CMake неправильно определяет допустимые параметры компилятора C++?
У меня есть набор потенциальных флагов компилятора C++, хранящихся в переменной, и над ней я запускаю следующий тест на CMake 3.14.5, чтобы увидеть, какие из них применимы, а какие нет к определенной версии компилятора (I'm с использованием GCC, CLANG и ICC для компиляции одного и того же проекта, поэтому необходимо применять к каждому только соответствующие флаги):
foreach (FLAG IN LISTS CXX_COMPILER_FLAGS_TO_USE)
# Check if the compiler supports the flag.
string(REGEX REPLACE "[-=+]" "" FLAG_NO_SIGNS ${FLAG}) # <- The variable recieving the result of the test can't have those signs in its name
check_cxx_compiler_flag(${FLAG} CXX_COMPILER_SUPPORTS_${FLAG_NO_SIGNS})
if(CXX_COMPILER_SUPPORTS_${FLAG_NO_SIGNS})
message(STATUS "Flag ${FLAG} accepted by C++ compiler")
string(APPEND CMAKE_CXX_FLAGS " ${FLAG}")
else()
message(STATUS "Flag ${FLAG} not accepted by C++ compiler")
endif()
endforeach()
Для GCC 8 и -Wabi
флаг, я получаю:
-- Performing Test CXX_COMPILER_SUPPORTS_Wabi
-- Performing Test CXX_COMPILER_SUPPORTS_Wabi - Failed
-- Flag -Wabi not accepted by C++ compiler
Теперь, если вместо нажатия на флаги внутри CMAKE_CXX_FLAGS
, Я использую add_compile_options()
, результат моего теста меняется!!!
foreach (FLAG IN LISTS CXX_COMPILER_FLAGS_TO_USE)
# Check if the compiler supports the flag.
string(REGEX REPLACE "[-=+]" "" FLAG_NO_SIGNS ${FLAG})
check_cxx_compiler_flag(${FLAG} CXX_COMPILER_SUPPORTS_${FLAG_NO_SIGNS})
if(CXX_COMPILER_SUPPORTS_${FLAG_NO_SIGNS})
message(STATUS "Flag ${FLAG} accepted by C++ compiler")
add_compile_options($<$<COMPILE_LANGUAGE:CXX>:${FLAG}>) # <- ONLY THIS LINE CHANGED
else()
message(STATUS "Flag ${FLAG} not accepted by C++ compiler")
endif()
endforeach()
Тест для -Wabi
сейчас сообщает:
-- Performing Test CXX_COMPILER_SUPPORTS_Wabi
-- Performing Test CXX_COMPILER_SUPPORTS_Wabi - Success
-- Flag -Wabi accepted by C++ compiler
Что приводит к сбою второго случая во время компиляции позже:
cc1plus: error: -Wabi won't warn about anything [-Werror=abi]
Это как add_compile_options()
изменил бы результат check_cxx_compiler_flag()
, что странно, так как последний работает до первого.
Просто из любопытства я объединил оба подхода в одном тесте (который может показаться излишним):
add_compile_options($<$<COMPILE_LANGUAGE:CXX>:${FLAG}>)
string(APPEND CMAKE_CXX_FLAGS " ${FLAG}")
и это работает, то есть -Wabi
НЕ добавляется в параметры компиляции для файлов C++.
Я не ожидал бы, что замена использования CMAKE_CXX_FLAGS
по add_compile_options()
изменил бы результат теста, сделанного ПРЕДЫДУЩАЯ и используя третью функцию.
Итак, вопрос: я делаю что-то, чего не должен делать? Или я столкнулся с настоящей ошибкой?
Я не смог найти ничего похожего в базе знаний, и когда я опубликовал проблему в трекере ошибок CMake, я действительно не понял ответ.
Спасибо большое за вашу помощь.