| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697 |
- 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
|