【问题标题】:SCONS run targetSCONS 运行目标
【发布时间】:2012-01-07 01:02:02
【问题描述】:

我一直在寻找,一直在寻找,但我找不到我的问题的答案。 我今晚刚开始学习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 不会等到您的程序完成构建后才开始子进程调用,因此您最终会运行旧的可执行文件,或者如果它是在清理后构建的,则会出现错误。

【问题讨论】:

  • @CarlNorum,我刚刚编辑了帖子以显示我的发现。感谢收看!
  • 恐怕我对SCONS一无所知。我确实再次修复了您的格式。请阅读发布/编辑页面上的说明。
  • 哦,谢谢你这样做。从现在开始,我会正确地做到这一点。

标签: scons


【解决方案1】:

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

Scons 不能那样工作。 scons 文件是一个将targets 添加到项目的脚本。这是通过 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

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

【讨论】:

    【解决方案2】:

    我可能有点晚了,但我有这个使用 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设置不正确,你需要在程序名前添加“./”。

    【讨论】:

    • 谢谢!其实我最近才想通。但你来告诉世界其他地方。太棒了!
    【解决方案3】:

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

    我刚刚建立了一个简单的链。 我设置了一个 Makefile,里面有这样的东西:

    run:
       scons -s
       ./name_of_executable
    

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

    【讨论】:

    • 恭喜修复; answer your own question 完全没问题。如果可以,请使用左侧的复选标记将您的答案标记为“已接受”。这将向其他人表明您的问题已解决。干杯~
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多