我的目标是在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
。然而,这不是我想要的。我的目标是在构建期间打印测试结果。
答案 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