2015-10-13 42 views
1

实际上,我为每个“模块”使用了不同CMakeLists的项目:一个用于编译,另一个用于单元测试(使用goole测试)。我有一个这样的结构:CMake设置选项只在一个CMakeLists中打开

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 

我触发编译与服务器(詹金斯)与一些$variables所以我想激活仅针对主CMakeLists的选项(谁在调用cmake的命令行中的一个)

我该怎么办那?

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

感谢您的帮助。

回答

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() 
+0

这是伟大的工作。谢谢 – Algorys

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

相关问题