CMP0168¶
3.30 版本新增。
FetchContent
模块直接实现步骤,而不是通过子构建。
CMake 3.29 及更早版本将 FetchContent 作为单独的子构建来实现。这需要配置那个单独的项目并使用一个构建工具。这种方法在某些生成器和操作系统上可能会非常慢。CMake 3.30 及更高版本倾向于将下载、更新和修补步骤直接作为主项目的一部分来实现。
NEW
行为具有以下特点:
不使用子构建。所有操作都直接在主项目的 CMake 配置步骤中实现。在 CMake 脚本模式下运行时,无需构建工具。
不支持生成器表达式和 GNU Make 变量形式的
$(SOMEVAR)
。它们不应用于FetchContent_Declare()
或FetchContent_Populate()
的任何参数。所有
LOG_...
和USES_TERMINAL_...
选项、QUIET
选项以及FETCHCONTENT_QUIET
变量都将被忽略。FetchContent
的输出始终是主项目配置输出的一部分。这也意味着它现在尊重消息日志级别(参见CMAKE_MESSAGE_LOG_LEVEL
和--log-level
)。默认消息日志级别应与使用QUIET
和OLD
策略设置时的级别相当,但现在会显示警告。PREFIX
、TMP_DIR
、STAMP_DIR
、LOG_DIR
和DOWNLOAD_DIR
选项及其关联的目录属性将被忽略。FetchContent
模块在内部控制这些位置。cmake --fresh
将删除用于跟踪和填充依赖项的戳记和脚本文件。这将强制重新执行依赖项的下载、更新和修补步骤。用于下载的目录不受cmake --fresh
的影响,因此对于URL
下载方法,之前下载的任何文件仍然可以重用。
OLD
行为具有以下特点:
始终使用子构建来实现下载、更新和修补步骤。必须有可用的构建工具,即使在 CMake 脚本模式下使用
FetchContent_Populate()
也是如此。可以使用生成器表达式和 GNU Make 变量形式的
$(SOMEVAR)
,尽管这种使用几乎总是不合适的。它们在子构建中进行评估,因此它们看不到主构建中的任何信息。所有与下载、更新或修补步骤相关的日志记录、终端控制和目录选项都受支持。
如果使用了
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 中移除。