Browse Source

build: Switch to use libtool for the static libraries

This makes it possible to embed libcompat inside libdpkg, so that the
static library that we ship is self contained with the required
compatibility code, specifically the MD5 functions.

This also prepares the build system for when we start building a
shared library, although it disables it by default.

Closes: #746122
Guillem Jover 10 years ago
parent
commit
93a8d74235

+ 4 - 0
.gitignore

@@ -1,6 +1,8 @@
 # Inherited ignores
 # Inherited ignores
 *.a
 *.a
 *.o
 *.o
+*.lo
+*.la
 *.so
 *.so
 *.gcno
 *.gcno
 *.gcda
 *.gcda
@@ -11,6 +13,7 @@
 *~
 *~
 .*.swp
 .*.swp
 .deps/
 .deps/
+.libs/
 Makefile
 Makefile
 Makefile.in
 Makefile.in
 
 
@@ -23,5 +26,6 @@ ChangeLog
 INSTALL
 INSTALL
 configure
 configure
 config.*
 config.*
+libtool
 aclocal.m4
 aclocal.m4
 stamp-h1
 stamp-h1

+ 1 - 0
README

@@ -44,6 +44,7 @@ some required software needs to be installed:
 
 
   GNU autoconf >= 2.60
   GNU autoconf >= 2.60
   GNU automake >= 1.11
   GNU automake >= 1.11
+  GNU libtool >= 2.0
   GNU gettext >= 0.18.2 (or just autopoint if using --disable-nls)
   GNU gettext >= 0.18.2 (or just autopoint if using --disable-nls)
   flex
   flex
 
 

+ 7 - 1
configure.ac

@@ -18,6 +18,13 @@ AM_GNU_GETTEXT([external])
 DPKG_DIST_CHECK([test "$GMSGFMT" = ":" && test "$USE_NLS" = "yes"],
 DPKG_DIST_CHECK([test "$GMSGFMT" = ":" && test "$USE_NLS" = "yes"],
                 [gettext required when NLS support enabled])
                 [gettext required when NLS support enabled])
 
 
+# Shared libraries are disabled on purpose, currently there is no ABI stability
+# guarantee, and it will be broken at will. The infrastructure is in place just
+# to be able to test that its future activation will work.
+LT_INIT([disable-shared])
+DPKG_BUILD_SHARED_LIBS
+DPKG_LINKER_VERSION_SCRIPT
+
 # Allow compilation without optional programs
 # Allow compilation without optional programs
 DPKG_BUILD_PROG([dselect])
 DPKG_BUILD_PROG([dselect])
 DPKG_BUILD_PROG([start-stop-daemon])
 DPKG_BUILD_PROG([start-stop-daemon])
@@ -42,7 +49,6 @@ AC_PROG_CXX
 DPKG_CXX_CXX11
 DPKG_CXX_CXX11
 AC_PROG_LEX
 AC_PROG_LEX
 DPKG_DIST_CHECK([test "$LEX" = ":"], [lex program required])
 DPKG_DIST_CHECK([test "$LEX" = ":"], [lex program required])
-AC_PROG_RANLIB
 AC_CHECK_PROGS([DOXYGEN], [doxygen])
 AC_CHECK_PROGS([DOXYGEN], [doxygen])
 AC_CHECK_PROG([HAVE_DOT], [dot], [YES], [NO])
 AC_CHECK_PROG([HAVE_DOT], [dot], [YES], [NO])
 DPKG_PROG_PO4A
 DPKG_PROG_PO4A

+ 5 - 0
debian/changelog

@@ -1,5 +1,10 @@
 dpkg (1.17.10) UNRELEASED; urgency=low
 dpkg (1.17.10) UNRELEASED; urgency=low
 
 
+  [ Guillem Jover ]
+  * Use libtool to build the static libraries, which makes it possible to
+    embed libcompat inside libdpkg, as required by some external programs
+    linking against the latter. Closes: #746122
+
   [ Updated manpages translations ]
   [ Updated manpages translations ]
   * German (Helge Kreutzmann).
   * German (Helge Kreutzmann).
 
 

+ 1 - 2
dpkg-deb/Makefile.am

@@ -18,8 +18,7 @@ dpkg_deb_SOURCES = \
 	main.c
 	main.c
 
 
 dpkg_deb_LDADD = \
 dpkg_deb_LDADD = \
-	../lib/dpkg/libdpkg.a \
-	../lib/compat/libcompat.a \
+	../lib/dpkg/libdpkg.la \
 	$(LIBINTL) \
 	$(LIBINTL) \
 	$(ZLIB_LIBS) \
 	$(ZLIB_LIBS) \
 	$(LIBLZMA_LIBS) \
 	$(LIBLZMA_LIBS) \

+ 1 - 2
dpkg-split/Makefile.am

@@ -20,8 +20,7 @@ dpkg_split_SOURCES = \
 	split.c
 	split.c
 
 
 dpkg_split_LDADD = \
 dpkg_split_LDADD = \
