SConstruct中配置的Copy命令不生效 移到SConscript后正常是什么原因
问题原因分析
- 默认构建目标范围限制
SCons 默认只会构建顶层SConstruct中通过Default()显式声明的目标,或者当前工作目录下被其他构建目标依赖的目标。你在SConstruct中直接声明的/lib64/路径下的复制目标属于绝对路径的独立目标,没有被纳入默认构建序列,执行普通scons命令时不会触发执行。
而将这段逻辑放到SConscript中时,通常你在SConstruct调用SConscript时,会将SConscript返回的所有目标批量加入默认构建列表,或者该复制目标被SConscript内的其他编译/链接目标依赖,因此会被自动触发执行。
你可以做验证:在SConstruct保留原代码的情况下,执行scons /lib64/[对应的tbb库文件名]显式指定该目标构建,如果复制操作正常执行,即可确认是该原因导致。 - 构建上下文的依赖扫描逻辑差异
如果为SConscript指定了variant_dir(变体输出目录),SCons对变体目录下的目标依赖扫描逻辑和顶层SConstruct的全局扫描逻辑不同,如果你在SConscript内的构建目标(比如最终生成的二进制文件)依赖了同目录下声明的tbb库复制目标,依赖关系会被自动识别并触发复制;而在顶层SConstruct声明的独立复制目标如果没有被任何顶层依赖关联,就会被忽略。 - 变量作用域问题(概率较低)
如果你的tbbLibNames、tbb_dylibs变量是在SConstruct的某个子作用域内定义,调用Command时变量未正确取值,也会导致命令不生效;而移动到SConscript时如果通过Export()/Import()正确传递了变量,就能正常执行。如果确认两处的变量取值完全一致,可排除该原因。
解决方案
如果需要在SConstruct中直接让复制命令生效,可将复制目标显式加入默认构建序列:
copy_tbb_tgt = Command('/lib64/'+ tbbLibNames[i] , tbb_dylibs + '/' + tbbLibNames[i], Copy("$TARGET", "$SOURCE")) # 显式加入默认构建目标 Default(copy_tbb_tgt)
也可以让该复制目标被其他你需要构建的顶层目标依赖,构建主目标时会自动触发复制:
main_bin = Program('main.cpp') Depends(main_bin, copy_tbb_tgt)
内容的提问来源于stack exchange,提问作者Charles Ke
相关产品推荐
相关产品推荐

