| CMP0199 | |
| ------- | |
| .. versionadded:: 4.2 | |
| :genex:`$<CONFIG:cfgs>` does not match mapped configurations that are not | |
| selected. | |
| Historically, when a :genex:`$<CONFIG:cfgs>` generator expression appeared in | |
| the properties of an imported target, it would match (that is, evaluate to | |
| ``1``) if any of the ``cfgs`` matched *any* of the following: | |
| 1. The selected configuration of the imported target being consumed. | |
| 2. The configuration of the consuming target. | |
| 3. *Any* of the configurations in the :prop_tgt:`MAP_IMPORTED_CONFIG_<CONFIG>` | |
| of the imported target being consumed | |
| (where ``<CONFIG>`` is the configuration of the consuming target), | |
| *whether or not such configurations are valid for the imported target*. | |
| This can result in expressions which are intended to be mutually exclusive | |
| being concurrently evaluated. This can be especially problematic if the value | |
| of a compile definition is intended to be determined by the configuration, as | |
| this lack of exclusivity could result in redefinition. | |
| CMake 4.2 and above prefer to consider *only* the configuration of the | |
| consuming target and (when applicable) the selected configuration of the | |
| imported target; that is, (2) and (1) in the above list. Unfortunately, | |
| because users rely on both of these, this policy is not able to fully prevent | |
| multiple unique ``$<CONFIG:cfg>`` expressions from matching concurrently. | |
| This policy provides compatibility with projects that rely on the historical | |
| behavior. The ``OLD`` behavior for this policy is to retain the historic | |
| behavior as described above. The ``NEW`` behavior is to consider only the | |
| configurations of the consuming and consumed targets. | |
| .. note:: | |
| This policy only applies to generator expressions being evaluated as part of | |
| the usage requirements of imported targets which are not imported from |CPS| | |
| packages. | |
| For non-imported targets, both the historic and ongoing behavior is to | |
| consider only the configuration of the consuming target. (The selected | |
| configuration of a non-imported target is always the active build | |
| configuration, which is necessarily the same as the consuming target's | |
| configuration.) | |
| For targets imported from |CPS| packages, **only** the configuration of the | |
| consumed imported target is considered, regardless of the policy setting. | |
| .. |INTRODUCED_IN_CMAKE_VERSION| replace:: 4.2 | |
| .. |WARNS_OR_DOES_NOT_WARN| replace:: warns | |
| .. include:: include/STANDARD_ADVICE.rst | |
| .. include:: include/DEPRECATED.rst | |
| Examples | |
| ^^^^^^^^ | |
| Consider the following imported libraries: | |
| .. code-block:: cmake | |
| add_library(test1 INTERFACE IMPORTED) | |
| set_target_properties(test1 PROPERTIES | |
| IMPORTED_CONFIGURATIONS "DEBUG" | |
| INTERFACE_COMPILE_DEFINITIONS | |
| "$<$<CONFIG:debug>:DEBUG>;$<$<CONFIG:release>:RELEASE>" | |
| ) | |
| add_library(test2 INTERFACE IMPORTED) | |
| set_target_properties(test2 PROPERTIES | |
| IMPORTED_CONFIGURATIONS "TEST" | |
| INTERFACE_COMPILE_DEFINITIONS | |
| "$<$<CONFIG:debug>:DEBUG>;$<$<CONFIG:example>:EXAMPLE>;$<$<CONFIG:test>:TEST>" | |
| MAP_IMPORTED_CONFIG_RELEASE "DEBUG;EXAMPLE;TEST" | |
| ) | |
| Assume that the consuming project is built in the ``Release`` configuration. | |
| A consumer of ``test1`` will see both ``DEBUG`` and ``RELEASE`` defined, | |
| regardless of the policy setting; ``$<CONFIG:debug>`` evaluates to ``1`` | |
| because the selected configuration of ``test1`` is ``DEBUG``, and | |
| ``$<CONFIG:release>`` evaluates to ``1`` because the consumer's configuration | |
| is ``Release`` (keeping in mind that configuration matching is | |
| case-insensitive). | |
| Under the ``OLD`` policy, a consumer of ``test2`` would see all of ``DEBUG``, | |
| ``EXAMPLE`` and ``TEST`` defined; ``$<CONFIG:debug>``, ``$<CONFIG:example>`` | |
| and ``$<CONFIG:test>`` all evaluate to ``1`` because all of these | |
| configurations appear in ``MAP_IMPORTED_CONFIG_RELEASE``. | |
| Under the ``NEW`` policy, a consumer of ``test2`` will see only ``TEST`` | |
| defined. | |
| .. |CPS| replace:: Common Package Specification |