Index: Mk/Scripts/qa.sh =================================================================== --- Mk/Scripts/qa.sh +++ Mk/Scripts/qa.sh @@ -313,7 +313,154 @@ return 0 } -checks="shebang symlinks paths stripped desktopfileutils sharedmimeinfo suidfiles libtool libperl prefixvar baselibs terminfo" +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} = 'devel/glib20' ]; then + warn "you need USE_GNOME+=glib20" + elif [ ${pkg} = 'graphics/gdk-pixbuf2' ]; then + warn "you need USE_GNOME+=gdkpixbuf2" + elif [ ${pkg} = 'x11-toolkits/gtk20' ]; then + warn "you need USE_GNOME+=gtk20" + elif [ ${pkg} = 'x11-toolkits/gtk30' ]; then + warn "you need USE_GNOME+=gtk30" + elif [ ${pkg} = 'graphics/cairo' ]; then + warn "you need USE_GNOME+=cairo" + elif [ ${pkg} = 'databases/sqlite3' ]; then + warn "you need USES+=sqlite" + elif [ ${pkg} = 'databases/sqlite2' ]; then + warn "you need USES+=sqlite:2" + # 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" + # 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 deplist="${LIB_RUN_DEPENDS}" + + 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} "${deplist} ${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 ~ "^/usr/local" || $3 ~ "^/usr/ppp") {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 + + return ${rc} +} + +checks="shebang symlinks paths stripped desktopfileutils sharedmimeinfo suidfiles libtool libperl prefixvar baselibs terminfo proxydeps" ret=0 cd ${STAGEDIR} Index: Mk/bsd.port.mk =================================================================== --- Mk/bsd.port.mk +++ Mk/bsd.port.mk @@ -1521,7 +1521,9 @@ "STRIP=${STRIP}" \ TMPPLIST=${TMPPLIST} \ LDCONFIG_DIR="${LDCONFIG_DIR}" \ - PKGBASE=${PKGBASE} + PKGBASE=${PKGBASE} \ + PKGORIGIN=${PKGORIGIN} \ + LIB_RUN_DEPENDS='${_LIB_RUN_DEPENDS:C,[^:]*:([^:]*):?.*,\1,}' .if !empty(USES:Mdesktop-file-utils) QA_ENV+= USESDESKTOPFILEUTILS=yes .endif