1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
|
# $NetBSD: reduce-depends.mk,v 1.3 2005/10/09 08:48:44 rillig 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}
. for _depdir_ in ${_dep_:C/^[^:]*://:C/:.*$//}
. if !defined(_DEPENDS_PKGPATH.${_depdir_})
. if exists(${_depdir_})
_DEPENDS_PKGPATH.${_depdir_}!= cd ${_depdir_:Q} && ${PWD_CMD}
. else
PKG_FAIL_REASON+= "[reduce-depends.mk] "${PKGPATH:Q}" depends on "${_depdir_:Q}", but the latter does not exist."
. endif
. endif
_DEPENDS_PKGPATH.${_DEPENDS_PKGPATH.${_depdir_}}?= ${_depdir_}
_DEPENDS.${_DEPENDS_PKGPATH.${_depdir_}}+= ${_dep_:C/:.*$//}
. if empty(_DEPENDS_PKGPATHS:M${_DEPENDS_PKGPATH.${_depdir_}})
_DEPENDS_PKGPATHS+= ${_DEPENDS_PKGPATH.${_depdir_}}
. endif
. endfor
.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.
#
. for _depend_ in ${_DEPENDS.${_path_}}
REDUCED_DEPENDS+= ${_depend_}:${_DEPENDS_PKGPATH.${_path_}}
. endfor
. 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
|