CMP0114

在版本 3.19 中添加。

ExternalProject 步骤目标完全采用它们的步骤。

可以使用 ExternalProject_Add() STEP_TARGETS 选项和 ExternalProject_Add_StepTargets() 函数为外部项目的各个步骤创建构建目标。

在 CMake 3.18 及更低版本中,步骤目标有一些限制

  • 即使并非所有步骤都需要,步骤目标始终依赖于 ExternalProject_Add() DEPENDS 选项命名的目标。为了允许在没有这些依赖项的情况下创建步骤目标,可以使用 ExternalProject_Add() INDEPENDENT_STEP_TARGETS 选项或 ExternalProject_Add_StepTargets() NO_DEPENDS 选项。但是,添加此类“独立的”步骤目标仅对特定步骤(例如 `download`、`update` 和 `patch`)有意义,因为它们不需要任何外部项目的构建依赖项。此外,为依赖于非独立步骤的步骤创建独立的步骤目标是没有意义的。这些规则没有强制执行,不遵循这些规则的项目可能会生成具有令人困惑和生成器特定行为的构建系统。

  • 步骤目标保存实现其步骤的自定义命令的副本,这些副本与 ExternalProject_Add() 创建的主目标中的副本是分开的,并且主目标不依赖于步骤目标。在并发驱动主目标和步骤目标的并行构建中,步骤命令的多个副本可能会并发运行并互相竞争。

    此外,在策略 CMP0113 之前,由 Makefile Generators 生成的步骤目标也包含其步骤依赖的所有自定义命令。即使在串行构建中,这也可能导致重复执行这些步骤。

在 CMake 3.19 及更高版本中,ExternalProject 模块倾向于采用修订后的设计来解决这些问题

  • 如果某个步骤不依赖于 ExternalProject_Add() DEPENDS 选项命名的其他目标,则该步骤被分类为“独立的”。预定义的步骤默认情况下会自动分类

    • download`、`update` 和 `patch` 步骤是独立的。

    • configure`、`build`、`test` 和 `install` 步骤不是独立的。

    对于自定义步骤,ExternalProject_Add_Step() 命令提供了 `INDEPENDENT` 选项来将它们标记为独立的。如果某个步骤依赖于其他非独立步骤,则将其标记为独立是错误的。请注意,此处术语“独立的”的使用仅指独立于外部目标,并且与步骤对其他步骤的依赖关系是正交的。

  • ExternalProject_Add() STEP_TARGETS 选项或 ExternalProject_Add_Step() 函数创建的步骤目标现在是独立的,当且仅当它们的步骤被标记为独立时。ExternalProject_Add() INDEPENDENT_STEP_TARGETS 选项和 ExternalProject_Add_StepTargets() NO_DEPENDS 选项不再允许使用。

  • 步骤目标在创建时,完全负责保存实现其步骤的自定义命令。由 ExternalProject_Add() 创建的主目标依赖于步骤目标,而步骤目标彼此依赖。目标级别的依赖关系与每个步骤的自定义命令使用的文件级别依赖关系相匹配。

    当使用 ExternalProject_Add() UPDATE_DISCONNECTED 或 `TEST_EXCLUDE_FROM_MAIN` 选项,或者为自定义步骤使用 ExternalProject_Add_Step() EXCLUDE_FROM_MAIN` 选项时,可能会自动创建一些步骤目标。这些步骤目标是必要的,用于保存主目标和断开连接的步骤目标通常依赖的步骤。

策略 `CMP0114` 为尚未更新以预期新行为的项目提供兼容性。此策略的 `OLD` 行为是使用上面记录的 3.18 及更低版本的行为。此策略的 `NEW` 行为是使用上面记录的 3.19 及更高版本首选的行为。

此策略在 CMake 3.19 版本中引入。可以通过 cmake_policy()cmake_minimum_required() 设置。如果未设置,CMake 会发出警告,并使用 `OLD` 行为。

注意

策略的 `OLD` 行为是 deprecated by definition,并可能在 CMake 的未来版本中移除。