Существует ли общий способ отключения исполняемых целей в 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()