Избежание дополнительных загрузок 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, видна в тритии...

Смотрите документацию для set и env.

Другие вопросы по тегам