仅在一个CMake列表中将CMake Set选项设置为ON

时间:2015-10-13 12:20:22

标签: unit-testing cmake

实际上,我有一个不同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命令行调用的那个)激活选项

我怎么能这样做?

如果您想了解更多信息,请告诉我

感谢先生的帮助。

2 个答案:

答案 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" ..

这样可以对module1module3进行测试,但不能对module2进行测试。

答案 1 :(得分:1)

关于测试,我最喜欢的方法是在两个条件下进行测试:

  • 变量TEST_ENABLEDON
  • 当前项目是cmake的主要项目

可以使用PROJECT_NAMECMAKE_PROJECT_NAME

测试第二个条件

来源:https://stackoverflow.com/a/8587949/1380225

示例:

if(TEST_ENABLED AND ("${PROJECT_NAME}" STREQUAL "${CMAKE_PROJECT_NAME}"))
    ...
endif()