cmake 为什么FetchContent使用的TAG与我指定的TAG不同?我该如何解决这个问题?

rdlzhqv9  于 2023-08-05  发布在  其他
关注(0)|答案(2)|浏览(129)

我正在尝试将某个库与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会下载不正确或较旧版本的库?

4zcjmb1e

4zcjmb1e1#

我的头号嫌疑人是
FetchContent_Declare()函数记录描述如何填充指定内容的选项。如果此类详细信息已在此项目的早期记录(无论在项目层次结构中的哪个位置),则此调用和所有后续对相同内容的调用都将被忽略。

kmbjn2e3

kmbjn2e32#

the FetchContent docs
FetchContent_Declare()函数记录描述如何填充指定内容的选项。如果此类详细信息已在此项目的早期记录(无论在项目层次结构中的哪个位置),则此调用和所有后续对相同内容的调用都将被忽略。
如果先前对相同名称的FetchContent_Declare的调用(在本例中为Catch2)选择了不同的TAG,则设置TAG的第一个调用将“获胜”。在配置中的任何地方是否有对Catch2的FetchContent_Declare的任何其他调用?也许在你的一个依赖(如果你有任何)?如果您不想手动搜索,可以使用cmake --trace,然后使用grepjq进行FetchContent_Declare调用。
整件事都是设计好的。来自相同的文档:
项目应该在调用FetchContent_MakeAvailable()之前声明它们可能使用的所有依赖项的细节。这确保了如果任何依赖项也是一个或多个其他依赖项的子依赖项,主项目仍然控制将使用的细节(因为它将在依赖项有机会声明之前先声明它们)
一旦你找到了占优势的东西,只要在你的CMakeLists.txt中移动东西,这样你对FetchContent_Declare的调用就先进行,这样它就“赢”了。
如果对给定名称的FetchContent_Declare的调用是该名称的唯一调用,则不应该有此问题。即使您更改了调用的TAG参数中引用的commitish,下次运行配置时,CMake也会将 checkout 更新为新的commitish。如果你运行build而不重新配置,CMake通常足够聪明,知道什么时候需要重新配置,以便自动完成。

相关问题