Fixup fromcvs/togit conversion
[minix-pkgsrc.git] / mk / pkgformat / pkg / depends.mk
blob5220783147560086f047321f9478a5faf732f1a7
1 # $NetBSD: depends.mk,v 1.2 2012/07/02 14:53:13 joerg Exp $
3 # This command prints out the dependency patterns for all full (run-time)
4 # dependencies of the package.
6 # This is used in install.mk and metadata.mk.
9 # ${_DEPENDS_FILE} contains all the dependency information
10 # for the package. The format of each line of the file is:
12 # <depends_type> <pattern> <directory>
14 # Valid dependency types are "bootstrap", "build" and "full".
16 # ${_RDEPENDS_FILE} contains the resolved dependency information
17 # for the package. For each line in ${_DEPENDS_FILE}
18 # a corresponding line of the following form exists:
20 # <depends_type> <pattern> <pkg>
22 # "pkg" is the match for "pattern" used to fulfill the dependency.
24 # ${_RRDEPENDS_FILE} is like ${_RPDENDS_FILE}, but all build dependencies
25 # are dropped, if they are dependencies of one of the full dependencies.
27 _DEPENDS_FILE= ${WRKDIR}/.depends
28 _RDEPENDS_FILE= ${WRKDIR}/.rdepends
30 _RRDEPENDS_FILE=${WRKDIR}/.rrdepends
32 _FULL_DEPENDS_CMD= \
33 ${AWK} '$$1 == "full" { print $$3; }' < ${_RDEPENDS_FILE}
35 _REDUCE_DEPENDS_CMD= ${PKGSRC_SETENV} CAT=${CAT:Q} \
36 PKG_ADMIN=${PKG_ADMIN:Q} \
37 PWD_CMD=${PWD_CMD:Q} TEST=${TEST:Q} \
38 ${AWK} -f ${PKGSRCDIR}/mk/pkgformat/pkg/reduce-depends.awk
40 _HOST_REDUCE_DEPENDS_CMD= \
41 ${PKGSRC_SETENV} CAT=${CAT:Q} \
42 PKG_ADMIN=${HOST_PKG_ADMIN:Q} \
43 PWD_CMD=${PWD_CMD:Q} TEST=${TEST:Q} \
44 ${AWK} -f ${PKGSRCDIR}/mk/pkgformat/pkg/reduce-depends.awk
46 _REDUCE_RESOLVED_DEPENDS_CMD=${PKGSRC_SETENV} CAT=${CAT:Q} \
47 PKG_INFO=${PKG_INFO:Q} \
48 HOST_PKG_INFO=${HOST_PKG_INFO:Q} \
49 ${AWK} -f ${PKGSRCDIR}/mk/pkgformat/pkg/reduce-resolved-depends.awk \
50 < ${_RDEPENDS_FILE}
52 _pkgformat-show-depends: .PHONY
53 @case ${VARNAME:Q}"" in \
54 BUILD_DEPENDS) ${_REDUCE_DEPENDS_CMD} ${BUILD_DEPENDS:Q} ;; \
55 TOOL_DEPENDS) ${_HOST_REDUCE_DEPENDS_CMD} ${TOOL_DEPENDS:Q} ;;\
56 DEPENDS|*) ${_REDUCE_DEPENDS_CMD} ${DEPENDS:Q} ;; \
57 esac
59 _LIST_DEPENDS_CMD= \
60 ${PKGSRC_SETENV} AWK=${AWK:Q} PKG_ADMIN=${PKG_ADMIN:Q} \
61 PKGSRCDIR=${PKGSRCDIR:Q} PWD_CMD=${PWD_CMD:Q} SED=${SED:Q} \
62 ${SH} ${PKGSRCDIR}/mk/pkgformat/pkg/list-dependencies \
63 " "${BOOTSTRAP_DEPENDS:Q} \
64 " "${TOOL_DEPENDS:Q} \
65 " "${BUILD_DEPENDS:Q} \
66 " "${DEPENDS:Q}
68 _LIST_DEPENDS_CMD.bootstrap= \
69 ${PKGSRC_SETENV} AWK=${AWK:Q} PKG_ADMIN=${PKG_ADMIN:Q} \
70 PKGSRCDIR=${PKGSRCDIR:Q} PWD_CMD=${PWD_CMD:Q} SED=${SED:Q} \
71 ${SH} ${PKGSRCDIR}/mk/pkgformat/pkg/list-dependencies \
72 " "${BOOTSTRAP_DEPENDS:Q} " " " " " "
74 _RESOLVE_DEPENDS_CMD= \
75 ${PKGSRC_SETENV} _PKG_DBDIR=${_PKG_DBDIR:Q} PKG_INFO=${PKG_INFO:Q} \
76 HOST_PKG_INFO=${HOST_PKG_INFO:Q} \
77 _DEPENDS_FILE=${_DEPENDS_FILE:Q} \
78 ${SH} ${PKGSRCDIR}/mk/pkgformat/pkg/resolve-dependencies \
79 " "${BOOTSTRAP_DEPENDS:Q} \
80 " "${TOOL_DEPENDS:Q} \
81 " "${BUILD_DEPENDS:Q} \
82 " "${DEPENDS:Q}
84 # _DEPENDS_INSTALL_CMD checks whether the package $pattern is installed,
85 # and installs it if necessary.
87 # @param $pattern The pattern of the package to be installed.
88 # @param $dir The pkgsrc directory from which the package can be
89 # built.
90 # @param $type The dependency type. Can be one of bootstrap, tool,
91 # build, full.
93 _DEPENDS_INSTALL_CMD= \
94 case $$type in bootstrap) Type=Bootstrap;; tool) Type=Tool;; build) Type=Build;; full) Type=Full;; esac; \
95 case $$type in \
96 bootstrap|tool) \
97 if expr "${USE_CROSS_COMPILE:Uno}" : '[yY][eE][sS]' >/dev/null; then \
98 extradep=""; \
99 else \
100 extradep=" ${PKGNAME}"; \
101 fi; \
102 cross=no; \
103 archopt=TARGET_ARCH=${MACHINE_ARCH}; \
104 pkg=`${_HOST_PKG_BEST_EXISTS} "$$pattern" || ${TRUE}`; \
105 ;; \
106 build|full) \
107 extradep=" ${PKGNAME}"; \
108 cross=${USE_CROSS_COMPILE:Uno}; \
109 archopt=; \
110 pkg=`${_PKG_BEST_EXISTS} "$$pattern" || ${TRUE}`; \
111 ;; \
112 esac; \
113 case "$$pkg" in \
114 "") \
115 ${STEP_MSG} "$$Type dependency $$pattern: NOT found"; \
116 target=${DEPENDS_TARGET:Q}; \
117 ${STEP_MSG} "Verifying $$target for $$dir"; \
118 [ -d "$$dir" ] || ${FAIL_MSG} "[depends.mk] The directory \`\`$$dir'' does not exist."; \
119 cd $$dir; \
120 ${PKGSRC_SETENV} ${PKGSRC_MAKE_ENV} \
121 _PKGSRC_DEPS="$$extradep${_PKGSRC_DEPS}" \
122 PKGNAME_REQD="$$pattern" \
123 USE_CROSS_COMPILE=$$cross \
124 $$archopt \
125 ${MAKE} ${MAKEFLAGS} _AUTOMATIC=yes $$target; \
126 case $$type in \
127 bootstrap|tool) \
128 pkg=`${_HOST_PKG_BEST_EXISTS} "$$pattern" || ${TRUE}`;; \
129 build|full) \
130 pkg=`${_PKG_BEST_EXISTS} "$$pattern" || ${TRUE}`;; \
131 esac; \
132 case "$$pkg" in \
133 "") ${ERROR_MSG} "[depends.mk] A package matching \`\`$$pattern'' should"; \
134 ${ERROR_MSG} " be installed, but one cannot be found. Perhaps there is a"; \
135 ${ERROR_MSG} " stale work directory for $$dir?"; \
136 exit 1; \
137 esac; \
138 ${STEP_MSG} "Returning to build of ${PKGNAME}"; \
139 ;; \
140 *) \
141 case $$type in \
142 bootstrap|tool) \
143 objfmt=`${HOST_PKG_INFO} -Q OBJECT_FMT "$$pkg"`;; \
144 build|full) \
145 objfmt=`${PKG_INFO} -Q OBJECT_FMT "$$pkg"`;; \
146 esac; \
147 case "$$objfmt" in \
148 "") ${WARNING_MSG} "[depends.mk] Unknown object format for installed package $$pkg" ;; \
149 ${OBJECT_FMT}) ;; \
150 *) ${ERROR_MSG} "[depends.mk] Installed package $$pkg has an"; \
151 ${ERROR_MSG} " object format \`\`$$objfmt'' which differs from \`\`${OBJECT_FMT}''. Please"; \
152 ${ERROR_MSG} " update the $$pkg package to ${OBJECT_FMT}."; \
153 exit 1; \
154 ;; \
155 esac; \
156 silent=${_BOOTSTRAP_VERBOSE:Dyes}; \
157 if ${TEST} -z "$${silent}"; then \
158 ${STEP_MSG} "$$Type dependency $$pattern: found $$pkg"; \
159 fi; \
160 ;; \
161 esac
163 ${_DEPENDS_FILE}:
164 ${RUN} ${MKDIR} ${.TARGET:H}
165 ${RUN} ${_LIST_DEPENDS_CMD} > ${.TARGET}
167 ${_RDEPENDS_FILE}: ${_DEPENDS_FILE}
168 ${RUN} ${_RESOLVE_DEPENDS_CMD} > ${.TARGET}
170 ${_RRDEPENDS_FILE}: ${_RDEPENDS_FILE}
171 ${RUN} ${_REDUCE_RESOLVED_DEPENDS_CMD} > ${.TARGET}
173 # _pkgformat-install-dependencies:
174 # Installs any missing dependencies.
176 _pkgformat-install-dependencies: .PHONY ${_DEPENDS_FILE}
177 ${RUN} \
178 exec 3<&0; \
179 ${CAT} ${_DEPENDS_FILE} | \
180 while read type pattern dir; do \
181 ${TEST} "$$type" != "bootstrap" || continue; \
182 ${_DEPENDS_INSTALL_CMD} 0<&3; \
183 done
185 # _pkgformat-post-install-dependencies:
186 # Targets after installing all dependencies.
188 _pkgformat-post-install-dependencies: .PHONY ${_RDEPENDS_FILE} ${_RRDEPENDS_FILE}
190 ######################################################################
191 ### pkg_install-depends (PUBLIC, pkgsrc/mk/depends/depends.mk)
192 ######################################################################
193 ### pkg_install-depends is a public target to install or update
194 ### pkg_install itself.
196 .PHONY: pkg_install-depends
197 pkg_install-depends:
198 ${RUN}if [ `${PKG_INFO_CMD} -V 2>/dev/null || echo 20010302` -lt ${PKGTOOLS_REQD} ]; then \
199 ${PHASE_MSG} "Trying to handle out-dated pkg_install..."; \
200 cd ../../pkgtools/pkg_install && ${PKGSRC_SETENV} ${PKGSRC_MAKE_ENV} \
201 _PKGSRC_DEPS=" ${PKGNAME}${_PKGSRC_DEPS}" \
202 ${MAKE} ${MAKEFLAGS} _AUTOMATIC=yes clean && \
203 cd ../../pkgtools/pkg_install && ${PKGSRC_SETENV} ${PKGSRC_MAKE_ENV} \
204 _PKGSRC_DEPS=" ${PKGNAME}${_PKGSRC_DEPS}" \
205 ${MAKE} ${MAKEFLAGS} _AUTOMATIC=yes ${DEPENDS_TARGET:Q}; \
208 ######################################################################
209 ### bootstrap-depends (PUBLIC, pkgsrc/mk/depends/depends.mk)
210 ######################################################################
211 ### bootstrap-depends is a public target to install any missing
212 ### dependencies needed during stages before the normal "depends"
213 ### stage. These dependencies are listed in BOOTSTRAP_DEPENDS.
215 .PHONY: bootstrap-depends
216 _BOOTSTRAP_DEPENDS_TARGETS+= acquire-bootstrap-depends-lock
217 _BOOTSTRAP_DEPENDS_TARGETS+= _pkgformat-bootstrap-depends
218 _BOOTSTRAP_DEPENDS_TARGETS+= release-bootstrap-depends-lock
220 bootstrap-depends: ${_BOOTSTRAP_DEPENDS_TARGETS}
222 .PHONY: _pkgformat-bootstrap-depends
223 .if empty(PKG_FAIL_REASON)
224 _pkgformat-bootstrap-depends:
225 ${RUN}${_LIST_DEPENDS_CMD.bootstrap} | \
226 while read type pattern dir; do \
227 ${TEST} "$$type" = "bootstrap" || continue; \
228 ${_DEPENDS_INSTALL_CMD}; \
229 done
230 .else
231 _pkgformat-bootstrap-depends:
232 ${RUN}${DO_NADA}
233 .endif
235 .PHONY:
236 acquire-bootstrap-depends-lock: acquire-lock
237 release-bootstrap-depends-lock: release-lock