2014-10-19 2 views
4

Я использую следующий файл 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 "" 
) 

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

+1

Вы можете создать вторую 'ExternalProject_Add' с пустым' DOWNLOAD_COMMAND' и добавить зависимость к первому 'ExternalProject_Add'. «SOURCE_DIR» обоих проектов должны быть одинаковыми. См. [Пример] (https://github.com/ruslo/hunter/blob/master/cmake/schemes/url_sha1_release_debug.cmake.in). –

+0

@ruslo Отлично, это работает. Не могли бы вы высказать свои комментарии в качестве ответа, чтобы я мог принять его, пожалуйста? – danijar

ответ

4

Создайте два проекта: 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) 
Смежные вопросы