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, я действительно не понял ответ.

Спасибо большое за вашу помощь.

0 ответов

Другие вопросы по тегам