scons是否忽略文件目标路径?

时间:2017-02-27 05:21:13

标签: python scons

我从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_dirlibsrc是绝对路径,但scons输出树中有base_dir个点。)

这适用于单个目的地,但任何其他目的地都不会复制或链接。我尝试使用env.Depends添加显式依赖项;我已经尝试将结果分配给变量并在以后使用它;似乎没什么用。

如果我查看--tree的输出,则总是只列出第一个目的地中的文件;任何后续的都不会。 (如果我改变他们列出的顺序,那么现在首先列出的是唯一列出的顺序。)

如果我为每个目的地添加一个别名目标,并在命令结果上设置Depends,那么两个别名目标都会出现在树中,但只有第一个具有子项;无论哪个出现在第二位,总是没有孩子。

即使我在命令行中明确指定了第二个别名目标,它也不执行任何操作,并且在--tree中不打印任何子项。只有通过重新订购目的地,才能让它做任何事情 - 然后当然另一个停止工作。

基本上,对于任何给定的输入文件,它似乎只能执行一个操作,并且完全忽略任何多次尝试使用源文件,甚至没有警告。这看起来很疯狂。

1 个答案:

答案 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]

这正确地为每个目的地执行内循环。