-	../lib/dpkg/libdpkg.a \
-	../lib/compat/libcompat.a \
+	../lib/dpkg/libdpkg.la \
 	$(LIBINTL)
 	$(LIBINTL)
 
 
 install-data-local:
 install-data-local:

+ 1 - 2
dselect/Makefile.am

@@ -42,8 +42,7 @@ dselect_SOURCES = \
 
 
 dselect_LDADD = \
 dselect_LDADD = \
 	$(CURSES_LIBS) \
 	$(CURSES_LIBS) \
-	../lib/dpkg/libdpkg.a \
-	../lib/compat/libcompat.a \
+	../lib/dpkg/libdpkg.la \
 	$(LIBINTL)
 	$(LIBINTL)
 
 
 
 

+ 15 - 15
lib/compat/Makefile.am

@@ -5,60 +5,60 @@ AM_CPPFLAGS = \
 	-I$(top_builddir)
 	-I$(top_builddir)
 
 
 
 
-noinst_LIBRARIES = libcompat.a
+noinst_LTLIBRARIES = libcompat.la
 
 
-libcompat_a_SOURCES = \
+libcompat_la_SOURCES = \
 	empty.c \
 	empty.c \
 	compat.h \
 	compat.h \
 	gettext.h
 	gettext.h
 
 
 # FIXME: unconditionally include these for now.
 # FIXME: unconditionally include these for now.
-libcompat_a_SOURCES += md5.c md5.h
+libcompat_la_SOURCES += md5.c md5.h
 
 
 if !HAVE_GETOPT
 if !HAVE_GETOPT
-libcompat_a_SOURCES += getopt.c getopt.h
+libcompat_la_SOURCES += getopt.c getopt.h
 endif
 endif
 
 
 if !HAVE_GETOPT_LONG
 if !HAVE_GETOPT_LONG
-libcompat_a_SOURCES += getopt1.c
+libcompat_la_SOURCES += getopt1.c
 endif
 endif
 
 
 if !HAVE_OBSTACK_FREE
 if !HAVE_OBSTACK_FREE
-libcompat_a_SOURCES += obstack.c obstack.h
+libcompat_la_SOURCES += obstack.c obstack.h
 endif
 endif
 
 
 if !HAVE_STRNLEN
 if !HAVE_STRNLEN
-libcompat_a_SOURCES += strnlen.c
+libcompat_la_SOURCES += strnlen.c
 endif
 endif
 
 
 if !HAVE_STRNDUP
 if !HAVE_STRNDUP
-libcompat_a_SOURCES += strndup.c
+libcompat_la_SOURCES += strndup.c
 endif
 endif
 
 
 if !HAVE_STRERROR
 if !HAVE_STRERROR
-libcompat_a_SOURCES += strerror.c
+libcompat_la_SOURCES += strerror.c
 endif
 endif
 
 
 if !HAVE_STRSIGNAL
 if !HAVE_STRSIGNAL
-libcompat_a_SOURCES += strsignal.c
+libcompat_la_SOURCES += strsignal.c
 endif
 endif
 
 
 if !HAVE_C99_SNPRINTF
 if !HAVE_C99_SNPRINTF
-libcompat_a_SOURCES += snprintf.c vsnprintf.c
+libcompat_la_SOURCES += snprintf.c vsnprintf.c
 endif
 endif
 
 
 if !HAVE_ASPRINTF
 if !HAVE_ASPRINTF
-libcompat_a_SOURCES += asprintf.c vasprintf.c
+libcompat_la_SOURCES += asprintf.c vasprintf.c
 endif
 endif
 
 
 if !HAVE_ALPHASORT
 if !HAVE_ALPHASORT
-libcompat_a_SOURCES += alphasort.c
+libcompat_la_SOURCES += alphasort.c
 endif
 endif
 
 
 if !HAVE_SCANDIR
 if !HAVE_SCANDIR
-libcompat_a_SOURCES += scandir.c
+libcompat_la_SOURCES += scandir.c
 endif
 endif
 
 
 if !HAVE_UNSETENV
 if !HAVE_UNSETENV
-libcompat_a_SOURCES += unsetenv.c
+libcompat_la_SOURCES += unsetenv.c
 endif
 endif

+ 17 - 2
lib/dpkg/Makefile.am

@@ -21,9 +21,24 @@ EXTRA_DIST = \
 pkgconfigdir = $(libdir)/pkgconfig
 pkgconfigdir = $(libdir)/pkgconfig
 pkgconfig_DATA = libdpkg.pc
 pkgconfig_DATA = libdpkg.pc
 
 
-lib_LIBRARIES = libdpkg.a
+lib_LTLIBRARIES = libdpkg.la
 
 
-libdpkg_a_SOURCES = \
+if HAVE_LINKER_VERSION_SCRIPT
+libdpkg_la_LDFLAGS = \
+	-Wl,--version-script=$(srcdir)/libdpkg.map
+endif
+libdpkg_la_LIBADD = \
+	../compat/libcompat.la
+if BUILD_SHARED
+libdpkg_la_LIBADD += \
+	$(LIBINTL) \
+	$(ZLIB_LIBS) \
+	$(LIBLZMA_LIBS) \
+	$(BZ2_LIBS)
+endif
+libdpkg_la_DEPENDENCIES = \
+	libdpkg.map
+libdpkg_la_SOURCES = \
 	dlist.h \
 	dlist.h \
 	ar.c \
 	ar.c \
 	arch.c \
 	arch.c \

