В cmake куча способов установить ключи компиляции:
# 1. Варварский:
set(CMAKE_CXX_FLAGS …)
# 2. Простой:
add_compile_options(…)
# 3. Быдляче-деприкейтный:
add_definitions(…)
# 4. Можно добавлять специфично для цели:
target_compile_options(target PRIVATE …)
# 5. Можно изменять свойства целей напрямую:
set_target_properties(target PROPERTIES COMPILE_OPTIONS …)
set_target_properties(target PROPERTIES COMPILE_FLAGS …)
set_target_properties(target PROPERTIES COMPILE_DEFINITIONS …)
# 6. Есть переменные, неявно аффектящие ключи:
set(CMAKE_CXX_STANDARD 14)
# 7. Есть переменные, специфичные для типа билда:
set(CMAKE_CXX_FLAGS_DEBUG …)
# 8. Можно дать CMake самостоятельно вычислить необходимые ключи:
target_compile_features(target PRIVATE cxx_constexpr)
# И возможно есть ещё
И это немного взрывает мозг. Понятно, что узнать, как компилируется конкретная цель можно, через make VERBOSE=1
. Но, допустим, у меня есть модуль, который опирается на ключи компиляции для конкретной цели: как мне в таком случае узнать ключи, с которыми она будет компилироваться?
Пока ничего лучше этого придумать не смог:
function(get_compile_options _target)
set(_target_dir "$<TARGET_PROPERTY:${_target},INCLUDE_DIRECTORIES>")
set(_target_def "$<TARGET_PROPERTY:${_target},COMPILE_DEFINITIONS>")
# и далее в том же духе
set(_all_options "${CMAKE_CXX_FLAGS}${_target_def}${_target_dir}…")
endfunction()