CMP0200¶
版本 4.2 中添加。
导入目标的配置和配置选择更加一致。
CMake 过去选择用于导入目标的配置的方式,优先根据候选配置的 location 属性进行选择,仅将 IMPORTED_CONFIGURATIONS 作为备选。这可能导致配置选择不正确,尤其对于 INTERFACE 库。
CMake 4.2 及以上版本将 IMPORTED_CONFIGURATIONS 视为可用配置的确定列表,无论是否为库提供了特定于配置的 location。此外,当未指定特定于配置的 location 时,CMake 将尊重非特定于配置的 locations。
此策略提供了与依赖历史行为的项目兼容性。策略设置应用于目标,并在创建导入目标时记录。因此,导入的包可能会覆盖消费者为它们创建的目标设置的策略。特别是,从 Common Package Specification 包导入的目标始终使用 NEW 行为。
此策略的 OLD 行为是保留历史行为。 NEW 行为优先根据广告的可用配置列表进行选择。下面详细描述了这两种行为。
此策略在 CMake 版本 4.2 中引入。它可以由 cmake_policy() 或 cmake_minimum_required() 设置。如果未设置,CMake 会发出警告并使用 OLD 行为。
注意
策略的 OLD 行为 根据定义已被弃用,并可能在未来的 CMake 版本中被移除。
映射配置选择¶
如果在导入目标上设置了 MAP_IMPORTED_CONFIG_<CONFIG>(其中 <CONFIG> 是消耗目标的配置),CMake 过去会从该列表中选择第一个提供特定于配置的 location 的配置。如果没有这样的配置,CMake 将选择消耗目标的配置,如果导入的目标是 INTERFACE 库。否则,CMake 将认为目标没有合适的配置。
对于不提供 location 的 INTERFACE 库,这会导致 CMake 始终选择消耗目标的配置,并有效地忽略 MAP_IMPORTED_CONFIG_<CONFIG>。此行为与提供 location 的导入目标的配置选择不一致。
在 NEW 行为下,CMake 选择映射中出现在 IMPORTED_CONFIGURATIONS 中的第一个配置。如果未设置 IMPORTED_CONFIGURATIONS,CMake 将选择映射中“可用”的第一个配置。“可用”对于非 INTERFACE 库意味着存在一个 location(特定于配置或与配置无关)。INTERFACE 库始终被认为是“可用”的。
如果没有找到匹配项,CMake 将认为目标没有合适的配置。
非映射配置选择¶
如果未设置 MAP_IMPORTED_CONFIG_<CONFIG>,CMake 过去会从以下列表中选择第一个提供 location 的配置:
消耗目标的配置,或
空配置,或
IMPORTED_CONFIGURATIONS中的配置列表。
作为实现细节,这会导致 CMake 为不提供 location 的 INTERFACE 库选择 IMPORTED_CONFIGURATIONS 中的最后一个配置。同样,此行为与提供 location 的导入目标的配置选择不一致。
在 NEW 行为下,如果设置了 IMPORTED_CONFIGURATIONS,CMake 将选择其中存在的消耗目标的配置,否则 CMake 将选择第一个导入的配置。如果未设置 IMPORTED_CONFIGURATIONS,CMake 将选择“可用”(在上一节中定义)的消耗目标的配置;否则,CMake 将认为目标没有合适的配置。
示例¶
考虑以下导入的库
add_library(test INTERFACE IMPORTED)
set_target_properties(test PROPERTIES
IMPORTED_CONFIGURATIONS "RELEASE;DEBUG"
INTERFACE_COMPILE_DEFINITIONS "$<$<CONFIG:debug>:DEBUG>"
)
在 OLD 策略下,CMake 将为任何链接到 test 的目标选择 test 的 DEBUG 配置(因此定义符号 DEBUG),因为 CMake 不认为任何配置“有效”,并且作为实现细节,接受了最后一个被考虑的配置。
在 NEW 策略下,如果消耗项目在 Debug 以外的任何配置中构建(请记住配置匹配不区分大小写),则将选择 RELEASE 配置。这是因为如果消耗者的配置也是 DEBUG,则会优先选择 DEBUG,但否则会优先选择 RELEASE,因为它首先出现在 IMPORTED_CONFIGURATIONS 中,并且其在其中的出现使其成为 INTERFACE 库的“有效”配置。