CMake: как исключить каталог для данной конфигурации сборки? - PullRequest
2 голосов
/ 12 марта 2012

У меня есть проект под Visual Studio 2008, настроенный с использованием CMake.Для этого проекта у меня есть три конфигурации сборки: «отладка», «выпуск», «тест».Все мои файлы C ++ разделены на несколько каталогов в соответствии с их функциональностью (Model, View, Controller, ...).Один каталог называется «test» и содержит файлы, которые предназначены только для конфигурации «test».

Следовательно, с CMake я должен скомпилировать файлы, которые есть во всех каталогах, если конфигурация«test», но исключите каталог «test», если конфигурация «debug» или «release».

Ответы [ 2 ]

1 голос
/ 14 марта 2012

Обычно "тесты" - это цель или цели, а не конфигурация сборки.

Я полагаю, что ваша конфигурация тестов копирует большинство своих настроек из Debug или Release, что означает, что вы либо тестируете код выпуска(и, следовательно, теряет способность эффективно отлаживать) или тестирует код отладки (что означает, что вы на самом деле не тестируете код, который планируете выпустить).

Если «tests» является целью CMake, вы можете собратьи запустите его в режиме Debug или Release.Для этого я предполагаю, что это будет что-то вроде:

SET(all_files_in_test_dir ...)
ADD_EXECUTABLE(TestAll ${all_files_in_test_dir})
TARGET_LINK_LIBRARIES(TestAll ModelLib ViewLib ControllerLib ...)

Это предполагает, что цели, включающие Model, View и Controller, являются библиотеками, которые вы ранее добавили, используя ADD_LIBRARY(ModelLib ...) и т. Д.

Если вы сделаете это таким образом, еще одним преимуществом будет то, что, имея только два типа конфигурации, вам придется тратить меньше времени на создание проекта.

Если вы действительно делаете хотите уйти "тесты "как тип конфигурации, то я думаю, что ответ ComicSansMS - это путь.

1 голос
/ 13 марта 2012

К сожалению, в настоящее время это невозможно из-за отсутствия свойства, которое контролирует функцию «Исключить из сборки» в Visual Studio. Есть CMake EXCLUDE_FROM_ALL , но это, вероятно, слишком грубо для вашего сценария.

В списке рассылки CMake есть хак , который пытается этого добиться, но это определенно не очень хорошее решение.

Самый простой способ - использовать защитные элементы препроцессора для источников тестирования и определять только соответствующий флаг препроцессора для профиля "test". В ваших списках CMakeList:

set_property( DIRECTORY test 
              APPEND PROPERTY COMPILE_DEFINITIONS_TEST DO_THE_TESTS
            )

В каждом исходном файле:

#ifdef DO_THE_TESTS
     ...
#endif
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...