| CMP0220 | |
| ------- | |
| .. versionadded:: 4.5 | |
| Languages enabled in subdirectories propagate to the top-level directory. | |
| In CMake 4.4 and below, enabling a language with the :command:`project` | |
| command or :command:`enable_language` command had some restrictions: | |
| * It had to be called in file scope, not in a :command:`function` call | |
| nor inside a :command:`block`. | |
| * It had be called in the highest directory common to all targets | |
| using the named language directly for compiling sources or | |
| indirectly through link dependencies. | |
| While these restrictions could be met by enabling all needed languages | |
| in the top-level directory of a project, this was not always easy. | |
| CMake 4.5 and above prefer to relax these restrictions so that languages | |
| enabled by calls to the :command:`project` and :command:`enable_language` | |
| commands in subdirectories are available to targets created in ancestor | |
| and sibling directories created afterward. This policy provides | |
| compatibility with projects that have not been updated for the new behavior. | |
| One may think of an :command:`add_subdirectory` call as an effective call | |
| site to :command:`enable_language` for languages enabled inside the | |
| subdirectory's tree. Similarly, for languages enabled in :command:`function` | |
| and :command:`block` scopes, the function or :command:`endblock` calls are | |
| effectively call sites to :command:`enable_language`. | |
| This policy is evaluated independently at each "effective call site", | |
| proceeding up the stack of variable scopes to determine if the language | |
| should be enabled at that level. This propagation stops at the first | |
| ancestor scope whose ``CMP0220`` is not ``NEW``. For example: | |
| .. code-block:: cmake | |
| cmake_policy(SET CMP0220 NEW) | |
| block() | |
| cmake_policy(SET CMP0220 OLD) | |
| block() | |
| cmake_policy(SET CMP0220 NEW) | |
| block() | |
| cmake_policy(SET CMP0220 OLD) | |
| enable_language(CXX) | |
| # CXX is enabled in this scope | |
| endblock() | |
| # CXX is enabled in this scope | |
| endblock() | |
| # CXX is not enabled in this scope | |
| endblock() | |
| # CXX is not enabled in this scope | |
| .. |INTRODUCED_IN_CMAKE_VERSION| replace:: 4.5 | |
| .. |WARNS_OR_DOES_NOT_WARN| replace:: does *not* warn by default | |
| .. include:: include/STANDARD_ADVICE.rst | |
| See documentation of the | |
| :variable:`CMAKE_POLICY_WARNING_CMP0220 <CMAKE_POLICY_WARNING_CMP<NNNN>>` | |
| variable to control the warning. | |
| .. include:: include/DEPRECATED.rst |