我从scons 2.3.0中看到了一些奇怪的行为。也许我只是做错了,但这似乎应该是明智的......
destinations = [base_dir+'lib/', base_dir+'tree/usr/local/lib/']
boost_ver = '1.63.0'
boost_libs = (x for x in env['LIBS'] if 'boost_' in x)
# eg. 'boost_thread', 'boost_system'
for dest in destinations:
for lib_name in boost_libs:
lib_so = 'lib'+lib_name+'.so'
lib_so_ver = lib_so+'.'+boost_ver
env.Command(dest+lib_so_ver, libsrc+lib_so_ver, Copy("$TARGET","$SOURCE"))
env.Command(dest+lib_so, dest+lib_so_ver, SymLink)
重点是获取命名库并将它们从libsrc
复制到每个destinations
,然后重新创建非版本化符号链接。 (base_dir
和libsrc
是绝对路径,但scons输出树中有base_dir
个点。)
这适用于单个目的地,但任何其他目的地都不会复制或链接。我尝试使用env.Depends
添加显式依赖项;我已经尝试将结果分配给变量并在以后使用它;似乎没什么用。
如果我查看--tree
的输出,则总是只列出第一个目的地中的文件;任何后续的都不会。 (如果我改变他们列出的顺序,那么现在首先列出的是唯一列出的顺序。)
如果我为每个目的地添加一个别名目标,并在命令结果上设置Depends
,那么两个别名目标都会出现在树中,但只有第一个具有子项;无论哪个出现在第二位,总是没有孩子。
即使我在命令行中明确指定了第二个别名目标,它也不执行任何操作,并且在--tree
中不打印任何子项。只有通过重新订购目的地,才能让它做任何事情 - 然后当然另一个停止工作。
基本上,对于任何给定的输入文件,它似乎只能执行一个操作,并且完全忽略任何多次尝试使用源文件,甚至没有警告。这看起来很疯狂。
答案 0 :(得分:0)
原来这不是Scons的问题,而是使用Python。 Real Problem™就是这个定义:
boost_libs = (x for x in env['LIBS'] if 'boost_' in x)
无论出于何种原因(显然我的python-fu不够高),这导致上面的内部for循环仅对第一个目标执行一次。
解决方案是使用方括号代替:
boost_libs = [x for x in env['LIBS'] if 'boost_' in x]
这正确地为每个目的地执行内循环。