Я начал использовать 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
.
Как я могу это исправить?