freebsd-ports/Mk/Scripts/do-depends.sh

226 lines
5.6 KiB
Bash
Raw Normal View History

#!/bin/sh
#
# MAINTAINER: portmgr@FreeBSD.org
set -e
set -o pipefail
. ${dp_SCRIPTSDIR}/functions.sh
validate_env dp_RAWDEPENDS dp_DEPTYPE dp_DEPENDS_TARGET dp_DEPENDS_PRECLEAN \
dp_DEPENDS_CLEAN dp_DEPENDS_ARGS dp_USE_PACKAGE_DEPENDS \
dp_USE_PACKAGE_DEPENDS_ONLY dp_PKG_ADD dp_PKG_INFO dp_WRKDIR \
dp_PKGNAME dp_STRICT_DEPENDS dp_LOCALBASE dp_LIB_DIRS dp_SH \
dp_SCRIPTSDIR PORTSDIR dp_MAKE dp_MAKEFLAGS dp_OVERLAYS
[ -n "${DEBUG_MK_SCRIPTS}" -o -n "${DEBUG_MK_SCRIPTS_DO_DEPENDS}" ] && set -x
set -u
install_depends()
{
origin=$1
target=$2
subpkg=$3
depends_args=$4
if [ -z "${dp_USE_PACKAGE_DEPENDS}" -a -z "${dp_USE_PACKAGE_DEPENDS_ONLY}" ]; then
INSTALLS_DEPENDS=1 MAKEFLAGS="${dp_MAKEFLAGS}" ${dp_MAKE} -C ${origin} ${target} ${depends_args}
return 0
fi
if [ -z "${subpkg}" ]; then
port_var_fetch "${origin}" "${depends_args}" \
PKGFILE pkgfile \
PKGBASE pkgbase
else
port_var_fetch "${origin}" "${depends_args}" \
PKGFILE.${subpkg} pkgfile \
PKGBASE.${subpkg} pkgbase
fi
if [ -r "${pkgfile}" -a "${target}" = "${dp_DEPENDS_TARGET}" ]; then
echo "===> Installing existing package ${pkgfile}"
if [ "${pkgbase}" = "pkg" ]; then
[ -d ${dp_WRKDIR} ] || mkdir -p ${dp_WRKDIR}
tar xf ${pkgfile} -C ${dp_WRKDIR} -s ",/.*/,,g" "*/pkg-static"
${dp_WRKDIR}/pkg-static add ${pkgfile}
rm -f ${dp_WRKDIR}/pkg-static
else
${dp_PKG_ADD} -A ${pkgfile}
fi
elif [ -n "${dp_USE_PACKAGE_DEPENDS_ONLY}" -a "${target}" = "${dp_DEPENDS_TARGET}" ]; then
echo "===> ${dp_PKGNAME} depends on package: ${pkgfile} - not found" >&2
echo "===> USE_PACKAGE_DEPENDS_ONLY set - not building missing dependency from source" >&2
exit 1
else
INSTALLS_DEPENDS=1 MAKEFLAGS="${dp_MAKEFLAGS}" ${dp_MAKE} -C ${origin} ${target} ${depends_args}
fi
}
find_package()
{
if ${dp_PKG_INFO} "$1" >/dev/null 2>&1; then
echo "===> ${dp_PKGNAME} depends on package: $1 - found"
return 0
fi
echo "===> ${dp_PKGNAME} depends on package: $1 - not found"
return 1
}
find_file()
{
if [ -e "$1" ]; then
echo "===> ${dp_PKGNAME} depends on file: $1 - found"
return 0
fi
echo "===> ${dp_PKGNAME} depends on file: $1 - not found"
return 1
}
find_file_path()
{
if which -s $1 ; then
echo "===> ${dp_PKGNAME} depends on executable: $1 - found"
return 0
fi
echo "===> ${dp_PKGNAME} depends on executable: $1 - not found"
return 1
}
find_lib()
{
echo -n "===> ${dp_PKGNAME} depends on shared library: $1"
libfile=$(env -i PATH="${PATH}" LIB_DIRS="${dp_LIB_DIRS}" LOCALBASE="${dp_LOCALBASE}" ${dp_SH} ${dp_SCRIPTSDIR}/find-lib.sh $1)
if [ -z "${libfile}" ]; then
echo " - not found"
return 1
fi
echo " - found (${libfile})"
}
anynotfound=0
err=0
for _line in ${dp_RAWDEPENDS} ; do
# ensure we never leak flavors
unset FLAVOR
myifs=${IFS}
IFS=:
set -- ${_line}
IFS=${myifs}
if [ $# -lt 2 -o $# -gt 3 ]; then
echo "Error: bad dependency syntax in ${dp_DEPTYPE}" >&2
echo "expecting: pattern:origin[@flavour][:target]" >&2
echo "got: ${_line}" >&2
err=1
continue
fi
pattern=$1
origin=$2
last=${3:-}
if [ -z "${pattern}" ]; then
echo "Error: there is an empty port dependency in ${dp_DEPTYPE}" >&2
err=1
continue
fi
if [ -z "${origin}" ]; then
echo "Error: a dependency has an empty origin in ${dp_DEPTYPE}" >&2
err=1
continue
fi
subpkg=
case "${origin}" in
*@*/*) ;; # Ignore @ in the path which would not be a flavor
*@*)
export FLAVOR="${origin##*@}"
origin=${origin%@*}
;;
*~*/*) ;; # Ignore ~ in the path which would not be a subpackage
*~*)
subpkg="${origin##*~}"
origin=${origin%~*}
;;
esac
case "${origin}" in
/*) ;;
*)
for overlay in ${dp_OVERLAYS} ${PORTSDIR}; do
orig="${overlay}/${origin}"
if [ -f "${orig}/Makefile" ]; then
break
fi
done
origin="${orig}"
;;
esac
depends_args="${dp_DEPENDS_ARGS}"
target=${dp_DEPENDS_TARGET}
if [ -n "${last}" ]; then
# In case we depend on the fetch stage, actually run checksum,
# this prevent a MITM attack.
if [ "${last}" = "fetch" ]; then
target=checksum
else
target=${last}
fi
if [ -n "${dp_DEPENDS_PRECLEAN}" ]; then
target="clean ${target}"
depends_args="${depends_args:+${depends_args} }NOCLEANDEPENDS=yes"
fi
if [ -n "${dp_DEPENDS_CLEAN}" ]; then
target="${target} clean"
depends_args="${depends_args:+${depends_args} }NOCLEANDEPENDS=yes"
fi
fi
case ${dp_DEPTYPE} in
LIB_DEPENDS)
case ${pattern} in
lib*.so*) fct=find_lib ;;
*)
echo "Error: pattern ${pattern} in LIB_DEPENDS is not valid"
err=1
continue
;;
esac ;;
*)
case ${pattern} in
*\>*|*\<*|*=*) fct=find_package ;;
/nonexistent) fct=false ;;
/*) fct=find_file ;;
*) fct=find_file_path ;;
esac ;;
esac
if ${fct} "${pattern}" ; then
continue
fi
[ ${pattern} = "/nonexistent" ] || anynotfound=1
if [ ! -f "${origin}/Makefile" ]; then
echo "Error a dependency refers to a non existing origin: ${origin} in ${dp_DEPTYPE}" >&2
err=1
continue
fi
# Now actually install the dependencies
install_depends "${origin}" "${target}" "${subpkg}" "${depends_args}"
# Recheck if the installed dependency validates the pattern except for /nonexistent
[ "${fct}" = "false" ] || ${fct} "${pattern}"
echo "===> Returning to build of ${dp_PKGNAME}"
done
if [ $err -eq 1 ]; then
echo "Errors with dependencies."
exit 1
fi
if [ -n "${dp_STRICT_DEPENDS}" -a ${anynotfound} -eq 1 ]; then \
echo "===> STRICT_DEPENDS set - Not installing missing dependencies."
echo " This means a dependency is wrong since it was not satisfied in the ${dp_DEPTYPE} phase."
exit 1
fi