CMake" RUN_TESTS"或"测试"目标

时间:2017-11-26 18:03:44

标签: testing cmake

在我的" 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中失败。查看我的评论

1 个答案:

答案 0 :(得分:0)

在cmake源代码中,您可以找到未使用变量但可以使用的变量,如果您使用include(CTest)而不是enable_testing()

检查此提交:https://github.com/Kitware/CMake/commit/816c9d1aa1f2b42d40c81a991b68c96eb12b6d26#diff-73eaa76f278a4e8afe41a9ffb838ccc4

 # 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 创建的,因此,它不是内置目标,因此您没有这些限制(真的很烦人),包括无法对其添加依赖项。 >