我使用以下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只提取存档?
答案 0 :(得分: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)