您应该查看UnTarBuilder,作为提取 tar 文件并将所有提取的文件正确插入依赖关系树的方法。但是以下内容将得到您的工作。
如果可能,您希望避免显式依赖。 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 不会依赖哪个文件,即使您将该操作列为显式依赖项。
虽然这不能完全回答您的问题,但我希望它为您想要完成的任务提供解决方案。