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

cmake: Generate better pkg-config file for SYSROOT builds under CMake

I recently fixed this for Autotools but said that fixing this for CMake
was not feasible due to it using `find_package` rather than
`pkg_check_modules`. I then thought about it and couldn't find any
reason why CMake couldn't try `pkg_check_modules` first and then fall
back to `find_package`, as that's basically what Autotools does.

I had wanted to use the linker flags generated by CMake when it does
fall back to `find_package`, but it only returns direct paths to the
libraries, as opposed to `-l` flags. Baking these library paths into the
pkg-config and xml2-config files would break static linking and
cross-compiling, so I've stuck with the `-l` flags we already have.

There is no need to set `CMAKE_REQUIRED_LIBRARIES` because we already
add the dependencies to the library target.
This commit is contained in:
James Le Cuirot 2023-09-03 22:14:01 +01:00
parent 5a18c505a7
commit f369154fce
No known key found for this signature in database
GPG Key ID: 1226415D00DD3137

View File

@ -20,6 +20,7 @@ include(CheckLinkerFlag)
include(CheckStructHasMember)
include(CheckSymbolExists)
include(CMakePackageConfigHelpers)
include(FindPkgConfig)
include(GNUInstallDirs)
option(BUILD_SHARED_LIBS "Build shared libraries" ON)
@ -63,18 +64,6 @@ option(LIBXML2_WITH_XPTR_LOCS "Add support for XPointer locations" OFF)
option(LIBXML2_WITH_ZLIB "Use libz" ON)
set(LIBXML2_XMLCONF_WORKING_DIR ${CMAKE_CURRENT_BINARY_DIR} CACHE PATH "Working directory for XML Conformance Test Suite")
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_PYTHON)
check_include_files(unistd.h HAVE_UNISTD_H)
check_symbol_exists(F_GETFL fcntl.h HAVE_F_GETFL)
@ -84,14 +73,6 @@ if(LIBXML2_WITH_PYTHON)
CACHE PATH "Python bindings install directory")
endif()
if(LIBXML2_WITH_THREADS)
find_package(Threads REQUIRED)
endif()
if(LIBXML2_WITH_ZLIB)
find_package(ZLIB REQUIRED)
endif()
foreach(VARIABLE IN ITEMS WITH_AUTOMATA WITH_C14N WITH_CATALOG WITH_DEBUG WITH_EXPR WITH_FTP WITH_HTML WITH_HTTP WITH_ICONV WITH_ICU WITH_ISO8859X WITH_LEGACY WITH_LZMA WITH_MEM_DEBUG WITH_MODULES WITH_OUTPUT WITH_PATTERN WITH_PUSH WITH_READER WITH_REGEXPS WITH_SAX1 WITH_SCHEMAS WITH_SCHEMATRON WITH_THREADS WITH_THREAD_ALLOC WITH_TREE WITH_TRIO WITH_UNICODE WITH_VALID WITH_WRITER WITH_XINCLUDE WITH_XPATH WITH_XPTR WITH_XPTR_LOCS WITH_ZLIB)
if(LIBXML2_${VARIABLE})
set(${VARIABLE} 1)
@ -118,18 +99,6 @@ set(PACKAGE_TARNAME "libxml2")
set(PACKAGE_URL "https://gitlab.gnome.org/GNOME/libxml2")
set(PACKAGE_VERSION ${VERSION})
if(LIBLZMA_FOUND)
list(APPEND CMAKE_REQUIRED_LIBRARIES LibLZMA::LibLZMA)
endif()
if(Threads_FOUND)
list(APPEND CMAKE_REQUIRED_LIBRARIES Threads::Threads)
endif()
if(ZLIB_FOUND)
list(APPEND CMAKE_REQUIRED_LIBRARIES ZLIB::ZLIB)
endif()
if (NOT MSVC)
check_c_source_compiles("
void __attribute__((destructor))
@ -348,21 +317,6 @@ add_library(LibXml2::LibXml2 ALIAS LibXml2)
target_compile_definitions(LibXml2 PRIVATE SYSCONFDIR="${CMAKE_INSTALL_FULL_SYSCONFDIR}")
if(CMAKE_C_COMPILER_ID MATCHES "Clang" OR CMAKE_C_COMPILER_ID STREQUAL "GNU")
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -pedantic -Wall -Wextra -Wshadow \
-Wpointer-arith -Wcast-align -Wwrite-strings -Waggregate-return \
-Wstrict-prototypes -Wmissing-prototypes -Wnested-externs -Winline \
-Wredundant-decls -Wno-long-long -Wno-format-extra-args")
if(BUILD_SHARED_LIBS AND UNIX AND NOT APPLE)
check_linker_flag(C "LINKER:--undefined-version" FLAG_UNDEFINED_VERSION)
if (FLAG_UNDEFINED_VERSION)
target_link_options(LibXml2 PRIVATE "LINKER:--undefined-version")
endif()
target_link_options(LibXml2 PRIVATE "LINKER:--version-script=${CMAKE_CURRENT_SOURCE_DIR}/libxml2.syms")
endif()
endif()
if(LIBXML2_WITH_THREADS)
target_compile_definitions(LibXml2 PRIVATE _REENTRANT)
if(NOT WIN32)
@ -401,6 +355,7 @@ 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")
@ -408,27 +363,71 @@ if(LIBXML2_WITH_ICONV)
endif()
if(LIBXML2_WITH_ICU)
target_link_libraries(LibXml2 PRIVATE ICU::data ICU::i18n ICU::uc)
if(WIN32)
set(ICU_LIBS "-licudt -licuin -licuuc")
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)
else()
set(ICU_LIBS "-licudata -licui18n -licuuc")
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}")
endif()
list(APPEND XML_PRIVATE_LIBS "${ICU_LDFLAGS}")
endif()
if(LIBXML2_WITH_LZMA)
target_link_libraries(LibXml2 PRIVATE LibLZMA::LibLZMA)
set(LZMA_LIBS "-llzma")
pkg_check_modules(LibLZMA IMPORTED_TARGET liblzma)
if(LibLZMA_FOUND)
target_link_libraries(LibXml2 PRIVATE PkgConfig::LibLZMA)
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)
find_package(Threads REQUIRED)
target_link_libraries(LibXml2 PRIVATE Threads::Threads)
set(THREAD_LIBS ${CMAKE_THREAD_LIBS_INIT})
endif()
if(LIBXML2_WITH_ZLIB)
target_link_libraries(LibXml2 PRIVATE ZLIB::ZLIB)
set(Z_LIBS "-lz")
pkg_check_modules(ZLIB IMPORTED_TARGET zlib)
if(ZLIB_FOUND)
target_link_libraries(LibXml2 PRIVATE PkgConfig::ZLIB)
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")
# These compiler flags can break the checks above so keep them here.
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -pedantic -Wall -Wextra -Wshadow \
-Wpointer-arith -Wcast-align -Wwrite-strings -Waggregate-return \
-Wstrict-prototypes -Wmissing-prototypes -Wnested-externs -Winline \
-Wredundant-decls -Wno-long-long -Wno-format-extra-args")
if(BUILD_SHARED_LIBS AND UNIX AND NOT APPLE)
check_linker_flag(C "LINKER:--undefined-version" FLAG_UNDEFINED_VERSION)
if (FLAG_UNDEFINED_VERSION)
target_link_options(LibXml2 PRIVATE "LINKER:--undefined-version")
endif()
target_link_options(LibXml2 PRIVATE "LINKER:--version-script=${CMAKE_CURRENT_SOURCE_DIR}/libxml2.syms")
endif()
endif()
set_target_properties(
@ -643,11 +642,19 @@ if(LIBXML2_WITH_PYTHON)
configure_file(python/setup.py.in setup.py @ONLY)
endif()
set(NON_PC_LIBS "${THREAD_LIBS} ${ICONV_LIBS} ${LIBM} ${WINSOCK_LIBS}")
list(APPEND XML_PC_LIBS "${NON_PC_LIBS}")
list(APPEND XML_PRIVATE_LIBS "${NON_PC_LIBS}")
list(REMOVE_DUPLICATES XML_PC_LIBS)
list(REMOVE_DUPLICATES XML_PRIVATE_LIBS)
list(JOIN XML_PC_REQUIRES " " XML_PC_REQUIRES)
list(JOIN XML_PC_LIBS " " XML_PC_LIBS)
list(JOIN XML_PRIVATE_LIBS " " XML_PRIVATE_LIBS)
set(XML_INCLUDEDIR "-I\${includedir}/libxml2")
set(XML_LIBDIR "-L\${libdir}")
set(XML_LIBS "-lxml2")
set(XML_PRIVATE_LIBS "${Z_LIBS} ${LZMA_LIBS} ${THREAD_LIBS} ${ICONV_LIBS} ${ICU_LIBS} ${LIBM} ${WINSOCK_LIBS}")
set(XML_PC_LIBS "${XML_PRIVATE_LIBS}")
if(BUILD_SHARED_LIBS)
set(XML_PC_PRIVATE ".private")