[英]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.