CMP0054

警告

此策略的 OLD 行为已在 CMake 4.0 版本中移除。此策略必须通过调用 cmake_minimum_required()cmake_policy() 来设置为 NEW

版本 3.1 中新增。

仅当 if() 命令的参数未加引号时,才将其解释为变量或关键字。

CMake 3.1 及以上版本在 if() 命令的参数是 带引号的参数括号参数 时,不再隐式解引用变量或解释关键字。

此策略的 OLD 行为是解引用变量并解释关键字,即使它们被加引号或用括号括起来。 NEW 行为是不解引用被加引号或用括号括起来的变量或关键字。

给定以下部分示例

set(A E)
set(E "")

if("${A}" STREQUAL "")
  message("Result is TRUE before CMake 3.1 or when CMP0054 is OLD")
else()
  message("Result is FALSE in CMake 3.1 and above if CMP0054 is NEW")
endif()

显式展开变量后,这会产生

if("E" STREQUAL "")

当策略设置为 OLD 时,隐式展开在语义上将其简化为

if("" STREQUAL "")

当策略设置为 NEW 时,带引号的参数将不再被进一步解引用

if("E" STREQUAL "")

此策略在 CMake 版本 3.1 中引入。在 CMake 版本 4.0 中移除之前,可以通过 cmake_policy()cmake_minimum_required() 来设置。如果未设置,CMake 会发出警告并使用 OLD 行为。