如何运行在SConscript中编译刚编译的程序
How to Run just-compiled program in SConscript
我有一个有点复杂的 SCons 构建脚本,其中某个点执行以下两个步骤:
# 1: builds unit tests (googletest, shell executable)
compile_tests = some_environment.Program(executable_path, test_sources)
# 2: runs unit tests (call earlier compiled program)
run_tests = other_environment.Command(
source = executable_path,
action = executable_path + ' --gtest_output=xml:' + test_results_path,
target = test_results_path
)
Depends(run_tests, compile_tests)
如果我 运行 单独使用此构建脚本进行 scon,则可以正常工作。
但是,如果我通过 environment.SConscript()
从另一个 SConstruct
文件调用它,然后步骤 1
调整项目位置的路径,而步骤 [=16] =] 没有。看到这个输出:
scons: Building targets ...
g++ -o Nuclex.Game.Native/obj/gcc-7-amd64-release/NuclexGameNativeTests -z defs -Bsymbolic Nuclex.Game.Native/obj/gcc-7-amd64-release/Tests/Timing/ClockTests.o -LNuclex.Game.Native/obj/gcc-7-amd64-release -LReferences/googletest/gcc-7-amd64-release -lNuclexGameNativeStatic -lgoogletest -lgoogletest_main -lpthread
obj/gcc-7-amd64-release/NuclexGameNativeTests --gtest_output=xml:bin/gcc-7-amd64-release/gtest-results.xml
sh: obj/gcc-7-amd64-release/NuclexGameNativeTests: No such file or directory
第 2 行将可执行文件构建到 Nuclex.Game.Native/obj/gcc-7-amd64-release/
,而第 3 行试图在 obj/gcc-7-amd64-release/
中调用它,忘记了项目目录。
我应该使用另一种方式来调用我的单元测试可执行文件吗?或者我可以查询 SCons 环境的基本路径吗?
更新:复制案例,将https://pastebin.com/W08yZuF9 as SConstruct
in root directory, create subdirectory somelib
and place https://pastebin.com/eiP63Yxh作为SConstruct
放入其中,同时用"Hello World"或其他虚拟程序创建main.cpp
。
SCons 操作(命令中的 action
参数)将使用 SCons 变量正确替换源和目标,自动考虑 VariantDirs 和 SConscript 目录。您可以在此处找到有关这些源和目标替换的更多信息:https://scons.org/doc/HTML/scons-man.html#variable_substitution
有一节解释了关于 SConscript 和 VariantDirs 的使用:
SConscript('src/SConscript', variant_dir='sub/dir')
$SOURCE => sub/dir/file.x
${SOURCE.srcpath} => src/file.x
${SOURCE.srcdir} => src
因此,在您的示例中,我认为您想在操作字符串中将 executable_path
替换为 $SOURCE
:
# 2: runs unit tests (call earlier compiled program)
run_tests = other_environment.Command(
source = executable_path,
action = '$SOURCE --gtest_output=xml:$TARGET',
target = test_results_path
)
我有一个有点复杂的 SCons 构建脚本,其中某个点执行以下两个步骤:
# 1: builds unit tests (googletest, shell executable)
compile_tests = some_environment.Program(executable_path, test_sources)
# 2: runs unit tests (call earlier compiled program)
run_tests = other_environment.Command(
source = executable_path,
action = executable_path + ' --gtest_output=xml:' + test_results_path,
target = test_results_path
)
Depends(run_tests, compile_tests)
如果我 运行 单独使用此构建脚本进行 scon,则可以正常工作。
但是,如果我通过 environment.SConscript()
从另一个 SConstruct
文件调用它,然后步骤 1
调整项目位置的路径,而步骤 [=16] =] 没有。看到这个输出:
scons: Building targets ...
g++ -o Nuclex.Game.Native/obj/gcc-7-amd64-release/NuclexGameNativeTests -z defs -Bsymbolic Nuclex.Game.Native/obj/gcc-7-amd64-release/Tests/Timing/ClockTests.o -LNuclex.Game.Native/obj/gcc-7-amd64-release -LReferences/googletest/gcc-7-amd64-release -lNuclexGameNativeStatic -lgoogletest -lgoogletest_main -lpthread
obj/gcc-7-amd64-release/NuclexGameNativeTests --gtest_output=xml:bin/gcc-7-amd64-release/gtest-results.xml
sh: obj/gcc-7-amd64-release/NuclexGameNativeTests: No such file or directory
第 2 行将可执行文件构建到 Nuclex.Game.Native/obj/gcc-7-amd64-release/
,而第 3 行试图在 obj/gcc-7-amd64-release/
中调用它,忘记了项目目录。
我应该使用另一种方式来调用我的单元测试可执行文件吗?或者我可以查询 SCons 环境的基本路径吗?
更新:复制案例,将https://pastebin.com/W08yZuF9 as SConstruct
in root directory, create subdirectory somelib
and place https://pastebin.com/eiP63Yxh作为SConstruct
放入其中,同时用"Hello World"或其他虚拟程序创建main.cpp
。
SCons 操作(命令中的 action
参数)将使用 SCons 变量正确替换源和目标,自动考虑 VariantDirs 和 SConscript 目录。您可以在此处找到有关这些源和目标替换的更多信息:https://scons.org/doc/HTML/scons-man.html#variable_substitution
有一节解释了关于 SConscript 和 VariantDirs 的使用:
SConscript('src/SConscript', variant_dir='sub/dir')
$SOURCE => sub/dir/file.x
${SOURCE.srcpath} => src/file.x
${SOURCE.srcdir} => src
因此,在您的示例中,我认为您想在操作字符串中将 executable_path
替换为 $SOURCE
:
# 2: runs unit tests (call earlier compiled program)
run_tests = other_environment.Command(
source = executable_path,
action = '$SOURCE --gtest_output=xml:$TARGET',
target = test_results_path
)