CMP0114

在 3.19 版本中添加。

ExternalProject step targets 完全采用了它们的 step。

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

在 CMake 3.18 及更低版本中,step targets 有一些限制

  • 即使并非所有步骤都需要,step targets 始终依赖由 ExternalProject_Add() DEPENDS 选项命名的目标。为了允许在没有这些依赖项的情况下创建 step targets,可以使用 ExternalProject_Add() INDEPENDENT_STEP_TARGETS 选项或 ExternalProject_Add_StepTargets() NO_DEPENDS 选项。但是,仅当特定步骤(如 downloadupdatepatch)不需要任何外部项目的构建依赖项时,才需要为这样的“独立”step targets 添加内容。此外,为依赖于非独立 step 的 step 创建独立的 step targets 没有任何意义。这些规则未得到强制执行,不遵循这些规则的项目可能会生成具有混淆且针对特定生成器的行为的构建系统。

  • step targets 保留了实现其 step 的自定义命令的副本,该副本与由 ExternalProject_Add() 创建的主目标中的副本不同,并且主目标不依赖于 step targets。在同时驱动主目标和 step targets 的并行构建中,多个 step 命令的副本可能同时运行,并相互竞争。

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

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

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

    • downloadupdatepatch 步骤是独立的。

    • configurebuildtestinstall 步骤不是独立的。

    对于自定义步骤,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_DISCONNECTEDTEST_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行为已定义为已弃用,并可能会在 CMake 的未来版本中删除。