SCons奇怪的执行顺序

时间:2016-03-29 00:33:40

标签: subprocess call scons

我的目标是在boost::test中执行SCons单元测试。在SConstruct文件中,我有以下代码:

for t in toTest:
    nextTest = SConscript('#/test/' + t + '/SConscript',  
                          variant_dir = test_dir + t,
                          duplicate = 0) 
    for a in nextTest:
        import subprocess
        subprocess.call(a.abspath)
分配给Sconscript

nextTest会返回一个程序:

prgs = env.Program( 'model_test_exe', 
                    'ModelTest.cpp', 
                     LIBPATH = [boost_lib, python_lib], 
                     LIBS = [modellib])

Return('prgs')

此问题是在scons -c命令后发生错误。下次我运行scons时,它会给我:

C:\Users\...>scons -Q
WindowsError: [Error 2] The system cannot find the file specified:
  File "C:\Users\...\Win32Project4\SConstruct", line 51:
    subprocess.call(a.abspath)

Sconscript创建程序之前看起来已执行调用。我该怎么办?我是SCons的新手,我已经完成了使用此工具进行捉迷藏。它实际上先于其他任何东西执行(没有创建.obj / .lib文件)。

此外,代码有效,因为当我将.exe更改为subprocess时,我可以将其编译为Alias。然而,这不是我想要的。我的目标是在构建期间打印测试结果。

1 个答案:

答案 0 :(得分:2)

O.k。您的问题是您使用子进程来启动进程而不是创建构建器或使用Command()。

SCons分几个阶段运行,第一阶段是处理开始构建依赖图的所有SConstruct / SConscript逻辑。

SCons运行扫描程序并构建完整的依赖关系树后,它会遍历该树并运行命令。

因此,在SCons甚至可以开始构建任何内容之前,您的子进程就会运行。

这是一个未完成的解释: https://bitbucket.org/scons/scons/wiki/SconsProcessOverview

您可以尝试从SConstruct中删除for nextTest循环,而不是在SConscripts中放置类似的东西

prgs = env.Program( 'model_test_exe', 
                    'ModelTest.cpp', 
                     LIBPATH = [boost_lib, python_lib], 
                     LIBS = [modellib])

env.Command('outputfile_for_test',prgs,'$SOURCE > $TARGET')



Return('prgs')

请注意,“用户指南”中介绍了很多内容。 http://scons.org/doc/production/HTML/scons-user/index.html