取决于CMake外部项目的INSTALL目标

Depending on the INSTALL target of a CMake External Project

本文关键字:INSTALL 目标 项目 CMake 外部 取决于      更新时间:2023-10-16

是否有方法在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.所以没有被找到,因为它还没有被安装,因此直到运行make-install之后的myProgram的上游依赖关系才得到满足。

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

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

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

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

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