summaryrefslogtreecommitdiff
path: root/mk
diff options
context:
space:
mode:
authorjoerg <joerg>2007-05-22 16:17:15 +0000
committerjoerg <joerg>2007-05-22 16:17:15 +0000
commit47f7c2ecda9707ad24958dc2049d1a0aa2c1b469 (patch)
treef30e63f9e3ebc1f367dc97f65f4b4bd2ead14709 /mk
parentfc8c2f84d497c84b2274d95a927b67d67eb88e8c (diff)
downloadpkgsrc-47f7c2ecda9707ad24958dc2049d1a0aa2c1b469.tar.gz
Make depends-cookie a flavor indendepent target. Before it was used to
trace the dependency information. This is computed and stored in .depends directly now before anything else is done. The output is locked and the locking is supposed to work before the bootstrap-depends are installed. Add a new hook for flavors after all dependencies are added and before the depends-cookie is created. Use this to compute which package is used to fulfill each dependency and store it in .rdepends. Adjust register-dependencies and some other places to use this information directly instead of recomputing it all the time. The code to list all dependencies and to recursively install missing ones is moved to a separate shell script. This makes it easier to understand what is going on and extend them later. Change the calling of pkg_create to prepend the dependencies directly to the passed-in PLIST and not via -P and -T. This is in preperation of changing the way they are stored in the packages. Discussed with, recieved minor disagreement about install-dependencies, but otherwise OKed by jlam.
Diffstat (limited to 'mk')
-rw-r--r--mk/depends/bsd.depends.mk7
-rw-r--r--mk/depends/depends.mk3
-rw-r--r--mk/flavor/pkg/depends.mk188
-rwxr-xr-xmk/flavor/pkg/install-dependencies85
-rw-r--r--mk/flavor/pkg/install.mk7
-rwxr-xr-xmk/flavor/pkg/list-dependencies67
-rw-r--r--mk/flavor/pkg/metadata.mk38
-rwxr-xr-xmk/flavor/pkg/register-dependencies17
-rwxr-xr-xmk/flavor/pkg/resolve-dependencies49
9 files changed, 305 insertions, 156 deletions
diff --git a/mk/depends/bsd.depends.mk b/mk/depends/bsd.depends.mk
index cabd14d8749..e481e74b976 100644
--- a/mk/depends/bsd.depends.mk
+++ b/mk/depends/bsd.depends.mk
@@ -1,4 +1,4 @@
-# $NetBSD: bsd.depends.mk,v 1.13 2007/03/23 21:21:33 jlam Exp $
+# $NetBSD: bsd.depends.mk,v 1.14 2007/05/22 16:17:15 joerg Exp $
#
# This Makefile fragment is included by bsd.pkg.mk and provides all
# variables and targets related to dependencies.
@@ -97,16 +97,11 @@ depends-clean:
### depends-cookie creates the depends "cookie" state file. This should
### be overridden per package system flavor.
###
-### XXX: Why? The other cookies are also created by pkgsrc, not by the
-### flavor.
-###
.PHONY: depends-cookie
-.if !target(depends-cookie)
depends-cookie:
${_PKG_SILENT}${_PKG_DEBUG}${TEST} ! -f ${_COOKIE.depends} || ${FALSE}
${_PKG_SILENT}${_PKG_DEBUG}${MKDIR} ${_COOKIE.depends:H}
${_PKG_SILENT}${_PKG_DEBUG}${TOUCH} ${TOUCH_ARGS} ${_COOKIE.depends}
-.endif
# show-depends:
# Prints a list of dependencies.
diff --git a/mk/depends/depends.mk b/mk/depends/depends.mk
index c0b29653c65..f16780ae26c 100644
--- a/mk/depends/depends.mk
+++ b/mk/depends/depends.mk
@@ -1,4 +1,4 @@
-# $NetBSD: depends.mk,v 1.12 2007/03/09 00:39:54 rillig Exp $
+# $NetBSD: depends.mk,v 1.13 2007/05/22 16:17:16 joerg Exp $
######################################################################
### depends (PUBLIC)
@@ -40,6 +40,7 @@ ${_COOKIE.depends}: real-depends
_REAL_DEPENDS_TARGETS+= depends-message
_REAL_DEPENDS_TARGETS+= pre-depends-hook
_REAL_DEPENDS_TARGETS+= _flavor-install-dependencies
+_REAL_DEPENDS_TARGETS+= _flavor-post-install-dependencies
_REAL_DEPENDS_TARGETS+= depends-cookie
_REAL_DEPENDS_TARGETS+= error-check
diff --git a/mk/flavor/pkg/depends.mk b/mk/flavor/pkg/depends.mk
index 026580ab1fd..1e74fddeceb 100644
--- a/mk/flavor/pkg/depends.mk
+++ b/mk/flavor/pkg/depends.mk
@@ -1,23 +1,31 @@
-# $NetBSD: depends.mk,v 1.26 2007/03/19 16:43:59 joerg Exp $
-
-_DEPENDS_FILE= ${WRKDIR}/.depends
-_REDUCE_DEPENDS_CMD= ${SETENV} CAT=${CAT:Q} \
- PKG_ADMIN=${PKG_ADMIN_CMD:Q} \
- PWD_CMD=${PWD_CMD:Q} TEST=${TEST:Q} \
- ${AWK} -f ${PKGSRCDIR}/mk/flavor/pkg/reduce-depends.awk
+# $NetBSD: depends.mk,v 1.27 2007/05/22 16:17:16 joerg Exp $
# This command prints out the dependency patterns for all full (run-time)
# dependencies of the package.
#
# This is used in install.mk and metadata.mk.
#
-_DEPENDS_PATTERNS_CMD= \
- [ ! -f ${_COOKIE.depends} ] \
- || ${AWK} '$$1 == "full" { print $$2; }' < ${_COOKIE.depends}
-_BUILD_DEPENDS_PATTERNS_CMD= \
- [ ! -f ${_COOKIE.depends} ] \
- || ${AWK} '$$1 == "build" { print $$2; }' < ${_COOKIE.depends}
+# ${_DEPENDS_FILE} contains all the dependency information
+# for the package. The format of each line of the file is:
+#
+# <depends_type> <pattern> <directory>
+#
+# Valid dependency types are "bootstrap", "build" and "full".
+#
+# ${_RDEPENDS_FILE} contains the resolved dependency information
+# for the package. For each line in ${_DEPENDS_FILE}
+# a corresponding line of the following form exists:
+#
+# <depends_type> <pattern> <pkg>
+#
+# "pkg" is the match for "pattern" used to fulfill the dependency.
+#
+_DEPENDS_FILE= ${WRKDIR}/.depends
+_RDEPENDS_FILE= ${WRKDIR}/.rdepends
+
+_FULL_DEPENDS_CMD= \
+ ${AWK} '$$1 == "full" { print $$3; }' < ${_RDEPENDS_FILE}
_flavor-show-depends: .PHONY
@case ${VARNAME:Q}"" in \
@@ -25,59 +33,61 @@ _flavor-show-depends: .PHONY
DEPENDS|*) ${_REDUCE_DEPENDS_CMD} ${DEPENDS:Q} ;; \
esac
-######################################################################
-### depends-cookie (PRIVATE, pkgsrc/mk/depends/bsd.depends.mk)
-######################################################################
-### depends-cookie creates the "depends" cookie file.
-###
-### The "depends" cookie file contains all of the dependency information
-### for the package. The format of each line of the cookie file is:
-###
-### <depends_type> <pattern> <directory>
-###
-### Valid dependency types are "build" and "full".
-###
-.PHONY: depends-cookie
-depends-cookie: ${_DEPENDS_FILE}
- ${RUN} [ ! -f ${_COOKIE.depends} ]
- ${RUN} ${MKDIR} ${_COOKIE.depends:H}
- ${RUN} ${MV} -f ${_DEPENDS_FILE} ${_COOKIE.depends}
+_LIST_DEPENDS_CMD= \
+ ${SETENV} AWK=${AWK:Q} PKG_ADMIN=${PKG_ADMIN:Q} \
+ PKGSRCDIR=${PKGSRCDIR:Q} PWD_CMD=${PWD_CMD:Q} SED=${SED:Q} \
+ ${SH} ${PKGSRCDIR}/mk/flavor/pkg/list-dependencies \
+ " "${BOOTSTRAP_DEPENDS:Q} \
+ " "${BUILD_DEPENDS:Q} \
+ " "${DEPENDS:Q}
+
+_RESOLVE_DEPENDS_CMD= \
+ ${SETENV} _PKG_DBDIR=${_PKG_DBDIR:Q} PKG_ADMIN=${PKG_ADMIN:Q} \
+ _DEPENDS_FILE=${_DEPENDS_FILE:Q} \
+ ${SH} ${PKGSRCDIR}/mk/flavor/pkg/resolve-dependencies \
+ " "${BOOTSTRAP_DEPENDS:Q} \
+ " "${BUILD_DEPENDS:Q} \
+ " "${DEPENDS:Q}
+
+_INSTALL_DEPENDS_CMD= \
+ ${SETENV} _PKG_DBDIR=${_PKG_DBDIR:Q} \
+ _PKGSRC_DEPS=${_PKSRC_DEPS:Q} \
+ _DEPENDS_FILE=${_DEPENDS_FILE:Q} \
+ DEPENDS_TARGET=${DEPENDS_TARGET:Q} \
+ MAKE=${MAKE:Q} \
+ MAKEFLAGS=${MAKEFLAGS:Q} \
+ OBJECT_FMT=${OBJECT_FMT:Q} \
+ PKG_ADMIN=${PKG_ADMIN_CMD:Q} \
+ PKG_INFO=${PKG_INFO:Q} \
+ _PKGNAME=${PKGNAME:Q} \
+ PKGSRC_MAKE_ENV=${PKGSRC_MAKE_ENV:Q} \
+ SETENV=${SETENV:Q} \
+ ${SH} ${PKGSRCDIR}/mk/flavor/pkg/install-dependencies
+
+bootstrap-depends: ${_DEPENDS_FILE}
${_DEPENDS_FILE}:
${RUN} ${MKDIR} ${.TARGET:H}
- ${RUN} ${_REDUCE_DEPENDS_CMD} ${BOOTSTRAP_DEPENDS:Q}\ ${BUILD_DEPENDS:Q} > ${.TARGET}.build
- ${RUN} \
- exec 0< ${.TARGET}.build; \
- while read dep; do \
- pattern=`${ECHO} "$$dep" | ${SED} -e "s,:.*,,"`; \
- dir=`${ECHO} "$$dep" | ${SED} -e "s,.*:,,"`; \
- [ "$$pattern" ]; \
- [ "$$dir" ]; \
- ${ECHO} "build $$pattern $$dir"; \
- done >> ${.TARGET}.tmp
- ${RUN} ${_REDUCE_DEPENDS_CMD} ${DEPENDS:Q} > ${.TARGET}.full
- ${RUN} \
- exec 0< ${.TARGET}.full; \
- while read dep; do \
- pattern=`${ECHO} "$$dep" | ${SED} -e "s,:.*,,"`; \
- dir=`${ECHO} "$$dep" | ${SED} -e "s,.*:,,"`; \
- [ "$$pattern" ]; \
- [ "$$dir" ]; \
- ${ECHO} "full $$pattern $$dir"; \
- done >> ${.TARGET}.tmp
- ${RUN} ${MV} ${.TARGET}.tmp ${.TARGET}
+ ${RUN} ${_LIST_DEPENDS_CMD} > ${.TARGET}
+
+${_RDEPENDS_FILE}: ${_DEPENDS_FILE}
+ ${RUN} ${_RESOLVE_DEPENDS_CMD} > ${.TARGET}
+
+# _flavor-list-dependencies:
+# Compute dependency list.
+#
+_flavor-list-dependencies: .PHONY ${_DEPENDS_FILE}
# _flavor-install-dependencies:
# Installs any missing dependencies.
#
_flavor-install-dependencies: .PHONY ${_DEPENDS_FILE}
- ${RUN} \
- while read type pattern dir rest; do \
- { [ "$$dir" ] && [ ! "$$rest" ]; } \
- || ${FAIL_MSG} "[depends.mk] Internal error #1: Check ${_DEPENDS_FILE}"; \
- silent=; \
- ${_DEPENDS_INSTALL_CMD}; \
- done < ${_DEPENDS_FILE}
+ ${RUN}${_INSTALL_DEPENDS_CMD}
+
+# _flavor-post-install-dependencies:
+# Targets after installing all dependencies.
+#
+_flavor-post-install-dependencies: .PHONY ${_RDEPENDS_FILE}
######################################################################
### bootstrap-depends (PUBLIC, pkgsrc/mk/depends/depends.mk)
@@ -87,55 +97,13 @@ _flavor-install-dependencies: .PHONY ${_DEPENDS_FILE}
### stage. These dependencies are listed in BOOTSTRAP_DEPENDS.
###
.PHONY: bootstrap-depends
-bootstrap-depends:
- ${_PKG_SILENT}${_PKG_DEBUG}set -e; \
- args=${BOOTSTRAP_DEPENDS:S/:/ /:Q}; \
- set -- dummy $$args; shift; \
- while ${TEST} $$# -gt 0; do \
- pattern="$$1"; dir="$$2"; shift 2; \
- silent=${_BOOTSTRAP_VERBOSE:Dyes}; \
- ${_DEPENDS_INSTALL_CMD}; \
- done
-
-# _DEPENDS_INSTALL_CMD expects "$pattern" to hold the dependency pattern
-# and "$dir" to hold the package directory path associated with
-# that dependency pattern.
-#
-_DEPENDS_INSTALL_CMD= \
- pkg=`${_PKG_BEST_EXISTS} "$$pattern" || ${TRUE}`; \
- case "$$pkg" in \
- "") \
- ${STEP_MSG} "Required installed package $$pattern: NOT found"; \
- target=${DEPENDS_TARGET:Q}; \
- ${STEP_MSG} "Verifying $$target for $$dir"; \
- if ${TEST} ! -d "$$dir"; then \
- ${ERROR_MSG} "[depends.mk] The directory \`\`$$dir'' does not exist."; \
- exit 1; \
- fi; \
- cd $$dir; \
- ${SETENV} ${PKGSRC_MAKE_ENV} _PKGSRC_DEPS=", ${PKGNAME}${_PKGSRC_DEPS}" PKGNAME_REQD="$$pattern" ${MAKE} ${MAKEFLAGS} _AUTOMATIC=yes $$target; \
- pkg=`${_PKG_BEST_EXISTS} "$$pattern" || ${TRUE}`; \
- case "$$pkg" in \
- "") ${ERROR_MSG} "[depends.mk] A package matching \`\`$$pattern'' should"; \
- ${ERROR_MSG} " be installed, but one cannot be found. Perhaps there is a"; \
- ${ERROR_MSG} " stale work directory for $$dir?"; \
- exit 1; \
- esac; \
- ${STEP_MSG} "Returning to build of ${PKGNAME}"; \
- ;; \
- *) \
- objfmt=`${PKG_INFO} -Q OBJECT_FMT "$$pkg"`; \
- case "$$objfmt" in \
- "") ${WARNING_MSG} "[depends.mk] Unknown object format for installed package $$pkg" ;; \
- ${OBJECT_FMT}) ;; \
- *) ${ERROR_MSG} "[depends.mk] Installed package $$pkg has an"; \
- ${ERROR_MSG} " object format \`\`$$objfmt'' which differs from \`\`${OBJECT_FMT}''. Please"; \
- ${ERROR_MSG} " update the $$pkg package to ${OBJECT_FMT}."; \
- exit 1; \
- ;; \
- esac; \
- if ${TEST} -z "$$silent"; then \
- ${STEP_MSG} "Required installed package $$pattern: $$pkg found"; \
- fi; \
- ;; \
- esac
+_BOOTSTRAP_DEPENDS_TARGETS+= acquire-bootstrap-depends-lock
+_BOOTSTRAP_DEPENDS_TARGETS+= ${_DEPENDS_FILE}
+_BOOTSTRAP_DEPENDS_TARGETS+= release-bootstrap-depends-lock
+
+bootstrap-depends: ${_BOOTSTRAP_DEPENDS_TARGETS}
+ ${RUN}${_INSTALL_DEPENDS_CMD} bootstrap
+
+.PHONY:
+acquire-bootstrap-depends-lock: acquire-lock
+release-bootstrap-depends-lock: release-lock
diff --git a/mk/flavor/pkg/install-dependencies b/mk/flavor/pkg/install-dependencies
new file mode 100755
index 00000000000..7db98c2a7db
--- /dev/null
+++ b/mk/flavor/pkg/install-dependencies
@@ -0,0 +1,85 @@
+#!/bin/sh
+#
+######################################################################
+#
+# NAME
+# install-dependencies -- install package dependencies
+#
+# SYNOPSIS
+# register-dependencies [ filter ]
+#
+# DESCRIPTION
+# install-dependencies checks all entries in ${DEPENDS_FILE}
+# for existance. Missing entries get installed by
+# ${DEPENDS_TARGET} in the listed directory.
+#
+######################################################################
+
+: ${CAT:=cat}
+: ${ECHO:=echo}
+: ${TEST:=test}
+: ${TRUE:=true}
+
+set -e
+
+DEPENDS_FILE=${_DEPENDS_FILE}
+unset _DEPENDS_FILE
+PKGNAME=${_PKGNAME}
+unset _PKGNAME
+
+if [ $# = 1 ]; then
+ type_filter=$1
+else
+ type_filter=all
+fi
+
+error_msg() {
+ ${ECHO} "ERROR:" "$*" 1>&2
+}
+
+step_msg() {
+ ${ECHO} "=>" "$*"
+}
+
+find_best() {
+ ${PKG_ADMIN} -b -d ${_PKG_DBDIR} -S lsbest $1 || ${TRUE}
+}
+
+${CAT} ${DEPENDS_FILE} | while read type pattern dir; do
+ [ $type_filter != all ] && [ $type_filter = "$filter" ] && continue
+ pkg=`find_best "$pattern"`
+ case "$pkg" in
+ "")
+ step_msg "Required installed package $pattern: NOT found"
+ target=${DEPENDS_TARGET}
+ if ${TEST} ! -d "$dir"; then
+ error_msg "[install-depends] The directory \`\`$dir'' does not exist."
+ exit 1
+ fi
+ step_msg "Verifying $target for $dir"
+ cd $dir
+ ${SETENV} ${PKGSRC_MAKE_ENV} _PKGSRC_DEPS=", ${PKGNAME}${_PKGSRC_DEPS}" PKGNAME_REQD="$pattern" ${MAKE} ${MAKEFLAGS} _AUTOMATIC=yes $target
+ pkg=`find_best "$pattern"`
+ case "$pkg" in
+ "") error_msg "[install-depends] A package matching \`\`$pattern'' should"
+ error_msg " be installed, but one cannot be found. Perhaps there is a"
+ error_msg " stale work directory for $dir?"
+ exit 1
+ esac
+ step_msg "Returning to build of ${PKGNAME}"
+ ;;
+ *)
+ objfmt=`${PKG_INFO} -Q OBJECT_FMT "$pkg"`
+ case "$objfmt" in
+ "") ${WARNING_MSG} "[install-depends] Unknown object format for installed package $pkg" ;;
+ ${OBJECT_FMT}) ;;
+ *) error_msg "[install-depends] Installed package $pkg has an"
+ error_msg " object format \`\`$objfmt'' which differs from \`\`${OBJECT_FMT}''. Please"
+ error_msg " update the $pkg package to ${OBJECT_FMT}."
+ exit 1
+ ;;
+ esac;
+ step_msg "Required installed package $pattern: $pkg found"
+ ;;
+ esac
+done
diff --git a/mk/flavor/pkg/install.mk b/mk/flavor/pkg/install.mk
index 3f2d9f6b76c..0f246d3468c 100644
--- a/mk/flavor/pkg/install.mk
+++ b/mk/flavor/pkg/install.mk
@@ -1,4 +1,4 @@
-# $NetBSD: install.mk,v 1.9 2007/03/09 00:39:55 rillig Exp $
+# $NetBSD: install.mk,v 1.10 2007/05/22 16:17:16 joerg Exp $
#
# _flavor-check-conflicts:
# Checks for conflicts between the package and installed packages.
@@ -52,10 +52,9 @@ _flavor-check-installed: .PHONY error-check
_REGISTER_DEPENDENCIES= \
${SETENV} PKG_DBDIR=${_PKG_DBDIR:Q} \
AWK=${TOOLS_AWK:Q} \
- PKG_ADMIN=${PKG_ADMIN_CMD:Q} \
${SH} ${PKGSRCDIR}/mk/flavor/pkg/register-dependencies
-_flavor-register: .PHONY generate-metadata ${_COOKIE.depends}
+_flavor-register: .PHONY generate-metadata ${_RDEPENDS_FILE}
@${STEP_MSG} "Registering installation for ${PKGNAME}"
${_PKG_SILENT}${_PKG_DEBUG}${RM} -fr ${_PKG_DBDIR}/${PKGNAME}
${_PKG_SILENT}${_PKG_DEBUG}${MKDIR} ${_PKG_DBDIR}/${PKGNAME}
@@ -65,5 +64,5 @@ _flavor-register: .PHONY generate-metadata ${_COOKIE.depends}
case ${_AUTOMATIC:Q}"" in \
[yY][eE][sS]) ${PKG_ADMIN} set automatic=yes ${PKGNAME} ;; \
esac
- ${_PKG_SILENT}${_PKG_DEBUG}${_DEPENDS_PATTERNS_CMD} | \
+ ${_PKG_SILENT}${_PKG_DEBUG}${_FULL_DEPENDS_CMD} | \
${SORT} -u | ${_REGISTER_DEPENDENCIES} ${PKGNAME}
diff --git a/mk/flavor/pkg/list-dependencies b/mk/flavor/pkg/list-dependencies
new file mode 100755
index 00000000000..749ec8c1dda
--- /dev/null
+++ b/mk/flavor/pkg/list-dependencies
@@ -0,0 +1,67 @@
+#!/bin/sh
+#
+######################################################################
+#
+# NAME
+# list-dependencies -- build package dependencies list
+#
+# SYNOPSIS
+# list-dependencies bootstrap build full
+#
+# DESCRIPTION
+# For each (reduced) dependency a line of the following format is
+# printed:
+#
+# <depends_type> <pattern> <directory>
+#
+# Valid dependency types are "bootstrap", "build" and "full".
+#
+# ENVIRONMENT
+# AWK
+# This is the path to the awk interpreter.
+#
+# PKGSRCDIR
+# This is the root of the pkgsrc tree.
+#
+# SED
+# This is the path to the sed command.
+#
+# The following variables are used by the reduce-depends.awk script:
+#
+# PKG_ADMIN
+# This is the path to the pkg_admin command.
+#
+# PWD_CMD
+# This is the path to the pwd command.
+#
+######################################################################
+
+: ${ECHO:=echo}
+: ${TEST:=test}
+: ${CAT:=cat}
+
+set -e
+
+reduce_depends() {
+ ${AWK} -f ${PKGSRCDIR}/mk/flavor/pkg/reduce-depends.awk "$1"
+}
+
+print_entries() {
+ reduce_depends "$2" | while read dep; do
+ pattern=`${ECHO} "$dep" | ${SED} -e "s,:.*,,"`
+ dir=`${ECHO} "$dep" | ${SED} -e "s,.*:,,"`
+ [ "$pattern" ]
+ [ "$dir" ]
+ ${ECHO} "$1 $pattern $dir"
+ done
+}
+
+if ${TEST} $# != 3;
+then
+ ${ECHO} "list-dependencies must be called with 3 arguments" 1>&2
+ exit 1
+fi
+
+print_entries bootstrap "$1"
+print_entries build "$2"
+print_entries full "$3"
diff --git a/mk/flavor/pkg/metadata.mk b/mk/flavor/pkg/metadata.mk
index c6d012f6ae2..8f374e9d8bb 100644
--- a/mk/flavor/pkg/metadata.mk
+++ b/mk/flavor/pkg/metadata.mk
@@ -1,4 +1,4 @@
-# $NetBSD: metadata.mk,v 1.19 2007/05/01 12:41:10 rillig Exp $
+# $NetBSD: metadata.mk,v 1.20 2007/05/22 16:17:16 joerg Exp $
######################################################################
### The targets below are all PRIVATE.
@@ -274,11 +274,10 @@ ${_PRESERVE_FILE}:
_SIZE_ALL_FILE= ${PKG_DB_TMPDIR}/+SIZE_ALL
_METADATA_TARGETS+= ${_SIZE_ALL_FILE}
-${_SIZE_ALL_FILE}: ${_COOKIE.depends}
+${_SIZE_ALL_FILE}: ${_RDEPENDS_FILE}
${_PKG_SILENT}${_PKG_DEBUG}${MKDIR} ${.TARGET:H}
${_PKG_SILENT}${_PKG_DEBUG} \
- ${_DEPENDS_PATTERNS_CMD} | \
- ${XARGS} -n 1 ${_PKG_BEST_EXISTS} | ${SORT} -u | \
+ ${_FULL_DEPENDS_CMD} | ${SORT} -u | \
${XARGS} -n 256 ${PKG_INFO} -qs | \
${AWK} 'BEGIN { s = 0 } /^[0-9]+$$/ { s += $$1 } END { print s }' \
> ${.TARGET}
@@ -316,13 +315,21 @@ ${_SIZE_PKG_FILE}: plist
_CONTENTS_FILE= ${PKG_DB_TMPDIR}/+CONTENTS
_METADATA_TARGETS+= ${_CONTENTS_FILE}
+_DEPENDS_PLIST= ${WRKDIR}/.PLIST_deps
+
+${_DEPENDS_PLIST}: ${PLIST}
+ ${RUN} { \
+ ${AWK} '$$1 == "full" { printf "@blddep %s\n@pkgdep %s\n", $$3, $$2; }' < ${_RDEPENDS_FILE}; \
+ ${AWK} '$$1 == "bootstrap" || $$1 == "build" { printf "@blddep %s\n", $$3; }' < ${_RDEPENDS_FILE}; \
+ ${CAT} ${PLIST}; } > ${.TARGET}
+
_PKG_CREATE_ARGS+= -v -l -U
_PKG_CREATE_ARGS+= -B ${_BUILD_INFO_FILE}
_PKG_CREATE_ARGS+= -b ${_BUILD_VERSION_FILE}
_PKG_CREATE_ARGS+= -c ${_COMMENT_FILE}
_PKG_CREATE_ARGS+= ${_MESSAGE_FILE:D -D ${_MESSAGE_FILE}}
_PKG_CREATE_ARGS+= -d ${_DESCR_FILE}
-_PKG_CREATE_ARGS+= -f ${PLIST}
+_PKG_CREATE_ARGS+= -f ${_DEPENDS_PLIST}
.if defined(USE_MTREE)
_PKG_CREATE_ARGS+= -m ${_MTREE_FILE}}
.endif
@@ -330,10 +337,6 @@ _PKG_CREATE_ARGS+= ${PKG_PRESERVE:D -n ${_PRESERVE_FILE}}
_PKG_CREATE_ARGS+= -S ${_SIZE_ALL_FILE}
_PKG_CREATE_ARGS+= -s ${_SIZE_PKG_FILE}
_PKG_CREATE_ARGS+= ${CONFLICTS:D -C ${CONFLICTS:Q}}
-_PKG_CREATE_ARGS+= ${_DEPENDS_ARG_cmd:sh}
-.if ${PKGTOOLS_VERSION} >= 20070308
-_PKG_CREATE_ARGS+= ${_BUILD_DEPENDS_ARG_cmd:sh}
-.endif
_PKG_CREATE_ARGS+= ${INSTALL_FILE:D ${_INSTALL_ARG_cmd:sh}}
_PKG_CREATE_ARGS+= ${DEINSTALL_FILE:D ${_DEINSTALL_ARG_cmd:sh}}
@@ -344,20 +347,6 @@ _PKG_ARGS_INSTALL+= -p ${PREFIX}
_PKG_ARGS_INSTALL+= -I ${PREFIX} -p ${DESTDIR}${PREFIX}
.endif
-_DEPENDS_ARG_cmd= depends=`${_DEPENDS_PATTERNS_CMD}`; \
- if ${TEST} -n "$$depends"; then \
- ${ECHO} "-P \"$$depends\""; \
- else \
- ${ECHO}; \
- fi
-
-_BUILD_DEPENDS_ARG_cmd= depends=`${_BUILD_DEPENDS_PATTERNS_CMD}`; \
- if ${TEST} -n "$$depends"; then \
- ${ECHO} "-T \"$$depends\""; \
- else \
- ${ECHO}; \
- fi
-
_DEINSTALL_ARG_cmd= if ${TEST} -f ${DEINSTALL_FILE}; then \
${ECHO} "-k "${DEINSTALL_FILE:Q}; \
else \
@@ -372,9 +361,10 @@ _INSTALL_ARG_cmd= if ${TEST} -f ${INSTALL_FILE}; then \
_CONTENTS_TARGETS+= ${_BUILD_INFO_FILE}
_CONTENTS_TARGETS+= ${_BUILD_VERSION_FILE}
_CONTENTS_TARGETS+= ${_COMMENT_FILE}
-_CONTENTS_TARGETS+= ${_COOKIE.depends}
+_CONTENTS_TARGETS+= ${_DEPENDS_FILE}
_CONTENTS_TARGETS+= ${_DESCR_FILE}
_CONTENTS_TARGETS+= ${_MESSAGE_FILE}
+_CONTENTS_TARGETS+= ${_DEPENDS_PLIST}
_CONTENTS_TARGETS+= plist
_CONTENTS_TARGETS+= ${_PRESERVE_FILE}
_CONTENTS_TARGETS+= ${_SIZE_ALL_FILE}
diff --git a/mk/flavor/pkg/register-dependencies b/mk/flavor/pkg/register-dependencies
index ca92d25c3b0..ee837a3851b 100755
--- a/mk/flavor/pkg/register-dependencies
+++ b/mk/flavor/pkg/register-dependencies
@@ -1,6 +1,6 @@
#!/bin/sh
#
-# $NetBSD: register-dependencies,v 1.2 2006/06/04 05:43:56 jlam Exp $
+# $NetBSD: register-dependencies,v 1.3 2007/05/22 16:17:16 joerg Exp $
#
######################################################################
#
@@ -12,13 +12,10 @@
#
# DESCRIPTION
# register-dependencies registers a dependency relationship from
-# the named package pkgname and the dependencies passed in via
-# standard input. The dependencies may be wildcard patterns.
+# the named package pkgname and the packages passed in via
+# standard input.
#
# ENVIRONMENT
-# PKG_ADMIN
-# This is the path to the pkg_admin command.
-#
# PKG_DBDIR
# This is the package meta-data directory in which the
# packages are registered. By default, this is /var/db/pkg.
@@ -28,7 +25,6 @@
: ${AWK:=awk}
: ${CP:=cp}
: ${ECHO:=echo}
-: ${PKG_ADMIN:=pkg_admin}
: ${PKG_DBDIR:=/var/db/pkg}
: ${RM:=rm}
: ${TEST:=test}
@@ -37,11 +33,10 @@
PKGNAME="$1"
-while read dependency; do
- pkg=`${PKG_ADMIN} -b -d ${PKG_DBDIR} -S lsbest "$dependency" || ${TRUE}`
+while read pkg; do
pkgdir="${PKG_DBDIR}/$pkg"
- if ${TEST} -z "$pkg" -o ! -d "$pkgdir"; then
- ${ECHO} 1>&2 "$dependency not found - dependency NOT registered"
+ if ${TEST} ! -d "$pkgdir"; then
+ ${ECHO} 1>&2 "$pkg not found - dependency NOT registered"
continue
fi
req="$pkgdir/+REQUIRED_BY"
diff --git a/mk/flavor/pkg/resolve-dependencies b/mk/flavor/pkg/resolve-dependencies
new file mode 100755
index 00000000000..30f343566e3
--- /dev/null
+++ b/mk/flavor/pkg/resolve-dependencies
@@ -0,0 +1,49 @@
+#!/bin/sh
+#
+######################################################################
+#
+# NAME
+# resolve-dependencies -- resolve package dependencies
+#
+# SYNOPSIS
+# resolve-dependencies
+#
+# DESCRIPTION
+# resolve-dependencies checks all entries in ${DEPENDS_FILE}
+# for existance. The best matching pattern is printed similiar
+# to list-dependencies
+#
+######################################################################
+
+: ${CAT:=cat}
+: ${ECHO:=echo}
+: ${TEST:=test}
+: ${TRUE:=true}
+
+set -e
+
+DEPENDS_FILE=${_DEPENDS_FILE}
+unset _DEPENDS_FILE
+
+error_msg() {
+ ${ECHO} "ERROR:" "$*" 1>&2
+}
+
+find_best() {
+ ${PKG_ADMIN} -b -d ${_PKG_DBDIR} -S lsbest $1 || ${TRUE}
+}
+
+${CAT} ${DEPENDS_FILE} | while read type pattern dir; do
+ pkg=`find_best "$pattern"`
+ case "$pkg" in
+ "")
+ error_msg "[resolve-dependencies] A package matching \`\`$pattern'' should"
+ error_msg " be installed, but one cannot be found. Perhaps there is a"
+ error_msg " stale work directory for $dir?"
+ exit 1
+ ;;
+ *)
+ ${ECHO} "$type $pattern $pkg"
+ ;;
+ esac
+done