diff --git bsd.port.mk bsd.port.mk index edfbec6..a1126b8 100644 --- bsd.port.mk +++ bsd.port.mk @@ -3905,11 +3905,19 @@ do-package: ${TMPPLIST} fi; \ fi; \ fi - @if ${PKG_CMD} -b ${PKGNAME} ${PKGFILE}; then \ +# Create package atomically. Create the package in a tempdir in the destination pkgdir +# on the same device, then move it to the real destination, cleaning up. Use dirname(PKGFILE) +# to respect any overrides on PKGFILE and dependent vars. See ports/171672 for test cases + @TMPPKGREPOSITORY=$$(TMPDIR=${PKGFILE:H} mktemp -dt pkg); \ + trap "${RM} -rf $${TMPPKGREPOSITORY}; exit 1" 1 2 3 5 10 13 15; \ + if ${PKG_CMD} -b ${PKGNAME} $${TMPPKGREPOSITORY}/${PKGNAME}${PKG_SUFX}; then \ + ${MV} -f $${TMPPKGREPOSITORY}/* ${PKGFILE:H}; \ + ${RM} -rf $${TMPPKGREPOSITORY}; \ if [ -d ${PACKAGES} ]; then \ cd ${.CURDIR} && eval ${MAKE} package-links; \ fi; \ else \ + ${RM} -rf $${TMPPKGREPOSITORY}; \ cd ${.CURDIR} && eval ${MAKE} delete-package; \ exit 1; \ fi