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
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 \
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
} ;; \
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
} \
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
} \
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
90 # @param $type The dependency type. Can be one of bootstrap, tool,
93 _DEPENDS_INSTALL_CMD
= \
94 case
$$type in bootstrap
) Type
=Bootstrap
;; tool
) Type
=Tool
;; build
) Type
=Build
;; full
) Type
=Full
;; esac
; \
97 if expr
"${USE_CROSS_COMPILE:Uno}" : '[yY][eE][sS]' >/dev
/null
; then \
100 extradep
=" ${PKGNAME}"; \
103 archopt
=TARGET_ARCH
=${MACHINE_ARCH}; \
104 pkg
=`${_HOST_PKG_BEST_EXISTS} "$$pattern" || ${TRUE}`; \
107 extradep
=" ${PKGNAME}"; \
108 cross
=${USE_CROSS_COMPILE
:Uno
}; \
110 pkg
=`${_PKG_BEST_EXISTS} "$$pattern" || ${TRUE}`; \
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."; \
120 ${PKGSRC_SETENV} ${PKGSRC_MAKE_ENV} \
121 _PKGSRC_DEPS
="$$extradep${_PKGSRC_DEPS}" \
122 PKGNAME_REQD
="$$pattern" \
123 USE_CROSS_COMPILE
=$$cross \
125 ${MAKE} ${MAKEFLAGS} _AUTOMATIC
=yes
$$target; \
128 pkg
=`${_HOST_PKG_BEST_EXISTS} "$$pattern" || ${TRUE}`;; \
130 pkg
=`${_PKG_BEST_EXISTS} "$$pattern" || ${TRUE}`;; \
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?"; \
138 ${STEP_MSG} "Returning to build of ${PKGNAME}"; \
143 objfmt
=`${HOST_PKG_INFO} -Q OBJECT_FMT "$$pkg"`;; \
145 objfmt
=`${PKG_INFO} -Q OBJECT_FMT "$$pkg"`;; \
148 "") ${WARNING_MSG} "[depends.mk] Unknown object format for installed package $$pkg" ;; \
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}."; \
156 silent
=${_BOOTSTRAP_VERBOSE
:Dyes
}; \
157 if
${TEST} -z
"$${silent}"; then \
158 ${STEP_MSG} "$$Type dependency $$pattern: found $$pkg"; \
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}
179 ${CAT} ${_DEPENDS_FILE} | \
180 while read type pattern
dir; do \
181 ${TEST} "$$type" != "bootstrap" || continue
; \
182 ${_DEPENDS_INSTALL_CMD} 0<&3; \
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
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}; \
231 _pkgformat-bootstrap-depends
:
236 acquire-bootstrap-depends-lock
: acquire-lock
237 release-bootstrap-depends-lock
: release-lock