CMake FetchContent多次下载外部依赖项

时间:2019-05-27 15:44:40

标签: android cmake

我开始使用FetchContent来自动下载外部依赖项。与较旧的方法相比,它的效果很好,但是我有一个可能与FetchContent本身无关的问题-外部依赖项被多次下载。我实际上是在为Android平台构建,但这没什么大不了的。 我这样称呼cmake -B build/arm64-v8a ...cmake -B build/x86 ...叫CMake。我需要为每个ABI(arm64-v8a,x86等)使用单独的构建文件夹,以避免重建,因为我经常在ABI之间切换。 但是当我使用简单的FetchContent构造,例如:

FetchContent_Declare(
  googletest
  GIT_REPOSITORY https://github.com/google/googletest.git
  GIT_TAG        release-1.8.0
)

FetchContent_GetProperties(googletest)
if(NOT googletest_POPULATED)
  FetchContent_Populate(googletest)
  add_subdirectory(${googletest_SOURCE_DIR} ${googletest_BINARY_DIR})
endif()

它将每个ABI下载一次外部项目(换句话说-使用不同构建文件夹的每个CMake调用一次),因为在使用不同构建文件夹的下一个CMake调用中看不到googletest_POPULATED。如果将源下载一次,那就太好了。

因此,我尝试在SOURCE_DIR中传递FetchContent_Declare,以将源一级保存(在build/_deps/googletest-src而非build/<abi>/_deps/googletest-src文件夹中)。它正确地保存了源,但是由于似乎googletest-subbuild文件夹(位于build/<abi>/_deps下)管理着googletest_POPULATED标志,因此仍然触发了重新下载。

我该如何解决?

1 个答案:

答案 0 :(得分:1)

尝试使用FETCHCONTENT_BASE_DIR共享创建的处理下载管理的CMake项目。然后确保使用单独的构建目录来构建软件。

cmake_minimum_required(VERSION 3.13)
project(fc_twice)

include (FetchContent)
set(FETCHCONTENT_QUIET off)
get_filename_component(fc_base "../fc_base"
                       REALPATH BASE_DIR "${CMAKE_BINARY_DIR}")
set(FETCHCONTENT_BASE_DIR ${fc_base})

FetchContent_Declare(
  googletest
  GIT_REPOSITORY https://github.com/google/googletest.git
  GIT_TAG        release-1.8.0
)

FetchContent_GetProperties(googletest)
if(NOT googletest_POPULATED)
  FetchContent_Populate(googletest)
  #create gt build directory in binary tree
  add_subdirectory(${googletest_SOURCE_DIR} gt)
endif()

在构建目录之间切换时,会重复一些簿记项目,但实际下载只会发生一次。您应该看到以下消息:

  Performing download step (git clone) for 'googletest-populate'
  -- Avoiding repeated git clone, stamp file is up to date: 'C:/Users/XXX/Desktop/temp/so_fc/fc_base/googletest-subbuild/googletest-populate-prefix/src/googletest-populate-stamp/googletest-populate-gitclone-lastrun.txt'

我使用命令cmake -S src/ -B bld1cmake -S src/ -B bld2进行了测试,然后切换回去构建它们。