我正在尝试将某个库与FetchContent一起使用:
FetchContent_Declare(
Catch2
GIT_REPOSITORY https://github.com/catchorg/Catch2.git
GIT_TAG 3f0283de7a9c43200033da996ff9093be3ac84dc
GIT_PROGRESS TRUE
GIT_SHALLOW FALSE
)
FetchContent_MakeAvailable(Catch2)
字符串
根据实践,我指定了一个特定的标签。然而,当我查看cmake下载的文件时,标签是7cf2f88e50f0d1de324489c31db0314188423b6d
,而且它更旧(2023年2月14日)。
如果我手动进入_deps/catch2-src
并执行git checkout 3f0283de7a9c43200033da996ff9093be3ac84dc
,我将获得正确的版本(2023年6月21日)。
上面的FetchContent块有什么问题?为什么CMake会下载不正确或较旧版本的库?
2条答案
按热度按时间4zcjmb1e1#
我的头号嫌疑人是
FetchContent_Declare()
函数记录描述如何填充指定内容的选项。如果此类详细信息已在此项目的早期记录(无论在项目层次结构中的哪个位置),则此调用和所有后续对相同内容的调用都将被忽略。kmbjn2e32#
the FetchContent docs:
FetchContent_Declare()
函数记录描述如何填充指定内容的选项。如果此类详细信息已在此项目的早期记录(无论在项目层次结构中的哪个位置),则此调用和所有后续对相同内容的调用都将被忽略。如果先前对相同名称的
FetchContent_Declare
的调用(在本例中为Catch2
)选择了不同的TAG
,则设置TAG
的第一个调用将“获胜”。在配置中的任何地方是否有对Catch2的FetchContent_Declare
的任何其他调用?也许在你的一个依赖(如果你有任何)?如果您不想手动搜索,可以使用cmake --trace
,然后使用grep
或jq
进行FetchContent_Declare
调用。整件事都是设计好的。来自相同的文档:
项目应该在调用
FetchContent_MakeAvailable()
之前声明它们可能使用的所有依赖项的细节。这确保了如果任何依赖项也是一个或多个其他依赖项的子依赖项,主项目仍然控制将使用的细节(因为它将在依赖项有机会声明之前先声明它们)一旦你找到了占优势的东西,只要在你的CMakeLists.txt中移动东西,这样你对
FetchContent_Declare
的调用就先进行,这样它就“赢”了。如果对给定名称的
FetchContent_Declare
的调用是该名称的唯一调用,则不应该有此问题。即使您更改了调用的TAG
参数中引用的commitish,下次运行配置时,CMake也会将 checkout 更新为新的commitish。如果你运行build而不重新配置,CMake通常足够聪明,知道什么时候需要重新配置,以便自动完成。