Как можно создать несколько «вкусов» цели и ее зависимостей из одной сборки CMake?

#cmake #target

Вопрос:

Я использую систему сборки на основе cmake. Я хочу сгенерировать две версии одного конкретного исполняемого файла, отличающиеся

  • Определенные определения (скажем, набор определений-это A в одной версии, а набор определений-B в другой) и
  • Библиотеки, с которыми связаны эти две версии.
  • Обратите внимание, что некоторые библиотеки в двух версиях сами должны быть построены с использованием определений в наборе A или в B.

Один из способов, которым я могу подумать о создании обоих исполняемых файлов в одной сборке, заключается в создании нескольких целевых объектов:

add_executable(app_A ...)
add_executable(app_B ...)

и затем,

target_link_libraries(app_A lib1_A lib2_A lib3) target_link_libraries(app_B lib1_B lib2_B lib3) .

Однако это требует, чтобы я также создавал целевые объекты для каждой общей библиотеки и, по сути, поддерживал два параллельных набора целевых объектов на протяжении всего процесса. Есть ли лучший способ сделать что-то подобное? Я действительно хочу, чтобы одна сборка создавала оба варианта исполняемого файла вместо двух команд cmake с разными определениями.

Комментарии:

1. В CMake цель исполняемого файла обозначает специально скомпилированный и связанный исполняемый файл. То есть, если вы хотите скомпилировать/связать исполняемый файл с разными параметрами , вам нужно создать разные целевые объекты. Если создание этих целевых объектов включает много общих шагов, то вы можете реализовать эти шаги в функции или макросе и вызвать эту функцию (макрос) несколько раз. Кстати, почему вы настаиваете на единой сборке? Во многих случаях проще настроить и построить проект CMake несколько раз с различными параметрами, чем поддерживать иерархию нескольких целей в одной сборке.

2. Спасибо. Причина, по которой я рассматриваю одну сборку, заключается в том, чтобы уменьшить накладные расходы на компиляцию проекта. Если это создание нескольких целей является единственным возможным подходом, то я понимаю, что мне придется оценить компромисс в затратах на начальную работу ремонтопригодность для поддержания двух наборов целей для группы целей по сравнению с получением выкупа за решение из двух сборок от моих повелителей.