【问题标题】:How to reuse extracted source with CMake's ExternalProject_Add?如何使用 CMake 的 ExternalProject_Add 重用提取的源?
【发布时间】:2014-12-14 15:25:55
【问题描述】:

我使用以下 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 仅在下载新存档时才提取存档?

【问题讨论】:

  • 您可以使用空的DOWNLOAD_COMMAND 创建第二个ExternalProject_Add,并将依赖项添加到第一个ExternalProject_Add。两个项目的SOURCE_DIR 必须相同。见example。
  • @ruslo 太好了,这行得通。您能否发表评论作为答案,以便我接受?

标签: cmake dependencies cross-compiling stamp


【解决方案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)

【讨论】:

    猜你喜欢
    • 2015-12-26
    • 1970-01-01
    • 1970-01-01
    • 2013-07-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-26
    相关资源
    最近更新 更多