Каков современный метод установки общих флагов компиляции в CMake?


Существует несколько механизмов, предлагаемых CMake для получения флагов компилятору:

есть ли один метод, который предпочтительнее другого в современном использовании? Если да, то почему? Кроме того, как этот метод может использоваться с несколькими системами конфигурации, такими как MSVC?

1 61

1 ответ:

для современного CMake (версии 2.8.12 и выше) вы должны использовать target_compile_options, который использует целевые свойства внутренне.

CMAKE_<LANG>_FLAGS является глобальной переменной и наиболее подвержена ошибкам в использовании. Он также не поддерживает выражений генератор, что может очень пригодиться.

add_compile_options основан на свойствах каталога, что прекрасно в некоторых ситуациях, но обычно не самый естественный способ указать параметры.

target_compile_options работает на целевой основе (через установку COMPILE_OPTIONS и INTERFACE_COMPILE_OPTIONS target properties), что обычно приводит к самому чистому коду CMake, поскольку параметры компиляции для исходного файла определяются тем, к какому проекту принадлежит файл (а не к какому каталогу он помещен на жесткий диск). Это имеет дополнительное преимущество, что она автоматически заботится о передаче параметров на к зависимым целям, если запрошенный.

несмотря на то, что они немного более подробны, команды для каждой цели позволяют достаточно мелкозернистый контроль над различными вариантами сборки и (по моему личному опыту) наименее вероятно, чтобы вызвать головные боли в долгосрочной перспективе.

в теории, вы также можете установить соответствующие свойства непосредственно с помощью 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}>")