Даниэль Пфайфер в своей презентации «Эффективный CMake» отмечает, что желательно избегать определений переменных, насколько это возможно.
Теперь о том, как получить свойства для различных целей сборки. То есть, например
target_include_directories(base_IncludeFlags
INTERFACE
first/dir
second/dir
...)
определяет набор включаемых каталогов. Вместо того, чтобы определять одни и те же включаемые каталоги для target_a
, target_b
и target_c
, я хотел бы позволить этим целям наследовать включаемые каталоги от 'base_target' с чем-то вроде
target_link_libraries(target_a PUBLIC base_IncludeFlags)
target_link_libraries(target_b PUBLIC base_IncludeFlags)
target_link_libraries(target_c PUBLIC base_IncludeFlags)
где base_IncludeFlags
не должен быть реальной физической целью, а скорее чем-то вроде абстрактного базового класса или интерфейса.
С другой стороны, я не хочу использовать include_directories
, так как это влияет на все цели. Лучше использовать foreach
? Каков самый элегантный способ сделать это? Должен ли я сделать base_target
библиотеку и добавить зависимости?
base_target
, которая может быть только библиотекой или исполняемым файлом (иначе вы не можете вызвать для нееtarget_inclide_directories
). Если это библиотека, вы можете просто использовать для нееtarget_link_libraries
. Если это исполняемый файл, почему вы хотите наследовать его свойства? Пожалуйста, уточните это. Шаблоны, предоставляемые CMake, предназначены не только для кода, но и для дизайна. Использование хорошего кода для плохого дизайна не так уж и хорошо. - person Tsyvarev   schedule 01.08.2018