Scons复制header个文件到构建目录

Scons copy header files to build directory

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

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' 没有创建包含目录。另外 'Copy' 似乎什么也没做。但是,如果我这样调用 Mkdir:

env.Command("includes", mclib_target, [Mkdir('$TARGET')])

看起来效果不错。如何fix/work解决这个问题?我对 Scons 也很陌生,所以欢迎使用任何替代方法来完成这项任务。我正在使用 scons 2.5.0.

您可能想使用“Install()”而不是“Copy()”。 Mkdir() 也不是必需的,SCons 会自动为其目标创建所有中间文件夹。

最后,请允许我对您的一般方法发表一些评论:我不想将 "building" 与 "installing/preparing for packaging" 混用。 “variant_dir”选项可以帮助您从相同的源文件(假设您有一个名为"src")。通过将当前 "build" 目录的名称传递到您的 "src" SConscript 中,您将特定于变体的知识嵌入到您的本地构建描述中,这意味着您必须将它与您添加的每个变体联系起来. 相反,您应该将“Install/Package”步骤移动到顶级 SConstruct 中……您可以在其中全面了解构建了哪些变体。从那里您可以将最终文件复制(=安装)到一个单独的子文件夹,例如distribution,然后存档那个。

有关如何在 SCons 中处理变体的简单示例,请查看存储库 https://bitbucket.org/dirkbaechle/scons_talks 和“pyconde_2013/examples/exvar”文件夹。

您正在使用的 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.

我在自己的动作函数中尝试使用这些函数时总是遇到问题。也许我遗漏了一些东西,但我认为这些函数不能在命令生成器中的直接操作列表之外使用。

相反,我使用 python 中的独立于平台的函数来创建目录和复制文件,例如 os.makedirs and shutil.copy