# CMP0053

Simplify variable reference and escape sequence evaluation.

CMake 3.1 introduced a much faster implementation of evaluation of the Variable References and Escape Sequences documented in the `cmake-language(7)` manual. While the behavior is identical to the legacy implementation in most cases, some corner cases were cleaned up to simplify the behavior. Specifically:

- Expansion of `@VAR@` reference syntax defined by the `configure_file()` and `string(CONFIGURE)` commands is no longer performed in other contexts.

- Literal `${VAR}` reference syntax may contain only alphanumeric characters (`A-Z`, `a-z`, `0-9`) and the characters `_`, `.`, `/`, `-`, and `+`. Note that `$` is technically allowed in the `NEW` behavior, but is invalid for `OLD` behavior. This is due to an oversight during the implementation of `CMP0053` and its use as a literal variable reference is discouraged for this reason. Variables with other characters in their name may still be referenced indirectly, e.g.

      set(varname "otherwise & disallowed $ characters")
      message("${${varname}}")

- The setting of policy `CMP0010` is not considered, so improper variable reference syntax is always an error.

- More characters are allowed to be escaped in variable names. Previously, only `()#" \@^` were valid characters to escape. Now any non-alphanumeric, non-semicolon, non-NUL character may be escaped following the `escape_identity` production in the Escape Sequences section of the `cmake-language(7)` manual.

The `OLD` behavior for this policy is to honor the legacy behavior for variable references and escape sequences. The `NEW` behavior is to use the simpler variable expansion and escape sequence evaluation rules.

This policy was introduced in CMake version 3.1. CMake version 3.16.0-rc4 warns when the policy is not set and uses `OLD` behavior. Use the `cmake_policy()` command to set it to `OLD` or `NEW` explicitly.

Note

The `OLD` behavior of a policy is `deprecated by definition` and may be removed in a future version of CMake.