实际上,我有一个不同CMakeLists的项目:一个用于编译,一个用于每个"模块的单元测试(使用goole测试)"。我有这样的结构:
module_1
- | SRC
--CMakeLists.txt //用于编译模块1
--test
---- | CMakeLists.txt //用于模块1的单元测试
module_2
- | SRC
--CMakeLists.txt //用于编译模块2
--test
---- | CMakeLists //用于模块2的单元测试
现在,我的目标是为每个模块只制作一个CMakeLists.txt,并在同一个CMakeLists.txt中进行编译和单元测试。所以我在我的CMakeLists.txt(用于编译)中创建一个OPTION来触发测试。
option(TEST_ENABLED
"Tests Unitaires Core"
OFF
)
if(TEST_ENABLED)
set...
endif()
它适用于一个CMakeLists。但是,如果我构建所有模块,则为每个模块激活该选项(我希望您关注我)。
cmake -DTEST_ENABLED=ON -G"Unix Makefiles" ../module1
我使用服务器(Jenkins)和一些$variables
触发编译,所以我想仅为主CMakeLists(使用cmake命令行调用的那个)激活选项
我怎么能这样做?
如果您想了解更多信息,请告诉我
感谢先生的帮助。
答案 0 :(得分:2)
为项目全局设置选项和其他用户提供的参数,因此它们会影响其所有部分。
您可以为项目的不同部分使用不同的选项:
<强>模块1 /的CMakeLists.txt 强>:
option(TEST1_ENABLED
"Test for module 1"
OFF
)
...
或者,在测试的情况下,您可以使用单个用户提供的参数枚举所有模块,应该为其设置选项:
<强>的CMakeLists.txt 强>:
set(TESTS_LIST "" CACHE STRING "List of tests")
<强>模块1 /的CMakeLists.txt 强>:
list(module_index FIND "module1" ${TESTS_LIST})
if(module_index EQUAL -1)
set(TEST_ENABLED OFF) # No CACHE, so variable is local for the module1.
else()
set(TEST_ENABLED ON)
endif()
if(TEST_ENABLED)
...
endif()
可能的用法:
cmake "-DTESTS_LIST=module1;module3" -G "Unix Makefiles" ..
这样可以对module1
和module3
进行测试,但不能对module2
进行测试。
答案 1 :(得分:1)
关于测试,我最喜欢的方法是在两个条件下进行测试:
TEST_ENABLED
为ON
可以使用PROJECT_NAME
和CMAKE_PROJECT_NAME
来源:https://stackoverflow.com/a/8587949/1380225
示例:
if(TEST_ENABLED AND ("${PROJECT_NAME}" STREQUAL "${CMAKE_PROJECT_NAME}"))
...
endif()