我正在尝试使用scons将许多头文件从源目录复制到构建目录中的“includes”目录中。我的目标是一个静态库,我想把它和它的相关头一起分发。预期最终结果:
build
|-- objects -> .o output files for constructing libmclib.a
|-- includes
| |-- foo.h
| `-- bar.h
`-- libmclib.a
我的建筑:
^{pr2}$我的命令:
#!python
Import('env')
# ...
# other stuff to build 'mclib_target'
# ...
def copy_header_files(target, source, env):
Mkdir(target)
header_files = []
for d in env['CPPPATH']:
header_files += Glob(d + "/*.h")
for f in header_files:
Copy(target, f)
# copy all relevant header files
env.Command("includes", mclib_target, copy_header_files)
Scons确实使用参数“[“build/includes”],[“build/libmclib.a”]”调用“copy_header_files”,但由于某些原因,“Mkdir”没有创建includes目录。“复制”似乎也没什么用。如果我这样称呼Mkdir:
env.Command("includes", mclib_target, [Mkdir('$TARGET')])
看来效果不错。如何解决这个问题?我对Scons还是个新手,所以欢迎有其他的选择来完成这个任务。我用的是scons2.5.0。在
您正在使用的Mkdir和Copy操作是命令定义中使用的操作工厂,如Platform-Independent File System Manipulation中所述:
我在尝试在自己的动作函数中使用这些函数时总是遇到问题。也许我遗漏了一些东西,但我不认为这些函数可以在commandbuilder中的直接操作列表之外使用。在
相反,我使用python中与平台无关的函数来创建目录和复制文件,例如^{} 和{a3}。在
您可能希望使用“
Install()
”而不是“Copy()
”。而且Mkdir()
不应该是必需的,SCons会自动为其目标创建所有中间文件夹。在最后,请允许我对您的一般方法发表一些意见:我不希望将“构建”与“安装/准备打包”混为一谈。“
variant_dir
”选项可以帮助您从相同的源文件(假设您有一个名为“src”的文件夹)构建几个“变体”(release、optimized、debug、ARM-specific…)。通过将当前“build”目录的名称传递到您的“src”SConscript中,您将把特定于变量的知识嵌入到本地构建描述中,这意味着您必须使用您添加的每个变量来接触它。 相反,您应该将“Install/Package
”步骤移到顶层SConstruct中……在这里您对构建哪些变体有全局性的了解。从那里你可以复制(=安装)最终文件到一个单独的子文件夹中,例如distribution
,并将其存档。在关于如何在scon中处理变量的简单示例,请查看repohttps://bitbucket.org/dirkbaechle/scons_talks和“
pyconde_2013/examples/exvar
”文件夹。在相关问题 更多 >
编程相关推荐