diff --git a/Mk/Scripts/autodeps.sh b/Mk/Scripts/autodeps.sh new file mode 100644 --- /dev/null +++ b/Mk/Scripts/autodeps.sh @@ -0,0 +1,38 @@ +#!/bin/sh +# +# MAINTAINER: portmgr@FreeBSD.org + +set -e +set -o pipefail + +. ${dp_SCRIPTSDIR}/functions.sh + +validate_env dp_PREFIX dp_PLIST dp_STAGEDIR dp_LOCALBASE + +[ -n "${DEBUG_MK_SCRIPTS}" -o -n "${DEBUG_MK_SCRIPTS_AUTODEPS}" ] && set -x + +set -u + +TARGET=$1 + +while read f; do + case "$f" in + @*) continue ;; + *) file="${dp_PREFIX}/${f}" ;; + /*) file="$f" ;; + esac + # TODO if linux check for linux binaries + brandelf $file >/dev/null 2>&1 || continue + ldd -f "%p\n" ${file} | grep '^/' +done < ${dp_PLIST} | sort -u | while read lib; do + case "$lib" in + ${dp_LOCALBASE}/*) + package=$(pkg which ${lib} 2>/dev/null) + if [ -z "$package" ]; then + continue + fi + pkg query '"%n" { origin: %o, version: "%v" }' $package + ;; + *) continue; + esac +done | sort -u > ${TARGET} diff --git a/Mk/Scripts/create-manifest.sh b/Mk/Scripts/create-manifest.sh --- a/Mk/Scripts/create-manifest.sh +++ b/Mk/Scripts/create-manifest.sh @@ -63,6 +63,7 @@ echo "deps: { " # Ignore grep's return value. eval ${dp_ACTUAL_PACKAGE_DEPENDS} | { grep -v -E ${dp_PKG_IGNORE_DEPENDS} || :; } | sort -u +echo ".include(try=true) \"${dp_METADIR}/autodeps\"" echo "}" echo "options: {" diff --git a/Mk/bsd.port.mk b/Mk/bsd.port.mk --- a/Mk/bsd.port.mk +++ b/Mk/bsd.port.mk @@ -3480,6 +3480,17 @@ # from here this will become a loop for subpackages . for sp in ${_PKGS} +_PORTS_DIRECTORIES+= ${METADIR}.${sp} + +${METADIR}.${sp}/autodeps: ${_PLIST}.${sp} ${METADIR}.${sp} + @${SETENV} \ + dp_SCRIPTSDIR="${SCRIPTSDIR}" \ + dp_PREFIX="${PREFIX}" \ + dp_PLIST="${_PLIST}.${sp}" \ + dp_STAGEDIR="${STAGEDIR}" \ + dp_LOCALBASE="${LOCALBASE}" \ + ${SH} ${SCRIPTSDIR}/autodeps.sh "${.TARGET}" + ${_PLIST}.${sp}: ${TMPPLIST} @if [ "${PKGBASE}" = "${sp}" ]; then \ ${SED} "/^@comment /d; /@@/d" ${TMPPLIST} > ${.TARGET} ; \ @@ -3487,7 +3498,7 @@ ${SED} -n "s/@@${sp:S/${PKGBASE}-//}@@//p" ${TMPPLIST} > ${.TARGET} ; \ fi -${WRKDIR_PKGFILE${_SP.${sp}}}: ${_PLIST}.${sp} create-manifest ${WRKDIR}/pkg +${WRKDIR_PKGFILE${_SP.${sp}}}: ${_PLIST}.${sp} ${METADIR}.${sp}/autodeps create-manifest ${WRKDIR}/pkg @echo "===> Building ${PKGNAME${_SP.${sp}}}" @if ! ${SETENV} ${PKG_ENV} ${PKG_CREATE} ${PKG_CREATE_ARGS} -m ${METADIR}.${sp} -p ${_PLIST}.${sp} -o ${WRKDIR}/pkg ${PKGNAME}; then \ cd ${.CURDIR} && eval ${MAKE} delete-package >/dev/null; \