У меня есть набор потенциальных флагов компилятора C ++, хранящихся в переменной, и над ней я запускаю следующий тест на CMake 3.14.5 , чтобы увидеть, какие из них применимы, а какие нетопределенная версия компилятора (я использую GCC , CLANG и ICC для компиляции одного и того же проекта, поэтому необходимо применять к каждому только соответствующийflags):
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 bug tracker , я действительно не заметилНе понимаю ответ.
Большое спасибо за вашу помощь.