2016-09-06 77 views
3

我试图从我的源目录中复制一些头文件到使用scons的我的构建目录中的'includes'目录。我的目标是一个静态库,我想把它和它的相关头文件一起分发。预期最终结果:Scons复制头文件以建立目录

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并称之为 'copy_header_files' 与参数“[ “构建/包括”],[ “build/libmclib.a”]',但由于某些原因'Mkdir'不创建includes目录。另外'复制'似乎什么都不做。如果我然后像这样打电话给Mkdir:

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

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

回答

6

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

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

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

+0

这就是它!我用forv循环中的env.Command替换了env.Command,将每个头文件从构建目录(重复设置为1)复制到'distro'目录。我还将安装相关的东西移到了SConstruct脚本中,因为这确实是一个更好的方法。非常感谢 – MaartenVds

1

MKDIR复制操作所使用是在命令定义使用行动工厂,Platform-Independent File System Manipulation描述:

SCons的提供了大量的独立于平台的功能,称为 工厂,它执行常见的文件系统操作,如复制,移动或删除文件和目录,或制作目录。 这些 函数是工厂,因为它们不会在调用它们时在 处执行操作,它们每个都会返回一个可在适当时间执行的操作对象 。

我一直有尝试在我自己的动作函数中使用这些函数的问题。也许我错过了一些东西,但我不认为这些功能可以用在“命令”构建器的直接操作列表之外。

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