summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorP. J. McDermott <pj@pehjota.net>2019-03-21 23:31:02 (EDT)
committer P. J. McDermott <pj@pehjota.net>2019-03-22 11:42:07 (EDT)
commit5d536f76fadb0dfb5643f177a0fdb8ec13fdaad3 (patch)
tree0d92d9729e6019e53a10662280953aa1c0b5b2f7
parent67e43afdaa931250b2628a465bae116f20346550 (diff)
oh-shlibdeps: New utility
-rw-r--r--locale/en_US.sh1
-rw-r--r--src/local.mk1
-rw-r--r--src/oh-shlibdeps.sh79
3 files changed, 81 insertions, 0 deletions
diff --git a/locale/en_US.sh b/locale/en_US.sh
index eb3d95b..1323689 100644
--- a/locale/en_US.sh
+++ b/locale/en_US.sh
@@ -30,3 +30,4 @@ msg_opkhelper_chmod_man='Setting mode of manual files...'
msg_opkhelper_chmod_bin='Setting mode of program files in "%s"...'
msg_opkhelper_no_capable_build_sys='No capable build system found'
msg_opkhelper_no_capable_host_arch='No capable build system host architecture found'
+msg_opkhelper_shlib_no_pkg='No package found containing library "%s"'
diff --git a/src/local.mk b/src/local.mk
index e8250b0..c1768fa 100644
--- a/src/local.mk
+++ b/src/local.mk
@@ -1,5 +1,6 @@
bin_sources = \
src/oh-installfiles.sh \
+ src/oh-shlibdeps.sh \
src/oh-strip.sh \
src/oh-fixperms.sh \
src/oh-autoconfigure.sh \
diff --git a/src/oh-shlibdeps.sh b/src/oh-shlibdeps.sh
new file mode 100644
index 0000000..cf5473e
--- /dev/null
+++ b/src/oh-shlibdeps.sh
@@ -0,0 +1,79 @@
+#!@SH@
+#
+# opkhelper
+# src/oh-shlibdeps.sh
+# Find shared library dependencies.
+#
+# Copyright (C) 2019 Patrick "P. J." McDermott
+#
+# 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 <http://www.gnu.org/licenses/>.
+
+. '@pkgdatadir@/load.sm'
+
+find_needed()
+{
+ local elf="${1}"
+ shift 1
+
+ while IFS='' read -r lib; do
+ pkg="$('@OPKG@' search "${lib}" | sed 's/ - .*$//')"
+ if [ -z "${pkg}" ]; then
+ oh_warn "$(oh_msg 'shlib_no_pkg')" "${lib}"
+ else
+ printf '%s,\n' "${pkg}"
+ fi
+ done <<-EOF
+ $('@LDD@' "${elf}" | sed -n 's/^\t.* => \(.*\) (.*)$/\1/p' \
+ 2>/dev/null)
+ EOF
+ # The above ldd's stderr is redirected to /dev/null to hide glibc ldd's
+ # "you do not have execution permission" warning.
+}
+
+find_elves()
+{
+ local d="${1}"
+ shift 1
+ local file=
+
+ while IFS='' read -r file; do
+ if file "${file}" | grep -E 'ELF.*(executable|shared)' \
+ >/dev/null 2>&1; then
+ find_needed "${file}"
+ fi
+ done <<-EOF
+ $(find "${d}" -type f -a ! -path '*/debug/*' \
+ -a \( -name '*.so*' -o -perm '-a+x' \))
+ EOF
+
+ return 0
+}
+
+main()
+{
+ local d=
+
+ oh_init
+
+ for d in *.data/; do
+ exec 3>"${d%.data/}.substvars"
+ printf 'Shlib-Depends:' >&3
+ printf ' %s' $(find_elves "${d}" | sort -u) >&3
+ exec 3>&-
+ done
+
+ return 0
+}
+
+main "${@}"