为 find_package CMake 提供一个外部项目
Make an external project available for find_package CMake
在我的项目中,我有一个依赖项 "A",它有另一个库依赖项 "B",我正在尝试下载并在 A 之前安装依赖 B 以清除冲突。我正在使用 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()
这个 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?
从技术上讲,您可以通过应用补丁来“修改”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 的东西看看我的补丁 ;)
在我的项目中,我有一个依赖项 "A",它有另一个库依赖项 "B",我正在尝试下载并在 A 之前安装依赖 B 以清除冲突。我正在使用 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()
这个 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?
从技术上讲,您可以通过应用补丁来“修改”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 的东西看看我的补丁 ;)