我有一个简单的.cpp
文件,该文件取决于jsoncpp
。作为构建过程的一部分,我希望Scons解压jsoncpp(如果它还没有)并在尝试编译app.cpp
之前构建它(如果它还没有){{1} }取决于app.cpp
内部压缩的一些.h
文件。
这是我迄今为止所尝试过的:
jsoncpp.tar.gz
然而,Scons从不打印"提取jsoncpp" ...它总是尝试编译app.cpp然后立即失败。
如果我使用env = Environment()
env.Program('app', 'app.cpp')
env.Depends('app.cpp', 'jsoncpp')
def build_jsoncpp(target, source, env):
shutil.rmtree("jsoncpp", ignore_errors=True)
mytar = tarfile.open(str(source[0]))
mytar.extractall()
print("Extracted jsoncpp")
env.Command("jsoncpp", ['jsoncpp.tar.gz'], build_jsoncpp)
,我可以简单地执行以下操作:
make
订单将得到保证。
答案 0 :(得分:1)
您应该查看UnTarBuilder,作为提取tarfile的方法,并将所有提取的文件正确插入到依赖关系树中。但是以下内容将得到您的工作。
如果可能,您希望避免显式依赖。 SCons的众多乐趣之一就是让它为您处理依赖关系。因此,只需将您所依赖的源文件列为untar命令构建器的目标之一。
为了测试这个,我创建了一个名为jsoncpp.tar.gz
的tar文件,其中只包含一个文件app.cpp
,其中包含以下内容。
#include <iostream>
int main() {
std::cout << "Hello World" << std::endl;
return 0;
}
并将您的SConstruct更新为以下内容。
import shutil
import tarfile
env = Environment()
env.Program('app', 'app.cpp')
def build_jsoncpp(target, source, env):
shutil.rmtree("jsoncpp", ignore_errors=True)
mytar = tarfile.open(str(source[0]))
mytar.extractall()
print("Extracted jsoncpp")
env.Command(["app.cpp"], ['jsoncpp.tar.gz'], build_jsoncpp)
因为您列出了所依赖的所需源文件作为命令构建器的目标,所以它将为您处理依赖项。
当你跑步时,你会看到以下内容。
>> scons --version
SCons by Steven Knight et al.:
script: v2.3.4, 2014/09/27 12:51:43, by garyo on lubuntu
engine: v2.3.4, 2014/09/27 12:51:43, by garyo on lubuntu
engine path: ['/usr/lib/scons/SCons']
Copyright (c) 2001 - 2014 The SCons Foundation
>> tree
.
├── jsoncpp.tar.gz
└── SConstruct
0 directories, 2 files
>> scons
scons: Reading SConscript files ...
scons: done reading SConscript files.
scons: Building targets ...
build_jsoncpp(["app.cpp"], ["jsoncpp.tar.gz"])
Extracted jsoncpp
g++ -o app.o -c app.cpp
g++ -o app app.o
scons: done building targets.
>> tree
.
├── app
├── app.cpp
├── app.o
├── jsoncpp.tar.gz
└── SConstruct
0 directories, 5 files
>> ./app
Hello World
您的代码无效的原因是您将jsoncpp
列为untar命令构建器的目标。即使您将该操作列为显式依赖项,也不是编译app.cpp
的文件所依赖的文件。
虽然这并不完全回答你的问题,但我希望它能为你想要完成的事情提供解决方案。
答案 1 :(得分:0)
如果将构建器函数的名称与Command()方法的参数对齐,则可能会有所帮助。 ;)