From 591e9891327fd6d23e5be5792dab52ee96fcbe08 Mon Sep 17 00:00:00 2001 From: jlam Date: Tue, 5 Oct 2004 15:28:50 +0000 Subject: [PATCH] Move the "dependency reduction" code from buildlink3 to bsd.pkg.mk so that all of pkgsrc can benefit from removing redundant dependencies. The code is encapsulated in a new file reduce-depends.mk which is included by bsd.pkg.mk after all dependencies have been specified. --- mk/bsd.pkg.mk | 6 +- mk/buildlink3/bsd.buildlink3.mk | 57 +-------------- mk/reduce-depends.mk | 123 ++++++++++++++++++++++++++++++++ 3 files changed, 130 insertions(+), 56 deletions(-) create mode 100644 mk/reduce-depends.mk diff --git a/mk/bsd.pkg.mk b/mk/bsd.pkg.mk index 2147c3776a8b0..623bef7134acc 100644 --- a/mk/bsd.pkg.mk +++ b/mk/bsd.pkg.mk @@ -1,4 +1,4 @@ -# $NetBSD: bsd.pkg.mk,v 1.1508 2004/10/04 20:28:29 jlam Exp $ +# $NetBSD: bsd.pkg.mk,v 1.1509 2004/10/05 15:28:50 jlam Exp $ # # This file is in the public domain. # @@ -1217,6 +1217,10 @@ BUILD_DEFS+= IGNORE_RECOMMENDED . endif .endif +# Remove some redundant dependencies from the DEPENDS list. +.include "../../mk/reduce-depends.mk" +DEPENDS:= ${REDUCED_DEPENDS} + .if defined(USE_DIRS) && !empty(USE_DIRS) && \ ${PKG_INSTALLATION_TYPE} == "overwrite" . include "../../mk/dirs.mk" diff --git a/mk/buildlink3/bsd.buildlink3.mk b/mk/buildlink3/bsd.buildlink3.mk index 48f01b5ab63a6..a4804e2c1e116 100644 --- a/mk/buildlink3/bsd.buildlink3.mk +++ b/mk/buildlink3/bsd.buildlink3.mk @@ -1,4 +1,4 @@ -# $NetBSD: bsd.buildlink3.mk,v 1.158 2004/10/04 17:57:08 jlam Exp $ +# $NetBSD: bsd.buildlink3.mk,v 1.159 2004/10/05 15:28:50 jlam Exp $ # # Copyright (c) 2004 The NetBSD Foundation, Inc. # All rights reserved. @@ -212,60 +212,7 @@ _BLNK_RECMETHOD.${_pkg_}= _BLNK_ADD_TO.BUILD_DEPENDS . endif . if defined(BUILDLINK_DEPENDS.${_pkg_}) && \ defined(BUILDLINK_PKGSRCDIR.${_pkg_}) -# -# BEGIN dependency reduction -# -# This next block of code sets _BLNK_DEPENDS. to the strictest set of -# dependencies it can derive from ${BUILDLINK_DEPENDS.}. It only -# understands dependencies of the form foo>=1.0, and leaves the other -# dependencies undisturbed. -# -# The algorithm takes dependencies of the form foo>=1.0 and converts them -# to foo-1.0. It then compares this pkg name against each dependency to -# see if it satisfies them all. The key fact is the the strictest -# dependency, when converted to a pkg name, will satisfy every dependency. -# -_BLNK_DEPENDS.${_pkg_}= # empty -_BLNK_GE_DEPENDS.${_pkg_}= ${BUILDLINK_DEPENDS.${_pkg_}:N*\{*:M*>=[0-9]*} -_BLNK_STRICTEST_DEPENDS.${_pkg_}?= none -. for _depend_ in ${_BLNK_GE_DEPENDS.${_pkg_}} -. for _dep2pkg_ in ${_depend_:S/>=/-/} -. if ${_BLNK_STRICTEST_DEPENDS.${_pkg_}} == "none" -_BLNK_PKG_SATISFIES_DEP.${_pkg_}= YES -. for _dep_ in ${_BLNK_GE_DEPENDS.${_pkg_}} -. if !empty(_BLNK_PKG_SATISFIES_DEP.${_pkg_}:M[yY][eE][sS]) -_BLNK_PKG_SATISFIES_DEP.${_pkg_}!= \ - if ${PKG_ADMIN} pmatch '${_dep_}' ${_dep2pkg_}; then \ - ${ECHO} "YES"; \ - else \ - ${ECHO} "NO"; \ - fi -. endif -. endfor -. if !empty(_BLNK_PKG_SATISFIES_DEP.${_pkg_}:M[yY][eE][sS]) -_BLNK_STRICTEST_DEPENDS.${_pkg_}= ${_depend_} -. endif -. endif -. endfor -. endfor -. if ${_BLNK_STRICTEST_DEPENDS.${_pkg_}} == "none" -# -# If the dependencies simply conflict, then pass them on through to the -# normal dependency handling code. -# -_BLNK_DEPENDS.${_pkg_}+= ${BUILDLINK_DEPENDS.${_pkg_}} -. else -. for _depend_ in ${BUILDLINK_DEPENDS.${_pkg_}} -. if empty(_BLNK_GE_DEPENDS.${_pkg_}:M${_depend_}) -_BLNK_DEPENDS.${_pkg_}+= ${_depend_} -. endif -. endfor -_BLNK_DEPENDS.${_pkg_}+= ${_BLNK_STRICTEST_DEPENDS.${_pkg_}} -. endif -# -# END dependency reduction -# -. for _depend_ in ${_BLNK_DEPENDS.${_pkg_}} +. for _depend_ in ${BUILDLINK_DEPENDS.${_pkg_}} . if empty(${_BLNK_DEPMETHOD.${_pkg_}}:M${_depend_}\:*) ${_BLNK_DEPMETHOD.${_pkg_}}+= ${_depend_}:${BUILDLINK_PKGSRCDIR.${_pkg_}} . endif diff --git a/mk/reduce-depends.mk b/mk/reduce-depends.mk new file mode 100644 index 0000000000000..93e8d37489495 --- /dev/null +++ b/mk/reduce-depends.mk @@ -0,0 +1,123 @@ +# $NetBSD: reduce-depends.mk,v 1.1 2004/10/05 15:28:50 jlam Exp $ +# +# Copyright (c) 2004 The NetBSD Foundation, Inc. +# All rights reserved. +# +# This code is derived from software contributed to The NetBSD Foundation +# by Johnny C. Lam. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# 1. Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# 2. Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in the +# documentation and/or other materials provided with the distribution. +# 3. All advertising materials mentioning features or use of this software +# must display the following acknowledgement: +# This product includes software developed by the NetBSD +# Foundation, Inc. and its contributors. +# 4. Neither the name of The NetBSD Foundation nor the names of its +# contributors may be used to endorse or promote products derived +# from this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS +# ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED +# TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +# PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS +# BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE. +# + +# This Makefile fragment takes the dependencies listed in ${DEPENDS} and +# creates a smaller set of dependencies in ${REDUCED_DEPENDS} that imply +# the same dependency relationships as ${DEPENDS}. + +# We skip the dependency calculation for some phases since they never +# use the dependency information. In these cases, ${REDUCED_DEPENDS} +# is simply empty. +# +_PHASES_SKIP_DEPENDS= fetch patch tools wrapper configure build test +.if !empty(_PHASES_SKIP_DEPENDS:M${PKG_PHASE}) +_DEPENDS= # empty +.else +_DEPENDS= ${DEPENDS} +.endif + +# _DEPENDS_PKGPATHS contains the full physical paths to the pkgsrc +# directories for dependencies. +# _DEPENDS_PKGPATH. maps to the full physical path. +# _DEPENDS. is a list of the wildcard dependencies associated +# with . +# +_DEPENDS_PKGPATHS= # empty +.for _dep_ in ${_DEPENDS} +. if !defined(_DEPENDS_PKGPATH.${_dep_:C/^[^:]*://:C/:.*$//}) +_DEPENDS_PKGPATH.${_dep_:C/^[^:]*://:C/:.*$//}!= \ + cd ${_dep_:C/^[^:]*://:C/:.*$//} && ${PWD_CMD} +. endif +_DEPENDS_PKGPATH.${_DEPENDS_PKGPATH.${_dep_:C/^[^:]*://:C/:.*$//}}?= \ + ${_dep_:C/^[^:]*://:C/:.*$//} +_DEPENDS.${_DEPENDS_PKGPATH.${_dep_:C/^[^:]*://:C/:.*$//}}+= \ + ${_dep_:C/:.*$//} +. if empty(_DEPENDS_PKGPATHS:M${_DEPENDS_PKGPATH.${_dep_:C/^[^:]*://:C/:.*$//}}) +_DEPENDS_PKGPATHS+= ${_DEPENDS_PKGPATH.${_dep_:C/^[^:]*://:C/:.*$//}} +. endif +.endfor + +# This next block of code sets REDUCED_DEPENDS to the strictest set of +# dependencies it can derive from all of ${_DEPENDS.}. It only +# understands dependencies of the form foo>=1.0, and leaves the other +# dependencies undisturbed. +# +# The algorithm takes dependencies of the form foo>=1.0 and converts +# them to foo-1.0. It then compares this pkg name against each +# dependency to see if it satisfies them all. The key fact is the +# the strictest dependency, when converted to a pkg name, will satisfy +# every dependency. +# +REDUCED_DEPENDS= # empty +.for _path_ in ${_DEPENDS_PKGPATHS} +_GE_DEPENDS.${_path_}= ${_DEPENDS.${_path_}:N*\{*:M*>=[0-9]*} +_STRICTEST_DEPENDS.${_path_}?= none +. for _depend_ in ${_GE_DEPENDS.${_path_}} +. for _dep2pkg_ in ${_depend_:S/>=/-/} +. if ${_STRICTEST_DEPENDS.${_path_}} == "none" +_SATISFIES_DEPENDS.${_path_}= YES +. for _dep_ in ${_GE_DEPENDS.${_path_}} +. if !empty(_SATISFIES_DEPENDS.${_path_}:M[yY][eE][sS]) +_SATISFIES_DEPENDS.${_path_}!= \ + if ${PKG_ADMIN} pmatch '${_dep_}' ${_dep2pkg_}; then \ + ${ECHO} "YES"; \ + else \ + ${ECHO} "NO"; \ + fi +. endif +. endfor +. if !empty(_SATISFIES_DEPENDS.${_path_}:M[yY][eE][sS]) +_STRICTEST_DEPENDS.${_path_}= ${_depend_} +. endif +. endif +. endfor +. endfor +. if ${_STRICTEST_DEPENDS.${_path_}} == "none" +# +# The dependencies simply conflict, so just pass them on through to the +# normal dependency handling code. +# +REDUCED_DEPENDS+= ${_DEPENDS.${_path_}}:${_DEPENDS_PKGPATH.${_path_}} +. else +. for _depend_ in ${_DEPENDS.${_path_}} +. if empty(_GE_DEPENDS.${_path_}:M${_depend_}) +REDUCED_DEPENDS+= ${_depend_}:${_DEPENDS_PKGPATH.${_path_}} +. endif +. endfor +REDUCED_DEPENDS+= ${_STRICTEST_DEPENDS.${_path_}}:${_DEPENDS_PKGPATH.${_path_}} +. endif +.endfor