【问题标题】:Make an external project available for find_package CMake使外部项目可用于 find_package CMake
【发布时间】:2020-07-09 22:02:41
【问题描述】:

在我的项目中,我有一个依赖项 "A" 有另一个库依赖项 "B",我正在尝试在 A 之前下载并安装依赖项 B为了消除冲突。我正在使用Externalproject_addFetchContent_Declareinstall,但它失败了。

举个例子

我有一个 CMakeList.txt,例如:

FetchContent_Declare(  libpng
        GIT_REPOSITORY      https://github.com/glennrp/libpng.git
        GIT_TAG             master
        UPDATE_DISCONNECTED TRUE
        STEP_TARGETS        update
        )

FetchContent_GetProperties(libpng)
if (NOT libpng_POPULATED)
    FetchContent_Populate(libpng)
    add_subdirectory("${libpng_SOURCE_DIR}" ${libpng_BINARY_DIR} EXCLUDE_FROM_ALL)
endif()

这个 libpng 的 CMakeList.txt 有 find_package(ZLIB REQUIRED) 行,此时我可以手动下载并安装 zlib,但由于我正在开发一个库,我希望我的代码能够处理这种依赖关系。我也无法修改 libpng 的 CMakeList.txt。所以,我有这段代码,但它仍然失败。

FetchContent_Declare(  zlib
        GIT_REPOSITORY      https://github.com/zlib-ng/zlib-ng.git
        GIT_TAG             develop
        UPDATE_DISCONNECTED TRUE
        STEP_TARGETS        update
        )
FetchContent_GetProperties(zlib)
if (NOT zlib_POPULATED)
    FetchContent_Populate(zlib)
    add_subdirectory("${zlib_SOURCE_DIR}" ${zlib_BINARY_DIR} EXCLUDE_FROM_ALL)
endif()
install(TARGETS zlib)

我仍然从 CMake 开始,我不断学习,但很难找到合适的例子。

那么,我如何安装外部项目以使其可用于 find_package?

【问题讨论】:

    标签: c++ cmake cmake-modules


    【解决方案1】:

    从技术上讲,您可以通过应用补丁“修改” png 项目。

    不幸的是FetchContent/add_subdirectory() 即合并第三方作为子项目,不能与find_package() 一起使用。

    你应该换成这样的东西

    if(NOT TARGET ZLIB::ZLIB)
      find_package(ZLIB)
    endif()
    

    即创建一个补丁并将其应用在 png 之上

      message(CHECK_START "Fetching png")
      list(APPEND CMAKE_MESSAGE_INDENT "  ")
      FetchContent_Declare(
        png
        GIT_REPOSITORY "https://github.com/glennrp/libpng.git"
        GIT_TAG "master"
        PATCH_COMMAND git apply ".../patches/png.patch")
      # here if you want to force some option(s) (must have CMP0077 to NEW)
      #e.g. set(CMAKE_BUILD_SHARED OFF)
      FetchContent_MakeAvailable(png)
      list(POP_BACK CMAKE_MESSAGE_INDENT)
      message(CHECK_PASS "fetched")
    

    CMake 相关“问题”:https://gitlab.kitware.com/cmake/cmake/-/issues/17735

    注意:看看https://github.com/google/or-tools/blob/master/cmake/dependencies/CMakeLists.txt(抱歉没有png)

    note2:madler zlib 未维护有关 CMake 的内容,请查看我的补丁 ;)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-11-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-12
      相关资源
      最近更新 更多