CMake неправильно определяет допустимые параметры компилятора C ++? - PullRequest
0 голосов
/ 02 июля 2019

У меня есть набор потенциальных флагов компилятора 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_FLAGSadd_compile_options() изменит результат теста ПРЕДЫДУЩАЯ и использования третьей функции.

Итак, вопрос в следующем: Я делаю что-то, чего не должен делать?Или я наткнулся на настоящую ошибку?

Я не смог найти ничего похожего в базе знаний, и когда я опубликовал проблему в CMake bug tracker , я действительно не заметилНе понимаю ответ.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...