Существует ли общий способ отключения исполняемых целей в cmake
С нашей системой сборки CMake я собираю несколько библиотек и несколько исполняемых файлов. Все продукты сборки выводятся в определенную папку.
Теперь проблема в том, что у меня есть набор инструментов VS2010 и VS2008, но мне нужен только набор инструментов VS2008 для библиотек VS2008. Выходные исполняемые файлы являются целью win32 для обеих цепочек инструментов, поэтому мне нужно собрать исполняемые файлы только один раз с помощью цепочки инструментов VS2010, в то время как цепочка инструментов VS2008 должна просто пропустить исполняемые файлы и собрать только нужные библиотеки (что экономит время сборки).
Базовые сценарии CMake и общая настройка также могут быть доставлены клиентам в будущем, поэтому было бы очень хорошо, если бы в CMake был способ отключить определенные цели, такие как все исполняемые файлы, в общем виде. В противном случае мне нужно написать много больших IF( BUILD_EXECUTABLES)... ENDIF()
вокруг моих настроек исполняемых файлов в моем CMakeLists.txt
, без CMake, выдающего мне ошибки, когда я их забываю.
Сборка запускается через некоторые командные файлы. В идеале я хочу передать переменную в cmake
помощью опции -D
(например, -D BUILD_EXECUTABLES=false
)
Я пытался обернуть макросы ADD_EXECUTABLE
но это не работает, так как у меня есть такие вызовы, как TARGET_LINK_LIBRARIES
которые потом жалуются на несуществующую цель.
Я мог бы также установить выходной каталог в какую-нибудь папку для мусора, которую потом можно будет удалить, но это (как уже упоминалось) не сэкономит время сборки. (У нас довольно огромный проект.)
Любые идеи о том, как сделать это простым и понятным способом?
Ответы
Ответ 1
Цели CMake имеют два свойства, которые управляют, если цель построена по умолчанию. Первый - EXCLUDE_FROM_ALL
. Он указывает, исключена ли цель из целевого объекта сборки по умолчанию. Для генераторов Makefile ввод make
не приведет к созданию сборки, у которого свойство EXCLUDE_FROM_ALL
установлено на 1.
Другой - EXCLUDE_FROM_DEFAULT_BUILD
и применим только к генераторам Visual Studio. Если он установлен в 1, цель не будет частью сборки по умолчанию при вызове команды меню "Создать решение".
Вы можете установить значения обоих свойств для исполняемых целей в зависимости от опции BUILD_EXECUTABLES
:
if (NOT BUILD_EXECUTABLES)
set_target_properties(exe1 exe2 PROPERTIES EXCLUDE_FROM_ALL 1 EXCLUDE_FROM_DEFAULT_BUILD 1)
endif()