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:



Reply via email to