Для сучасного CMake (версії 2.8.12 і новіших) ви повинні використовувати target_compile_options
, який використовує цільові властивості внутрішньо.
CMAKE_<LANG>_FLAGS
є глобальною змінною і найбільш схильною до використання. Він також не підтримує генераторські вирази , які можуть стати в нагоді.
add_compile_options
базується на властивостях каталогу, що в деяких ситуаціях добре, але, як правило, не найприродніший спосіб вказати параметри.
target_compile_options
працює на основі цілі (шляхом встановлення властивостей COMPILE_OPTIONS
і INTERFACE_COMPILE_OPTIONS
target), що зазвичай призводить до найчистішого коду CMake, оскільки параметри компіляції вихідного файлу визначаються тим, до якого проекту належить файл (а не до якого каталогу він розміщений) на жорсткому диску). Це має додаткову перевагу в тому, що він автоматично піклується про передачу параметрів залежним цілям, якщо це вимагається.
Незважаючи на те, що вони трохи більш багатослівні, команди per-target дозволяють досить чітко контролювати різні варіанти збірки, і (з мого особистого досвіду) найменш вірогідно спричиняють головний біль у довгостроковій перспективі.
Теоретично ви також можете встановити відповідні властивості безпосередньо, використовуючи це set_target_properties
, але, target_compile_options
як правило, це читабельніше.
Наприклад, щоб встановити параметри компіляції цілі foo
на основі конфігурації, використовуючи вирази генератора, ви можете написати:
target_compile_options(foo PUBLIC "$<$<CONFIG:DEBUG>:${MY_DEBUG_OPTIONS}>")
target_compile_options(foo PUBLIC "$<$<CONFIG:RELEASE>:${MY_RELEASE_OPTIONS}>")