Skip to content

Commit 93e8bb2

Browse files
committed
build: Generate better pkg-config files for static-only builds
pkg-config supports `Requires.private` and `Libs.private` fields for static linking. However, if you're building a dynamic binary, then pkg-config will use the non-private fields, even if just the static libxml2 is available. This will result in libxml2 being underlinked, causing the build to fail. The solution is to fold the private fields into the non-private fields when the shared libxml2 is not being built. This works for Autotools and CMake. Meson also knows how to handle this when it automatically generates pkg-config files.
1 parent 4640cca commit 93e8bb2

File tree

5 files changed

+35
-12
lines changed

5 files changed

+35
-12
lines changed

CMakeLists.txt

+10-5
Original file line numberDiff line numberDiff line change
@@ -348,11 +348,6 @@ add_library(LibXml2::LibXml2 ALIAS LibXml2)
348348

349349
target_compile_definitions(LibXml2 PRIVATE SYSCONFDIR="${CMAKE_INSTALL_FULL_SYSCONFDIR}")
350350

351-
if(NOT BUILD_SHARED_LIBS)
352-
target_compile_definitions(LibXml2 PUBLIC LIBXML_STATIC)
353-
set(XML_CFLAGS "-DLIBXML_STATIC")
354-
endif()
355-
356351
if(CMAKE_C_COMPILER_ID MATCHES "Clang" OR CMAKE_C_COMPILER_ID STREQUAL "GNU")
357352
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -pedantic -Wall -Wextra -Wshadow \
358353
-Wpointer-arith -Wcast-align -Wwrite-strings -Waggregate-return \
@@ -654,6 +649,16 @@ set(XML_LIBS "-lxml2")
654649
set(XML_PRIVATE_LIBS "${Z_LIBS} ${LZMA_LIBS} ${THREAD_LIBS} ${ICONV_LIBS} ${ICU_LIBS} ${LIBM} ${WINSOCK_LIBS}")
655650
set(XML_PC_LIBS "${XML_PRIVATE_LIBS}")
656651

652+
if(BUILD_SHARED_LIBS)
653+
set(XML_PC_PRIVATE ".private")
654+
set(XML_PC_LIBS_PRIVATE "
655+
Libs.private:")
656+
else()
657+
target_compile_definitions(LibXml2 PUBLIC LIBXML_STATIC)
658+
set(XML_CFLAGS "-DLIBXML_STATIC")
659+
set(XML_PRIVATE_LIBS_NO_SHARED "${XML_PRIVATE_LIBS}")
660+
endif()
661+
657662
file(RELATIVE_PATH PACKAGE_RELATIVE_PATH "${CMAKE_INSTALL_FULL_LIBDIR}/pkgconfig" "${CMAKE_INSTALL_PREFIX}")
658663
string(REGEX REPLACE "/$" "" PACKAGE_RELATIVE_PATH "${PACKAGE_RELATIVE_PATH}")
659664

configure.ac

+20
Original file line numberDiff line numberDiff line change
@@ -1173,6 +1173,26 @@ XML_LIBTOOLLIBS="libxml2.la"
11731173
XML_PRIVATE_LIBS="${XML_PRIVATE_LIBS} $THREAD_LIBS $ICONV_LIBS $LIBM $NET_LIBS"
11741174
XML_PRIVATE_CFLAGS="${XML_PRIVATE_CFLAGS} $THREAD_CFLAGS $ICONV_CFLAGS"
11751175

1176+
dnl When static-only:
1177+
dnl * Duplicate xml-config static --libs into --dynamic.
1178+
dnl * Fold pkg-config private fields into main fields.
1179+
if test "x$enable_shared" = "xno"; then
1180+
XML_PRIVATE_LIBS_NO_SHARED="${XML_PRIVATE_LIBS}"
1181+
XML_PC_PRIVATE=
1182+
XML_PC_LIBS_PRIVATE=
1183+
else
1184+
XML_PRIVATE_LIBS_NO_SHARED=
1185+
XML_PC_PRIVATE=".private"
1186+
XML_PC_LIBS_PRIVATE="
1187+
Libs.private:"
1188+
fi
1189+
AC_SUBST(XML_PRIVATE_LIBS_NO_SHARED)
1190+
AC_SUBST(XML_PC_PRIVATE)
1191+
AC_SUBST(XML_PC_LIBS_PRIVATE)
1192+
AM_SUBST_NOTMAKE(XML_PRIVATE_LIBS_NO_SHARED)
1193+
AM_SUBST_NOTMAKE(XML_PC_PRIVATE)
1194+
AM_SUBST_NOTMAKE(XML_PC_LIBS_PRIVATE)
1195+
11761196
AC_SUBST(XML_PC_LIBS)
11771197
AC_SUBST(XML_PC_CFLAGS)
11781198
AC_SUBST(XML_PC_REQUIRES)

libxml-2.0-uninstalled.pc.in

+2-3
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,6 @@ modules=@WITH_MODULES@
77
Name: libXML
88
Version: @VERSION@
99
Description: libXML library version2.
10-
Requires: @XML_PC_REQUIRES@
11-
Libs: -L${libdir} @XML_LIBS@
12-
Libs.private: @XML_PC_LIBS@ @LIBS@
10+
Requires@XML_PC_PRIVATE@: @XML_PC_REQUIRES@
11+
Libs: -L${libdir} @XML_LIBS@ @XML_PC_LIBS_PRIVATE@ @XML_PC_LIBS@ @LIBS@
1312
Cflags: @XML_INCLUDEDIR@ @XML_CFLAGS@ @XML_PC_CFLAGS@

libxml-2.0.pc.in

+2-3
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,6 @@ modules=@WITH_MODULES@
77
Name: libXML
88
Version: @VERSION@
99
Description: libXML library version2.
10-
Requires: @XML_PC_REQUIRES@
11-
Libs: -L${libdir} @XML_LIBS@
12-
Libs.private: @XML_PC_LIBS@ @LIBS@
10+
Requires@XML_PC_PRIVATE@: @XML_PC_REQUIRES@
11+
Libs: -L${libdir} @XML_LIBS@ @XML_PC_LIBS_PRIVATE@ @XML_PC_LIBS@ @LIBS@
1312
Cflags: @XML_INCLUDEDIR@ @XML_CFLAGS@ @XML_PC_CFLAGS@

xml2-config.in

+1-1
Original file line numberDiff line numberDiff line change
@@ -84,7 +84,7 @@ while test $# -gt 0; do
8484
--libs)
8585
if [ "$2" = "--dynamic" ]; then
8686
shift
87-
libs="@XML_LIBS@"
87+
libs="@XML_LIBS@ @XML_PRIVATE_LIBS_NO_SHARED@"
8888
else
8989
libs="@XML_LIBS@ @XML_PRIVATE_LIBS@ @MODULE_PLATFORM_LIBS@ @LIBS@"
9090
fi

0 commit comments

Comments
 (0)