2014-10-19 38 views
4

我使用下面的CMake文件來自動下載和編譯Boost庫。在爲我的編譯器生成項目文件後,我運行cmake --build . --config Debugcmake --build . --config Release來構建兩個變體。所以我啓動了兩次構建過程。即使CMake非常聰明,如果校驗和仍然匹配,不會再次下載壓縮文件,它會將其提取到源目錄中兩次。對於大型Boost庫,抽取需要幾分鐘的時間,所以我想阻止CMake在第二次構建時使用它。如何通過CMake的ExternalProject_Add重用提取的源代碼?

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)。 – 2014-10-21 09:41:09

+0

@ruslo很好,這個工程。你能否發表評論作爲答案,以便我能接受它? – danijar 2014-11-29 23:34:43

回答

4

創建兩個項目:Foo-ReleaseFoo-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) 
相關問題