Лучшим вариантом будет своего рода смешанная версия. Я обычно отслеживаю внешние библиотеки как подмодули git (в PROJECT_ROOT / submodules) и создаю общий файл CMake для всех них, например:
find_package(GTest)
if(GTEST_FOUND)
message(STATUS "googletest was found!")
else()
message(STATUS "googletest was not found, local build is needed!")
include(ExternalProject)
ExternalProject_Add(googletest-project
URL ${CMAKE_SOURCE_DIR}/submodules/googletest/
PREFIX "${CMAKE_CURRENT_BINARY_DIR}/ext/googletest"
CMAKE_ARGS -DCMAKE_BUILD_TYPE:STRING=Release -DBUILD_GTEST=ON
DCMAKE_INSTALL_PREFIX=<INSTALL_DIR>
LOG_DOWNLOAD ON
LOG_CONFIGURE ON
LOG_BUILD ON
LOG_INSTALL ON
)
ExternalProject_Get_Property(googletest-project install_dir)
ExternalProject_Get_Property(googletest-project source_dir)
file(MAKE_DIRECTORY ${install_dir}/include)
add_library(gtest STATIC IMPORTED)
add_library(gtest_main STATIC IMPORTED)
set_property(TARGET gtest PROPERTY IMPORTED_LOCATION
${install_dir}/lib/libgtest.a)
set_property(TARGET gtest_main PROPERTY IMPORTED_LOCATION
${install_dir}/lib/libgtest_main.a)
set_property(TARGET gtest APPEND PROPERTY INTERFACE_INCLUDE_DIRECTORIES
${install_dir}/include)
set_property(TARGET gtest_main APPEND PROPERTY INTERFACE_INCLUDE_DIRECTORIES
${install_dir}/include)
add_dependencies(gtest googletest-project)
add_dependencies(gtest_main googletest-project)
set(GTEST_LIBRARIES gtest)
set(GTEST_MAIN_LIBRARIES gtest_main)
set(GTEST_INCLUDE_DIRS ${install_dir}/include)
endif()
Таким образом, googletest не будет создан, если он уже установлен в вашей системе (например, в образе Docker со всеми предварительно установленными внешними зависимостями). Как видите, я собираю googletest из каталога подмодулей и не буду клонировать из github.