Сделайте внешний проект доступным для find_package CMake - PullRequest
1 голос
/ 10 июля 2020

В моем проекте у меня есть зависимость «A» , у которой есть зависимость от другой библиотеки «B» , я пытаюсь загрузить и установить зависимость B перед A, чтобы убрать конфликт. Я использую Externalproject_add, FetchContent_Declare и install, но это не работает.

для примера

Я получил 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()

CMakeList.txt этого libpng содержит строку find_package(ZLIB REQUIRED), на этом этапе я мог бы вручную загрузить и установить zlib, но, поскольку я разрабатываю библиотеку, я хотел бы, чтобы мой код позаботился об этой зависимости. Также я не могу изменить CMakeList.txt из libpng. Итак, у меня есть этот код, но он продолжает давать сбой.

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?

1 Ответ

1 голос
/ 10 июля 2020

технически вы можете «модифицировать» проект 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 взгляните на мой патч;)

...