SCons奇怪的执行顺序

SCons strange execution order

我的目标是在 SCons 中执行 boost::test 单元测试。在 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 returns 一个程序:

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 文件)。

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

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

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

在 SCons 运行s 扫描器并构建完整的依赖关系树之后,它会遍历该树并执行 运行s 命令。

因此,在 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