在SCons中安装文件夹时,依赖关系树不知道该文件夹的内容。这意味着无法创建隐式关系。
env.Install("out/bin","path/to/folder")
env.Install("out/archive", Glob("out/bin/folder/library.lib"))
在此示例代码中,Glob返回[],因为SCons不知道该文件夹包含一个名为library.lib的文件。
我发现的唯一解决方法是遍历目录并安装每个单独的文件。
SCons Install没有为您执行此操作的选项吗?
答案 0 :(得分:0)
我也遇到过这种情况。我没有找到任何其他解决方案,而不是像你描述的那样遍历目录。虽然文件夹的内容被复制,但SCons只有一个目标,只有一个源,除非你单独指定每个目标。
import os
def recursive_install(target, source, env):
source_dirname = os.path.dirname(source)
for root, dirnames, filenames in os.walk(source):
for filename in filenames:
env.Install(os.path.join(
target, os.path.relpath(root, os.path.dirname(source))),
os.path.join(root, filename))
env = Environment()
recursive_install("out/bin", "path/to/folder", env)
env.Install("out/archive", "out/bin/folder/library.lib")
运行时产生......
>> scons --version
SCons by Steven Knight et al.:
script: v2.3.4, 2014/09/27 12:51:43, by garyo on lubuntu
engine: v2.3.4, 2014/09/27 12:51:43, by garyo on lubuntu
engine path: ['/usr/lib/scons/SCons']
Copyright (c) 2001 - 2014 The SCons Foundation
>> tree
.
├── path
│ └── to
│ └── folder
│ └── library.lib
└── SConstruct
3 directories, 2 files
>> scons
scons: Reading SConscript files ...
scons: done reading SConscript files.
scons: Building targets ...
Install file: "path/to/folder/library.lib" as "out/bin/folder/library.lib"
Install file: "out/bin/folder/library.lib" as "out/archive/library.lib"
scons: done building targets.
>> tree
.
├── out
│ ├── archive
│ │ └── library.lib
│ └── bin
│ └── folder
│ └── library.lib
├── path
│ └── to
│ └── folder
│ └── library.lib
└── SConstruct
7 directories, 4 files
答案 1 :(得分:0)
SCons没有选项以递归方式安装顶级文件夹下的所有文件,因为这被认为是一种罕见的情况(注意,SCons如何更喜欢源内树构建,如此你必须从Install调用中排除很多文件,否则)。如果您要创建要安装的"文件"在同一个构建中,首选方法是使用Builder中发出的目标列表,并将其作为Install方法的第二个参数:
mylibs = env.AnyBuilder('library', sources)
env.Install("out/bin", mylibs)
然后,您不必像Kenneth的回答那样使用递归的os.walk手动列出所有目标文件。