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

4

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

build
|-- objects -> .o output files for constructing libmclib.a
|-- includes
|   |-- foo.h
|   `-- bar.h
`-- libmclib.a

我的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])

我的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)

Scons会使用参数'["build/includes"], ["build/libmclib.a"]'来调用 'copy_header_files' 方法,但由于某些原因 'Mkdir' 没有创建 includes 目录。同时 'Copy' 似乎也没有起到作用。不过如果我这样调用 Mkdir:
env.Command("includes", mclib_target, [Mkdir('$TARGET')])

看起来它运行良好。如何解决/绕过这个问题?我对Scons也很陌生,如果有其他做这个任务的替代方案也欢迎。我正在使用Scons 2.5.0。

2个回答

8
您可能希望使用"Install()"而不是"Copy()"。此外,Mkdir()应该不必要,SCons会自动为其目标创建所有中间文件夹。
最后,允许我就您的一般方法发表一些评论:我宁愿不将“构建”与“安装/打包准备”混合在一起。"variant_dir"选项可帮助您从相同的源文件(假设您有一个名为“src”的文件夹)构建多个“变体”(发布版、优化版、调试版、特定于ARM等)。通过将当前“构建”目录的名称传递给您的“src” SConscript,您正在将特定于变体的知识嵌入到本地构建描述中,这意味着您将不得不使用每个添加的变体进行修改。 相反,您应该将“Install/Package”步骤移至顶层SConstruct...在那里您具有有关构建哪些变体的全局知识。从那里,您可以将最终文件复制(=安装)到单独的子文件夹,例如distribution,并对其进行归档。

如果您想了解如何在SCons中正确处理变体的简单示例,请查看存储库https://bitbucket.org/dirkbaechle/scons_talks,然后转到“pyconde_2013/examples/exvar”文件夹。


这就是了!我在一个for循环中用env.Install替换了env.Command,以便将构建目录中的每个头文件(重复设置为1)复制到“distro”目录中。我还将安装相关的内容移动到SConstruct脚本中,因为这确实是更好的方法。非常感谢。 - MaartenVds

1

您正在使用的MkdirCopy操作是用于命令定义的Action工厂,详见平台无关文件系统操作:

SCons提供了许多平台无关函数(称为工厂),可以执行常见的文件系统操作,如复制、移动或删除文件和目录,或创建目录。 这些函数是工厂,因为它们不会在调用时立即执行操作,而是返回可在适当时间执行的Action对象。

我一直有问题尝试在我的自定义动作函数中使用这些函数。也许我缺少了什么,但我认为这些函数不能在Command构建器的立即操作列表之外使用。

相反,我使用Python中的平台无关函数来创建目录和复制文件,例如os.makedirsshutil.copy


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接