#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. Спасибо. Причина, по которой я рассматриваю одну сборку, заключается в том, чтобы уменьшить накладные расходы на компиляцию проекта. Если это создание нескольких целей является единственным возможным подходом, то я понимаю, что мне придется оценить компромисс в затратах на начальную работу ремонтопригодность для поддержания двух наборов целей для группы целей по сравнению с получением выкупа за решение из двух сборок от моих повелителей.