Как повторно использовать извлеченный источник с 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)