Scons显式依赖

时间:2015-05-13 21:53:10

标签: scons

我有一个简单的.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

订单将得到保证。

2 个答案:

答案 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()方法的参数对齐,则可能会有所帮助。 ;)