1
0
mirror of https://git.FreeBSD.org/ports.git synced 2024-12-19 03:52:17 +00:00
freebsd-ports/Mk/Scripts/qa.sh
Tobias C. Berner 30a183cdd9 Importing KDE Frameworks into the ports tree (required for newer KDE Desktop and Applications)
KDE Frameworks is a collection of libraries and software frameworks by KDE
that serve as technological foundation for KDE Plasma 5 and KDE Applications
distributed under the GNU Lesser General Public License (LGPL) [1].

The work is based on what we have in the KDE testing repo [2].

This is the next big step in updating the KDE Desktop and its Applications
to anything less dusty.

With this change, `USES=kde:5` is now a valid option. Ports that need to depend
on KDE Framework can now set:
	USES=kde:5
	USE_KDE=<framework1> <framework2> ... <frameworkX>

For example: www/qupzilla-qt5 can depend on sysutils/kf5-kwallet via:
	KWALLET_USE=            KDE=wallet

I would like to thank Raphael and Adriaan for reviewing the ports in the testing
repo :)

[1] https://en.wikipedia.org/wiki/KDE_Frameworks
[2] http://src.mouf.net/area51/log/branches/plasma5

Reviewed by:	rakuco, mat, groot_kde.org
Approved by:	rakuco (maintainer)
Differential Revision:	https://reviews.freebsd.org/D8329
2016-11-14 16:12:56 +00:00

