From patchwork Sun Dec 12 10:54:39 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Allan McRae X-Patchwork-Id: 1993 Return-Path: Delivered-To: patchwork@archlinux.org Received: from mail.archlinux.org [2a01:4f9:c010:3052::1] by patchwork.archlinux.org with IMAP (fetchmail-6.4.24) for (single-drop); Sun, 12 Dec 2021 10:55:03 +0000 (UTC) Received: from mail.archlinux.org by mail.archlinux.org with LMTP id MKLnNgbVtWF+TgUAK+/4rw (envelope-from ) for ; Sun, 12 Dec 2021 10:55:02 +0000 Received: from lists.archlinux.org (lists.archlinux.org [IPv6:2a01:4f9:c010:9eb4::1]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256) (No client certificate requested) by mail.archlinux.org (Postfix) with ESMTPS id 280E3B3DC26; Sun, 12 Dec 2021 10:55:02 +0000 (UTC) Received: from lists.archlinux.org (localhost [IPv6:::1]) by lists.archlinux.org (Postfix) with ESMTP id BD13DA8385F; Sun, 12 Dec 2021 10:54:58 +0000 (UTC) X-Original-To: pacman-dev@lists.archlinux.org Delivered-To: pacman-dev@lists.archlinux.org Received: from mail.archlinux.org (mail.archlinux.org [95.216.189.61]) by lists.archlinux.org (Postfix) with ESMTPS id EE098A83847 for ; Sun, 12 Dec 2021 10:54:56 +0000 (UTC) From: Allan McRae DKIM-Signature: v=1; a=ed25519-sha256; c=relaxed/relaxed; d=archlinux.org; s=dkim-ed25519; t=1639306496; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=RbF7nhkkyEYlwIdIKP9xhhHY6kBf8O8hzYF6c87my/0=; b=6BhEY8oj3ms2gREWpaqeyre7CxEoEFIhxiwOehoqYoOawF0KZ7driCG/djb/Qc1hAWPgSJ +Ijn81zCkOZW4cCg== DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=archlinux.org; s=dkim-rsa; t=1639306496; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=RbF7nhkkyEYlwIdIKP9xhhHY6kBf8O8hzYF6c87my/0=; b=RntyhcRIfT8wKnXhrvvy8FH7htfwQx1fso4Dfqitd+vgnWhHpPIRr3jr49PBjF40hbd1zw gCwVJtVr5j1PCCGGVznu7Hg9RfBV1tOB+/09GLq52tpNSkyWbuXsMW3mc1xFWer4Ii3rg4 RjioF+/QoGDwB70qZOrFkuwUqLr+SrnpCaVHmYQrEGTc5mTGboDVwUI5NL0LNZCjgv505r UksqQr2QF7SbpOdZB3UvYV9CAZ6Ri0pHKUBdiJt5hPb4QA2PpeP/GpruVs30kjt0t4T23S BS5lOm0RVea2npiZ7J/9PHBJuBcnGE+9WrNZahIYlLyKzzBaveum11gf8A8F2v0NoMUnuL 1VGijlR2uSPGLYAYkw+0Ek7jI6qPjMfGJc3YdNPmI8xZqkAPR0wQv5a7POtZpUipZHuZTl u8CExBNO9ej+shTOTUeKclwtoKXcgl5I5aUziuBK4f9aebdXfiA3OFwRs65AAGagqLXBau 5YvYqCx4YNWlkBCaUk8t1BcEcbiK8LEIrwhL6vox/8bpCO0ik7s5xlEBVOvtZ9HKSqdl1i j1UeRaOv7jTc44NAdrMrx6yfQWLy50cU6LUKoHTdbhmQ3hZxxFwlm35DkEJd2fZ8dQfpqF HqJXChjQidQU8EYgpzt9Lqy4bccSi56k7v5d3KCIujAaGSe025tx8= To: pacman-dev@lists.archlinux.org Subject: [PATCH] libmakepkg: automatically add library sonames to provides Date: Sun, 12 Dec 2021 20:54:39 +1000 Message-Id: <20211212105440.1129363-4-allan@archlinux.org> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20211212105440.1129363-1-allan@archlinux.org> References: <20211212105440.1129363-1-allan@archlinux.org> MIME-Version: 1.0 X-BeenThere: pacman-dev@lists.archlinux.org X-Mailman-Version: 2.1.38 Precedence: list List-Id: Discussion list for pacman development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: pacman-dev-bounces@lists.archlinux.org Sender: "pacman-dev" Authentication-Results: mail.archlinux.org; dkim=pass header.d=archlinux.org header.s=dkim-ed25519 header.b=6BhEY8oj; dkim=pass header.d=archlinux.org header.s=dkim-rsa header.b=RntyhcRI; dmarc=pass (policy=none) header.from=archlinux.org; spf=pass (mail.archlinux.org: domain of pacman-dev-bounces@lists.archlinux.org designates 2a01:4f9:c010:9eb4::1 as permitted sender) smtp.mailfrom=pacman-dev-bounces@lists.archlinux.org X-Rspamd-Queue-Id: 280E3B3DC26 X-Spamd-Result: default: False [-2.61 / 15.00]; DWL_DNSWL_MED(-2.00)[archlinux.org:dkim]; MID_CONTAINS_FROM(1.00)[]; R_MISSING_CHARSET(0.50)[]; DMARC_POLICY_ALLOW(-0.50)[archlinux.org,none]; RCVD_DKIM_ARC_DNSWL_MED(-0.50)[]; RCVD_IN_DNSWL_MED(-0.40)[2a01:4f9:c010:9eb4::1:from,95.216.189.61:received]; R_DKIM_ALLOW(-0.20)[archlinux.org:s=dkim-ed25519,archlinux.org:s=dkim-rsa]; R_SPF_ALLOW(-0.20)[+ip6:2a01:4f9:c010:9eb4::1:c]; MAILLIST(-0.20)[mailman]; MIME_GOOD(-0.10)[text/plain]; HAS_LIST_UNSUB(-0.01)[]; MIME_TRACE(0.00)[0:+]; ASN(0.00)[asn:24940, ipnet:2a01:4f9::/32, country:DE]; RCVD_TLS_LAST(0.00)[]; ARC_NA(0.00)[]; RCPT_COUNT_ONE(0.00)[1]; RCVD_COUNT_THREE(0.00)[3]; FROM_HAS_DN(0.00)[]; NEURAL_HAM(-0.00)[-1.000]; DKIM_TRACE(0.00)[archlinux.org:+]; PREVIOUSLY_DELIVERED(0.00)[pacman-dev@lists.archlinux.org]; FROM_NEQ_ENVFROM(0.00)[allan@archlinux.org,pacman-dev-bounces@lists.archlinux.org]; TO_DN_NONE(0.00)[]; FORGED_SENDER_MAILLIST(0.00)[] X-Rspamd-Server: mail.archlinux.org When the option "autodeps" is enabled, makepkg will add provides entries for libraries found in the directories specified in LIB_DIRS in makepkg.conf. The entries LIB_DIRS array have the format "prefix:directory". For example, the entry "lib:usr/lib" will search $pkgdir/usr/lib for library sonames and add "lib:libfoo.so.1" to the provides array. Signed-off-by: Allan McRae --- doc/makepkg.conf.5.asciidoc | 11 ++++ etc/makepkg.conf.in | 2 + .../libmakepkg/autodep/library_provides.sh.in | 56 +++++++++++++++++++ scripts/libmakepkg/autodep/meson.build | 18 ++++++ scripts/libmakepkg/meson.build | 1 + 5 files changed, 88 insertions(+) create mode 100644 scripts/libmakepkg/autodep/library_provides.sh.in create mode 100644 scripts/libmakepkg/autodep/meson.build diff --git a/doc/makepkg.conf.5.asciidoc b/doc/makepkg.conf.5.asciidoc index 76c27f6a..39c5c808 100644 --- a/doc/makepkg.conf.5.asciidoc +++ b/doc/makepkg.conf.5.asciidoc @@ -193,6 +193,11 @@ Options Enable building packages using link time optimization. Adds '-flto' to both CFLAGS and CXXFLAGS. + *autodep*;; + Enable the automatic addition of libraries to the depends and + provides arrays. Search library directories are controlled by + the LIB_DIRS variable defined below. + **INTEGRITY_CHECK=(**check1 ...**)**:: File integrity checks to use. Multiple checks may be specified; this affects both generation and checking. The current valid options are: @@ -223,6 +228,12 @@ Options that are located in opt/, you may need to add the directory to this array. *NOTE:* Do not add the leading slash to the directory name. +**LIB_DIRS=(**lib:usr/lib ...**)**:: + If `autodeps` is specified in the `OPTIONS` array, this variable will + instruct makepkg where to look to find librarys to add to the `provides` + array. The format is "prefix:path", where provides will be added for + libraries found in "path" with the specified prefix added. + **PURGE_TARGETS=(**usr/{,share}/info/dir .podlist *.pod...**)**:: If `purge` is specified in the `OPTIONS` array, this variable will instruct makepkg which files to remove from the package. This is diff --git a/etc/makepkg.conf.in b/etc/makepkg.conf.in index f69a7add..0c911cce 100644 --- a/etc/makepkg.conf.in +++ b/etc/makepkg.conf.in @@ -109,6 +109,8 @@ DOC_DIRS=(usr/{,local/}{,share/}{doc,gtk-doc} opt/*/{doc,gtk-doc}) PURGE_TARGETS=(usr/{,share}/info/dir .packlist *.pod) #-- Directory to store source code in for debug packages DBGSRCDIR="/usr/src/debug" +#-- Prefix and directories for library autodeps +LIB_DIRS=('lib:/usr/lib' 'lib32:/usr/lib32') ######################################################################### # PACKAGE OUTPUT diff --git a/scripts/libmakepkg/autodep/library_provides.sh.in b/scripts/libmakepkg/autodep/library_provides.sh.in new file mode 100644 index 00000000..5cd497fa --- /dev/null +++ b/scripts/libmakepkg/autodep/library_provides.sh.in @@ -0,0 +1,56 @@ +#!/bin/bash +# +# library_provides.sh - Automatically add a packages libraries to provides +# +# Copyright (c) 2021 Pacman Development Team +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . +# + +[[ -n "$LIBMAKEPKG_AUTODEP_LIBRARY_PROVIDES_SH" ]] && return +LIBMAKEPKG_AUTODEP_LIBRARY_PROVIDES_SH=1 + +LIBRARY=${LIBRARY:-'@libmakepkgdir@'} + +autodep_functions+=('library_provides') + +library_provides() { + if check_option "autodeps" "y"; then + for lib in ${LIB_DIRS[@]}; do + dir=${lib/*:} + prefix=${lib/:*} + + if [[ ! -d "$pkgdir/$dir" ]]; then + continue; + fi + + mapfile -t filenames < <(find "$pkgdir/$dir" -type f | LC_ALL=C sort) + + for fn in "${filenames[@]}"; do + # check we have a shared library + if LC_ALL=C readelf -h "$fn" 2>/dev/null | grep -q '.*Type:.*DYN (Shared object file).*'; then + # extract library soname + local sofile=$(LC_ALL=C readelf -d "$fn" 2>/dev/null | sed -n 's/.*Library soname: \[\(.*\)\].*/\1/p') + + if [[ -z "$sofile" ]]; then + # the library is not versioned + continue + fi + + provides+=("$prefix:$sofile") + fi + done + done + fi +} diff --git a/scripts/libmakepkg/autodep/meson.build b/scripts/libmakepkg/autodep/meson.build new file mode 100644 index 00000000..e0af26a6 --- /dev/null +++ b/scripts/libmakepkg/autodep/meson.build @@ -0,0 +1,18 @@ +libmakepkg_module = 'tidy' + +sources = [ + 'library_provides.sh.in', + +] + +foreach src : sources + output_dir = join_paths(get_option('datadir'), 'makepkg', libmakepkg_module) + + custom_target( + libmakepkg_module + '_' + src.underscorify(), + command : [ SCRIPT_EDITOR, '@INPUT@', '@OUTPUT@' ], + input : src, + output : '@BASENAME@', + install : true, + install_dir : output_dir) +endforeach diff --git a/scripts/libmakepkg/meson.build b/scripts/libmakepkg/meson.build index 50eb905b..6e83a4a8 100644 --- a/scripts/libmakepkg/meson.build +++ b/scripts/libmakepkg/meson.build @@ -1,4 +1,5 @@ libmakepkg_modules = [ + { 'name' : 'autodep', 'has_subdir' : true }, { 'name' : 'buildenv', 'has_subdir' : true }, { 'name' : 'executable', 'has_subdir' : true }, { 'name' : 'integrity', 'has_subdir' : true },