[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]

[Libguestfs] [PATCH] Use guestfsd binary to auto-generate library dependencies for appliance



The ELF NEEDED are used to determine guestfsd's library dependencies
with help from the dynamic linker and the package manager.

This was prompted by Debian bug #972241 which was caused by a
libtirpc package renaming in Debian/unstable because the SONAME had
been changed.
---
 appliance/Makefile.am    | 26 ++++++++++++++++-
 appliance/packagelist.in | 62 ++--------------------------------------
 m4/guestfs-appliance.m4  |  9 ++++++
 3 files changed, 36 insertions(+), 61 deletions(-)

diff --git a/appliance/Makefile.am b/appliance/Makefile.am
index bad5d9d9eb..a213e12be4 100644
--- a/appliance/Makefile.am
+++ b/appliance/Makefile.am
@@ -79,7 +79,30 @@ make.sh: make.sh.in $(top_builddir)/config.log $(top_builddir)/config.status
 
 PACKAGELIST_CPP_FLAGS = -D$(DISTRO)=1 -DEXTRA_PACKAGES="$(EXTRA_PACKAGES)"
 
-packagelist: packagelist.in Makefile
+
+if HAVE_RPM
+QUERY_FILES_CMD := xargs rpm -qf --qf '%{name}\n'
+endif
+if HAVE_DPKG
+QUERY_FILES_CMD := xargs dpkg -S | cut -d: -f1
+endif
+if HAVE_PACMAN
+QUERY_FILES_CMD := xargs pacman -Qo | sed -r 's/.* is owned by ([^ ]+) .*/\1/'
+endif
+
+# Automatically generate library dependency list
+guestfsd.deps: ../daemon/guestfsd
+	/sbin/ldconfig -p > ld.so.cache.txt
+	objdump -p $^ |\
+		sed -ne '/NEEDED/{s/ *NEEDED *//; p;}' |\
+		xargs -i grep -F {} ld.so.cache.txt |\
+		sed -ne '/ => /{s/.* => *//; p;}' |\
+		$(QUERY_FILES_CMD) |\
+		sort -u > $  t
+	rm -f ld.so.cache.txt
+	mv $  t $@
+
+packagelist: packagelist.in Makefile guestfsd.deps
 	m4 $(PACKAGELIST_CPP_FLAGS) $< | \
 	grep -v '^[[:space:]]*$$' | grep -v '^#' > $ -t
 	cmp -s $@ $ -t || mv $ -t $@
@@ -153,5 +176,6 @@ stamp-libguestfs-make-fixed-appliance.pod: libguestfs-make-fixed-appliance.pod
 
 DISTCLEANFILES += \
 	make.sh \
+	guestfsd.deps \
 	packagelist \
 	supermin.d/*
diff --git a/appliance/packagelist.in b/appliance/packagelist.in
index 13c83d8e45..68ed16a415 100644
--- a/appliance/packagelist.in
+++ b/appliance/packagelist.in
@@ -23,7 +23,6 @@ dnl Basically the same with a few minor tweaks.
 ifelse(UBUNTU,1,`define(`DEBIAN',1)')
 
 ifelse(REDHAT,1,
-  augeas-libs
   cryptsetup
   cryptsetup-luks      dnl old name used before Fedora 17
   dhclient
@@ -32,28 +31,20 @@ ifelse(REDHAT,1,
   gfs2-utils
   grub
   hfsplus-tools
-  hivex
   iproute
   iputils
-  jansson
   kernel
-  libcap
-  libldm
-  libtirpc
   nilfs-utils
   ntfsprogs
   ntfs-3g
   ntfs-3g-system-compression
   openssh-clients
-  pcre
   policycoreutils
   reiserfs-utils
-  libselinux
   syslinux-extlinux
   systemd              dnl for /sbin/reboot and udevd
   vim-minimal
   xz
-  yara
   zfs-fuse
 )
 
@@ -79,17 +70,7 @@ dnl iproute has been renamed to iproute2
   iputils-tracepath
   isc-dhcp-client
   ldmtool
-  libaugeas0
   libc-bin
-  libcap2
-  libhivex0
-  libjansson4
-  libpcre3
-  libsystemd0
-  libsystemd-id128-0
-  libsystemd-journal0
-  libtirpc1
-  libyara3
   linux-image
   dnl syslinux 'suggests' mtools, but in reality it's a hard dependency:
   mtools
@@ -107,19 +88,14 @@ dnl iproute has been renamed to iproute2
 )
 
 ifelse(ARCHLINUX,1,
-  augeas
   cdrkit
   cdrtools
   cryptsetup
   dhcpcd
   gptfdisk
   grub
-  hivex
   iproute2
   iputils
-  jansson
-  libcap
-  libtirpc
   linux
   lrzip
   dnl syslinux has mtools as optional dependency, but in reality it's
@@ -129,16 +105,13 @@ ifelse(ARCHLINUX,1,
   nilfs-utils
   ntfs-3g
   ntfs-3g-system-compression
-  pcre
   reiserfsprogs
   systemd
   vim
   xz
-  yara
 )
 
 ifelse(SUSE,1,
-  augeas
   dnl It seems no other augeas package depends on it.
   augeas-lenses
   btrfsprogs
@@ -149,16 +122,9 @@ ifelse(SUSE,1,
   genisoimage
   glibc-locale
   gptfdisk
-  hivex
   initviocons
   iproute2
   iputils
-  libcap2
-  libhivex0
-  libjansson4
-  libselinux1
-  libtirpc3
-  libyara3
   mkisofs
   ntfsprogs
   ntfs-3g
@@ -167,11 +133,9 @@ ifelse(SUSE,1,
   systemd
   vim
   xz
-  yara
 )
 
 ifelse(FRUGALWARE,1,
-  augeas
   cryptsetup-luks
   cdrkit
   dhclient
@@ -179,14 +143,10 @@ ifelse(FRUGALWARE,1,
   hfsplus
   iproute2
   iputils
-  jansson
   kernel
-  libcap
-  libtirpc
   ntfsprogs
   ntfs-3g
   openssh
-  pcre
   reiserfsprogs
   systemd
   vim
@@ -197,7 +157,6 @@ ifelse(FRUGALWARE,1,
 )
 
 ifelse(MAGEIA,1,
-  augeas
   cryptsetup
   chkconfig /* for /etc/init.d */
   cdrkit-genisoimage
