summaryrefslogtreecommitdiff
path: root/mk
diff options
context:
space:
mode:
authorjlam <jlam@pkgsrc.org>2004-10-05 15:28:50 +0000
committerjlam <jlam@pkgsrc.org>2004-10-05 15:28:50 +0000
commit9fd8b786cac3400ed9bfa4c73efcd273bc1ff90c (patch)
tree9fea6f31815eb90e2a42982641326268dac7a7a3 /mk
parentfa2c8e20e825cb437911704b6008867d28d57f25 (diff)
downloadpkgsrc-9fd8b786cac3400ed9bfa4c73efcd273bc1ff90c.tar.gz
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.
Diffstat (limited to 'mk')
-rw-r--r--mk/bsd.pkg.mk6
-rw-r--r--mk/buildlink3/bsd.buildlink3.mk57
-rw-r--r--mk/reduce-depends.mk123
3 files changed, 130 insertions, 56 deletions
diff --git a/mk/bsd.pkg.mk b/mk/bsd.pkg.mk
index 2147c3776a8..623bef7134a 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 48f01b5ab63..a4804e2c1e1 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.<pkg> to the strictest set of
-# dependencies it can derive from ${BUILDLINK_DEPENDS.<pkg>}. 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 00000000000..93e8d374894
--- /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.<relpkgpath> maps <relpkgpath> to the full physical path.
+# _DEPENDS.<physpkgpath> is a list of the wildcard dependencies associated
+# with <physpkgpath>.
+#
+_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.<path>}. 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