791 lines
28 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}
notice() {
echo "Notice: $@" >&2
}
warn() {
echo "Warning: $@" >&2
}
err() {
echo "Error: $@" >&2
}
list_stagedir_elfs() {
cd ${STAGEDIR} && find -s . -type f \( -perm +111 -o -name '*.so*' \) "$@"
}
shebangonefile() {
local f interp rc
f="$@"
rc=0
# whitelist some files
case "${f}" in
*.pm|*.pod|*.txt|${STAGEDIR}${LINUXBASE}/*)
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
local found_openssl
[ "${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
;;
*NEEDED*\[libcrypto.so.*]|*NEEDED*\[libssl.so.*])
found_openssl=1
;;
esac
done <<-EOF
$(list_stagedir_elfs -exec readelf -d {} + 2>/dev/null)
EOF
if [ -z "${USESSSL}" -a -n "${found_openssl}" ]; then
warn "you need USES=ssl"
elif [ -n "${USESSSL}" -a -z "${found_openssl}" ]; then
warn "you may not need USES=ssl"
fi
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
;;
/*)
# Only warn for symlinks within the package.
if [ -e "${STAGEDIR}${link}" ]; then
warn "Bad symlink '${l#${STAGEDIR}}' pointing to an absolute pathname '${link}'"
fi
# Also warn if the symlink exists nowhere.
if [ ! -e "${STAGEDIR}${link}" -a ! -e "${link}" ]; then
warn "Symlink '${l#${STAGEDIR}}' pointing to '${link}' which does not exist in the stage directory or in localbase"
fi
;;
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 [ ${PREFIX} != ${LINUXBASE} -a -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-runtime"
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"
# KDE
# grep -B1 _LIB= Mk/Uses/kde.mk | grep _PORT=|sed -e 's/^\(.*\)_PORT=[[:space:]]*\([^[:space:]]*\).*/elif [ ${pkg} = "\2" ]; then warn "you need to use USE_KDE+=\1"/'
elif [ ${pkg} = "sysutils/baloo" ]; then warn "you need to use USE_KDE+=baloo"
elif [ ${pkg} = "sysutils/baloo-widgets" ]; then warn "you need to use USE_KDE+=baloo-widgets"
elif [ ${pkg} = "x11/kactivities" ]; then warn "you need to use USE_KDE+=kactivities"
elif [ ${pkg} = "editors/kate" ]; then warn "you need to use USE_KDE+=kate"
elif [ ${pkg} = "x11/kdelibs4" ]; then warn "you need to use USE_KDE+=kdelibs"
elif [ ${pkg} = "sysutils/kfilemetadata" ]; then warn "you need to use USE_KDE+=kfilemetadata"
elif [ ${pkg} = "audio/libkcddb" ]; then warn "you need to use USE_KDE+=libkcddb"
elif [ ${pkg} = "audio/libkcompactdisc" ]; then warn "you need to use USE_KDE+=libkcompactdisc"
elif [ ${pkg} = "graphics/libkdcraw-kde4" ]; then warn "you need to use USE_KDE+=libkdcraw"
elif [ ${pkg} = "misc/libkdeedu" ]; then warn "you need to use USE_KDE+=libkdeedu"
elif [ ${pkg} = "games/libkdegames" ]; then warn "you need to use USE_KDE+=libkdegames"
elif [ ${pkg} = "graphics/libkexiv2-kde4" ]; then warn "you need to use USE_KDE+=libkexiv2"
elif [ ${pkg} = "graphics/libkipi-kde4" ]; then warn "you need to use USE_KDE+=libkipi"
elif [ ${pkg} = "x11/libkonq" ]; then warn "you need to use USE_KDE+=libkonq"
elif [ ${pkg} = "graphics/libksane" ]; then warn "you need to use USE_KDE+=libksane"
elif [ ${pkg} = "astro/marble" ]; then warn "you need to use USE_KDE+=marble"
elif [ ${pkg} = "sysutils/nepomuk-core" ]; then warn "you need to use USE_KDE+=nepomuk-core"
elif [ ${pkg} = "sysutils/nepomuk-widgets" ]; then warn "you need to use USE_KDE+=nepomuk-widgets"
elif [ ${pkg} = "graphics/okular" ]; then warn "you need to use USE_KDE+=okular"
elif [ ${pkg} = "deskutils/kdepimlibs4" ]; then warn "you need to use USE_KDE+=pimlibs"
elif [ ${pkg} = "devel/ruby-qtruby" ]; then warn "you need to use USE_KDE+=qtruby"
elif [ ${pkg} = "devel/smokegen" ]; then warn "you need to use USE_KDE+=smokegen"
elif [ ${pkg} = "devel/smokekde" ]; then warn "you need to use USE_KDE+=smokekde"
elif [ ${pkg} = "devel/smokeqt" ]; then warn "you need to use USE_KDE+=smokeqt"
elif [ ${pkg} = "x11/kde4-workspace" ]; then warn "you need to use USE_KDE+=workspace"
elif [ ${pkg} = "databases/akonadi" ]; then warn "you need to use USE_KDE+=akonadi"
elif [ ${pkg} = "x11-toolkits/attica" ]; then warn "you need to use USE_KDE+=attica"
elif [ ${pkg} = "x11/qimageblitz" ]; then warn "you need to use USE_KDE+=qimageblitz"
elif [ ${pkg} = "textproc/soprano" ]; then warn "you need to use USE_KDE+=soprano"
elif [ ${pkg} = "deskutils/libstreamanalyzer" ]; then warn "you need to use USE_KDE+=strigi"
# KDE Frameworks
elif [ ${pkg} = "devel/kf5-extra-cmake-modules" ]; then warn "you need to use USE_KDE+=ecm"
elif [ ${pkg} = "devel/kf5-kcmutils" ]; then warn "you need to use USE_KDE+=kcmutils"
elif [ ${pkg} = "devel/kf5-kdeclarative" ]; then warn "you need to use USE_KDE+=kdeclarative"
elif [ ${pkg} = "devel/kf5-kfilemetadata" ]; then warn "you need to use USE_KDE+=filemetadata5"
elif [ ${pkg} = "devel/kf5-kio" ]; then warn "you need to use USE_KDE+=kio"
elif [ ${pkg} = "devel/kf5-solid" ]; then warn "you need to use USE_KDE+=solid"
elif [ ${pkg} = "devel/kf5-threadweaver" ]; then warn "you need to use USE_KDE+=threadweaver"
elif [ ${pkg} = "devel/kio-extras-kf5" ]; then warn "you need to use USE_KDE+=kio-extras"
elif [ ${pkg} = "graphics/kf5-kimageformats" ]; then warn "you need to use USE_KDE+=kimageformats"
elif [ ${pkg} = "lang/kf5-kross" ]; then warn "you need to use USE_KDE+=kross"
elif [ ${pkg} = "security/kf5-kdesu" ]; then warn "you need to use USE_KDE+=kdesu"
elif [ ${pkg} = "sysutils/kf5-baloo" ]; then warn "you need to use USE_KDE+=baloo5"
elif [ ${pkg} = "sysutils/kf5-bluez-qt" ]; then warn "you need to use USE_KDE+=bluez-qt"
elif [ ${pkg} = "textproc/kf5-sonnet" ]; then warn "you need to use USE_KDE+=sonnet"
elif [ ${pkg} = "www/kf5-kdewebkit" ]; then warn "you need to use USE_KDE+=kdewebkit"
elif [ ${pkg} = "www/kf5-khtml" ]; then warn "you need to use USE_KDE+=khtml"
elif [ ${pkg} = "x11-themes/kf5-breeze-icons" ]; then warn "you need to use USE_KDE+=breeze-icons"
elif [ ${pkg} = "x11-themes/kf5-oxygen-icons5" ]; then warn "you need to use USE_KDE+=oxygen-icons5"
elif [ ${pkg} = "x11-toolkits/kf5-attica" ]; then warn "you need to use USE_KDE+=attica5"
elif [ ${pkg} = "x11/kf5-frameworkintegration" ]; then warn "you need to use USE_KDE+=frameworkintegration"
elif [ ${pkg} = "x11/kf5-kded" ]; then warn "you need to use USE_KDE+=kded"
elif [ ${pkg} = "x11/kf5-kdelibs4support" ]; then warn "you need to use USE_KDE+=kdelibs4support"
elif [ ${pkg} = "x11/kf5-plasma-framework" ]; then warn "you need to use USE_KDE+=plasma-framework"
elif expr ${pkg} : '.*/kf5-.*' > /dev/null; then
warn "you need USE_KDE+=$(echo ${pkg} | sed -E 's|.*/kf5-k||')"
# 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-||')"
elif expr ${pkg} : '.*/.*-qt4' > /dev/null; then
warn "you need USE_QT4+=$(echo ${pkg} | sed -E 's|.*/(.*)-qt4|\1|')"
# Qt5
elif expr ${pkg} : '.*/qt5-.*' > /dev/null; then
warn "you need USE_QT5+=$(echo ${pkg} | sed -E 's|.*/qt5-||')"
elif expr ${pkg} : '.*/.*-qt5' > /dev/null; then
warn "you need USE_QT5+=$(echo ${pkg} | sed -E 's|.*/(.*)-qt5|\1|')"
# 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"
# ncurses
elif [ ${pkg} = "devel/ncurses" ]; then
warn "you need USES+=ncurses"
# 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"
# ssl
elif [ ${pkg} = "security/openssl" -o ${pkg} = "security/openssl-devel" \
-o ${pkg} = "security/libressl" -o ${pkg} = "security/libressl-devel" \
]; then
warn "you need USES=ssl"
# 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})
# Skip files we already checked.
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})
# Check that the .so we need has a SONAME
if [ "${dep_file_pkg}" != "${PKGORIGIN}" ]; then
if ! readelf -d "${dep_file}" | grep -q SONAME; then
err "${file} is linked to ${dep_file} which does not have a SONAME. ${dep_file_pkg} needs to be fixed."
fi
fi
# If we don't already depend on it, and we don't provide it
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
$(ldd -a "${STAGEDIR}${file}" | \
awk '\
BEGIN {section=0}\
/^\// {section++}\
!/^\// && section<=1 && ($3 ~ "^'${PREFIX}'" || $3 ~ "^'${LOCALBASE}'") {print $3}')
EOT
done <<-EOT
$(list_stagedir_elfs | \
file -F $'\1' -f - | \
grep -a 'ELF.*FreeBSD.*dynamically linked' | \
cut -f 1 -d $'\1'| \
sed -e 's/^\.//')
EOT
[ -z "${PROXYDEPS_FATAL}" ] && return 0
return ${rc}
}
sonames() {
[ -n "${BUNDLE_LIBS}" ] && return 0
while read f; do
# No results presents a blank line from heredoc.
[ -z "${f}" ] && continue
# Ignore symlinks
[ -f "${f}" -a ! -L "${f}" ] || continue
if ! readelf -d ${f} | grep -q SONAME; then
warn "${f} doesn't have a SONAME."
warn "pkg(8) will not register it as being provided by the port."
warn "If another port depend on it, pkg will not be able to know where it comes from."
case "${f}" in
${STAGEDIR}${PREFIX}/lib/*/*)
warn "It is in a subdirectory, it may not be used in another port."
;;
*)
warn "It is directly in ${PREFIX}/lib, it is probably used by other ports."
;;
esac
fi
# Use heredoc to avoid losing rc from find|while subshell
done <<-EOT
$(find ${STAGEDIR}${PREFIX}/lib -name '*.so.*')
EOT
}
perlcore() {
local portname version module gotsome
[ -x "${LOCALBASE}/bin/corelist" ] || return 0
for dep in ${UNIFIED_DEPENDS}; do
portname=$(expr "${dep}" : ".*/p5-\(.*\)")
if [ -n "${portname}" ]; then
gotsome=1
module=$(echo ${portname}|sed -e 's/-/::/g')
version=$(expr "${dep}" : ".*>=*\([^:<]*\)")
while read l; do
case "${l}" in
*was\ not\ in\ CORE*)
# This never was with Perl
# CORE, so nothing to do here
;;
*and\ removed*)
# This was in Perl CORE but has
# been removed since.
warn "${dep##*:} was in Perl CORE. Check with \`corelist ${module} ${version}\` and \`corelist -a ${module}\` if it should be conditionally added depending on PERL_LEVEL"
;;
*deprecated*in*)
# This is in Perl CORE but is
# deprecated.
warn "${dep##*:} is in Perl CORE but deprecated. Check with \`corelist ${module} ${version}\` and \`corelist -a ${module}\` if the dependency is really needed or if it should be conditionally added depending on PERL_LEVEL"
;;
*was\ first\ released*)
# This is in Perl CORE and is
# maybe not needed.
warn "${dep##*:} is present in Perl CORE. Check with \`corelist ${module} ${version}\` and \`corelist -a ${module}\` if the dependency is really needed or if it should be conditionally added depending on PERL_LEVEL"
;;
*)
err "This line is not handled: \"${l}\""
esac
done <<-EOT
$(${LOCALBASE}/bin/corelist "${module}"|tail -1)
EOT
fi
done
if [ -n "${gotsome}" ] && ! pkg info -e devel/p5-Module-CoreList; then
notice "You have some Perl modules as dependencies but you do not have devel/p5-Module-CoreList installed, the perlcore QA check gets better results when using it, especially with older Perl versions."
fi
}
checks="shebang symlinks paths stripped desktopfileutils sharedmimeinfo"
checks="$checks suidfiles libtool libperl prefixvar baselibs terminfo"
checks="$checks proxydeps sonames perlcore"
ret=0
cd ${STAGEDIR}
for check in ${checks}; do
${check} || ret=1
done
exit ${ret}