Index: Mk/Scripts/do-depends.sh =================================================================== --- /dev/null +++ Mk/Scripts/do-depends.sh @@ -0,0 +1,176 @@ +#!/bin/sh +# $FreeBSD$ +# +# MAINTAINER: portmgr@FreeBSD.org + +set -e + +. ${SCRIPTSDIR}/functions.sh + +envfault= +for i in RAWDEPENDS DEPTYPE DEPENDS_TARGET DEPENDS_PRECLEAN DEPENDS_CLEAN \ + DEPENDS_ARGS USE_PACKAGE_DEPENDS_ONLY USE_PACKAGE_DEPENDS_ONLY \ + PKG_ADD PKG_INFO WRKDIR PKGNAME STRICT_DEPENDS LOCALBASE \ + LIB_DIRS SH SCRIPTSDIR PORTSDIR +do + if ! (eval ": \${${i}?}" ) >/dev/null; then + envfault="${envfault}${envfault:+" "}${i}" + fi +done +if [ -n "${envfault}" ]; then + echo "Environment variable ${envfault} undefined. Aborting." \ + | fmt >&2 + exit 1 +fi + +set -u + +install_depends() +{ + origin=$1 + target=$2 + depends_args=$3 + if [ -z "${USE_PACKAGE_DEPENDS}" -a -z "${USE_PACKAGE_DEPENDS_ONLY}" ]; then + make -C ${origin} -DINSTALLS_DEPENDS ${target} ${depends_args} + return 0 + fi + + read pkgfile <<- EOF + $(make -C ${origin} -VPKGFILE) + EOF + read pkgbase <<- EOF + $(make -C ${origin} -VPKGBASE) + EOF + if [ -r "${pkgfile}" -a "${target}" = "${DEPENDS_TARGET}" ]; then + echo "===> Installing existing package ${pkgfile}" + if [ "${pkgbase}" = "pkg" ]; then + [ -d ${WRKDIR} ] || mkdir -p ${WRKDIR} + tar xf ${pkgfile} -C ${WRKDIR} -s ",/.*/,,g" "*/pkg-static" + ${WRKDIR}/pkg-static add ${pkgfile} + rm -f ${WRKDIR}/pkg-static + else + ${PKG_ADD} -A ${pkgfile} + fi + elif [ -n "${USE_PACKAGE_DEPENDS_ONLY}" -a "${target}" = "${DEPENDS_TARGET}" ]; then + echo "===> ${PKGNAME} depends on package: ${pkgfile} - not found" >&2 + echo "===> USE_PACKAGE_DEPENDS_ONLY set - not building missing dependency from source" >&2 + exit 1 + else + make -C ${origin} -DINSTALLS_DEPENDS ${target} ${depends_args} + fi +} + +find_package() +{ + if ${PKG_INFO} "$1" >/dev/null 2>&1; then + echo "===> ${PKGNAME} depends on package: $1 - found" + return 0 + fi + echo "===> ${PKGNAME} depends on file: $1 - not found" + return 1 +} + +find_file() +{ + if [ -e "$1" ]; then + echo "===> ${PKGNAME} depends on file: $1 - found" + return 0 + fi + echo "===> ${PKGNAME} depends on file: $1 - not found" + return 1 +} + +find_file_path() +{ + if which -s $1 ; then + echo "===> ${PKGNAME} depends on executable: $1 - found" + return 0 + fi + echo "===> ${PKGNAME} depends on executable: $1 - not found" + return 1 +} + +find_lib() +{ + echo -n "===> ${PKGNAME} depends on shared library: $1" + libfile=$(env -i LIB_DIRS="${LIB_DIRS}" LOCALBASE="${LOCALBASE}" ${SH} ${SCRIPTSDIR}/find-lib.sh $1) + if [ -z "${libfile}" ]; then + echo " - not found" + return 1 + fi + echo " - found (${libfile})" +} + +anynotfound=0 +for _line in ${RAWDEPENDS} ; do + myifs=${IFS} + IFS=: + set -- ${_line} + IFS=${myifs} + if [ $# -lt 2 -o $# -gt 3 ]; then + echo "Error: bad dependency syntax in ${DEPTYPE}" >&2 + echo "expecting: pattern:origin[:target]" >&2 + echo "got: ${_line}" >&2 + exit 1 + fi + pattern=$1 + origin=$2 + last=${3:-} + + if [ -z "${pattern}" ]; then + echo "Error: there is an empty port dependency in ${DEPTYPE}" >&2 + exit 1 + fi + + if [ -z "${origin}" ]; then + echo "Error: a dependency has an empty origin in ${DEPTYPE}" >&2 + exit 1 + fi + + case "${origin}" in + /*) ;; + *) origin="${PORTSDIR}/${origin}" ;; + esac + if [ ! -f "${origin}/Makefile" ]; then + echo "Error a dependency refers to a non existing origin: ${origin} in ${DEPTYPE}" >&2 + exit 1 + fi + + depends_args="${DEPENDS_ARGS}" + target=${DEPENDS_TARGET} + if [ -n "${last}" ]; then + target=${last} + if [ -n "${DEPENDS_PRECLEAN}" ]; then + target="clean ${target}" + depends_args="NOCLEANDEPENDS=yes" + fi + if [ -n "${DEPENDS_CLEAN}" ]; then + target="${target} clean" + depends_args="NOCLEANDEPENDS=yes" + fi + fi + + case ${pattern} in + *\>*|*\<*|*=*) fct=find_package ;; + lib*.so*) fct=find_lib ;; + /nonexistent) fct=false ;; + /*) fct=find_file ;; + *) fct=find_file_path ;; + esac + if ${fct} "${pattern}" ; then + continue + fi + [ ${pattern} = "/nonexistent" ] || anynotfound=1 + + # Now actually install the dependencies + install_depends "${origin}" "${target}" "${depends_args}" + # Recheck if the installed dependency validates the pattern except for /nonexistent + [ "${fct}" = "false" ] || ${fct} "${pattern}" + echo "===> Returning to build of ${PKGNAME}" +done + +if [ -n "${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 ${DEPTYPE} phase." + exit 1 +fi Index: Mk/bsd.port.mk =================================================================== --- Mk/bsd.port.mk +++ Mk/bsd.port.mk @@ -4320,177 +4320,32 @@ .if !target(depends) depends: pkg-depends extract-depends patch-depends lib-depends fetch-depends build-depends run-depends -.if defined(ALWAYS_BUILD_DEPENDS) -_DEPEND_ALWAYS= 1 -.else -_DEPEND_ALWAYS= 0 -.endif - -_INSTALL_DEPENDS= \ - if [ -n "${USE_PACKAGE_DEPENDS}" -o -n "${USE_PACKAGE_DEPENDS_ONLY}" ]; then \ - subpkgfile=`(cd $$dir; ${MAKE} $$depends_args -V PKGFILE)`; \ - subpkgname=$${subpkgfile%-*} ; \ - subpkgname=$${subpkgname\#\#*/} ; \ - if [ -r "$${subpkgfile}" -a "$$target" = "${DEPENDS_TARGET}" ]; then \ - ${ECHO_MSG} "===> Installing existing package $${subpkgfile}"; \ - if [ $${subpkgname} = "pkg" ]; then \ - [ -d ${WRKDIR} ] || ${MKDIR} ${WRKDIR} ; \ - ${TAR} xf $${subpkgfile} -C ${WRKDIR} -s ",/.*/,,g" "*/pkg-static" ; \ - ${WRKDIR}/pkg-static add $${subpkgfile}; \ - ${RM} -f ${WRKDIR}/pkg-static; \ - else \ - ${PKG_ADD} -A $${subpkgfile}; \ - fi; \ - elif [ -n "${USE_PACKAGE_DEPENDS_ONLY}" -a "$${target}" = "${DEPENDS_TARGET}" ]; then \ - ${ECHO_MSG} "===> ${PKGNAME} depends on package: $${subpkgfile} - not found"; \ - ${ECHO_MSG} "===> USE_PACKAGE_DEPENDS_ONLY set - not building missing dependency from source"; \ - exit 1; \ - else \ - (cd $$dir; ${MAKE} -DINSTALLS_DEPENDS $$target $$depends_args) ; \ - fi; \ - elif [ -z "${STRICT_DEPENDS}" ]; then \ - (cd $$dir; ${MAKE} -DINSTALLS_DEPENDS $$target $$depends_args) ; \ - fi; \ - ${ECHO_MSG} "===> Returning to build of ${PKGNAME}"; - -.for deptype in PKG EXTRACT PATCH FETCH BUILD RUN +.for deptype in PKG EXTRACT PATCH FETCH BUILD LIB RUN ${deptype:tl}-depends: -.if defined(${deptype}_DEPENDS) -.if !defined(NO_DEPENDS) - @set -e ; anynotfound=0; for i in `${ECHO_CMD} "${${deptype}_DEPENDS}"`; do \ - prog=$${i%%:*}; \ - if [ -z "$$prog" ]; then \ - ${ECHO_MSG} "Error: there is an empty port dependency in ${deptype}_DEPENDS."; \ - break; \ - fi; \ - dir=`${ECHO_CMD} $$i | ${SED} -e 's/[^:]*://'`; \ - if ${EXPR} "$$dir" : '.*:' > /dev/null; then \ - target=$${dir##*:}; \ - dir=$${dir%%:*}; \ - if [ X${DEPENDS_PRECLEAN} != "X" ]; then \ - target="clean $$target"; \ - depends_args="$$depends_args NOCLEANDEPENDS=yes"; \ - fi; \ - if [ X${DEPENDS_CLEAN} != "X" ]; then \ - target="$$target clean"; \ - depends_args="$$depends_args NOCLEANDEPENDS=yes"; \ - fi; \ - else \ - target="${DEPENDS_TARGET}"; \ - depends_args="${DEPENDS_ARGS}"; \ - fi; \ - if ${EXPR} "$$prog" : \\/ >/dev/null; then \ - if [ -e "$$prog" ]; then \ - if [ "$$prog" = "${NONEXISTENT}" ]; then \ - ${ECHO_MSG} "Error: ${NONEXISTENT} exists. Please remove it, and restart the build."; \ - ${FALSE}; \ - else \ - ${ECHO_MSG} "===> ${PKGNAME} depends on file: $$prog - found"; \ - if [ ${_DEPEND_ALWAYS} = 1 ]; then \ - ${ECHO_MSG} " (but building it anyway)"; \ - notfound=1; \ - else \ - notfound=0; \ - fi; \ - fi; \ - else \ - ${ECHO_MSG} "===> ${PKGNAME} depends on file: $$prog - not found"; \ - notfound=1; \ - fi; \ - else \ - case $${prog} in \ - *\>*|*\<*|*=*) pkg=yes;; \ - *) pkg="";; \ - esac; \ - if [ "$$pkg" != "" ]; then \ - if ${PKG_INFO} "$$prog" > /dev/null 2>&1 ; then \ - ${ECHO_MSG} "===> ${PKGNAME} depends on package: $$prog - found"; \ - if [ ${_DEPEND_ALWAYS} = 1 ]; then \ - ${ECHO_MSG} " (but building it anyway)"; \ - notfound=1; \ - else \ - notfound=0; \ - fi; \ - else \ - ${ECHO_MSG} "===> ${PKGNAME} depends on package: $$prog - not found"; \ - notfound=1; \ - fi; \ - if [ $$notfound != 0 ]; then \ - inverse_dep=`${ECHO_CMD} $$prog | ${SED} \ - -e 's/<=/=gt=/; s/=/=lt=/; s/>/=le=/' \ - -e 's/=gt=/>/; s/=ge=/>=/; s/=lt=//dev/null || ${TRUE}`; \ - if [ "$$pkg_info" != "" ]; then \ - ${ECHO_MSG} "===> Found $$pkg_info, but you need to upgrade to $$prog."; \ - exit 1; \ - fi; \ - fi; \ - elif ${WHICH} "$$prog" > /dev/null 2>&1 ; then \ - ${ECHO_MSG} "===> ${PKGNAME} depends on executable: $$prog - found"; \ - if [ ${_DEPEND_ALWAYS} = 1 ]; then \ - ${ECHO_MSG} " (but building it anyway)"; \ - notfound=1; \ - else \ - notfound=0; \ - fi; \ - else \ - ${ECHO_MSG} "===> ${PKGNAME} depends on executable: $$prog - not found"; \ - notfound=1; \ - fi; \ - fi; \ - if [ $$notfound != 0 ]; then \ - if [ "$$prog" != "${NONEXISTENT}" ]; then \ - anynotfound=1; \ - fi; \ - ${ECHO_MSG} "===> Verifying $$target for $$prog in $$dir"; \ - if [ ! -d "$$dir" ]; then \ - ${ECHO_MSG} " => No directory for $$prog. Skipping.."; \ - else \ - ${_INSTALL_DEPENDS} \ - fi; \ - fi; \ - done; \ - if [ -n "${STRICT_DEPENDS}" -a $${anynotfound} -eq 1 ]; then \ - ${ECHO_MSG} "===> STRICT_DEPENDS set - Not installing missing dependencies."; \ - ${ECHO_MSG} " This means a dependency is wrong since it was not satisfied in the ${deptype:tl}-depends phase."; \ - exit 1; \ - fi -.endif -.else - @${DO_NADA} +.if defined(${deptype}_DEPENDS) && !defined(NO_DEPENDS) + @${SETENV} \ + RAWDEPENDS="${${deptype}_DEPENDS}" \ + DEPTYPE="${deptype}_DEPENDS" \ + DEPENDS_TARGET="${DEPENDS_TARGET}" \ + DEPENDS_PRECLEAN="${DEPENDS_PRECLEAN}" \ + DEPENDS_CLEAN="${DEPENDS_CLEAN}" \ + DEPENDS_ARGS="${DEPENDS_ARGS}" \ + USE_PACKAGE_DEPENDS="${USE_PACKAGE_DEPENDS}" \ + USE_PACKAGE_DEPENDS_ONLY="${USE_PACKAGE_DEPENDS_ONLY}" \ + PKG_ADD="${PKG_ADD}" \ + PKG_INFO="${PKG_INFO}" \ + WRKDIR="${WRKDIR}" \ + PKGNAME="${PKGNAME}" \ + STRICT_DEPENDS="${STRICT_DEPENDS}" \ + LOCALBASE="${LOCALBASE}" \ + LIB_DIRS="${LIB_DIRS}" \ + SH="${SH}" \ + SCRIPTSDIR="${SCRIPTSDIR}" \ + PORTSDIR="${PORTSDIR}" \ + ${SH} ${SCRIPTSDIR}/do-depends.sh .endif .endfor -lib-depends: -.if defined(LIB_DEPENDS) && !defined(NO_DEPENDS) - @set -e ; \ - anynotfound=0; for i in ${LIB_DEPENDS}; do \ - lib=$${i%%:*} ; \ - dir=$${i#*:} ; \ - target="${DEPENDS_TARGET}"; \ - depends_args="${DEPENDS_ARGS}"; \ - ${ECHO_MSG} -n "===> ${PKGNAME} depends on shared library: $${lib}" ; \ - libfile=`${SETENV} LIB_DIRS="${LIB_DIRS}" LOCALBASE="${LOCALBASE}" ${SH} ${SCRIPTSDIR}/find-lib.sh $${lib}` ; \ - if [ -z "$${libfile}" ]; then \ - anynotfound=1; \ - ${ECHO_MSG} " - not found"; \ - ${ECHO_MSG} "===> Verifying for $$lib in $$dir"; \ - if [ ! -d "$$dir" ] ; then \ - ${ECHO_MSG} " => No directory for $$lib. Skipping.."; \ - else \ - ${_INSTALL_DEPENDS} \ - fi ; \ - else \ - ${ECHO_MSG} " - found ($${libfile})"; \ - fi ; \ - done; \ - if [ -n "${STRICT_DEPENDS}" -a $${anynotfound} -eq 1 ]; then \ - ${ECHO_MSG} "===> STRICT_DEPENDS set - Not installing missing dependencies."; \ - ${ECHO_MSG} " This means a dependency is wrong since it was not satisfied in the lib-depends phase."; \ - exit 1; \ - fi -.endif - .endif # Dependency lists: both build and runtime, recursive. Print out directory names.