简体   繁体   English

编译器标志在CMake中检查了两次CHECK_CXX_COMPILER_FLAG

[英]Compiler flag checked twice in CMake CHECK_CXX_COMPILER_FLAG

I use a custom macro to check and add a compiler flag to the compilation in CMAKE. 我使用自定义宏来检查并将编译器标志添加到CMAKE中的编译中。 The code I use for this is that: 我为此使用的代码是:

MACRO(CheckAndAddFlag flag)
    # We cannot check for -Wno-foo as this won't throw a warning so we must check for the -Wfoo option directly
    # http://stackoverflow.com/questions/38785168/cc1plus-unrecognized-command-line-option-warning-on-any-other-warning
    STRING(REGEX REPLACE "^-Wno-" "-W" checkedFlag ${flag})
    SET(VarName ${checkedFlag})
    STRING(REPLACE "+" "X" VarName ${VarName})
    STRING(REPLACE "-" "_" VarName ${VarName})
    # Avoid double checks. A compiler will not magically support a flag it did not before
    MESSAGE(STATUS "Checking CXX_FLAG_${VarName}_SUPPORTED. Checked? ${VarName}_CHECKED= ${${VarName}_CHECKED} end")
    if(NOT ${VarName}_CHECKED)
        CHECK_CXX_COMPILER_FLAG(${checkedFlag} CXX_FLAG_${VarName}_SUPPORTED)
        CHECK_C_COMPILER_FLAG(${checkedFlag} C_FLAG_${VarName}_SUPPORTED)
        set(${VarName}_CHECKED YES CACHE INTERNAL "")
        MESSAGE(STATUS "Checked CXX_FLAG_${VarName}_SUPPORTED. Checked? ${VarName}_CHECKED= ${${VarName}_CHECKED} end")
    endif()
    IF (CXX_FLAG_${VarName}_SUPPORTED)
        set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${flag}")
    ENDIF ()
    IF (C_FLAG_${VarName}_SUPPORTED)
        set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${flag}")
    ENDIF ()
    unset(VarName)
    unset(checkedFlag)
ENDMACRO()

And I call it eg with: 我称它为:

CheckAndAddFlag("-Wno-error=type-limits")
CheckAndAddFlag("-Wfloat-conversion")

Normally it should only check each flag once, set its variable and following runs of CMake should find this and don't check it again (try_compile with MSVC is painfully slow) 通常,它应该只检查每个标志一次,设置其变量,然后在CMake的运行中应找到该标志,而不要再次检查它(使用MSVC的try_compile速度很慢)
It does work for most of the flags, but it does not work with -Wno-error=type-limits . 它适用于大多数标志,但不适用于-Wno-error=type-limits Here the flag gets double checked according to the output. 在此,根据输出对标志进行仔细检查。 Hence I added the _CHECKED variable to work around this, but even this does not work. 因此,我添加了_CHECKED变量来解决此问题,但即使这样也不起作用。 It sill gets checked again. 窗台再次被检查。

Some output: 一些输出:

Checking CXX_FLAG__Werror=type_limits_SUPPORTED. Checked? _Werror=type_limits_CHECKED=  end
Performing Test CXX_FLAG__Werror=type_limits_SUPPORTED
Performing Test CXX_FLAG__Werror=type_limits_SUPPORTED - Failed
Performing Test C_FLAG__Werror=type_limits_SUPPORTED
Performing Test C_FLAG__Werror=type_limits_SUPPORTED - Failed
Checked CXX_FLAG__Werror=type_limits_SUPPORTED. Checked? _Werror=type_limits_CHECKED= YES end
Checking CXX_FLAG__Wfloat_conversion_SUPPORTED. Checked? _Wfloat_conversion_CHECKED= YES end
Checking CXX_FLAG__Wlong_long_SUPPORTED. Checked? _Wlong_long_CHECKED= YES end

Any ideas why this is happening? 任何想法为什么会这样? Why does the variable get set but is unset in the next CMAKE run and why only this? 为什么在下一次CMAKE运行中设置变量但未设置变量,为什么只设置此变量?

You are confusing CMake with your = sign in variable names? 您将CMake与=符号变量名混淆了吗?

Try this instead: 尝试以下方法:

STRING(REGEX REPLACE "[-=]" "_" VarName ${VarName})

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM