[pacman-dev] [PATCH] makepkg: Implement 'autolibprovides' option

Mohammad Alsaleh ce.mohammad.alsaleh at gmail.com
Mon Oct 19 20:05:14 UTC 2015


  The option tries to find all real (no symlinks) library names
  in the paths a compiler/linker search for by default. And add
  those libraries to libprovides.

  The option is disabled by default.

Signed-off-by: Mohammad Alsaleh <CE.Mohammad.AlSaleh at gmail.com>
---

 Side notes:

  1- I wasn't sure where to define the option. Since all options
     were moved to libmakepkg/tidy.

  2- A side benefit of this approach is that the developer does not
     have to guess what to put exactly in provides. A discussion from
     2.5 years ago:

     https://lists.archlinux.org/pipermail/pacman-dev/2013-May/017147.html 
     https://lists.archlinux.org/pipermail/pacman-dev/2013-May/017152.html


 etc/makepkg.conf.in   | 23 ++++++++++++-----------
 scripts/makepkg.sh.in | 22 ++++++++++++++++++++++
 2 files changed, 34 insertions(+), 11 deletions(-)

diff --git a/etc/makepkg.conf.in b/etc/makepkg.conf.in
index 71ec624..da6e7ad 100644
--- a/etc/makepkg.conf.in
+++ b/etc/makepkg.conf.in
@@ -74,18 +74,19 @@ BUILDENV=(!distcc color !ccache check !sign)
 # Default: OPTIONS=(strip docs libtool staticlibs emptydirs zipman purge !upx !optipng !debug)
 #  A negated option will do the opposite of the comments below.
 #
-#-- strip:      Strip symbols from binaries/libraries
-#-- docs:       Save doc directories specified by DOC_DIRS
-#-- libtool:    Leave libtool (.la) files in packages
+#-- strip:           Strip symbols from binaries/libraries
+#-- docs:            Save doc directories specified by DOC_DIRS
+#-- libtool:         Leave libtool (.la) files in packages
 #-- staticlibs: Leave static library (.a) files in packages
-#-- emptydirs:  Leave empty directories in packages
-#-- zipman:     Compress manual (man and info) pages in MAN_DIRS with gzip
-#-- purge:      Remove files specified by PURGE_TARGETS
-#-- upx:        Compress binary executable files using UPX
-#-- optipng:    Optimize PNG images with optipng
-#-- debug:      Add debugging flags as specified in DEBUG_* variables
-#
-OPTIONS=(strip docs libtool staticlibs emptydirs zipman purge !upx !optipng !debug)
+#-- emptydirs:       Leave empty directories in packages
+#-- zipman:          Compress manual (man and info) pages in MAN_DIRS with gzip
+#-- purge:           Remove files specified by PURGE_TARGETS
+#-- upx:             Compress binary executable files using UPX
+#-- optipng:         Optimize PNG images with optipng
+#-- debug:           Add debugging flags as specified in DEBUG_* variables
+#-- autolibprovides: Auto-add so provides
+#
+OPTIONS=(strip docs libtool staticlibs emptydirs zipman purge !upx !optipng !debug !autolibprovides)
 
 #-- File integrity checks to use. Valid: md5, sha1, sha256, sha384, sha512
 INTEGRITY_CHECK=(md5)
diff --git a/scripts/makepkg.sh.in b/scripts/makepkg.sh.in
index 6ededa3..5475bcc 100644
--- a/scripts/makepkg.sh.in
+++ b/scripts/makepkg.sh.in
@@ -48,6 +48,7 @@ declare -r startdir="$PWD"
 
 LIBRARY=${LIBRARY:-'@libmakepkgdir@'}
 
+packaging_options+=('autolibprovides')
 build_options=('ccache' 'distcc' 'buildflags' 'makeflags')
 splitpkg_overrides=('pkgdesc' 'arch' 'url' 'license' 'groups' 'depends'
                     'optdepends' 'provides' 'conflicts' 'replaces' 'backup'
@@ -944,6 +945,24 @@ find_libdepends() {
 	printf '%s\n' "${libdepends[@]}"
 }
 
+auto_libprovides() {
+	local f solib search_paths autolibprovides
+
+	msg2 "$(gettext "Auto-adding libprovides...")"
+
+	# Only search default library paths
+	search_paths=($(${CC:-gcc} -print-search-dirs | grep '^lib' | sed "s|^libraries: =|:|;s|:| ${pkgdir}|g"))
+
+	for f in $(find ${search_paths[@]} -maxdepth 1 -type f 2>/dev/null); do
+		# Match solibs, but exclude ones with a relative path to avoid dups
+		if [[ "$f" =~ \.so ]]  && [[ ! "$f" =~ \.\./ ]]; then
+			solib="${f##*/}"
+			autolibprovides+=("${solib%.so.*}.so")
+		fi
+	done
+
+	printf '%s\n' "${autolibprovides[@]}"
+}
 
 find_libprovides() {
 	local p libprovides missing
@@ -1130,6 +1149,9 @@ write_pkginfo() {
 	printf "size = %s\n" "$size"
 	printf "arch = %s\n" "$pkgarch"
 
+	if check_option "autolibprovides" "y"; then
+		mapfile -t provides < <(auto_libprovides)
+	fi
 	mapfile -t provides < <(find_libprovides)
 	mapfile -t depends < <(find_libdepends)
 
-- 
2.6.1


More information about the pacman-dev mailing list