13

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

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

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

4

4 回答 4

6

还有一种更通用的方法。添加一个名为您的源代码树的文件并添加您不想运行CTestCustom.cmake的测试列表:CTest

set(CTEST_CUSTOM_TESTS_IGNORE
   test1
   ....
   testN
)

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

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

这将CTest忽略列出的测试。有关更多信息,请参阅内容。

于 2015-02-19T11:07:06.123 回答
4

查看libevent 的 CMakeLists.txt 文件中可用option的 s,您似乎可以通过设置EVENT__DISABLE_TESTSON.

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

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

或者当您在命令行上调用 CMake 时:

cmake . -DEVENT__DISABLE_TESTS=ON
于 2014-05-17T18:54:36.560 回答
4

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

TL;博士

添加到您的 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.cmake是在 之前执行的,CTestTestfile.cmake所以CTestCustom.cmake只需从CTestTestfile.cmake文件中删除有问题的行。这可以通过 a 来完成sed,但本着交叉兼容的精神,现在都是纯 CMake。CTestCustom.cmake没有CMAKE_BINARY_DIR设置,所以我们使用@替换来获取CMAKE_BINARY_DIRCMake 生成时的值,并CTestCustom.cmake使用替换替换将在构建目录中的副本中的值,以不理会@ONLY其他变量$

于 2020-08-28T22:01:33.583 回答
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如果需要,多个库的多个路径可以在哪里。

于 2018-10-11T21:18:47.297 回答