1
0
mirror of https://git.FreeBSD.org/ports.git synced 2025-01-30 10:38:37 +00:00
freebsd-ports/Mk/Scripts/qa.sh
Mathieu Arnold 6596903add A new stage-qa test has been added, it reports all shared libraries
dependencies that are not part of the port list of dependencies.  It help
finds what is called proxy dependencies.

A is needed by B, and B is needed by C.  If C also needs A, then it needs to
be registered, and this check will tell you to do so.

Right now, it is only reporting the problems, but if you add
PROXYDEPS_FATAL=yes to your environment, it will give an error and will force
you to fix the dependencies.

PR:		195203
Submitted by:	yuri rawbw com (earlier version)
Sponsored by:	Absolight
Differential Revision:	https://reviews.freebsd.org/D6531
2016-05-25 11:59:39 +00:00

614 lines
19 KiB
Bash

#!/bin/sh
# MAINTAINER: portmgr@FreeBSD.org
# $FreeBSD$
if [ -z "${STAGEDIR}" -o -z "${PREFIX}" -o -z "${LOCALBASE}" ]; then
echo "STAGEDIR, PREFIX, LOCALBASE required in environment." >&2
exit 1
fi
[ -n "${DEBUG_MK_SCRIPTS}" -o -n "${DEBUG_MK_SCRIPTS_QA}" ] && set -x
LF=$(printf '\nX')
LF=${LF%X}
warn() {
echo "Warning: $@" >&2
}
err() {
echo "Error: $@" >&2
}
shebangonefile() {
local f interp rc
f="$@"
rc=0
# blacklist of files which are not intended to be runnable
case "${f##*/}" in
*.pm|*.pod|*.txt)
return 0
;;
esac
interp=$(sed -n -e '1s/^#![[:space:]]*\([^[:space:]]*\).*/\1/p;2q' "${f}")
case "${interp}" in
"") ;;
${LINUXBASE}/*) ;;
${LOCALBASE}/*) ;;
${PREFIX}/*) ;;
/bin/csh) ;;
/bin/sh) ;;
/bin/tcsh) ;;
/usr/bin/awk) ;;
/usr/bin/env) ;;
/usr/bin/nawk) ;;
/usr/bin/sed) ;;
/usr/sbin/dtrace) ;;
*)
err "'${interp}' is an invalid shebang you need USES=shebangfix for '${f#${STAGEDIR}${PREFIX}/}'"
rc=1
;;
esac
return ${rc}
}
shebang() {
local f l link rc
rc=0
while read f; do
# No results presents a blank line from heredoc.
[ -z "${f}" ] && continue
shebangonefile "${f}" || rc=1
# Use heredoc to avoid losing rc from find|while subshell
done <<-EOF
$(find ${STAGEDIR}${PREFIX}/bin ${STAGEDIR}${PREFIX}/sbin \
${STAGEDIR}${PREFIX}/libexec ${STAGEDIR}${PREFIX}/www \
-type f -perm +111 2>/dev/null)
EOF
# Split stat(1) result into 2 lines and read each line separately to
# retain spaces in filenames.
while read l; do
# No results presents a blank line
[ -z "${l}" ] && continue
read link
case "${link}" in
/*) f="${STAGEDIR}${link}" ;;
*) f="${l%/*}/${link}" ;;
esac
if [ -f "${f}" ]; then
shebangonefile "${f}" || rc=1
fi
# Use heredoc to avoid losing rc from find|while subshell
done <<-EOF
$(find ${STAGEDIR}${PREFIX}/bin ${STAGEDIR}${PREFIX}/sbin \
${STAGEDIR}${PREFIX}/libexec ${STAGEDIR}${PREFIX}/www \
-type l -exec stat -f "%N${LF}%Y" {} + 2>/dev/null)
EOF
return ${rc}
}
baselibs() {
local rc
[ "${PKGBASE}" = "pkg" -o "${PKGBASE}" = "pkg-devel" ] && return
while read f; do
case ${f} in
*NEEDED*\[libarchive.so.[56]])
err "Bad linking on ${f##* } please add USES=libarchive"
rc=1
;;
*NEEDED*\[libedit.so.7])
err "Bad linking on ${f##* } please add USES=libedit"
rc=1
;;
esac
done <<-EOF
$(find ${STAGEDIR}${PREFIX}/bin ${STAGEDIR}${PREFIX}/sbin \
${STAGEDIR}${PREFIX}/lib ${STAGEDIR}${PREFIX}/libexec \
-type f -exec readelf -d {} + 2>/dev/null)
EOF
return ${rc}
}
symlinks() {
local rc
rc=0
# Split stat(1) result into 2 lines and read each line separately to
# retain spaces in filenames.
while read l; do
# No results presents a blank line from heredoc.
[ -z "${l}" ] && continue
read link
case "${link}" in
${STAGEDIR}*)
err "Bad symlink '${l#${STAGEDIR}${PREFIX}/}' pointing inside the stage directory"
rc=1
;;
esac
# Use heredoc to avoid losing rc from find|while subshell.
done <<-EOF
$(find ${STAGEDIR} -type l -exec stat -f "%N${LF}%Y" {} +)
EOF
return ${rc}
}
paths() {
local rc
rc=0
while read f; do
# No results presents a blank line from heredoc.
[ -z "${f}" ] && continue
# Ignore false-positive/harmless files
case "${f}" in
*/lib/ruby/gems/*) continue ;;
*/share/texmf-var/web2c/*/*.fmt) continue ;;
*/share/texmf-var/web2c/*/*.log) continue ;;
esac
err "'${f#${STAGEDIR}${PREFIX}/}' is referring to ${STAGEDIR}"
rc=1
# Use heredoc to avoid losing rc from find|while subshell
done <<-EOF
$(find ${TMPPLIST} ${STAGEDIR} -type f -exec grep -l "${STAGEDIR}" {} +)
EOF
return ${rc}
}
# For now do not raise an error, just warnings
stripped() {
[ -x /usr/bin/file ] || return # this is fatal
[ -n "${STRIP}" ] || return 0
# Split file and result into 2 lines and read separately to ensure
# files with spaces are kept intact.
# Using readelf -h ... /ELF Header:/ will match on all ELF files.
find ${STAGEDIR} -type f ! -name '*.a' ! -name '*.o' \
-exec readelf -S {} + 2>/dev/null | awk '\
/File:/ {sub(/File: /, "", $0); file=$0} \
/SYMTAB/ {print file}' |
while read f; do
warn "'${f#${STAGEDIR}${PREFIX}/}' is not stripped consider trying INSTALL_TARGET=install-strip or using \${STRIP_CMD}"
done
}
desktopfileutils() {
if [ -z "${USESDESKTOPFILEUTILS}" ]; then
grep -q MimeType= ${STAGEDIR}${PREFIX}/share/applications/*.desktop 2>/dev/null &&
warn "you need USES=desktop-file-utils"
else
grep -q MimeType= ${STAGEDIR}${PREFIX}/share/applications/*.desktop 2>/dev/null ||
warn "you may not need USES=desktop-file-utils"
fi
return 0
}
sharedmimeinfo() {
local f found
found=0
for f in ${STAGEDIR}${PREFIX}/share/mime/packages/*.xml; do
[ "${f}" = "${STAGEDIR}${PREFIX}/share/mime/packages/*.xml" ] && break #no matches
[ "${f}" = "${STAGEDIR}${PREFIX}/share/mime/packages/freedesktop.org.xml" ] && continue
found=1
break
done
if [ -z "${USESSHAREDMIMEINFO}" -a ${found} -eq 1 ]; then
warn "you need USES=shared-mime-info"
elif [ -n "${USESSHAREDMIMEINFO}" -a ${found} -eq 0 ]; then
warn "you may not need USES=shared-mime-info"
fi
return 0
}
suidfiles() {
local filelist
filelist=`find ${STAGEDIR} -type f \
\( -perm -u+x -or -perm -g+x -or -perm -o+x \) \
\( -perm -u+s -or -perm -g+s \)`
if [ -n "${filelist}" ]; then
warn "setuid files in the stage directory (are these necessary?):"
ls -liTd ${filelist}
fi
return 0
}
libtool() {
if [ -z "${USESLIBTOOL}" ]; then
find ${STAGEDIR} -name '*.la' | while read f; do
grep -q 'libtool library' "${f}" &&
err ".la libraries found, port needs USES=libtool" &&
return 1 || true
done
# The return above continues here.
fi
}
libperl() {
local has_some_libperl_so files found
if [ -n "${SITE_ARCH_REL}" -a -d "${STAGEDIR}${PREFIX}/${SITE_ARCH_REL}" ]; then
has_some_libperl_so=0
files=0
while read f; do
# No results presents a blank line from heredoc.
[ -z "${f}" ] && continue
files=$((files+1))
found=`readelf -d ${f} | awk "BEGIN {libperl=1; rpath=10; runpath=100}
/NEEDED.*${LIBPERL}/ { libperl = 0 }
/RPATH.*perl.*CORE/ { rpath = 0 }
/RUNPATH.*perl.*CORE/ { runpath = 0 }
END {print libperl+rpath+runpath}
"`
case "${found}" in
*1)
warn "${f} is not linked with ${LIBPERL}, not respecting lddlflags?"
;;
*0)
has_some_libperl_so=1
# Older Perl did not USE_LDCONFIG.
if [ ! -f ${LOCALBASE}/${LDCONFIG_DIR}/perl5 ]; then
case "${found}" in
*1?)
warn "${f} does not have a rpath to ${LIBPERL}, not respecting lddlflags?"
;;
esac
case "${found}" in
1??)
warn "${f} does not have a runpath to ${LIBPERL}, not respecting lddlflags?"
;;
esac
fi
;;
esac
# Use heredoc to avoid losing rc from find|while subshell
done <<-EOT
$(find ${STAGEDIR}${PREFIX}/${SITE_ARCH_REL} -name '*.so')
EOT
if [ ${files} -gt 0 -a ${has_some_libperl_so} -eq 0 ]; then
err "None of the .so in ${STAGEDIR}${PREFIX}/${SITE_ARCH_REL} are linked with ${LIBPERL}, see above for the full list."
return 1
else
return 0
fi
fi
}
prefixvar() {
if test -d ${STAGEDIR}${PREFIX}/var; then
warn "port uses ${PREFIX}/var instead of /var"
fi
}
terminfo() {
local f found
for f in ${STAGEDIR}${PREFIX}/share/misc/*.terminfo; do
[ "${f}" = "${STAGEDIR}${PREFIX}/share/misc/*.terminfo" ] && break #no matches
found=1
break
done
for f in ${STAGEDIR}${PREFIX}/share/misc/terminfo.db*; do
[ "${f}" = "${STAGEDIR}${PREFIX}/share/misc/terminfo.db*" ] && break #no matches
found=1
break
done
if [ -z "${USESTERMINFO}" -a -n "${found}" ]; then
warn "you need USES=terminfo"
elif [ -n "${USESTERMINFO}" -a -z "${found}" ]; then
warn "you may not need USES=terminfo"
fi
return 0
}
listcontains() {
local str lst elt
str=$1
lst=$2
for elt in ${lst} ; do
if [ ${elt} = ${str} ]; then
return 0
fi
done
return 1
}
proxydeps_suggest_uses() {
local pkg=$1
local lib_file=$2
# miscellaneous USE clauses
if [ ${pkg} = 'devel/gettext-runtime' ]; then
warn "you need USES+=gettext"
elif [ ${pkg} = 'databases/sqlite3' ]; then
warn "you need USES+=sqlite"
elif [ ${pkg} = 'databases/sqlite2' ]; then
warn "you need USES+=sqlite:2"
# Gnome -> same as port
# grep LIB_DEPENDS= Mk/Uses/gnome.mk |sed -e 's|\(.*\)_LIB_DEPENDS.*:\(.*\)\/\(.*\)|[ "\1" = "\3" ] \&\& echo "\\${pkg} = \\\"\2/\3\\\" -o \\\\"|'|sort|sh
elif [ ${pkg} = "accessibility/atk" -o \
${pkg} = "accessibility/atkmm" -o \
${pkg} = "graphics/cairo" -o \
${pkg} = "graphics/cairomm" -o \
${pkg} = "devel/dconf" -o \
${pkg} = "audio/esound" -o \
${pkg} = "x11-toolkits/gal2" -o \
${pkg} = "devel/gconf2" -o \
${pkg} = "devel/gconfmm26" -o \
${pkg} = "devel/glib12" -o \
${pkg} = "devel/glib20" -o \
${pkg} = "devel/glibmm" -o \
${pkg} = "audio/gsound" -o \
${pkg} = "x11-toolkits/gtk12" -o \
${pkg} = "x11-toolkits/gtk20" -o \
${pkg} = "x11-toolkits/gtk30" -o \
${pkg} = "www/gtkhtml3" -o \
${pkg} = "www/gtkhtml4" -o \
${pkg} = "x11-toolkits/gtkmm20" -o \
${pkg} = "x11-toolkits/gtkmm24" -o \
${pkg} = "x11-toolkits/gtkmm30" -o \
${pkg} = "x11-toolkits/gtksourceview" -o \
${pkg} = "x11-toolkits/gtksourceview2" -o \
${pkg} = "x11-toolkits/gtksourceview3" -o \
${pkg} = "x11-toolkits/gtksourceviewmm3" -o \
${pkg} = "devel/libbonobo" -o \
${pkg} = "x11-toolkits/libbonoboui" -o \
${pkg} = "databases/libgda4" -o \
${pkg} = "databases/libgda5" -o \
${pkg} = "databases/libgda5-ui" -o \
${pkg} = "databases/libgdamm" -o \
${pkg} = "databases/libgdamm5" -o \
${pkg} = "devel/libglade2" -o \
${pkg} = "x11/libgnome" -o \
${pkg} = "graphics/libgnomecanvas" -o \
${pkg} = "x11/libgnomekbd" -o \
${pkg} = "print/libgnomeprint" -o \
${pkg} = "x11-toolkits/libgnomeprintui" -o \
${pkg} = "x11-toolkits/libgnomeui" -o \
${pkg} = "devel/libgsf" -o \
${pkg} = "www/libgtkhtml" -o \
${pkg} = "x11-toolkits/libgtksourceviewmm" -o \
${pkg} = "graphics/librsvg2" -o \
${pkg} = "devel/libsigc++12" -o \
${pkg} = "devel/libsigc++20" -o \
${pkg} = "x11-toolkits/libwnck" -o \
${pkg} = "x11-toolkits/libwnck3" -o \
${pkg} = "textproc/libxml++26" -o \
${pkg} = "textproc/libxml2" -o \
${pkg} = "textproc/libxslt" -o \
${pkg} = "x11-wm/metacity" -o \
${pkg} = "x11-toolkits/pango" -o \
${pkg} = "x11-toolkits/pangomm" -o \
${pkg} = "x11-toolkits/pangox-compat" -o \
${pkg} = "x11-toolkits/vte" -o \
${pkg} = "x11-toolkits/vte3" ]; then
warn "you need USE_GNOME+=${pkg#*/}"
# Gnome different as port
# grep LIB_DEPENDS= Mk/Uses/gnome.mk |sed -e 's|\(.*\)_LIB_DEPENDS.*:\(.*\)\/\(.*\)|[ "\1" = "\3" ] \|\| echo "elif [ \\${pkg} = \\\"\2/\3\\\" ]; then; warn \\\"you need USE_GNOME+=\1\\\""|'|sort|sh
elif [ ${pkg} = "accessibility/at-spi" ]; then warn "you need USE_GNOME+=atspi"
elif [ ${pkg} = "databases/evolution-data-server" ]; then warn "you need USE_GNOME+=evolutiondataserver3"
elif [ ${pkg} = "graphics/gdk-pixbuf" ]; then warn "you need USE_GNOME+=gdkpixbuf"
elif [ ${pkg} = "graphics/gdk-pixbuf2" ]; then warn "you need USE_GNOME+=gdkpixbuf2"
elif [ ${pkg} = "x11/gnome-desktop" ]; then warn "you need USE_GNOME+=gnomedesktop3"
elif [ ${pkg} = "accessibility/gnome-speech" ]; then warn "you need USE_GNOME+=gnomespeech"
elif [ ${pkg} = "devel/gnome-vfs" ]; then warn "you need USE_GNOME+=gnomevfs2"
elif [ ${pkg} = "devel/gobject-introspection" ]; then warn "you need USE_GNOME+=introspection"
elif [ ${pkg} = "graphics/libart_lgpl" ]; then warn "you need USE_GNOME+=libartlgpl2"
elif [ ${pkg} = "devel/libIDL" ]; then warn "you need USE_GNOME+=libidl"
elif [ ${pkg} = "x11-fm/nautilus" ]; then warn "you need USE_GNOME+=nautilus3"
elif [ ${pkg} = "devel/ORBit2" ]; then warn "you need USE_GNOME+=orbit2"
# mate
# grep LIB_DEPENDS= Mk/Uses/mate.mk |sed -e 's|\(.*\)_LIB_DEPENDS.*:\(.*\)\/\(.*\)|elif [ ${pkg} = "\2/\3" ]; then warn "you need USE_MATE+=\1"|'
elif [ ${pkg} = "x11-fm/caja" ]; then warn "you need USE_MATE+=caja"
elif [ ${pkg} = "sysutils/mate-control-center" ]; then warn "you need USE_MATE+=controlcenter"
elif [ ${pkg} = "x11/mate-desktop" ]; then warn "you need USE_MATE+=desktop"
elif [ ${pkg} = "x11/libmatekbd" ]; then warn "you need USE_MATE+=libmatekbd"
elif [ ${pkg} = "net/libmateweather" ]; then warn "you need USE_MATE+=libmateweather"
elif [ ${pkg} = "x11-wm/marco" ]; then warn "you need USE_MATE+=marco"
elif [ ${pkg} = "x11/mate-menus" ]; then warn "you need USE_MATE+=menus"
elif [ ${pkg} = "x11/mate-panel" ]; then warn "you need USE_MATE+=panel"
elif [ ${pkg} = "sysutils/mate-polkit" ]; then warn "you need USE_MATE+=polkit"
# sdl-related
elif [ ${pkg} = 'devel/sdl12' ]; then
warn "you need USE_SDL+=sdl"
elif echo ${pkg} | grep -E '/sdl_(console|gfx|image|mixer|mm|net|pango|sound|ttf)$' > /dev/null; then
warn "you need USE_SDL+=$(echo ${pkg} | sed -E 's|.*/sdl_||')"
elif [ ${pkg} = 'devel/sdl20' ]; then
warn "you need USE_SDL+=sdl2"
elif echo ${pkg} | grep -E '/sdl2_(gfx|image|mixer|net|ttf)$' > /dev/null; then
warn "you need USE_SDL+=$(echo ${pkg} | sed -E 's|.*/sdl2_||')2"
# gl-related
elif [ ${pkg} = 'graphics/libGL' ]; then
warn "you need USE_GL+=gl"
elif [ ${pkg} = 'graphics/gbm' ]; then
warn "you need USE_GL+=gbm"
elif [ ${pkg} = 'graphics/libglesv2' ]; then
warn "you need USE_GL+=glesv2"
elif [ ${pkg} = 'graphics/libEGL' ]; then
warn "you need USE_GL+=egl"
elif [ ${pkg} = 'graphics/glew' ]; then
warn "you need USE_GL+=glew"
elif [ ${pkg} = 'graphics/libGLU' ]; then
warn "you need USE_GL+=glu"
elif [ ${pkg} = 'graphics/libGLw' ]; then
warn "you need USE_GL+=glw"
elif [ ${pkg} = 'graphics/freeglut' ]; then
warn "you need USE_GL+=glut"
# Xorg-libraries: this should be by XORG_MODULES @ bsd.xorg.mk
elif echo ${pkg} | grep -E '/lib(X11|Xau|Xdmcp|Xext|SM|ICE|Xfixes|Xft|Xdamage|Xcomposite|Xcursor|Xinerama|Xmu|Xmuu|Xpm|Xt|Xtst|Xi|Xrandr|Xrender|Xres|XScrnSaver|Xv|Xxf86vm|Xxf86dga|Xxf86misc|xcb)$' > /dev/null; then
warn "you need USE_XORG+=$(echo ${pkg} | sed -E 's|.*/lib//' | tr '[:upper:]' '[:lower:]')"
elif [ ${pkg} = 'x11/pixman' ]; then
warn "you need USE_XORG+=pixman"
# Qt4
elif expr ${pkg} : '.*/qt4-.*' > /dev/null; then
warn "you need USE_QT4+=$(echo ${pkg} | sed -E 's|.*/qt4-||')"
# Qt5
elif expr ${pkg} : '.*/qt5-.*' > /dev/null; then
warn "you need USE_QT5+=$(echo ${pkg} | sed -E 's|.*/qt5-||')"
# MySQL
elif expr ${lib_file} : "${LOCALBASE}/lib/mysql/[^/]*$" > /dev/null; then
warn "you need USES+=mysql"
# postgresql
elif expr ${pkg} : "^databases/postgresql.*-client" > /dev/null; then
warn "you need USES+=pgsql"
# bdb
elif expr ${pkg} : "^databases/db[456]" > /dev/null; then
warn "you need USES+=bdb"
# execinfo
elif [ ${pkg} = "devel/libexecinfo" ]; then
warn "you need USES+=execinfo"
# fam/gamin
elif [ ${pkg} = "devel/fam" -o ${pkg} = "devel/gamin" ]; then
warn "you need USES+=fam"
# firebird
elif [ ${pkg} = "databases/firebird25-client" ]; then
warn "you need USES+=firebird"
# fuse
elif [ ${pkg} = "sysutils/fusefs-libs" ]; then
warn "you need USES+=fuse"
# gnustep
elif [ ${pkg} = "lang/gnustep-base" ]; then
warn "you need USES+=gnustep and USE_GNUSTEP+=base"
elif [ ${pkg} = "x11-toolkits/gnustep-gui" ]; then
warn "you need USES+=gnustep and USE_GNUSTEP+=gui"
# iconv
elif [ ${pkg} = "converters/libiconv" ]; then
warn "you need USES+=iconv"
# jpeg
elif [ ${pkg} = "graphics/jpeg" -o ${pkg} = "graphics/jpeg-turbo" ]; then
warn "you need USES+=jpeg"
# libarchive
elif [ ${pkg} = "archivers/libarchive" ]; then
warn "you need USES+=libarchive"
elif [ ${pkg} = "devel/libedit" ]; then
warn "you need USES+=libedit"
# lua
elif expr ${pkg} : "^lang/lua" > /dev/null; then
warn "you need USES+=lua"
# motif
elif [ ${pkg} = "x11-toolkits/lesstif" -o ${pkg} = "x11-toolkits/open-motif" ]; then
warn "you need USES+=motif"
# objc
elif [ ${pkg} = "lang/libobjc2" ]; then
warn "you need USES+=objc"
# openal
elif [ ${pkg} = "audio/openal" -o ${pkg} = "audio/openal-soft" -o ${pkg} = "audio/freealut" ]; then
warn "you need USES+=openal"
# pure
elif [ ${pkg} = "lang/pure" ]; then
warn "you need USES+=pure"
# readline
elif [ ${pkg} = "devel/readline" ]; then
warn "you need USES+=readline"
# Tcl
elif expr ${pkg} : "^lang/tcl" > /dev/null; then
warn "you need USES+=tcl"
# Tk
elif expr ${pkg} : "^x11-toolkits/tk" > /dev/null; then
warn "you need USES+=tk"
# Xfce
# grep LIB_DEPENDS= Mk/Uses/xfce.mk |sed -e 's|\(.*\)_LIB_DEPENDS.*:\(.*\)\/\(.*\)|elif [ ${pkg} = "\2/\3" ]; then warn "you need USE_XFCE+=\1"|'
elif [ ${pkg} = "sysutils/garcon" ]; then warn "you need USE_XFCE+=garcon"
elif [ ${pkg} = "x11/libexo" ]; then warn "you need USE_XFCE+=libexo"
elif [ ${pkg} = "x11-toolkits/libxfce4gui" ]; then warn "you need USE_XFCE+=libgui"
elif [ ${pkg} = "x11/libxfce4menu" ]; then warn "you need USE_XFCE+=libmenu"
elif [ ${pkg} = "x11/libxfce4util" ]; then warn "you need USE_XFCE+=libutil"
elif [ ${pkg} = "x11-wm/xfce4-panel" ]; then warn "you need USE_XFCE+=panel"
elif [ ${pkg} = "x11-fm/thunar" ]; then warn "you need USE_XFCE+=thunar"
elif [ ${pkg} = "x11/xfce4-conf" ]; then warn "you need USE_XFCE+=xfconf"
# default
elif expr ${lib_file} : "${LOCALBASE}/lib/[^/]*$" > /dev/null; then
lib_file=${lib_file#${LOCALBASE}/lib/}
lib_file=${lib_file%.so*}.so
warn "you need LIB_DEPENDS+=${lib_file}:${pkg}"
fi
}
subst_dep_file() {
local dep_file=$1
if expr ${dep_file} : "${LOCALBASE}/lib/libGL.so.[0-9]$" > /dev/null; then
if [ -f ${LOCALBASE}/lib/.mesa/libGL.so ]; then
echo ${LOCALBASE}/lib/.mesa/libGL.so
return
fi
elif expr ${dep_file} : "${LOCALBASE}/lib/libEGL.so.[0-9]$" > /dev/null; then
if [ -f ${LOCALBASE}/lib/.mesa/libEGL.so ]; then
echo ${LOCALBASE}/lib/.mesa/libEGL.so
return
fi
fi
echo ${dep_file}
}
proxydeps() {
local file dep_file dep_file_pkg already rc
rc=0
# Check all dynamicaly linked ELF files
# Some .so are not executable, but we want to check them too.
while read file; do
# No results presents a blank line from heredoc.
[ -z "${file}" ] && continue
while read dep_file; do
# No results presents a blank line from heredoc.
[ -z "${dep_file}" ] && continue
dep_file=$(subst_dep_file ${dep_file})
if listcontains ${dep_file} "${already}"; then
continue
fi
if $(pkg which -q ${dep_file} > /dev/null 2>&1); then
dep_file_pkg=$(pkg which -qo ${dep_file})
if ! listcontains ${dep_file_pkg} "${LIB_RUN_DEPENDS} ${PKGORIGIN}"; then
err "${file} is linked to ${dep_file} from ${dep_file_pkg} but it is not declared as a dependency"
proxydeps_suggest_uses ${dep_file_pkg} ${dep_file}
rc=1
fi
else
err "${file} is linked to ${dep_file} that does not belong to any package"
rc=1
fi
already="${already} ${dep_file}"
done <<-EOT
$(LD_LIBRARY_PATH=${LOCALBASE}/lib ldd -a "${STAGEDIR}${file}" | \
awk '\
BEGIN {section=0}\
/^\// {section++}\
!/^\// && section<=1 && ($3 ~ "^'${PREFIX}'" || $3 ~ "^'${LOCALBASE}'") {print $3}')
EOT
done <<-EOT
$(cd ${STAGEDIR} && find -s . -type f \( -perm +111 -o -name '*.so*' \) | \
file -F $'\1' -f - | \
grep -a 'ELF.*dynamically linked' | \
cut -f 1 -d $'\1'| \
sed -e 's/^\.//')
EOT
[ -z "${PROXYDEPS_FATAL}" ] && return 0
return ${rc}
}
checks="shebang symlinks paths stripped desktopfileutils sharedmimeinfo suidfiles libtool libperl prefixvar baselibs terminfo proxydeps"
ret=0
cd ${STAGEDIR}
for check in ${checks}; do
${check} || ret=1
done
exit ${ret}