SCON将头文件复制到生成目录

2024-04-28 19:25:09 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试使用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。在


Tags: inbuild目录envtargetforfilesscons
2条回答

您正在使用的MkdirCopy操作是命令定义中使用的操作工厂,如Platform-Independent File System Manipulation中所述:

SCons provides a number of platform-independent functions, called factories, that perform common file system manipulations like copying, moving or deleting files and directories, or making directories. These functions are factories because they don't perform the action at the time they're called, they each return an Action object that can be executed at the appropriate time.

我在尝试在自己的动作函数中使用这些函数时总是遇到问题。也许我遗漏了一些东西,但我不认为这些函数可以在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”文件夹。在

相关问题 更多 >