Scons Install Builder支持硬链接

时间:2018-02-20 08:53:49

标签: scons

我正在使用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 = {}                                               

0 个答案:

没有答案