【问题标题】:Depending on the INSTALL target of a CMake External Project取决于 CMake 外部项目的安装目标
【发布时间】:2015-06-29 13:41:46
【问题描述】:

有没有办法在 cmake 中识别目标安装步骤的依赖关系?这是我的情况:

我的目标是能够下载该项目的源代码并构建它,而无需先安装依赖项。换句话说,我希望在尝试构建主要目标之前识别和安装依赖项。例如,我正在努力将 Leptonica 作为一个外部项目:

set(leptonica_build "${CMAKE_CURRENT_BINARY_DIR}/leptonica")

ExternalProject_Add(
    leptonica
    DOWNLOAD_DIR ${download_dir}
    BINARY_DIR ${leptonica_build}
    GIT_REPOSITORY ${OpenCV_git_repository}
    GIT_TAG ${OpenCV_git_tag}
    TLS_VERIFY true
    CONFIGURE_COMMAND <SOURCE_DIR>/configure --prefix=${DOC_READER_INSTALL_PREFIX}
)

运行目标 leptonica 会正确地构建库并将其安装到临时目录中,使其自身可供其他目标使用:

add_dependencies(myProgram leptonica)
find_library(LEPT_LIB lept)
target_link_libraries(myProgram ${LEPT_LIB})

问题是,当/tmp 被清除并且cmake 以myProgram 为目标首先执行时,liblept。所以 找不到,因为它还没有安装,因此 myProgram 的上游依赖直到 after make安装 已运行。

换句话说,我希望构建脚本首先下载并安装依赖项,然后尝试查找下游构建步骤所需的库的位置。这可能与 cmake 相关还是我应该以其他方式实现这个目标?

【问题讨论】:

    标签: c++ cmake


    【解决方案1】:

    从单独的 CMakeLists.txt 构建和安装 leptonica。或者,您可以使用相同的 CMakeLists 并通过控制变量 (-DMYPROJECT_INSTALL_DEPS=1) 选择性地启用 ExternalProject 部分或 CMakeLists 的主要部分

    您可以从 shell 脚本触发 leptonica 的配置/构建步骤,或者使用 execute_process 从主 CMakeLists 调用 cmake:

        execute_process(
            COMMAND ${CMAKE_COMMAND} -H... -B...
            COMMAND ${CMAKE_COMMAND} --build ... --target install ...
        )
    

    这样整个配置/构建/安装步骤将在您的主项目的配置步骤中执行。

    【讨论】:

    • 谢谢,这就是我现在正在使用的策略。
    • 您能否解释一下-H 和-B 的含义以及为什么需要将它们一起用于此目的?我没有在文档中看到它们
    • @LewisChan -B 已记录(二进制目录的路径),-H(源目录的路径)是一个未记录的开关,现在他们已在 -S 下将其正式化。跨度>
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-01-10
    • 1970-01-01
    • 1970-01-01
    • 2013-05-19
    • 1970-01-01
    • 2016-04-25
    • 1970-01-01
    相关资源
    最近更新 更多