我正在使用Scons构建一个环境,其中包括传播包含硬链接的部分目录结构。
所以它看起来像这样,我将一些源代码编译到$ BIN目录中,一些创建的目标是硬链接,而在其他一些模块中,我正在扫描$ BIN目录并触发一个构建器,它将二进制文件剥离到新目标,但保持硬链接。因此,如果有两个文件是源中的硬链接,它会复制第一个文件并创建硬链接到另一个目标。
现在的问题是,如果我尝试使用-j4运行它,例如,可能会发生竞争条件,因为在构建器尝试创建硬链接时,由strip创建的目标尚未完成。
以下是我的建设者:
def GenerateM3Strip(target, source, env):
if type(source) is list:
source = source[0]
if type(target) is list:
target = target[0]
src_stat = os.stat(source.abspath)
if (src_stat.st_nlink > 1
and src_stat.st_ino in GenerateM3Strip.inodes_dict):
previous_target = GenerateM3Strip.inodes_dict[src_stat.st_ino]
if target.get_dir().get_path() in previous_target:
source = previous_target[target.get_dir().get_path()]
print('LinkTarget: %s %s' % (source.get_path(), target.get_path()))
try:
os.unlink(target.get_path())
except Exception:
pass
os.link(source.get_path(), target.get_path())
return
# We have to keep a dictionary of target directory and target pairs, to
# support separate hard links for different directory targets, for example:
# fsdata/default and fsdata/bench
GenerateM3Strip.inodes_dict[src_stat.st_ino] = {
target.get_dir().get_path(): target}
action_str = env.subst(cross + 'strip -o $TARGET $SOURCE',
source=source, target=target)
env.Execute(env.Action(action_str))
GenerateM3Strip.inodes_dict = {}