diff options
Diffstat (limited to 'mk')
-rw-r--r-- | mk/bsd.pkg.mk | 12 | ||||
-rw-r--r-- | mk/install/bin-install.mk | 6 | ||||
-rw-r--r-- | mk/install/deinstall.mk | 13 | ||||
-rw-r--r-- | mk/install/install.mk | 6 | ||||
-rw-r--r-- | mk/internal/locking.mk | 131 |
5 files changed, 111 insertions, 57 deletions
diff --git a/mk/bsd.pkg.mk b/mk/bsd.pkg.mk index a9d9254f81d..897c7822036 100644 --- a/mk/bsd.pkg.mk +++ b/mk/bsd.pkg.mk @@ -1,4 +1,4 @@ -# $NetBSD: bsd.pkg.mk,v 1.1883 2006/08/04 07:04:38 rillig Exp $ +# $NetBSD: bsd.pkg.mk,v 1.1884 2006/08/04 20:52:27 rillig Exp $ # # This file is in the public domain. # @@ -410,12 +410,8 @@ USE_TOOLS+= expr USE_TOOLS+= tee tsort .endif -# We need shlock and sleep if we're using locking to synchronize multiple -# builds over the same pkgsrc tree. -# -.if ${PKGSRC_LOCKTYPE} != "none" -USE_TOOLS+= shlock sleep -.endif +# Locking +.include "${PKGSRCDIR}/mk/internal/locking.mk" # Tools .include "../../mk/tools/bsd.tools.mk" @@ -605,8 +601,6 @@ all: ${_PKGSRC_BUILD_TARGETS} # adding pre-* or post-* targets/scripts, override these. ################################################################ -.include "${PKGSRCDIR}/mk/internal/locking.mk" - .PHONY: makedirs makedirs: ${WRKDIR} diff --git a/mk/install/bin-install.mk b/mk/install/bin-install.mk index 8ef5fabd848..0fb73ed3d2b 100644 --- a/mk/install/bin-install.mk +++ b/mk/install/bin-install.mk @@ -1,4 +1,4 @@ -# $NetBSD: bin-install.mk,v 1.2 2006/08/04 07:17:58 rillig Exp $ +# $NetBSD: bin-install.mk,v 1.3 2006/08/04 20:52:27 rillig Exp $ # # This file provides the following targets: @@ -28,8 +28,8 @@ _SU_BIN_INSTALL_TARGETS+= locked-su-bin-install _SU_BIN_INSTALL_TARGETS+= release-bin-install-lock .PHONY: acquire-bin-install-lock release-bin-install-lock -acquire-bin-install-lock: acquire-lock -release-bin-install-lock: release-lock +acquire-bin-install-lock: acquire-localbase-lock +release-bin-install-lock: release-localbase-lock # Install binary pkg, without strict uptodate-check first .PHONY: su-bin-install diff --git a/mk/install/deinstall.mk b/mk/install/deinstall.mk index 0f5423b6fe7..9ae3e50edde 100644 --- a/mk/install/deinstall.mk +++ b/mk/install/deinstall.mk @@ -1,4 +1,4 @@ -# $NetBSD: deinstall.mk,v 1.4 2006/08/03 19:12:43 rillig Exp $ +# $NetBSD: deinstall.mk,v 1.5 2006/08/04 20:52:27 rillig Exp $ # DEINSTALLDEPENDS controls whether dependencies and dependents are also # removed when a package is de-installed. The valid values are: @@ -21,7 +21,16 @@ deinstall: su-target @${PHASE_MSG} "Deinstalling for ${PKGNAME}" .endif -su-deinstall: acquire-install-lock deinstall-pkg release-install-lock install-clean +_SU_DEINSTALL_TARGETS= acquire-deinstall-lock +_SU_DEINSTALL_TARGETS+= deinstall-pkg +_SU_DEINSTALL_TARGETS+= release-deinstall-lock +_SU_DEINSTALL_TARGETS+= install-clean +su-deinstall: ${_SU_DEINSTALL_TARGETS} +.ORDER: ${_SU_DEINSTALL_TARGETS} + +.PHONY: acquire-deinstall-lock release-deinstall-lock +acquire-deinstall-lock: acquire-localbase-lock +release-deinstall-lock: release-localbase-lock MAKEFLAGS.su-deinstall= DEINSTALLDEPENDS=${DEINSTALLDEPENDS} diff --git a/mk/install/install.mk b/mk/install/install.mk index bac0c4db5fb..3f4c7368b7e 100644 --- a/mk/install/install.mk +++ b/mk/install/install.mk @@ -1,4 +1,4 @@ -# $NetBSD: install.mk,v 1.15 2006/07/27 21:46:46 jlam Exp $ +# $NetBSD: install.mk,v 1.16 2006/08/04 20:52:27 rillig Exp $ ###################################################################### ### install (PUBLIC) @@ -25,8 +25,8 @@ install: barrier .endif .PHONY: acquire-install-lock release-install-lock -acquire-install-lock: acquire-lock -release-install-lock: release-lock +acquire-install-lock: acquire-lock acquire-localbase-lock +release-install-lock: release-lock release-localbase-lock .if exists(${_COOKIE.install}) ${_COOKIE.install}: diff --git a/mk/internal/locking.mk b/mk/internal/locking.mk index 7a0bed0c484..4943835212e 100644 --- a/mk/internal/locking.mk +++ b/mk/internal/locking.mk @@ -1,39 +1,62 @@ -# $NetBSD: locking.mk,v 1.1 2006/08/04 05:55:18 rillig Exp $ +# $NetBSD: locking.mk,v 1.2 2006/08/04 20:52:27 rillig Exp $ # -# acquire-lock and release-lock are two .USE macro targets that aquire -# and release coarse-grained locks. There are two areas of pkgsrc that -# can be locked: The WRKDIR of a specific package or the LOCALBASE. -# Which of those is locked depends on the name of the target where the -# {acquire,release}-lock macro is used. If it contains -install-, as for -# example acquire-install-lock, LOCALBASE is locked. Otherwise, WRKDIR -# is locked. +# This file provides the following .USE targets: +# +# acquire-lock +# Acquires a coarse-grained lock in WRKDIR. +# +# release-lock +# Releases the lock in WRKDIR. +# +# acquire-localbase-lock +# Acquires a coarse-grained lock in LOCALBASE. +# +# release-localbase-lock +# Releases the lock in LOCALBASE. # -# _WRKDIR_LOCKFILE= ${WRKDIR}/.lockfile -_PREFIX_LOCKFILE= ${PKG_DBDIR}/.lockfile -_GET_LOCKFILE_CMD= \ - case ${.TARGET} in \ - *-install-*) lockfile=${_PREFIX_LOCKFILE};; \ - *) lockfile=${_WRKDIR_LOCKFILE};; \ - esac +_LOCALBASE_LOCKFILE= ${LOCALBASE}/.lockfile + +# +# Sanity checks. +# -acquire-lock: .USE .if ${PKGSRC_LOCKTYPE} == "none" - @${DO_NADA} -.else - @if ${TEST} ! -x ${SHLOCK:Q}""; then \ - ${ERROR_MSG} "The ${SHLOCK:Q} utility does not exist, and is necessary for locking."; \ - ${ERROR_MSG} "Please \""${MAKE:Q}" install\" in ../../pkgtools/shlock."; \ - exit 1; \ - fi +# No further checks. +.elif ${PKGSRC_LOCKTYPE} == "once" || ${PKGSRC_LOCKTYPE} == "sleep" . if !defined(OBJHOSTNAME) - @${ERROR_MSG} "PKGSRC_LOCKTYPE needs OBJHOSTNAME defined."; \ - exit 1 +PKG_FAIL_REASON+= "[locking.mk] PKGSRC_LOCKTYPE needs OBJHOSTNAME defined." . endif - ${_PKG_SILENT}${_PKG_DEBUG}set -e; \ - ${_GET_LOCKFILE_CMD}; \ +.else +PKG_FAIL_REASON+= "[locking.mk] PKGSRC_LOCKTYPE must be one of {none,once,sleep}, not ${PKGSRC_LOCKTYPE}." +.endif + +# +# Needed tools. +# + +.if ${PKGSRC_LOCKTYPE} != "none" +USE_TOOLS+= shlock +.endif +.if ${PKGSRC_LOCKTYPE} == "sleep" +USE_TOOLS+= sleep +.endif + +# +# The commands. +# + +_CHECK_IF_SHLOCK_IS_AVAILABLE_CMD= \ + ${TEST} -x ${SHLOCK:Q}"" || { \ + ${ERROR_MSG} "[locking.mk] shlock is not installed."; \ + ${ERROR_MSG} "[locking.mk] Please \"cd ../../pkgtools/shlock && ${MAKE} install\"."; \ + exit 1; \ + } + +_ACQUIRE_LOCK_CMD= \ + ${_CHECK_IF_SHLOCK_IS_AVAILABLE_CMD}; \ ppid=`${PS} -p $$$$ -o ppid | ${AWK} 'NR == 2 { print $$1 }'`; \ if ${TEST} -z "$$ppid"; then \ ${ERROR_MSG} "No parent process ID found."; \ @@ -49,7 +72,7 @@ acquire-lock: .USE fi; \ lockdir=`echo "$$lockfile" | sed "s,/[^/]*\$$,,"`; \ ${MKDIR} "$$lockdir"; \ - if ${SHLOCK} -f "$$lockfile" -p $$ppid; then \ + if ${SHLOCK} -f "$$lockfile" -p "$$ppid"; then \ break; \ fi; \ lockpid=`${CAT} "$$lockfile"`; \ @@ -61,22 +84,50 @@ acquire-lock: .USE ${SLEEP} ${PKGSRC_SLEEPSECS}; \ ;; \ esac; \ - done; \ - if ${PKG_VERBOSE:D${TRUE}:U${FALSE}}; then \ - lockpid=`${CAT} "$$lockfile"`; \ - ${STEP_MSG} "Lock acquired for \`\`${.TARGET:S/^acquire-//:S/-lock$//}'' on behalf of process $$lockpid"; \ - fi + done; +.if defined(PKG_VERBOSE) +_ACQUIRE_LOCK_CMD+= \ + lockpid=`${CAT} "$$lockfile"`; \ + ${STEP_MSG} "Lock $$lockfile acquired for \`\`${.TARGET:S/^acquire-//:S/-lock$//}'' on behalf of process $$lockpid"; .endif -release-lock: .USE +_RELEASE_LOCK_CMD= # nothing +.if defined(PKG_VERBOSE) +_RELEASE_LOCK_CMD+= \ + lockpid=`${CAT} "$$lockfile"`; \ + ${STEP_MSG} "Lock $$lockfile released for \`\`${.TARGET:S/^release-//:S/-lock$//}'' on behalf of process $$lockpid"; +.endif +_RELEASE_LOCK_CMD+= \ + ${RM} -f "$$lockfile" + +# +# The targets. +# + +.PHONY: acquire-lock release-lock +.PHONY: acquire-localbase-lock release-localbase-lock + .if ${PKGSRC_LOCKTYPE} == "none" +acquire-lock release-lock acquire-localbase-lock release-localbase-lock: .USE @${DO_NADA} .else +acquire-lock: .USE ${_PKG_SILENT}${_PKG_DEBUG} set -e; \ - ${_GET_LOCKFILE_CMD}; \ - if ${PKG_VERBOSE:D${TRUE}:U${FALSE}}; then \ - lockpid=`${CAT} "$$lockfile"`; \ - ${STEP_MSG} "Lock released for \`\`${.TARGET:S/^release-//:S/-lock$//}'' on behalf of process $$lockpid"; \ - fi; \ - ${RM} -f "$$lockfile" + lockfile=${_WRKDIR_LOCKFILE}; \ + ${_ACQUIRE_LOCK_CMD} + +release-lock: .USE + ${_PKG_SILENT}${_PKG_DEBUG} set -e; \ + lockfile=${_WRKDIR_LOCKFILE}; \ + ${_RELEASE_LOCK_CMD} + +acquire-localbase-lock: .USE + ${_PKG_SILENT}${_PKG_DEBUG} set -e; \ + lockfile=${_LOCALBASE_LOCKFILE}; \ + ${_ACQUIRE_LOCK_CMD} + +release-localbase-lock: .USE + ${_PKG_SILENT}${_PKG_DEBUG} set -e; \ + lockfile=${_LOCALBASE_LOCKFILE}; \ + ${_RELEASE_LOCK_CMD} .endif |