SCONS运行目标

时间:2012-01-07 01:02:02

标签: scons

我一直在寻找,看着,我无法找到问题的答案。 我今晚刚刚开始学习scons,它看起来很棒!我虽然陷入了一点混乱。

为了便于开发,我经常喜欢让我的make文件构建我的目标,然后运行它以便我可以通过一次击键测试更改。这在make文件中非常简单:

run: $(exe)
    chmod a+x $(exe)
    $(exe)

我已经发现我可以使用子进程这样做:

import subprocess import os.path

env = Environment();
result = env.Program(target = "FOO", source = "BAR");
location = os.path.abspath(result[0].name)
subprocess.call([location])

但这个解决方案存在问题。就我的实验而言,scons不会等到你的程序在启动子进程调用之前完成构建,所以你最终运行旧的可执行文件,或者如果它是一个干净的构建后出错。

3 个答案:

答案 0 :(得分:9)

您在scons文件中执行的操作是scons中的典型初学者错误。您假设您正在编写用于构建项目的脚本。

Scons并不像那样工作。 scons文件是一个将目标添加到项目中的脚本。这是通过python完成的,各种对象允许您创建和操作目标,直到脚本完成。 首先,项目将开始建设。

您在代码中执行的操作是描述要使用的环境程序来创建,然后调用运行某个程序的子进程。在此之后,项目将开始构建 - 难怪旧的可执行文件已运行,新的可执行文件尚未开始构建。

您应该使用自定义构建器来执行程序。

env = Environment() #construct your environment
files = "test.cpp" #env.Glob or list some files

#now we create some targets
program = env.Program("test",files) #create the target *program*
execution = env.Command(None,None,"./test") #create the execution target (No input & output

Depends(execution,program) #tell scons that execution depends on program
#there might be a way to get SCons to figure out this dependency itself

#now the script is completed, so the targets are built

这里的依赖关系是明确的,程序必须在执行完成之前构建,它将

答案 1 :(得分:6)

我可能会有点迟到,但我有使用Alias的解决方案。 通过使用以下命令,它将构建并运行程序:

$ scons run
# Define the different target output
program = env.Program('build/output', Glob('build/test/*.cpp'))

env.Default(program)
env.Alias('run', program, program[0].abspath)

请注意我们使用abspath,因此它可以是跨平台的win / linux(对于linux,如果PATH未正确设置,则需要在程序名称之前添加“./”。

答案 2 :(得分:1)

好的,我有点紧张地回答我自己的问题,但我发现了一个或多或少可接受的解决方案。

我刚刚建立了一个简单的链条。 我在其中设置了一个类似这样的Makefile:

run:
   scons -s
   ./name_of_executable

这会以静默模式调用scons,然后自动运行程序。它不是一个仅限scons的解决方案,但它确实有效。我仍然有兴趣看看是否有人有另一个答案。 谢谢! 墨菲