cmake重用ExternalProject - DEPENDS不起作用?

时间:2013-05-17 08:37:36

标签: dependencies cmake

请考虑以下情况:我想通过ExternalProject_Add添加某个库。我想构建发布和调试库。我的计划是首先构建发布库,然后重用下载的源代码来构建调试库。我不想两次下载源代码。我的CMakeLists.txt的相关部分看起来是这样的:

ExternalProject_Add(
installSFMLRelease
            PREFIX ${TMPDIR}
            DOWNLOAD_DIR ${TMPDIR}/SFML
            GIT_REPOSITORY git://github.com/LaurentGomila/SFML.git
            GIT_TAG 2.0
            CMAKE_ARGS -DCMAKE_INSTALL_PREFIX:PATH=${SFML_INSTALL_PREFIX}
            CMAKE_GENERATOR ${CMAKE_GENERATOR}
            UPDATE_COMMAND "")

ExternalProject_Add(
installSFMLDebugAndDocs
            DEPENDS installSFMLRelease
            URL file://${TMPDIR}/SFML
            SOURCE_DIR ${TMPDIR}/SFML
            CMAKE_ARGS -DCMAKE_INSTALL_PREFIX:PATH=${SFML_INSTALL_PREFIX} -DCMAKE_BUILD_TYPE:STRING=Debug -DSFML_BUILD_DOC:BOOL=TRUE)               
猜猜是什么?它不起作用。 CMake失败

3>CUSTOMBUILD : CMake error : The source directory "C:/Windows/Temp/SFML" does not appear to contain CMakeLists.txt.

这里的问题是,该目录确实不包含任何内容,因为之前没有运行installSFMLRelease。如何才能使DEPENDS - 部分正确?

2 个答案:

答案 0 :(得分:0)

我用libgit尝试过; git克隆直入 $ {} TMPDIR / SRC / installLIBGITRelease 不使用DOWNLOAD_DIR,因此DOWNLOAD_DIR中没有CMakeLists。

答案 1 :(得分:0)

首先,我不确定你的目标是否会在这里得到满足。如果你在调试模式下从MSVC构建installSFMLRelease,那么你将得到一个这样的Debug构建。反之亦然,发布版本的installSFMLDebugAndDocs。 CMAKE_BUILD_TYPE变量对MSVC等多配置生成器没有影响。

您可能最好为不同的配置指定不同的安装路径?

尽管如此,为了回答您的问题,DOWNLOAD_DIR参数仅适用于我认为与URL arg一起使用的情况。 ExternalProject的文档并没有真正说明这一点,但是this article可能会更加清晰。

要解决此问题,我认为您可以跳过为installSFMLRelease指定DOWNLOAD_DIR,跳过installSFMLDebugAndDocs的整个下载阶段,而是检索installSFMLRelease的SOURCE_DIR值并将其传递给Debug版本:< / p>

ExternalProject_Add(
    installSFMLRelease
    PREFIX ${TMPDIR}
    DOWNLOAD_DIR ${TMPDIR}/SFML
    GIT_REPOSITORY git://github.com/LaurentGomila/SFML.git
    GIT_TAG 2.0
    CMAKE_ARGS -DCMAKE_INSTALL_PREFIX:PATH=${SFML_INSTALL_PREFIX}
    CMAKE_GENERATOR ${CMAKE_GENERATOR}
    UPDATE_COMMAND "")

ExternalProject_Get_Property(installSFMLRelease source_dir)

ExternalProject_Add(
    installSFMLDebugAndDocs
    DEPENDS installSFMLRelease
    DOWNLOAD_COMMAND ""
    URL file://${TMPDIR}/SFML
    SOURCE_DIR ${TMPDIR}/SFML
    SOURCE_DIR ${source_dir}
    CMAKE_ARGS -DCMAKE_INSTALL_PREFIX:PATH=${SFML_INSTALL_PREFIX}
               -DCMAKE_BUILD_TYPE:STRING=Debug
               -DSFML_BUILD_DOC:BOOL=TRUE)