option() honors normal variables.
The option() command is typically used to create a cache entry to allow users to set the option. However, there are cases in which a normal (non-cached) variable of the same name as the option may be defined by the project prior to calling the option() command. For example, a project that embeds another project as a subdirectory may want to hard-code options of the subproject to build the way it needs.
For historical reasons in CMake 3.12 and below the option() command removes a normal (non-cached) variable of the same name when:
In both of these cases (typically on the first run in a new build tree), the option() command gives the cache entry type BOOL and removes any normal (non-cached) variable of the same name. In the remaining case that the cache entry of the specified name already exists and has a type (typically on later runs in a build tree), the option() command changes nothing and any normal variable of the same name remains set.
In CMake 3.13 and above the option() command prefers to do nothing when a normal variable of the given name already exists. It does not create or update a cache entry or remove the normal variable. The new behavior is consistent between the first and later runs in a build tree. This policy provides compatibility with projects that have not been updated to expect the new behavior.
When the option() command sees a normal variable of the given name:
This policy was introduced in CMake version 3.13. CMake version 3.18.2 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.