CMP0168¶
3.30 版本新增。
FetchContent 模块直接实现步骤,而不是通过子构建。
CMake 3.29 及更早版本将 FetchContent 实现为单独的子构建。这需要配置该单独的项目并使用构建工具。这种方法对于某些生成器和操作系统来说可能非常缓慢。CMake 3.30 及更高版本倾向于直接在主项目的一部分中实现下载、更新和修补步骤。
NEW 行为具有以下特点:
不使用子构建。所有操作都直接从主项目的 CMake 配置步骤中实现。在 CMake 脚本模式下运行时,不需要提供构建工具。
不支持生成器表达式和形式为
$(SOMEVAR)的 GNU Make 变量。它们不应被用于FetchContent_Declare()或FetchContent_Populate()的任何参数中。所有
LOG_...和USES_TERMINAL_...选项、QUIET选项以及FETCHCONTENT_QUIET变量都将被忽略。FetchContent的输出始终是主项目配置输出的一部分。这也意味着它现在会尊重消息日志级别(请参阅CMAKE_MESSAGE_LOG_LEVEL和--log-level)。默认消息日志级别应与使用OLD策略设置的QUIET相当,只不过现在会显示警告。PREFIX、TMP_DIR、STAMP_DIR、LOG_DIR和DOWNLOAD_DIR选项及其相关的目录属性将被忽略。FetchContent模块会内部控制这些位置。cmake --fresh将删除用于跟踪和填充依赖项的印记和脚本文件。这将强制重新执行依赖项的下载、更新和修补步骤。cmake --fresh不会影响用于下载的目录,因此对于URL下载方法,任何先前下载的文件仍然可以重用。
OLD 行为具有以下特点:
始终使用子构建来实现下载、更新和修补步骤。即使在 CMake 脚本模式下使用
FetchContent_Populate()时,也必须提供构建工具。可以使用生成器表达式和形式为
$(SOMEVAR)的 GNU Make 变量,尽管这种使用几乎总是错误的。它们在子构建中进行评估,因此它们看不到主构建中的任何信息。支持与下载、更新或修补步骤相关的日志记录、终端控制和目录选项。
如果使用了
QUIET选项,或者将FETCHCONTENT_QUIET变量设置为 true,则输出中不会显示警告。cmake --fresh对依赖项的印记或脚本文件没有影响。只有当依赖项的详细信息发生变化时,先前执行的步骤才会重新运行。
用户很有可能可以将 CMAKE_POLICY_DEFAULT_CMP0168 变量设置为 NEW,以便在等待项目及其依赖项更新以默认使用 NEW 策略设置的同时,全局切换到 NEW 行为。项目通常不使用 NEW 行为不再支持的功能,即使是那些使用的项目,在忽略这些选项时通常仍然可以正常工作。在全局设置此行为之前,请检查任何 FetchContent_Declare() 或 FetchContent_Populate() 调用是否以会更改可观察行为的方式使用被忽略的选项,除了将临时或内部生成的文件放在不同的位置。
此策略引入于 CMake 版本 3.30。它可以通过 cmake_policy() 或 cmake_minimum_required() 设置。如果未设置,CMake *不会* 警告,并使用 OLD 行为。
注意
策略的 OLD 行为 根据定义已被弃用,并可能在未来的 CMake 版本中被移除。