Как повторно использовать извлеченный источник с CMake ExternalProject_Add?

Я использую следующий файл CMake для автоматической загрузки и компиляции библиотек Boost. После генерации файлов проекта для моего компилятора я запускаю cmake --build . --config Debug а также cmake --build . --config Release построить оба варианта. Поэтому я запускаю процесс сборки дважды. Хотя CMake достаточно умен, чтобы не загружать архив снова, если контрольная сумма все еще совпадает, он дважды извлекает его в исходный каталог. Извлечение больших библиотек Boost занимает пару минут, поэтому я бы не хотел, чтобы CMake делал это для второй сборки.

ExternalProject_Add(Boost
    PREFIX            ${BOOST_PREFIX}
    TMP_DIR           ${BOOST_PREFIX}/temp
    STAMP_DIR         ${BOOST_PREFIX}/stamp
    #--Download step--------------
    DOWNLOAD_DIR      ${BOOST_PREFIX}/download
    URL               http://downloads.sourceforge.net/project/boost/boost/1.56.0/boost_1_56_0.tar.gz
    URL_MD5           8c54705c424513fa2be0042696a3a162
    #--Update/Patch step----------
    UPDATE_COMMAND    ""
    #--Configure step-------------
    SOURCE_DIR        ${BOOST_PREFIX}/source
    CONFIGURE_COMMAND ${BOOST_CONFIGURE_COMMAND}
    #--Build step-----------------
    BUILD_COMMAND     ${BOOST_BUILD_EXECUTABLE} install
                          --build-dir=${BOOST_PREFIX}/build
                          --prefix=${BOOST_PREFIX}/install
                          variant=${BOOST_VARIANT}
                          link=${BOOST_LINK}
                          threading=multi
                          address-model=32
                          toolset=${BOOST_TOOLSET}
                          runtime-link=${BOOST_RUNTIME_LINK}
    BUILD_IN_SOURCE   1
    #--Install step---------------
    INSTALL_COMMAND   ""
)

В этом конкретном примере можно было бы просто использовать variant=debug,release, но в моем проекте есть и другие внешние зависимости, которые я строю таким образом. Как я могу сделать так, чтобы CMake распаковывал архив, только если он скачал новый?

1 ответ

Решение

Создайте два проекта: Foo-Release а также Foo-Debug, Покидать DOWNLOAD_COMMAND пусто для второго проекта и сделать это зависит от первого. Задавать SOURCE_DIR Explicilty для обоих проектов (указать на один и тот же каталог). То есть:

set(source_dir "${CMAKE_CURRENT_BINARY_DIR}/3rdParty/Foo/Source")

ExternalProject_Add(
    Foo-Release
    URL "..."
    URL_HASH SHA1=...
    SOURCE_DIR "${source_dir}"
    ...
)

ExternalProject_Add(
    Foo-Debug
    DOWNLOAD_COMMAND
    ""
    SOURCE_DIR "${source_dir}"
    ...
)

add_dependencies(Foo-Debug Foo-Release)
Другие вопросы по тегам