#!@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 . . '@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 "${@}"