CMake排除子目录中的测试

时间:2014-05-17 16:29:50

标签: cmake ctest

我有一个包含libevent库的c ++项目。项目结构:

.
|_ CMakeLists.txt
|_ Makefile
|_ src
| |_ my_lib.cpp
|_ test
| |_ my_lib_test.cpp
|_ lib
  |_ libevent
    |_ CMakeLists.txt
    |_ ...

当我构建并运行我的测试时,也会执行libevent测试。如何排除它们并仅运行我自己的测试?

4 个答案:

答案 0 :(得分:3)

查看libevent的CMakeLists.txt文件中的available options,您可以通过将EVENT__DISABLE_TESTS设置为ON来轻松停用这些文件。

在包含libevent之前,您可以在自己的CMakeLists.txt中执行此操作:

set(EVENT__DISABLE_TESTS ON)
...
add_subdirectory(lib/libevent)

或在命令行上调用CMake时:

cmake . -DEVENT__DISABLE_TESTS=ON

答案 1 :(得分:3)

还有一种更通用的方法。将名为CTestCustom.cmake的文件添加到源树,并添加一个您希望CTest无法运行的测试列表:

set(CTEST_CUSTOM_TESTS_IGNORE
   test1
   ....
   testN
)

将此文件复制到执行测试的构建目录:

configure_file(${CMAKE_SOURCE_DIR}/CTestCustom.cmake ${CMAKE_BINARY_DIR})

这将使CTest忽略列出的测试。有关详细信息,请参阅this

答案 2 :(得分:1)

我找到了另一种(更好的)方法来解决实际问题。

TL; DR

添加到您的CMakeLists.txt文件:

configure_file(${CMAKE_SOURCE_DIR}/CTestCustom.cmake ${CMAKE_BINARY_DIR} @ONLY)

在您的源代码中添加您的CTestCustom.cmake文件:

file (STRINGS "@CMAKE_BINARY_DIR@/CTestTestfile.cmake" LINES)

# overwrite the file....
file(WRITE "@CMAKE_BINARY_DIR@/CTestTestfile.cmake" "")

# loop through the lines,
foreach(LINE IN LISTS LINES)
  # remove unwanted parts
  string(REGEX REPLACE ".*directory_to_remove.*" "" STRIPPED "${LINE}")
  # and write the (changed) line ...
  file(APPEND "@CMAKE_BINARY_DIR@/CTestTestfile.cmake" "${STRIPPED}\n")
endforeach()

(有关删除行的功能形式,请参见https://stackoverflow.com/a/59506088/4166604

说明:

“按测试排除”方法有很多缺点,包括动态(通过宏)添加的测试,浪费的时间等...

这已在CMake 3.x上进行了测试:构建启用了测试的CMake项目时,CTestTestfile.cmake中将生成一个CMAKE_BINARY_DIR文件。基本上,每次调用add_subdirectory时,都会将等效的subdirs命令添加到CTestTestfile.cmake文件中。 CTestTestfile.cmake文件将模仿与CMakeLists.txt文件等效的目录结构。 (因此,如果您需要删除另一个目录中的子目录,则需要编辑CTestTestfile.cmake。)

CTestCustom.cmakeCTestTestfile.cmake之前执行,因此CTestCustom.cmake要做的就是从CTestTestfile.cmake文件中删除有问题的行。可以使用sed来完成,但是出于交叉兼容性的考虑,现在完全是CMake。 CTestCustom.cmake没有设置CMAKE_BINARY_DIR,因此我们使用@替换来在CMake生成时获取CMAKE_BINARY_DIR的值,并替换{ {1}}复制到构建目录中,使用CTestCustom.cmake进行替换,以使其他变量@ONLY保持不变。

答案 3 :(得分:0)

我同意@Ivan Baidakou。

我不确定这是否会更好,但这是一个不可移植的黑客(默认情况下在Windows上不起作用)将其完成。

execute_process(COMMAND sh -c "echo 'set(CTEST_CUSTOM_TESTS_IGNORE'; find '${CMAKE_SOURCE_DIR}/relative_paths' -path '*tests/CMakeLists.txt' -exec sed -nE '/add_test.*NAME/{s|.*NAME *([^ ]+).*|\\1|; p}' {} +; echo ')'"
                OUTPUT_FILE ${CMAKE_BINARY_DIR}/CTestCustom.cmake)

如果需要,${CMAKE_SOURCE_DIR}/relative_paths可以是多个库的多个路径。