mirror of
https://git.freebsd.org/ports.git
synced 2025-06-03 20:06:29 -04:00
It makes upgrading from one Perl major version to another way easier. For binary package users, it means pkg upgrade will detect the libperl.so.x.yy change, and reinstall the affected packages. For users using ports, it will save rebuild time as it's easier to detect what ports really need to be rebuilt. PR: 195821 Differential Revision: https://reviews.freebsd.org/D1241 Submitted by: mat Reviewed by: antoine, bdrewery Exp-run by: antoine With hat: perl Sponsored by: Absolight
266 lines
6.5 KiB
Bash
266 lines
6.5 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
|
|
|
|
LF=$(printf '\nX')
|
|
LF=${LF%X}
|
|
|
|
warn() {
|
|
echo "Warning: $@" >&2
|
|
}
|
|
|
|
err() {
|
|
echo "Error: $@" >&2
|
|
}
|
|
|
|
shebangonefile() {
|
|
local f interp rc
|
|
|
|
f="$@"
|
|
rc=0
|
|
interp=$(sed -n -e '1s/^#![[:space:]]*\([^[:space:]]*\).*/\1/p;2q' "$f")
|
|
case "$interp" in
|
|
"") ;;
|
|
/usr/bin/env) ;;
|
|
${LINUXBASE}/*) ;;
|
|
${LOCALBASE}/*) ;;
|
|
${PREFIX}/*) ;;
|
|
/usr/bin/awk) ;;
|
|
/usr/bin/sed) ;;
|
|
/usr/bin/nawk) ;;
|
|
/bin/csh) ;;
|
|
/bin/sh) ;;
|
|
/bin/tcsh) ;;
|
|
*)
|
|
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 -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 -type l \
|
|
-exec stat -f "%N${LF}%Y" {} + 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/*/Makefile) continue ;;
|
|
*/lib/ruby/gems/*/Makefile.html) continue ;;
|
|
*/lib/ruby/gems/*/mkmf.log) 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.
|
|
find ${STAGEDIR} -type f \
|
|
-exec /usr/bin/file -nNF "${LF}" {} + |
|
|
while read f; do
|
|
read output
|
|
case "${output}" in
|
|
ELF\ *\ executable,\ *FreeBSD*,\ not\ stripped*|ELF\ *\ shared\ object,\ *FreeBSD*,\ not\ stripped*)
|
|
warn "'${f#${STAGEDIR}${PREFIX}/}' is not stripped consider trying INSTALL_TARGET=install-strip or using \${STRIP_CMD}"
|
|
;;
|
|
esac
|
|
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}" ]; 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}
|
|
"`
|
|
# FIXME When 8.4 goes out of commission, replace the ;;
|
|
# with ;& in the case below. Also, change the logic on
|
|
# detecting if there was a file with libperl.so
|
|
if [ "$found" -ne "0" ]; then
|
|
case "$found" in
|
|
*1)
|
|
warn "${f} is not linked with ${LIBPERL}, not respecting lddlflags?"
|
|
;; #;&
|
|
*1?)
|
|
has_some_libperl_so=1
|
|
warn "${f} does not have a rpath to ${LIBPERL}, not respecting lddlflags?"
|
|
;; #;&
|
|
1??)
|
|
has_some_libperl_so=1
|
|
warn "${f} does not have a runpath to ${LIBPERL}, not respecting lddlflags?"
|
|
;; #;&
|
|
esac
|
|
else
|
|
has_some_libperl_so=1
|
|
fi
|
|
# 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
|
|
}
|
|
|
|
checks="shebang symlinks paths stripped desktopfileutils sharedmimeinfo suidfiles libtool libperl"
|
|
|
|
ret=0
|
|
cd ${STAGEDIR}
|
|
for check in ${checks}; do
|
|
${check} || ret=1
|
|
done
|
|
|
|
exit $ret
|