Избежание дополнительных загрузок ExternalProject
Допустим, у меня есть следующая настройка проекта с этими зависимостями:
MainProject
├─ Dependency_1
│ └─ Dependency_2
└─ Dependency_2
Эти зависимости обрабатываются в MainProject
а также Dependency_1
с Внешним Проектом.
Проблема в Dependency_2
будет загружен дважды: Dependency_1
загрузит копию для себя, и MainProject
загрузит копию для себя.
Это не способствует эффективному процессу сборки, есть ли способ скачать Dependency_2
один раз для обоих проектов?
Было высказано предположение, что этот вопрос является дубликатом этого. Этот вопрос немного отличается от моего в том, что я не могу предположить, что эти библиотеки будут установлены на хост-систему с ExternalProject. Я также хотел бы, чтобы решение было только CMake, к которому этот вопрос не требовался.
1 ответ
Из основного CMakeLists.txt установите переменную среды, содержащую общий корневой путь для загрузки и сборки внешних проектов, например:
set (ENV EXTERNAL_PROJ_DOWNLOAD_DIR "${CMAKE_SOURCE_DIR}/externalProjects")
для использования в качестве корневых папок для загрузки и построения зависимостей. Вы можете установить (и использовать) его в своем основном проекте и прочитать это значение из своей первой зависимости (той, которая также зависит от вашей второй зависимости).
Рассматривая это на практике применительно к проекту, связанному в ваших комментариях, вы установите EXTERNAL_PROJ_DOWNLOAD_DIR
В Хроносе, а затем для связи с PortAudio в проектах Хронос и Тритий вы будете иметь:
find_package(PortAudio)
if (${PORTAUDIO_FOUND})
include_directories(${PORTAUDIO_INCLUDE_DIRS})
else ()
ExternalProject_Add(
PortAudio
GIT_REPOSITORY "https://github.com/syb0rg/PortAudio2.git"
SOURCE_DIR "$ENV{EXTERNAL_PROJ_DOWNLOAD_DIR}/PortAudio"
UPDATE_COMMAND ""
INSTALL_COMMAND ""
BUILD_IN_SOURCE ON
LOG_DOWNLOAD ON
LOG_UPDATE ON
LOG_CONFIGURE ON
LOG_BUILD ON
LOG_TEST ON
LOG_INSTALL ON
)
ExternalProject_Get_Property(PortAudio SOURCE_DIR)
ExternalProject_Get_Property(PortAudio BINARY_DIR)
set(PORTAUDIO_SOURCE_DIR ${SOURCE_DIR})
set(PORTAUDIO_BINARY_DIR ${BINARY_DIR})
set(PORTAUDIO_LIBRARIES ${PORTAUDIO_SOURCE_DIR}/libportaudio_static.a)
set(DEPENDENCIES ${DEPENDENCIES} PortAudio)
include_directories(${PORTAUDIO_SOURCE_DIR}/include)
endif ()
SET(LIBS ${LIBS} ${PORTAUDIO_LIBRARIES})
Вы также можете использовать set (ENV EXTERNAL_PROJ_BINARY_DIR "${CMAKE_BINARY_DIR}/externalProjects")
если вы хотите активировать сборку вне исходного кода.
Я предлагаю использовать переменную окружения, потому что я не знаю, будет ли переменная кэша, установленная из Khronos, видна в тритии...