@@ -207,30 +166,21 @@ ifelse(MAGEIA,1,
   gfs2-utils
   grub
   hfsplus-tools
-  hivex
   iproute2
   iputils
-  libcap
-  libjansson4
-  lib64jansson4 /* lib64jansson4 does not provide libjansson4 */
-  libldm
-  libtirpc
   dnl syslinux uses mtools without depending on it
   mtools
   nilfs-utils
   ntfsprogs
   ntfs-3g
   openssh-clients
-  pcre
   reiserfs-utils
-  libselinux
   systemd /* for /sbin/reboot and udevd */
   vim-minimal
   xz
 )
 
 ifelse(OPENMANDRIVA,1,
-  augeas
   cryptsetup
   chkconfig /* for /etc/init.d */
   cdrkit-genisoimage
@@ -238,27 +188,20 @@ ifelse(OPENMANDRIVA,1,
   dhcp-client
   extlinux
   grub2
-  lib64hivex0
-  hivex
   iproute2
   iputils
-  libcap
-  libjansson4
-  lib64jansson4 /* lib64jansson4 does not provide libjansson4 */
-  libldm
-  libtirpc
   dnl syslinux uses mtools without depending on it
   mtools
   nilfs-utils
   ntfs-3g
   openssh-clients
-  pcre
-  libselinux
   systemd /* for /sbin/reboot and udevd */
   vim-minimal
   xz
 )
 
+include(guestfsd.deps)
+
 acl
 attr
 bash
@@ -280,7 +223,6 @@ gzip
 jfsutils
 kmod
 less
-libxml2
 lsof
 lsscsi
 lvm2
diff --git a/m4/guestfs-appliance.m4 b/m4/guestfs-appliance.m4
index a7f7d8321a..b0a6ab40f0 100644
--- a/m4/guestfs-appliance.m4
+++ b/m4/guestfs-appliance.m4
@@ -114,6 +114,15 @@ AC_ARG_WITH([distro],
             AC_MSG_ERROR([/etc/os-release not available, please specify the distro using --with-distro=DISTRO])
         fi
     ]
+    AM_CONDITIONAL([HAVE_RPM],
+        [AS_CASE([$DISTRO], [REDHAT | SUSE | OPENMANDRIVA | MAGEIA ], [true],
+                            [*], [false])])
+    AM_CONDITIONAL([HAVE_DPKG],
+        [AS_CASE([$DISTRO], [DEBIAN | UBUNTU ], [true],
+                            [*], [false])])
+    AM_CONDITIONAL([HAVE_PACMAN],
+        [AS_CASE([$DISTRO], [ARCHLINUX | FRUGALWARE ], [true],
+                            [*], [false])])
 )
 AC_SUBST([DISTRO])
 
-- 
2.28.0


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]