1
0
mirror of https://gitlab.gnome.org/GNOME/libxml2.git synced 2025-03-25 10:50:08 +03:00

cmake: Only use pkg-config for .pc files, not for building binaries

Using `pkg_check_modules(FOO IMPORTED_TARGET foo)` with
`target_link_libraries()` leads to `INTERFACE_LINK_LIBRARIES` in the
resulting export file having `\$<LINK_ONLY:PkgConfig::FOO>` rather than
the currently expected `\$<LINK_ONLY:FOO::FOO>`, leading to breakage.
This can be worked around like so:

    target_link_libraries(UseFoo
      PUBLIC "$<BUILD_INTERFACE:PkgConfig::FOO>"
      INTERFACE "$<INSTALL_INTERFACE:FOO::FOO>"
    )

However, following some discussion, it is preferable to primarily use
find modules as before and only use `pkg_check_modules` for correctly
populating the .pc file.

Also move `find_package()` calls earlier so that builds fail faster when
dependencies are missing.
This commit is contained in:
James Le Cuirot 2023-09-10 13:00:31 +01:00
parent 9d53452206
commit c7ff438b83
No known key found for this signature in database
GPG Key ID: 1226415D00DD3137

View File

@ -99,12 +99,28 @@ set(PACKAGE_TARNAME "libxml2")
set(PACKAGE_URL "https://gitlab.gnome.org/GNOME/libxml2")
set(PACKAGE_VERSION ${VERSION})
if(LIBXML2_WITH_ICONV)
find_package(Iconv REQUIRED)
endif()
if(LIBXML2_WITH_ICU)
find_package(ICU REQUIRED COMPONENTS data i18n uc)
endif()
if(LIBXML2_WITH_LZMA)
find_package(LibLZMA REQUIRED)
endif()
if(LIBXML2_WITH_THREADS)
find_package(Threads REQUIRED)
set(THREAD_LIBS ${CMAKE_THREAD_LIBS_INIT})
list(APPEND CMAKE_REQUIRED_LIBRARIES Threads::Threads)
endif()
if(LIBXML2_WITH_ZLIB)
find_package(ZLIB REQUIRED)
endif()
if (NOT MSVC)
check_c_source_compiles("
void __attribute__((destructor))
@ -361,7 +377,6 @@ if(WIN32)
endif()
if(LIBXML2_WITH_ICONV)
find_package(Iconv REQUIRED)
target_link_libraries(LibXml2 PUBLIC Iconv::Iconv)
if(NOT Iconv_IS_BUILT_IN)
set(ICONV_LIBS "-liconv")
@ -369,35 +384,31 @@ if(LIBXML2_WITH_ICONV)
endif()
if(LIBXML2_WITH_ICU)
pkg_check_modules(ICU IMPORTED_TARGET icu-i18n)
if(ICU_FOUND)
target_link_libraries(LibXml2 PRIVATE PkgConfig::ICU)
list(APPEND XML_PC_REQUIRES icu-i18n)
target_link_libraries(LibXml2 PRIVATE ICU::data ICU::i18n ICU::uc)
if(WIN32)
set(ICU_LDFLAGS "-licudt -licuin -licuuc")
else()
find_package(ICU REQUIRED COMPONENTS data i18n uc)
target_link_libraries(LibXml2 PRIVATE ICU::data ICU::i18n ICU::uc)
if(WIN32)
set(ICU_LDFLAGS "-licudt -licuin -licuuc")
else()
set(ICU_LDFLAGS "-licudata -licui18n -licuuc")
endif()
list(APPEND XML_PC_LIBS "${ICU_LDFLAGS}")
set(ICU_LDFLAGS "-licudata -licui18n -licuuc")
endif()
list(APPEND XML_PRIVATE_LIBS "${ICU_LDFLAGS}")
pkg_check_modules(ICU_PC IMPORTED_TARGET icu-i18n)
if(ICU_PC_FOUND)
list(APPEND XML_PC_REQUIRES icu-i18n)
else()
list(APPEND XML_PC_LIBS "${ICU_LDFLAGS}")
endif()
endif()
if(LIBXML2_WITH_LZMA)
pkg_check_modules(LibLZMA IMPORTED_TARGET liblzma)
if(LibLZMA_FOUND)
target_link_libraries(LibXml2 PRIVATE PkgConfig::LibLZMA)
target_link_libraries(LibXml2 PRIVATE LibLZMA::LibLZMA)
set(LibLZMA_LDFLAGS "-llzma")
list(APPEND XML_PRIVATE_LIBS "${LibLZMA_LDFLAGS}")
pkg_check_modules(LibLZMA_PC IMPORTED_TARGET liblzma)
if(LibLZMA_PC_FOUND)
list(APPEND XML_PC_REQUIRES liblzma)
else()
find_package(LibLZMA REQUIRED)
target_link_libraries(LibXml2 PRIVATE LibLZMA::LibLZMA)
set(LibLZMA_LDFLAGS "-llzma")
list(APPEND XML_PC_LIBS "${LibLZMA_LDFLAGS}")
endif()
list(APPEND XML_PRIVATE_LIBS "${LibLZMA_LDFLAGS}")
endif()
if(LIBXML2_WITH_THREADS)
@ -405,17 +416,15 @@ if(LIBXML2_WITH_THREADS)
endif()
if(LIBXML2_WITH_ZLIB)
pkg_check_modules(ZLIB IMPORTED_TARGET zlib)
if(ZLIB_FOUND)
target_link_libraries(LibXml2 PRIVATE PkgConfig::ZLIB)
target_link_libraries(LibXml2 PRIVATE ZLIB::ZLIB)
set(ZLIB_LDFLAGS "-lz")
list(APPEND XML_PRIVATE_LIBS "${ZLIB_LDFLAGS}")
pkg_check_modules(ZLIB_PC IMPORTED_TARGET zlib)
if(ZLIB_PC_FOUND)
list(APPEND XML_PC_REQUIRES zlib)
else()
find_package(ZLIB REQUIRED)
target_link_libraries(LibXml2 PRIVATE ZLIB::ZLIB)
set(ZLIB_LDFLAGS "-lz")
list(APPEND XML_PC_LIBS "${ZLIB_LDFLAGS}")
endif()
list(APPEND XML_PRIVATE_LIBS "${ZLIB_LDFLAGS}")
endif()
if(CMAKE_C_COMPILER_ID MATCHES "Clang" OR CMAKE_C_COMPILER_ID STREQUAL "GNU")