在我的" plange_superbuild" CMakeLists.txt,我有:
add_test(plange_test ${CMAKE_COMMAND} --build ${CMAKE_BINARY_DIR}/prefix/src/plange-build --target test)
应该调用" plange"子项目的测试目标,在使用Makefile生成器时工作正常。但是,CMake测试documentation解释了:
[enable_testing()]添加另一个构建目标,即对Makefile生成器进行测试, 或RUN_TESTS用于集成开发环境(如Visual 工作室)。
因此,我的代码片段不适用于使用IDE的构建,因为我只是说" test"。如何使命令也能在IDE构建中运行?
我已经想到了一些可能的解决方案选项。一种是使用现有的CMake变量(如果存在)来获取测试目标的名称。这是一个等于test
的变量(我们称之为CMAKE_TEST_TARGET),除了在IDE构建中它将等于RUN_TESTS
,允许以下内容:
add_test(plange_test ${CMAKE_COMMAND} --build ${CMAKE_BINARY_DIR}/prefix/src/plange-build --target ${CMAKE_TEST_TARGET})
我不知道这样的变量。也许我可以通过CMAKE_GENERATOR变量(或MSVC等)检测基于IDE的构建,并手动设置所谓的CMAKE_TEST_TARGET变量。这需要了解(并维护)CMake用于确定" test"的确切逻辑。或" RUN_TESTS"在我的CMakeLists.txt中,这将是不可靠的。
我的另一个想法是使用一个类似于CMAKE_COMMAND的变量(让我们的调用是CTEST_COMMAND)直接调用ctest,但是指向ctest可执行文件。我再次没有意识到这样的变量。
编辑:有CMAKE_CTEST_COMMAND请参阅https://stackoverflow.com/a/736838/395029及其中的评论
我从CMAKE_COMMAND派生了这个变量,使用get_filename_component()来提取bin目录,但这取决于CMAKE_COMMAND没有任何嵌入的参数。这是一个安全的假设吗?这适用于Makefile生成器,但不适用于VC ++ 2017生成器。 VC ++中的错误消息不清楚,但这是我尝试过的:
get_filename_component(CMAKE_EXECUTABLES_DIR ${CMAKE_COMMAND} DIRECTORY)
set(CTEST_COMMAND "${CMAKE_EXECUTABLES_DIR}/ctest${CMAKE_EXECUTABLE_SUFFIX}")
add_test(NAME plange_test COMMAND ${CTEST_COMMAND} WORKING_DIRECTORY ${CMAKE_BINARY_DIR}/prefix/src/plange-build)
superbuild项目中VC ++ 2017中的错误消息:
1>The following tests FAILED:
1> 1 - plange_test (Failed)
1>Errors while running CTest
1>C:\Program Files (x86)\Microsoft Visual Studio\2017\Professional\Common7\IDE\VC\VCTargets\Microsoft.CppCommon.targets(133,5): error MSB3073: The command "setlocal
1>C:\Program Files (x86)\Microsoft Visual Studio\2017\Professional\Common7\IDE\VC\VCTargets\Microsoft.CppCommon.targets(133,5): error MSB3073: "C:\Program Files\CMake\bin\ctest.exe" --force-new-ctest-process -C Debug
1>C:\Program Files (x86)\Microsoft Visual Studio\2017\Professional\Common7\IDE\VC\VCTargets\Microsoft.CppCommon.targets(133,5): error MSB3073: if %errorlevel% neq 0 goto :cmEnd
1>C:\Program Files (x86)\Microsoft Visual Studio\2017\Professional\Common7\IDE\VC\VCTargets\Microsoft.CppCommon.targets(133,5): error MSB3073: :cmEnd
1>C:\Program Files (x86)\Microsoft Visual Studio\2017\Professional\Common7\IDE\VC\VCTargets\Microsoft.CppCommon.targets(133,5): error MSB3073: endlocal & call :cmErrorLevel %errorlevel% & goto :cmDone
1>C:\Program Files (x86)\Microsoft Visual Studio\2017\Professional\Common7\IDE\VC\VCTargets\Microsoft.CppCommon.targets(133,5): error MSB3073: :cmErrorLevel
1>C:\Program Files (x86)\Microsoft Visual Studio\2017\Professional\Common7\IDE\VC\VCTargets\Microsoft.CppCommon.targets(133,5): error MSB3073: exit /b %1
1>C:\Program Files (x86)\Microsoft Visual Studio\2017\Professional\Common7\IDE\VC\VCTargets\Microsoft.CppCommon.targets(133,5): error MSB3073: :cmDone
1>C:\Program Files (x86)\Microsoft Visual Studio\2017\Professional\Common7\IDE\VC\VCTargets\Microsoft.CppCommon.targets(133,5): error MSB3073: if %errorlevel% neq 0 goto :VCEnd
1>C:\Program Files (x86)\Microsoft Visual Studio\2017\Professional\Common7\IDE\VC\VCTargets\Microsoft.CppCommon.targets(133,5): error MSB3073: :VCEnd" exited with code 8.
1>Done building project "RUN_TESTS.vcxproj" -- FAILED.
========== Build: 0 succeeded, 1 failed, 1 up-to-date, 0 skipped ==========
我能够成功地从错误输出中运行命令:
C:\...\plange.build\prefix\src\plange-build>ctest --force-new-ctest-process -C Debug
但:
C:\...\plange.build>ctest --force-new-ctest-process -C Debug
失败,因此使失败更加令人困惑。这些常见做法之一是什么?是否有一些我尚未考虑的优越(工作)方法?
编辑:使用CMAKE_CTEST_COMMAND我了解到" -C Debug"没有通过,这使它在IDE中失败。查看我的评论
答案 0 :(得分:0)
在cmake源代码中,您可以找到未使用变量但可以使用的变量,如果您使用include(CTest)而不是enable_testing()
# If requested, add an alias that is the equivalent of the built-in "test"
# or "RUN_TESTS" target:
if(CTEST_TEST_TARGET_ALIAS)
add_custom_target(${CTEST_TEST_TARGET_ALIAS}
${CMAKE_CTEST_COMMAND} ${__conf_types}
USES_TERMINAL
)
endif()
endif()
意思是,如果在Cmakelist.txt中调用 set(CTEST_TEST_TARGET_ALIAS my_name_for_target_test),然后再 include(CTest),则可以可靠地使用 my_name_for_target_test 强>根据此评论(我没有检查自己是否真的做到了)。由于此别名是通过 add_custom_target 创建的,因此,它不是内置目标,因此您没有这些限制(真的很烦人),包括无法对其添加依赖项。 >