I don't like to be root when it's not necessary, and, well, sometimes I just don't get to be. Anyway this is a multiuser OS, and I don't see why users shouldn't be allowed to play with their own private ports. ;-)
This has made it easier for me to test on regular user shell accounts loaned to me by nice people (thank you). Maybe others will find it of use, or it could be added to the actual infrastructure. First, as far as I can tell, alternate localbase ports don't work because mtree.fake is being unconditionally included, and its layout is usr/local, conflicting with any LOCALBASE setting. That's taken care of by creating a custom mtree file, for example: http://deanna.freeshell.org/home.mtree and creating a new variable, LOCAL_MTREE_FILE. Setting LOCAL_MTREE_FILE in $MAKECONF, and making this change to bsd.port.mk seems to fix the LOCALBASE ports installation. -MTREE_FILE?= +.if !defined(LOCAL_MTREE_FILE) MTREE_FILE+=${PORTSDIR}/infrastructure/db/fake.mtree +.else +MTREE_FILE+=${LOCAL_MTREE_FILE} +.endif Non-root operation is a bit more complicated. Most all of the necessary variables are already in place. I added a couple of new ones: PKG_ADD_LOCAL PKG_DELETE_LOCAL which can contain extra arguments to the pkg_* commands in the ports infrastructure, like -Fnonroot. Other changes to bsd.port.mk include passing the PKG_DBDIR to the shell commands so that install/delete work properly, and that dependency checking only happens on things in LOCALBASE. I've been using these modifications for a day or so. I'm sure I've overlooked something or they could be improved upon. The only minor annoyance I've seen is ports whose distribution Makefiles try to do things like chmod in their install targets, but that's taken care of by modifying them by hand. Here's a sample MAKECONF with the required settings : http://deanna.freeshell.org/mk.conf and the diff to bsd.port.mk Index: bsd.port.mk =================================================================== RCS file: /cvs/ports/infrastructure/mk/bsd.port.mk,v retrieving revision 1.835 diff -u -p -r1.835 bsd.port.mk --- bsd.port.mk 2006/11/25 19:47:53 1.835 +++ bsd.port.mk 2006/11/26 06:21:08 @@ -143,6 +143,9 @@ FETCH_CMD?= /usr/bin/ftp -V -m PKG_TMPDIR?= /var/tmp PKG_CMD?= /usr/sbin/pkg_create PKG_DELETE?= /usr/sbin/pkg_delete +PKG_ADD_LOCAL?= +PKG_DELETE_LOCAL?= + # remount those mount points ro before fake. # XXX tends to panic the OS PROTECT_MOUNT_POINTS?= @@ -744,8 +747,11 @@ UNMESSAGE${SUBPACKAGE}?= ${PKGDIR}/UNMES DESCR${SUBPACKAGE}?= ${PKGDIR}/DESCR${SUBPACKAGE} -MTREE_FILE?= +.if !defined(LOCAL_MTREE_FILE) MTREE_FILE+=${PORTSDIR}/infrastructure/db/fake.mtree +.else +MTREE_FILE+=${LOCAL_MTREE_FILE} +.endif # Fill out package command, and package dependencies _PKG_PREREQ= ${WRKPKG}/DESCR${SUBPACKAGE} ${WRKPKG}/COMMENT${SUBPACKAGE} @@ -1260,7 +1266,7 @@ _grab_libs_from_plist= sed -n -e '/[EMAIL PROTECTED] ${_CACHE_REPO}/${_PKGFILE}: @mkdir -p [EMAIL PROTECTED] @${ECHO_MSG} -n "===> Looking for ${_PKGFILE} in \$$PKG_PATH - " - @if ${SETENV} PKG_CACHE=${_CACHE_REPO} PKG_PATH=${_CACHE_REPO}:${_PKG_REPO}:${PACKAGE_REPOSITORY}/${NO_ARCH}/:${PKG_PATH} PKG_TMPDIR=${PKG_TMPDIR} pkg_add -n -q ${_PKG_ADD_FORCE} ${_PKGFILE} >/dev/null 2>&1; then \ + @if ${SETENV} PKG_CACHE=${_CACHE_REPO} PKG_PATH=${_CACHE_REPO}:${_PKG_REPO}:${PACKAGE_REPOSITORY}/${NO_ARCH}/:${PKG_PATH} PKG_TMPDIR=${PKG_TMPDIR} PKG_DBDIR=${PKG_DBDIR} pkg_add -n -q ${_PKG_ADD_LOCAL} ${_PKGFILE} >/dev/null 2>&1; then \ ${ECHO_MSG} "found"; \ exit 0; \ else \ @@ -1429,7 +1435,7 @@ ${WRKDIR}/.dep${_i:C,[|:/<=>*],-,g}: ${_ what=$$pkg; \ if $$checkinstall; then \ $$early_exit || ${_force_update_fragment}; \ - if pkg_info -q -e "$$pkg"; then \ + if ${SETENV} PKG_DBDIR=${PKG_DBDIR} pkg_info -q -e "$$pkg"; then \ ${ECHO_MSG} "===> ${FULLPKGNAME${SUBPACKAGE}}${_MASTER} depends on: $$what - found"; \ break; \ else \ @@ -2035,13 +2041,13 @@ ${_INSTALL_COOKIE}: . endif .endfor .if ${TRUST_PACKAGES:L} == "yes" - @if pkg_info -q -e ${FULLPKGNAME${SUBPACKAGE}}; then \ + @if ${SETENV} PKG_DBDIR=${PKG_DBDIR} pkg_info -q -e ${FULLPKGNAME${SUBPACKAGE}}; then \ echo "Package ${FULLPKGNAME${SUBPACKAGE}} is already installed"; \ else \ - ${SUDO} ${SETENV} PKG_PATH=${_PKG_REPO} PKG_TMPDIR=${PKG_TMPDIR} pkg_add ${_PKG_ADD_AUTO} ${PKGFILE}; \ + ${SUDO} ${SETENV} PKG_PATH=${_PKG_REPO} PKG_TMPDIR=${PKG_TMPDIR} PKG_DBDIR=${PKG_DBDIR} pkg_add ${PKG_ADD_LOCAL} ${_PKG_ADD_AUTO} ${PKGFILE}; \ fi .else - @${SUDO} ${SETENV} PKG_PATH=${_PKG_REPO} PKG_TMPDIR=${PKG_TMPDIR} pkg_add ${_PKG_ADD_AUTO} ${PKGFILE} + @${SUDO} ${SETENV} PKG_PATH=${_PKG_REPO} PKG_TMPDIR=${PKG_TMPDIR} PKG_DBDIR=${PKG_DBDIR} pkg_add ${PKG_ADD_LOCAL} ${_PKG_ADD_AUTO} ${PKGFILE} .endif @-${SUDO} ${_MAKE_COOKIE} $@ @@ -2053,11 +2059,11 @@ ${_UPDATE_COOKIE}: @mkdir -p ${UPDATE_COOKIES_DIR} .endif @${ECHO_MSG} "===> Updating for ${FULLPKGNAME${SUBPACKAGE}}" - @a=`pkg_info -e ${FULLPKGPATH} 2>/dev/null || true`; \ + @a=`${SETENV} PKG_DBDIR=${PKG_DBDIR} pkg_info -e ${FULLPKGPATH} 2>/dev/null || true`; \ case $$a in \ '') ${ECHO_MSG} "Not installed, no update";; \ *) ${ECHO_MSG} "Upgrading from $$a"; \ - ${SUDO} ${SETENV} PKG_PATH=${_PKG_REPO} PKG_TMPDIR=${PKG_TMPDIR} pkg_add ${_PKG_ADD_AUTO} -r ${_PKG_ADD_FORCE} ${PKGFILE};; \ + ${SUDO} ${SETENV} PKG_PATH=${_PKG_REPO} PKG_TMPDIR=${PKG_TMPDIR} PKG_DBDIR=${PKG_DBDIR} pkg_add ${PKG_ADD_LOCAL} ${_PKG_ADD_AUTO} -r ${_PKG_ADD_FORCE} ${PKGFILE};; \ esac @${_MAKE_COOKIE} $@ @@ -2168,10 +2174,10 @@ _internal-clean: .if ${_clean:L:Minstall} . if ${_clean:L:Msub} . for _s in ${MULTI_PACKAGES} - -${SUDO} ${PKG_DELETE} ${FULLPKGNAME${_s}} + -${SUDO} ${SETENV} PKG_DBDIR=${PKG_DBDIR} ${PKG_DELETE} ${PKG_DELETE_LOCAL} ${FULLPKGNAME${_s}} . endfor . else - -${SUDO} ${PKG_DELETE} ${FULLPKGNAME${SUBPACKAGE}} + -${SUDO} ${SETENV} PKG_DBDIR=${PKG_DBDIR} ${PKG_DELETE} ${PKG_DELETE_LOCAL} ${FULLPKGNAME${SUBPACKAGE}} . endif .endif .if ${_clean:L:Mpackages} || ${_clean:L:Mpackage} && ${_clean:L:Msub} @@ -2379,7 +2385,7 @@ ${FULLPKGNAME${SUBPACKAGE}}.html: -e '/%%HOMEPAGE%%/[EMAIL PROTECTED]' -e '//d' \ -e '/%%BUILD_DEPENDS%%/[EMAIL PROTECTED]' -e '//d' \ -e '/%%RUN_DEPENDS%%/[EMAIL PROTECTED]' -e '//d' \ - -e '/%%SUBPACKAGES%%/[EMAIL PROTECTED]' -e '//d' \ + -e '/%%SUBPACKAGES%%/[EMAIL PROTECTED]' -e '//d' \ >> $@ @rm -f [EMAIL PROTECTED] @@ -2475,7 +2481,7 @@ _print-package-args: libspecs='';comma=''; \ default=`eval $$toset ${MAKE} _print-packagename`; \ case "X$$pkg" in X) pkg=`echo $$default|${_version2default}`;; esac; \ - if pkg_info -q -e $$pkg; then \ + if ${SETENV} PKG_DBDIR=${PKG_DBDIR} pkg_info -q -e $$pkg; then \ listlibs='echo ${DEPDIR}$$shdir/lib*'; \ case $$dir in ${PKGPATH}) \ listlibs="$$toset ${MAKE} print-plist-contents|${_grab_libs_from_plist}; $$listlibs";; \ @@ -2720,7 +2726,7 @@ rebuild: uninstall deinstall: @${ECHO_MSG} "===> Deinstalling for ${FULLPKGNAME${SUBPACKAGE}}" - @${SUDO} ${PKG_DELETE} ${FULLPKGNAME${SUBPACKAGE}} + @${SUDO} ${SETENV} PKG_DBDIR=${PKG_DBDIR} ${PKG_DELETE} ${PKG_DELETE_LOCAL} ${FULLPKGNAME${SUBPACKAGE}} .if defined(ERRORS) .BEGIN: