From 199bc827021ffdb43b6579d68e5eecf54c7f6f56 Mon Sep 17 00:00:00 2001 From: Earl Chew Date: Sun, 10 Mar 2024 21:12:45 -0700 Subject: [PATCH] ICU-22610 Use Requires.private and Libs.private To prevent overlinking when publishing shared libraries, specify internal dependencies using Requires.private and Libs.private. Use Libs.private in icu-uc.pc for libicudata.so, and Requires.private in icu-i18n.pc, icu-io.pc, and icu-lx.pc, so that ICU internal dependencies will not be bound into clients. The resulting *.pc files will produce the following output for icu-i18n and icu-lx, provided pkgconf has commit 78d53ea0 (2.2.0 or later) which de-duplicates multiple -L options: commit 78d53ea012dfbaf397bf8e6907efac5b51abac56 Author: Kai Pastor Date: Fri Feb 23 15:18:08 2024 +0100 Revise serials, traversal, flattening ./configure --enable-shared ... # # icu-i18n # % pkgconf --libs icu-i18n -L/opt/local/lib -licui18n % pkgconf --libs --static icu-i18n -L/opt/local/lib -licui18n -licuuc -licudata -lpthread -lm # # icu-lx # % pkgconf --libs icu-lx -L/opt/local/lib -liculx % pkgconf --libs --static icu-lx -L/opt/local/lib -liculx -L/usr/lib/x86_64-linux-gnu -licu-le-hb -lharfbuzz -lm -licuuc -licudata -lpthread -lm ./configure --disable-shared --enable-static ... # # icu-i18n # % pkgconf --libs icu-i18n -L/opt/local/lib -licui18n -licuuc -licudata -lpthread -lm % pkgconf --libs --static icu-i18n -L/opt/local/lib -licui18n -licuuc -licudata -lpthread -lm # # icu-lx # % pkgconf --libs icu-lx -L/opt/local/lib -liculx -L/usr/lib/x86_64-linux-gnu -licu-le-hb % pkgconf --libs --static icu-lx -L/opt/local/lib -liculx -L/usr/lib/x86_64-linux-gnu -licu-le-hb -lharfbuzz -licuuc -licudata -lpthread -lm --- icu4c/source/Makefile.in | 30 +++++++++++++++++++++++++----- 1 file changed, 25 insertions(+), 5 deletions(-) diff --git a/icu4c/source/Makefile.in b/icu4c/source/Makefile.in index 8366f013bce9..5c0d2aff6173 100644 --- a/icu4c/source/Makefile.in +++ b/icu4c/source/Makefile.in @@ -275,24 +275,36 @@ config/icu-uc.pc: config/icu.pc Makefile icudefs.mk @cat config/icu.pc > $@ @echo "Description: $(PACKAGE_ICU_DESCRIPTION): Common and Data libraries" >> $@ @echo "Name: $(PACKAGE)-uc" >> $@ - @echo "Libs:" '-L$${libdir}' "${ICULIBS_UC}" "${ICULIBS_DT}" >> $@ - @echo "Libs.private:" '$${baselibs}' >> $@ +ifeq ($(ENABLE_SHARED),) + @echo "Libs:" '-L$${libdir}' "${ICULIBS_UC}" "${ICULIBS_DT}" '$${baselibs}' >> $@ +else + @echo "Libs:" '-L$${libdir}' "${ICULIBS_UC}" >> $@ + @echo "Libs.private:" "${ICULIBS_DT}" '$${baselibs}' >> $@ +endif @echo $@ updated. config/icu-i18n.pc: config/icu.pc Makefile icudefs.mk @cat config/icu.pc > $@ @echo "Description: $(PACKAGE_ICU_DESCRIPTION): Internationalization library" >> $@ @echo "Name: $(PACKAGE)-i18n" >> $@ +ifeq ($(ENABLE_SHARED),) @echo "Requires: icu-uc" >> $@ - @echo "Libs:" "${ICULIBS_I18N}" >> $@ +else + @echo "Requires.private: icu-uc" >> $@ +endif + @echo "Libs:" '-L$${libdir}' "${ICULIBS_I18N}" >> $@ @echo $@ updated. config/icu-io.pc: config/icu.pc Makefile icudefs.mk @cat config/icu.pc > $@ @echo "Description: $(PACKAGE_ICU_DESCRIPTION): Stream and I/O Library" >> $@ @echo "Name: $(PACKAGE)-io" >> $@ +ifeq ($(ENABLE_SHARED),) @echo "Requires: icu-i18n" >> $@ - @echo "Libs:" "${ICULIBS_IO}" >> $@ +else + @echo "Requires.private: icu-i18n" >> $@ +endif + @echo "Libs:" '-L$${libdir}' "${ICULIBS_IO}" >> $@ @echo $@ updated. ICULEHB_LIBS=@ICULEHB_LIBS@ @@ -306,12 +318,20 @@ config/icu-lx.pc: config/icu.pc Makefile icudefs.mk @cat config/icu.pc > $@ @echo "Description: $(PACKAGE_ICU_DESCRIPTION): Paragraph Layout library $(USING_HB)" >> $@ @echo "Name: $(PACKAGE)-lx" >> $@ +ifeq ($(ENABLE_SHARED),) ifneq ($(ICULEHB_LIBS),) @echo "Requires: icu-le-hb icu-uc" >> $@ else @echo "Requires: icu-le" >> $@ endif - @echo "Libs:" "${ICULIBS_LX}" >> $@ +else +ifneq ($(ICULEHB_LIBS),) + @echo "Requires.private: icu-le-hb icu-uc" >> $@ +else + @echo "Requires.private: icu-le" >> $@ +endif +endif + @echo "Libs:" '-L$${libdir}' "${ICULIBS_LX}" >> $@ @echo $@ updated.