CMP0199

版本 4.2 中添加。

$<CONFIG:cfgs> 仅匹配所消费目标的配置。

历史上,当 $<CONFIG:cfgs> 生成器表达式出现在导入目标的属性中时,它会匹配(即,求值为 1),如果 cfgs 中的任何一个匹配 *以下任何一项*

  1. 所消费的导入目标的选定配置。

  2. 所消费目标的配置。

  3. 所消费导入目标的 MAP_IMPORTED_CONFIG_<CONFIG> 中的 *任何* 配置(其中 <CONFIG> 是所消费目标的配置),*无论这些配置是否对导入目标有效*。

这可能导致原本应互斥的表达式被同时求值。如果编译定义的取值本应由配置决定,那么这种非互斥性可能导致重定义,这将尤其成问题。

CMake 4.2 及以上版本倾向于 *仅* 考虑所消费导入目标的配置;即,列表(1)中的项。

此策略提供了与依赖于历史行为的项目兼容性。OLD 策略的行为是保留上述历史行为。 NEW 策略的行为是仅考虑所消费导入目标的配置。

注意

此策略仅适用于作为非从 Common Package Specification 包导入的导入目标的使用要求一部分而被求值的生成器表达式。

对于非导入目标,历史和当前行为都是仅考虑所消费目标的配置。(非导入目标的选定配置始终是活动的构建配置,它必然与所消费目标的配置相同。)

对于从 Common Package Specification 包导入的目标,无论策略设置如何,都使用 NEW 行为。

此策略是在 CMake 版本 4.2 中引入的。它可以由 cmake_policy()cmake_minimum_required() 设置。如果未设置,CMake 会发出警告并使用 OLD 行为。

注意

策略的 OLD 行为 根据定义已被弃用,并可能在未来的 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"
)

假设所消费项目是在 Release 配置下构建的。在 OLD 策略下,test1 的消费者将看到 DEBUGRELEASE 都被定义;$<CONFIG:debug> 的求值为 1,因为 test1 的选定配置是 DEBUG,而 $<CONFIG:release> 的求值为 1,因为消费者的配置是 Release(请记住配置匹配是不区分大小写的)。类似地,test2 的消费者将看到 DEBUGRELEASETEST 都被定义;$<CONFIG:debug>$<CONFIG:example>$<CONFIG:test> 的求值都为 1,因为所有这些配置都出现在 MAP_IMPORTED_CONFIG_RELEASE 中。

NEW 策略下,当消费 test1 时,只有 $<CONFIG:debug> 的求值将为 1。同样,当消费 test2 时,只有 $<CONFIG:test> 的求值将为 1。这两者都对应于 CMake 实际选定的被消费库的配置。