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,45 @@ +#!/bin/sh +# +# MAINTAINER: portmgr@FreeBSD.org + +set -e +set -o pipefail + +. ${SCRIPTSDIR}/functions.sh + +validate_env PREFIX PLIST STAGEDIR LOCALBASE LIB_DIRS + +[ -n "${DEBUG_MK_SCRIPTS}" ] || [ -n "${DEBUG_MK_SCRIPTS_AUTODEPS}" ] && set -x + +set -u + +TARGET=$1 + +while read -r f; do + case "$f" in + @*) + _f=${f#* } + case "$_f" in + /*) file="${_f}" ;; + *) file="${PREFIX}/${_f}" ;; + esac + ;; + /*) file="$f" ;; + *) file="${PREFIX}/${f}" ;; + esac + # TODO if linux check for linux binaries + brandelf "${STAGEDIR}${file}" 2>/dev/null | grep -q FreeBSD || continue + objdump -x "${STAGEDIR}${file}" | awk '/NEEDED/ { print $2 }' +done < "${PLIST}" | sort -u | while read -r lib; do + plop=$lib + l=$(env LIB_DIRS="${LIB_DIRS}" LOCALBASE="${LOCALBASE}" sh "${SCRIPTSDIR}/find-lib.sh" "${lib}") + case "$l" in + ${LOCALBASE}/*) + package=$(pkg which -q "${l}" 2>/dev/null) + if [ -z "$package" ]; then + continue + fi + pkg query '"%n" { origin: %o, version: "%v" }' "${package}" + ;; + 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 @@ -3496,6 +3496,18 @@ # 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} \ + SCRIPTSDIR="${SCRIPTSDIR}" \ + PREFIX="${PREFIX}" \ + PLIST="${_PLIST}.${sp}" \ + STAGEDIR="${STAGEDIR}" \ + LOCALBASE="${LOCALBASE}" \ + LIB_DIRS="${LIB_DIRS}" \ + ${SH} ${SCRIPTSDIR}/autodeps.sh "${.TARGET}" + ${_PLIST}.${sp}: ${TMPPLIST} @if [ "${PKGBASE}" = "${sp}" ]; then \ ${SED} "/^@comment /d; /@@/d" ${TMPPLIST} > ${.TARGET} ; \ @@ -3503,7 +3515,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; \ @@ -4173,7 +4185,7 @@ DEINSTALL-DEPENDS-FLAVORS-LIST= ${DEPENDS-LIST} -f -r ${_UNIFIED_DEPENDS:N${PKG_DEPENDS}:Q} MISSING-DEPENDS-LIST= ${DEPENDS-LIST} -m ${_UNIFIED_DEPENDS:Q} BUILD-DEPENDS-LIST= ${DEPENDS-LIST} "${PKG_DEPENDS_ALL} ${EXTRACT_DEPENDS_ALL} ${PATCH_DEPENDS_ALL} ${FETCH_DEPENDS_ALL} ${BUILD_DEPENDS_ALL} ${LIB_DEPENDS_ALL}" -RUN-DEPENDS-LIST= ${DEPENDS-LIST} "${LIB_DEPENDS_ALL} ${RUN_DEPENDS_ALL}" +RUN-DEPENDS-LIST= ${DEPENDS-LIST} "${RUN_DEPENDS_ALL}" TEST-DEPENDS-LIST= ${DEPENDS-LIST} ${TEST_DEPENDS_ALL:Q} CLEAN-DEPENDS-LIST= ${DEPENDS-LIST} -wr ${_UNIFIED_DEPENDS:Q} CLEAN-DEPENDS-LIMITED-LIST= ${DEPENDS-LIST} -w ${_UNIFIED_DEPENDS:Q} @@ -4314,7 +4326,7 @@ @${PACKAGE-DEPENDS-LIST} . endif -_LIB_RUN_DEPENDS= ${LIB_DEPENDS_ALL} ${RUN_DEPENDS_ALL} +_LIB_RUN_DEPENDS= ${RUN_DEPENDS_ALL} PACKAGE-DEPENDS-LIST?= \ if [ "${CHILD_DEPENDS}" ]; then \ installed=$$(${PKG_INFO} -qO ${PKGORIGIN} 2>/dev/null || \ @@ -4372,9 +4384,6 @@ . for sp in ${_PKGS} ACTUAL-PACKAGE-DEPENDS${_SP.${sp}}?= \ depfiles="" ; \ - for lib in ${LIB_DEPENDS${_SP.${sp}}:C/\:.*//}; do \ - depfiles="$$depfiles `${SETENV} LIB_DIRS="${LIB_DIRS}" LOCALBASE="${LOCALBASE}" ${SH} ${SCRIPTSDIR}/find-lib.sh $${lib}`" ; \ - done ; \ for self in ${SELF_DEPENDS${_SP.${sp}}}; do \ if [ "$$self" = "main" ]; then \ printf "\"%s\": {origin: \"%s\", version: \"%s\"}\n" ${PKGBASE} ${PKGORIGIN} ${PKGVERSION}; \