2015-10-13 4 views
1

На самом деле, у меня есть проект с различными CMakeLists: один для компиляций и один для модульных тестов (с тестированием goole) для каждого «модуля». У меня есть структура вроде этого:Опция CMake Set включена только в одном CMakeLists

module_1
- | ЦСИ
--CMakeLists.txt // для компиляции модуля 1
--test
---- | CMakeLists.txt // для модульных тестов модуля 1

module_2
- | ЦСИ
--CMakeLists.txt // для компиляции модуля 2
--test
---- | CMakeLists // для единичных испытаний модуль 2

Теперь моя цель - создать только один CMakeLists.txt для каждого модуля и выполнить компиляцию и модульный тест в том же CMakeLists.txt. Поэтому я делаю OPTION в моем CMakeLists.txt (для компиляции), который запускает тест.

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 линии)

Как я могу сделать что ?

Если вы хотите получить больше информации, скажите мне

Спасибо advnace за помощь.

ответ

1

О тестировании, мой любимый путь позволяет испытывать с двумя условиями:

  • Переменная TEST_ENABLED является ON
  • Текущий проект является основным проектом для CMake

Второе условие может быть протестирована с PROJECT_NAME и CMAKE_PROJECT_NAME

Источник: https://stackoverflow.com/a/8587949/1380225

Пример:

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

Это работает прекрасно. благодаря – Algorys

2

Параметры и другие параметры, заданные пользователем, устанавливаются глобально для проекта, поэтому они влияют на все его части.

Вы можете использовать различные вариантов для разных частей вами проект:

module1/CMakeLists.txt:

option(TEST1_ENABLED 
    "Test for module 1" 
    OFF 
) 

... 

В качестве альтернативы, в случае, если испытания, вы можете использовать единый USER- поставляемый параметр, перечисляющий все модули, для которых необходимо установить опцию:

CMakeLists.txt :

set(TESTS_LIST "" CACHE STRING "List of tests") 

module1/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.

Смежные вопросы