+ 1 - 2
lib/dpkg/test/Makefile.am

@@ -6,8 +6,7 @@ AM_CPPFLAGS = \
 	-I$(top_builddir) \
 	-I$(top_builddir) \
 	-I$(top_srcdir)/lib
 	-I$(top_srcdir)/lib
 LDADD = \
 LDADD = \
-	$(top_builddir)/lib/dpkg/libdpkg.a \
-	$(top_builddir)/lib/compat/libcompat.a \
+	$(top_builddir)/lib/dpkg/libdpkg.la \
 	$(LIBINTL)
 	$(LIBINTL)
 
 
 
 

+ 10 - 1
m4/dpkg-build.m4

@@ -1,4 +1,13 @@
-# Copyright © 2010-2012 Guillem Jover <guillem@debian.org>
+# Copyright © 2010-2014 Guillem Jover <guillem@debian.org>
+
+# DPKG_BUILD_SHARED_LIBS()
+# ----------------------
+AC_DEFUN([DPKG_BUILD_SHARED_LIBS], [
+  m4_pattern_allow([DPKG_DEVEL_MODE])
+  AS_IF([test "$enable_shared" = "yes" && test -z "$DPKG_DEVEL_MODE"],
+        [AC_MSG_ERROR([building libdpkg as a shared library is not supported])])
+  AM_CONDITIONAL([BUILD_SHARED], [test "$enable_shared" = "yes"])
+])# DPKG_BUILD_SHARED_LIBS
 
 
 # DPKG_BUILD_PROG(PROG)
 # DPKG_BUILD_PROG(PROG)
 # ---------------
 # ---------------

+ 20 - 0
m4/dpkg-linker.m4

@@ -1,4 +1,5 @@
 # Copyright © 2004 Scott James Remnant <scott@netsplit.com>.
 # Copyright © 2004 Scott James Remnant <scott@netsplit.com>.
+# Copyright © 2010, 2014 Guillem Jover <guillem@debian.org>
 
 
 # DPKG_LINKER_OPTIMISATIONS
 # DPKG_LINKER_OPTIMISATIONS
 # --------------------------
 # --------------------------
@@ -16,3 +17,22 @@ AC_DEFUN([DPKG_LINKER_OPTIMISATIONS],
     LDFLAGS="$LDFLAGS -Wl,-O1"
     LDFLAGS="$LDFLAGS -Wl,-O1"
   ])
   ])
 ])
 ])
+
+# DPKG_LINKER_VERSION_SCRIPT
+# --------------------------
+AC_DEFUN([DPKG_LINKER_VERSION_SCRIPT],
+[
+  AC_CACHE_CHECK([for --version-script linker flag],
+    [dpkg_cv_version_script],
+    [echo "{ global: symbol; local: *; };" >conftest.map
+    save_LDFLAGS=$LDFLAGS
+    LDFLAGS="$LDFLAGS -Wl,--version-script=conftest.map"
+    AC_LINK_IFELSE([AC_LANG_PROGRAM([], [])],
+                   [dpkg_cv_version_script=yes],
+                   [dpkg_cv_version_script=no])
+    LDFLAGS="$save_LDFLAGS"
+    rm -f conftest.map
+  ])
+  AM_CONDITIONAL([HAVE_LINKER_VERSION_SCRIPT],
+                 [test "x$dpkg_cv_version_script" = "xyes"])
+])

+ 1 - 2
src/Makefile.am

@@ -10,8 +10,7 @@ AM_CPPFLAGS = \
 	-I$(top_builddir) \
 	-I$(top_builddir) \
 	-I$(top_srcdir)/lib
 	-I$(top_srcdir)/lib
 LDADD = \
 LDADD = \
-	../lib/dpkg/libdpkg.a \
-	../lib/compat/libcompat.a \
+	../lib/dpkg/libdpkg.la \
 	$(LIBINTL)
 	$(LIBINTL)
 
 
 
 

+ 2 - 2
utils/Makefile.am

@@ -24,7 +24,7 @@ update_alternatives_SOURCES = \
 	update-alternatives.c
 	update-alternatives.c
 
 
 update_alternatives_LDADD = \
 update_alternatives_LDADD = \
-	../lib/compat/libcompat.a \
+	../lib/compat/libcompat.la \
 	$(LIBINTL) \
 	$(LIBINTL) \
 	$(UA_LIBS)
 	$(UA_LIBS)
 
 
@@ -37,7 +37,7 @@ start_stop_daemon_SOURCES = \
 	start-stop-daemon.c
 	start-stop-daemon.c
 
 
 start_stop_daemon_LDADD = \
 start_stop_daemon_LDADD = \
-	../lib/compat/libcompat.a \
+	../lib/compat/libcompat.la \
 	$(SSD_LIBS)
 	$(SSD_LIBS)
 endif
 endif