CMake FetchContent загружает внешние зависимости несколько раз - PullRequest
0 голосов
/ 27 мая 2019

Я начал использовать FetchContent для автоматической загрузки внешних зависимостей. Он хорошо работает по сравнению со старыми подходами, но у меня есть одна проблема, которая, вероятно, не связана с самим FetchContent - внешние зависимости загружаются несколько раз. Я на самом деле строю для платформы Android, но это не имеет большого значения. Я называю CMake вот так cmake -B build/arm64-v8a ... или cmake -B build/x86 .... Мне нужны отдельные папки сборки для каждого 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 с использованием другой папки сборки), потому что googletest_POPULATED не виден при следующем вызове CMake с использованием другой папки сборки. Было бы здорово, если бы исходники были скачаны один раз.

Поэтому я попытался передать SOURCE_DIR в FetchContent_Declare, чтобы сохранить источник на один уровень вверх (в папке build/_deps/googletest-src, а не build/<abi>/_deps/googletest-src). Он правильно сохранил источники, но повторная загрузка все еще была запущена, так как кажется, что папка googletest-subbuild (находится под build/<abi>/_deps) управляет флагом googletest_POPULATED.

Как я могу это исправить?

1 Ответ

1 голос
/ 27 мая 2019

Попробуйте использовать 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 bld1 и cmake -S src/ -B bld2, переключился назад и создал их.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...