簡體   English   中英

編譯器標志在CMake中檢查了兩次CHECK_CXX_COMPILER_FLAG

[英]Compiler flag checked twice in CMake CHECK_CXX_COMPILER_FLAG

我使用自定義宏來檢查並將編譯器標志添加到CMAKE中的編譯中。 我為此使用的代碼是:

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()

我稱它為:

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

通常,它應該只檢查每個標志一次,設置其變量,然后在CMake的運行中應找到該標志,而不要再次檢查它(使用MSVC的try_compile速度很慢)
它適用於大多數標志,但不適用於-Wno-error=type-limits 在此,根據輸出對標志進行仔細檢查。 因此,我添加了_CHECKED變量來解決此問題,但即使這樣也不起作用。 窗台再次被檢查。

一些輸出:

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

任何想法為什么會這樣? 為什么在下一次CMAKE運行中設置變量但未設置變量,為什么只設置此變量?

您將CMake與=符號變量名混淆了嗎?

嘗試以下方法:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM