[cmake-developers] Surprising CMP0054 behavior

Brad King brad.king at kitware.com
Mon Mar 26 08:51:30 EDT 2018

On 03/26/2018 08:07 AM, Craig Scott wrote:
> Am I missing something, or is the following result surprising to others as well:
> set(somevar YES)
> if ("somevar")
>     message("Get here if CMP0054 is OLD (seems okay)")
> else()
>     message("Get here if CMP0054 is NEW (surprising?)")
> endif()
> I would have thought that even with CMP0054 being NEW, the if condition would
> still evaluate to true since it is going to test a non-empty string that
> doesn't match any of the defined false constants.

The observed behavior is consistent with the documentation.

`if(<constant>)` enumerates a set of true/false constants and says
that if it is not one of these then it uses `if(<variable|string>)`.
That is true only if it is a variable that is defined to a value that
is not a false constant.  With CMP0054 NEW behavior, `if("string")`
is always treated as the *string* variant which is never a variable
defined to anything.


More information about the cmake-developers mailing list