CMake错误地标识有效的C ++编译器选项?

时间:2019-07-02 15:47:19

标签: cmake cmake-modules cmake-language

我在变量中存储了一组C ++潜在的编译器标志,并在其上进行了测试,我在CMake 3.14.5 上运行以下测试,以查看哪些适用和哪些不适用到特定版本的编译器(我使用 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 bug tracker时,我真的不理解响应。

非常感谢您的帮助。

0 个答案:

没有答案