Для сучасного CMake (версії 2.8.12 і новіших) ви повинні використовувати target_compile_options, який використовує цільові властивості внутрішньо.
CMAKE_<LANG>_FLAGSє глобальною змінною і найбільш схильною до використання. Він також не підтримує генераторські вирази , які можуть стати в нагоді.
add_compile_options базується на властивостях каталогу, що в деяких ситуаціях добре, але, як правило, не найприродніший спосіб вказати параметри.
target_compile_optionsпрацює на основі цілі (шляхом встановлення властивостей COMPILE_OPTIONSі INTERFACE_COMPILE_OPTIONStarget), що зазвичай призводить до найчистішого коду 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}>")