pkgsrc/mk/bsd.pkg.update.mk
joerg 3602c0d28e Don't require pkg_delete or pkg_info -r to list packages in full
topological sort for the make update list. This breaks naturally when
new dependencies are introduced that are also in the list scheduled for
later installation. Reported by David Holland.
2009-05-16 01:27:30 +00:00

148 lines
4.2 KiB
Makefile

# $NetBSD: bsd.pkg.update.mk,v 1.18 2009/05/16 01:27:30 joerg Exp $
#
# This Makefile fragment is included by bsd.pkg.mk and contains the targets
# and variables for "make update".
#
# There is no documentation on what "update" actually does. This is merely
# an attempt to separate the magic into a separate module that can be
# reimplemented later.
#
NOCLEAN?= NO # don't clean up after update
REINSTALL?= NO # reinstall upon update
# UPDATE_TARGET is the target that is invoked when updating packages during
# a "make update". This variable is user-settable within /etc/mk.conf.
#
.if !defined(UPDATE_TARGET)
. if defined(DEPENDS_TARGET) && (${DEPENDS_TARGET} == "update")
. if ${_USE_DESTDIR} != "no"
UPDATE_TARGET= package-install
. elif make(package)
UPDATE_TARGET= package
. else
UPDATE_TARGET= install
. endif
. else
UPDATE_TARGET= ${DEPENDS_TARGET}
. endif
.endif
# The 'update' target can be used to update a package and all
# currently installed packages that depend upon this package.
_DDIR= ${WRKDIR}/.DDIR
_DLIST= ${WRKDIR}/.DLIST
.PHONY: update-create-ddir
update-create-ddir: ${_DDIR}
.PHONY: update
.if !target(update)
.if exists(${_DDIR})
RESUMEUPDATE?= YES
CLEAR_DIRLIST?= NO
update:
@${PHASE_MSG} "Resuming update for ${PKGNAME}"
. if ${REINSTALL} != "NO" && ${UPDATE_TARGET} != "replace"
${RUN} ${RECURSIVE_MAKE} ${MAKEFLAGS} deinstall _UPDATE_RUNNING=YES DEINSTALLDEPENDS=ALL
. endif
.else
RESUMEUPDATE?= NO
CLEAR_DIRLIST?= YES
update:
${RUN} ${RECURSIVE_MAKE} ${MAKEFLAGS} update-create-ddir
. if ${UPDATE_TARGET} != "replace"
${RUN} if ${PKG_INFO} -qe ${PKGBASE}; then \
${RECURSIVE_MAKE} ${MAKEFLAGS} deinstall _UPDATE_RUNNING=YES DEINSTALLDEPENDS=ALL \
|| (${RM} ${_DDIR} && ${FALSE}); \
fi
. endif
.endif
${RUN} ${RECURSIVE_MAKE} ${MAKEFLAGS} ${UPDATE_TARGET} KEEP_WRKDIR=YES DEPENDS_TARGET=${DEPENDS_TARGET:Q}
${RUN} \
[ ! -s ${_DDIR} ] || for dep in `${CAT} ${_DDIR}` ; do \
(if cd ../.. && cd "$${dep}" ; then \
${PHASE_MSG} "Installing in $${dep}" && \
if [ "(" "${RESUMEUPDATE}" = "NO" -o \
"${REINSTALL}" != "NO" ")" -a \
"${UPDATE_TARGET}" != "replace" ] ; then \
${RECURSIVE_MAKE} ${MAKEFLAGS} deinstall _UPDATE_RUNNING=YES; \
fi && \
${RECURSIVE_MAKE} ${MAKEFLAGS} ${UPDATE_TARGET} \
_PKGSRC_UPDATE_CHECK=yes \
DEPENDS_TARGET=${DEPENDS_TARGET:Q} ; \
else \
${PHASE_MSG} "Skipping removed directory $${dep}"; \
fi) ; \
done
.if ${NOCLEAN} == "NO"
${RUN} ${RECURSIVE_MAKE} ${MAKEFLAGS} clean-update CLEAR_DIRLIST=YES
.endif
.PHONY: clean-update
clean-update:
${RUN} ${RECURSIVE_MAKE} ${MAKEFLAGS} update-create-ddir
${RUN} \
if [ -s ${_DDIR} ] ; then \
for dep in `${CAT} ${_DDIR}` ; do \
(if cd ../.. && cd "$${dep}" ; then \
${RECURSIVE_MAKE} ${MAKEFLAGS} clean ; \
else \
${PHASE_MSG} "Skipping removed directory $${dep}";\
fi) ; \
done ; \
fi
.if ${CLEAR_DIRLIST} != "NO"
${RUN} ${RECURSIVE_MAKE} ${MAKEFLAGS} clean
.else
${RUN} ${RECURSIVE_MAKE} ${MAKEFLAGS} clean update-dirlist DIRLIST="`${CAT} ${_DDIR}`" PKGLIST="`${CAT} ${_DLIST}`"
@${WARNING_MSG} "preserved leftover directory list. Your next"
@${WARNING_MSG} "\`\`${MAKE} update'' may fail. It is advised to use"
@${WARNING_MSG} "\`\`${MAKE} update REINSTALL=YES'' instead!"
.endif
.endif # !target(update)
.PHONY: update-dirlist
update-dirlist:
${RUN} ${MKDIR} -p ${WRKDIR}
.if defined(PKGLIST)
. for __tmp__ in ${PKGLIST}
${RUN} ${ECHO} >>${_DLIST} "${__tmp__}"
. endfor
.endif
.if defined(DIRLIST)
. for __tmp__ in ${DIRLIST}
${RUN} ${ECHO} >>${_DDIR} "${__tmp__}"
. endfor
.endif
${_DDIR}: ${_DLIST}
${RUN} pkgs=`${CAT} ${_DLIST}`; \
if [ "$$pkgs" ]; then ${PKG_INFO} -Q PKGPATH $$pkgs; fi > ${_DDIR}
.if ${PKGTOOLS_VERSION} >= 20090302
${_DLIST}: ${WRKDIR}
if ${PKG_INFO} -qe "${PKGWILDCARD}"; then \
${PKG_INFO} -qr "${PKGWILDCARD}" > ${_DLIST}; \
else \
${TOUCH} ${_DLIST}; \
fi
.elif ${PKGTOOLS_VERSION} >= 20090225
${_DLIST}: ${WRKDIR}
${RUN}echo "Please update to pkg_install-20090302 or later" 2>&1
${RUN}exit 1
.else
${_DLIST}: ${WRKDIR}
${RUN} \
${PKG_DELETE} -n "${PKGWILDCARD}" 2>&1 \
| ${GREP} '^ ' \
| ${AWK} '{ l[NR]=$$0 } END { for (i=NR;i>0;--i) print l[i] }' \
> ${_DLIST}
.endif