diff options
-rw-r--r-- | locale/en_US.sh | 1 | ||||
-rw-r--r-- | src/local.mk | 1 | ||||
-rw-r--r-- | src/oh-shlibdeps.sh | 79 |
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 "${@}" |