Scons将头文件复制到构建目录

Maa*_*Vds 4 python scons

我正在尝试使用scons将源目录中的一些头文件复制到我的构建目录中的'includes'目录.我的目标是一个静态库,我想将它与相关的标题一起分发.预期的最终结果:

build
|-- objects -> .o output files for constructing libmclib.a
|-- includes
|   |-- foo.h
|   `-- bar.h
`-- libmclib.a
Run Code Online (Sandbox Code Playgroud)

我的SConstruct:

#!python
target = 'mock'

env = Environment(LINKCOM = "$LINK -o $TARGET $SOURCES $LINKFLAGS $CCFLAGS")
Export('env', 'target')

build_base = 'build'
SConscript('SConscript', variant_dir=build_base, duplicate=0)

# remove build directory
if GetOption('clean'):
    import subprocess
    subprocess.call(['rm', '-rf', build_base])
Run Code Online (Sandbox Code Playgroud)

我的SConscript:

#!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)
Run Code Online (Sandbox Code Playgroud)

Scons使用参数'["build/includes"],["build/libmclib.a"]'调用'copy_header_files',但由于某种原因,'Mkdir'不会创建包含目录."复制"似乎什么都不做.如果我这样称呼Mkdir:

env.Command("includes", mclib_target, [Mkdir('$TARGET')])
Run Code Online (Sandbox Code Playgroud)

它似乎运作良好.如何解决/解决这个问题?我对Scons也很陌生,所以欢迎任何替代方案来完成这项任务.我正在使用scons 2.5.0.

dir*_*hle 7

你可能想用" Install()"而不是" Copy()".此外,Mkdir()不需要,SCons会自动为其目标创建所有中间文件夹.

最后,请允许我对您的一般方法发表一些评论:我宁愿不将"建筑"与"安装/准备包装"混在一起." variant_dir"选项可以帮助您从相同的源文件构建多个"变体"(发布,优化,调试,特定于ARM,...)(假设您有一个名为"src"的文件夹).通过将当前"build"目录的名称传递到"src"SConscript中,您将特定于变体的知识嵌入到本地构建描述中,这意味着您必须使用添加的每个变体来触摸它.相反,您应该将" Install/Package"步骤移动到顶级SConstruct ......您可以全面了解构建哪些变体.从那里你可以将最终文件复制(=安装)到一个单独的子文件夹,例如distribution,并将其归档.

有关如何在SCons中处理变体的简单示例,请查看repo https://bitbucket.org/dirkbaechle/scons_talks以及" pyconde_2013/examples/exvar"文件夹.