将 cmake ctest 提升到父级
Promote cmake ctest to parent level
我在从超级项目的顶部调用 ctest
时遇到问题。
我正在 运行 构建一个嵌套项目;一个有很多子项目的项目,有时也有子项目。这是用 cmake 处理的。
superproject
├── project1
│ ├── subproject1a
│ └── subproject1b
├── project2
│ ├── subproject2a
│ └── subproject2b
│ ...
└── projectN
├── subprojectN1
│ ...
└── subprojectNn
在一些项目和大部分子项目中,我们使用ctest来定义测试用例。这些在适用的最低级别(子项目)的 CMakeLists.txt 文件中定义。
用于在最低级别定义、编译和声明 ctest 的 cmake 部分如下所示:
# ${subprojectName} was set earlier in this file
enable_testing()
file(GLOB TEST_SRCS RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} test/*.cpp)
foreach(testSrc ${TEST_SRCS})
get_filename_component(testName ${testSrc} NAME_WE)
set(testName ${subprojectName}_${testName})
add_executable(${testName} ${testSrc})
target_link_libraries(${testName} ${subprojectName} Boost::unit_test_framework Boost::dynamic_linking)
add_test(NAME ${testName} COMMAND ${testName})
endforeach(testSrc)
我希望能够像这样 运行 ctest:
mkdir build && cd build
cmake ..
cmake --build .
ctest
但是,目前我需要这样做:
mkdir build && cd build
cmake ..
cmake --build .
cd project1/subproject1a
ctest
cd ../subproject1b
ctest
...
cd ../subprojectNn
ctest
问题是 ctest 指令只会在调用 add_test()
的 cmake 级别创建。有没有办法让我将 ${testName}
的列表提升到超级项目的范围?如果是这样,我可以遍历该列表并从根目录调用 add_test
(尽管我可能仍然对工作目录有一些问题)。
我目前解决这个问题的方向是在构建目录的根目录中手动创建一个 CTestTestfile.cmake,并添加 add_subdirectory
以指向所有项目。如果我 运行 ctest
从这种情况开始,那么一切正常。如果我能让 cmake 生成这样的 CTestTestfile.cmake,那我会很高兴。
来电
enable_testing()
在当前目录中为 ctest
创建基础结构。
您可以在超级项目 CMakeLists.txt
中使用此调用,因此您将能够从顶级构建目录 运行 ctest
。
我在从超级项目的顶部调用 ctest
时遇到问题。
我正在 运行 构建一个嵌套项目;一个有很多子项目的项目,有时也有子项目。这是用 cmake 处理的。
superproject
├── project1
│ ├── subproject1a
│ └── subproject1b
├── project2
│ ├── subproject2a
│ └── subproject2b
│ ...
└── projectN
├── subprojectN1
│ ...
└── subprojectNn
在一些项目和大部分子项目中,我们使用ctest来定义测试用例。这些在适用的最低级别(子项目)的 CMakeLists.txt 文件中定义。
用于在最低级别定义、编译和声明 ctest 的 cmake 部分如下所示:
# ${subprojectName} was set earlier in this file
enable_testing()
file(GLOB TEST_SRCS RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} test/*.cpp)
foreach(testSrc ${TEST_SRCS})
get_filename_component(testName ${testSrc} NAME_WE)
set(testName ${subprojectName}_${testName})
add_executable(${testName} ${testSrc})
target_link_libraries(${testName} ${subprojectName} Boost::unit_test_framework Boost::dynamic_linking)
add_test(NAME ${testName} COMMAND ${testName})
endforeach(testSrc)
我希望能够像这样 运行 ctest:
mkdir build && cd build
cmake ..
cmake --build .
ctest
但是,目前我需要这样做:
mkdir build && cd build
cmake ..
cmake --build .
cd project1/subproject1a
ctest
cd ../subproject1b
ctest
...
cd ../subprojectNn
ctest
问题是 ctest 指令只会在调用 add_test()
的 cmake 级别创建。有没有办法让我将 ${testName}
的列表提升到超级项目的范围?如果是这样,我可以遍历该列表并从根目录调用 add_test
(尽管我可能仍然对工作目录有一些问题)。
我目前解决这个问题的方向是在构建目录的根目录中手动创建一个 CTestTestfile.cmake,并添加 add_subdirectory
以指向所有项目。如果我 运行 ctest
从这种情况开始,那么一切正常。如果我能让 cmake 生成这样的 CTestTestfile.cmake,那我会很高兴。
来电
enable_testing()
在当前目录中为 ctest
创建基础结构。
您可以在超级项目 CMakeLists.txt
中使用此调用,因此您将能够从顶级构建目录 运行 ctest
。