[PC-BSD Commits] r8084 - pcbsd/current/src-sh/pbi-manager
svn at pcbsd.org
svn at pcbsd.org
Mon Nov 29 13:09:49 PST 2010
Author: kris
Date: 2010-11-29 13:09:48 -0800 (Mon, 29 Nov 2010)
New Revision: 8084
Modified:
pcbsd/current/src-sh/pbi-manager/pbi-manager
Log:
Update to pbi_makeport functionality, now the first time run it will build
a clean freebsd chroot "sandbox" for the port / PBI building, in order to
prevent messes on the host system. Doing this also makes building PBIs
much more reliable and cleaner all around.
Modified: pcbsd/current/src-sh/pbi-manager/pbi-manager
===================================================================
--- pcbsd/current/src-sh/pbi-manager/pbi-manager 2010-11-29 17:23:13 UTC (rev 8083)
+++ pcbsd/current/src-sh/pbi-manager/pbi-manager 2010-11-29 21:09:48 UTC (rev 8084)
@@ -897,7 +897,9 @@
shift; PBI_MAKEPREFIX="$1"
;;
--sign) if [ $# -eq 1 ]; then usage_create_pbi; fi
- shift; PBI_SSLPRIVKEY="$1"
+ shift
+ get_abspath "$1"
+ PBI_SSLPRIVKEY="$_ABSPATH"
;;
*)
if [ $# -gt 1 ]; then usage_make_pbi; fi
@@ -977,6 +979,7 @@
PROGBASE="/usr/local"
SYS_LOCALBASE="/usr/local"
PBI_APPDIR="${PROGBASE}/pbi"
+ PBI_CHROOTFILE="${PBI_APPDIR}/.pbi-world.tbz"
PBI_HASHDIR="${PBI_APPDIR}/.hashdir"
PBI_RCDIR="${SYS_LOCALBASE}/etc/rc.d"
PBI_ETCCONF="${SYS_LOCALBASE}/etc/pbi.conf"
@@ -1003,7 +1006,6 @@
MOD_XDGMIME_DIR="xdg-mime"
MOD_EXTLINKFILE="external-links"
MOD_AUTOEXTLINKFILE=".auto-external-links"
- OLDPATH=""
PBI_ADD_GUIDISPLAY="NO"
PBI_ADD_INFODISPLAY="NO"
PBI_ADD_LICDISPLAY="NO"
@@ -1142,9 +1144,11 @@
rm_buildfiles() {
if [ "${PBI_KEEPBUILDFILES}" = "YES" ] ; then return ; fi
if [ -z "${PBI_PROGDIRPATH}" ] ; then return ; fi
- if [ "`basename $0`" = "pbi_makeport" -a -d "${PBI_PROGDIRPATH}" ] ; then
+ if [ "`basename $0`" = "pbi_makeport_chroot" -a -d "${PBI_PROGDIRPATH}" ] ; then
rm -rf "${PBI_PROGDIRPATH}"
fi
+ if [ -z "$PBI_CHROOTDIR" ] ; then return ; fi
+ rm -rf "${PBI_CHROOTDIR}"
}
# Load PBI conf options
@@ -1222,7 +1226,7 @@
echo -e "`basename ${0}`: ${1}"
rm_tmpdir
rm_buildfiles
- clean_wrkdirprefix
+ chroot_make_cleanup
clean_remote_dl
exit 255
}
@@ -1240,85 +1244,52 @@
# Set the PREFIX
PREFIX="${PBI_PROGDIRPATH}" ; export PREFIX
- WRKDIRPREFIX="${PBI_PROGDIRPATH}.wrkdir" ; export WRKDIRPREFIX
if [ -e "${PREFIX}" ] ; then
if [ "$MKDELBUILD" != "YES" ] ; then
exit_err "${PREFIX} already exists! Delete it before doing a rebuild"
else
- if [ -z "${PREFIX}" -o -z "$WRKDIRPREFIX" ] ; then
+ if [ -z "${PREFIX}" ] ; then
exit_err "null PREFIX, this shouldn't happen"
fi
rm -rf "${PREFIX}"
- rm -rf "${WRKDIRPREFIX}"
fi
fi
- mkdir -p ${PREFIX}
- # rm /\$ORIGIN >/dev/null 2>/dev/null
- #ln -fs ${PREFIX} /\$ORIGIN
- #PREFIX='/\$ORIGIN' ; export PREFIX
+ mkdir -p "${PREFIX}"
- __MAKE_CONF="${PBI_PROGDIRPATH}/make.conf"
- export __MAKE_CONF
- cp /etc/make.conf ${__MAKE_CONF}
+ local MAKE_CONF="/etc/make.conf"
- echo "PREFIX=${PREFIX}" >> ${__MAKE_CONF}
- #echo 'PREFIX=$${ORIGIN}' >> ${__MAKE_CONF}
- echo "LOCALBASE=${PREFIX}" >> ${__MAKE_CONF}
- echo "LINUXBASE=${PREFIX}" >> ${__MAKE_CONF}
- echo "PACKAGE_BUILDING=yes" >> ${__MAKE_CONF}
- #echo 'LOCALBASE=$${ORIGIN}' >> ${__MAKE_CONF}
+ echo "PREFIX=${PREFIX}" >> ${MAKE_CONF}
+ echo "LOCALBASE=${PREFIX}" >> ${MAKE_CONF}
+ echo "LINUXBASE=${PREFIX}" >> ${MAKE_CONF}
+ echo "PACKAGE_BUILDING=yes" >> ${MAKE_CONF}
+ echo "LDFLAGS+=-L${PREFIX}/lib" >> ${MAKE_CONF}
- echo "BATCH=yes" >> ${__MAKE_CONF}
- echo "PACKAGE_BUILDING=yes" >> ${__MAKE_CONF}
- echo "WRKDIRPREFIX=${WRKDIRPREFIX}" >> ${__MAKE_CONF}
+ echo "BATCH=yes" >> ${MAKE_CONF}
+ echo "PACKAGE_BUILDING=yes" >> ${MAKE_CONF}
- # Experiementing with $ORIGIN, still needs some work
- #echo "CFLAGS+=-Wl,-z,origin" >> ${__MAKE_CONF}
- #echo "CFLAGS+=\"-Wl,-R,\\\$ORIGIN/../lib\"" >> ${__MAKE_CONF}
- #echo "LDFLAGS+=-Wl,-z,origin" >> ${__MAKE_CONF}
- # CFLAGS = "-Wl,-R'$ORIGIN', -O2, -fno-strict-aliasing, -Wl,-z,'$ORIGIN'
- # To inspect libs: objdump -p
-
if [ ! -z "$PBI_MAKEOPTS" ] ; then
# Check if we have custom make opts
- echo "${PBI_MAKEOPTS}" >> ${__MAKE_CONF}
+ echo "${PBI_MAKEOPTS}" >> ${MAKE_CONF}
fi
- # Set PATH
- OLDPATH="${PATH}"
- PATH="/sbin:/bin:/usr/sbin:/usr/bin:/usr/games:${PREFIX}/bin:${PREFIX}/sbin"
- export PATH
+ # Link /usr/local -> PREFIX
+ mkdir -p /usr/local/pbi
+ ln -s ${PREFIX} /usr/local
- # Need to trick ldconfig lookups as well
- LD_ELF_HINTS_PATH="${PREFIX}/.ld-elf.hints" ; export LD_ELF_HINTS_PATH
- ldconfig -elf -f ${LD_ELF_HINTS_PATH} /lib /usr/lib ${PREFIX}/lib ${PREFIX}/lib/compat/pkg 2>/dev/null
+ #PATH="/sbin:/bin:/usr/sbin:/usr/bin:/usr/games:${PREFIX}/bin:${PREFIX}/sbin"
+ #export PATH
- echo "LDCONFIG=/sbin/ldconfig -f ${LD_ELF_HINTS_PATH}" >> ${__MAKE_CONF}
- LDCONFIG="/sbin/ldconfig -f ${LD_ELF_HINTS_PATH}"
- export LDCONFIG
+ FORCE_PKG_REGISTER="Y"
+ export FORCE_PKG_REGISTER
- LDCONFIG_DIRS="${PREFIX}/lib"
- export LDCONFIG_DIRS
+ #LDCONFIG_DIRS="${PREFIX}/lib"
+ #export LDCONFIG_DIRS
- LD_LIBRARY_PATH="${PREFIX}/lib"
- export LD_LIBRARY_PATH
+ #LD_LIBRARY_PATH="${PREFIX}/lib"
+ #export LD_LIBRARY_PATH
- echo "LDFLAGS+=-L${PREFIX}/lib" >> ${__MAKE_CONF}
- #echo "CFLAGS+=-Wl,-L${PREFIX}/lib/" >> ${__MAKE_CONF}
- #echo "CFLAGS+=-Wl,-rpath-link=${PREFIX}/lib/" >> ${__MAKE_CONF}
- #echo "CPPFLAGS+=-Wl,-L${PREFIX}/lib" >> ${__MAKE_CONF}
- #echo "CPPFLAGS+=-Wl,-rpath-link=${PREFIX}/lib" >> ${__MAKE_CONF}
- #echo "CXXFLAGS+=-Wl,-L${PREFIX}/lib" >> ${__MAKE_CONF}
- #echo "CXXFLAGS+=-Wl,-rpath-link=${PREFIX}/lib" >> ${__MAKE_CONF}
-
- # Set the DBDIRS
- PKG_DBDIR="${PREFIX}/.pkgdb" ; export PKG_DBDIR
- PORT_DBDIR="${PREFIX}/.portdb" ; export PORT_DBDIR
-
- # Enable forced pkg registration
- FORCE_PKG_REGISTER="Y" ; export FORCE_PKG_REGISTER
}
# Confirm we are running as root
@@ -3589,7 +3560,7 @@
# Begins the port make
start_pbi_makeport()
{
- cd ${PORTSDIR}/${PBI_MAKEPORT}
+ cd /usr/ports/${PBI_MAKEPORT}
make clean
make
make install
@@ -3608,21 +3579,21 @@
if [ "${PBI_PRUNEBUILDPORTS}" = "NO" ] ; then return ; fi
get_pkgname "${PORTSDIR}/${PBI_MAKEPORT}"
- echo "${PKGNAME}" >${PBI_PROGDIRPATH}/.keepports
+ echo "${PKGNAME}" >/.keepports
# Do the same for any OTHERPORTS
for port in ${PBI_MKPORTBEFORE}
do
if [ ! -d "${PORTSDIR}/${port}" ] ; then continue ; fi
get_pkgname "${PORTSDIR}/${port}"
- echo "${PKGNAME}" >>${PBI_PROGDIRPATH}/.keepports
+ echo "${PKGNAME}" >>/.keepports
done
for port in ${PBI_MKPORTAFTER}
do
if [ ! -d "${PORTSDIR}/${port}" ] ; then continue ; fi
get_pkgname "${PORTSDIR}/${port}"
- echo "${PKGNAME}" >>${PBI_PROGDIRPATH}/.keepports
+ echo "${PKGNAME}" >>/.keepports
done
# Now check what packages we have and prune those whom aren't needed
@@ -3630,12 +3601,14 @@
z="1"
do
FOUND=""
- for j in `pkg_info -I -a | cut -d ' ' -f 1`
+ for j in `pkg_info -I -a | cut -d " " -f 1`
do
- grep "${j}" "${PBI_PROGDIRPATH}/.keepports" >/dev/null 2>/dev/null
+ grep "${j}" "/.keepports" >/dev/null 2>/dev/null
if [ "$?" != "0" ] ; then
- check_remove_port "${j}"
- if [ "$?" = "0" ] ; then
+ pkg_info -R "${j}" | grep "Required" >/dev/null 2>/dev/null
+ if [ "$?" != "0" ] ; then
+ echo "Removing non-required port: ${j}"
+ pkg_delete ${j}
FOUND="1"
break
fi
@@ -3645,7 +3618,6 @@
# All done pruning ports
if [ -z "$FOUND" ] ; then break ; fi
done
- #rm ${PBI_PROGDIRPATH}/.keepports
}
# Get the full package-name for a target port
@@ -3654,17 +3626,6 @@
PKGNAME="${name}"
}
-# Check if the specified port doesn't have anything which requires it, and remove it if so
-check_remove_port() {
- pkg_info -R "${1}" | grep "Required" >/dev/null 2>/dev/null
- if [ "$?" != "0" ] ; then
- echo "Removing non-required port: ${1}"
- pkg_delete ${1}
- return 0
- fi
- return 1
-}
-
# Make any additional required ports
start_pbi_mkportbefore()
{
@@ -3672,10 +3633,10 @@
for port in ${PBI_MKPORTBEFORE}
do
- if [ ! -d "${PORTSDIR}/${port}" ] ; then
- exit_err "${PORTSDIR}/${port} does not exist!"
+ if [ ! -d "/usr/ports/${port}" ] ; then
+ exit_err "/usr/ports/${port} does not exist!"
fi
- cd ${PORTSDIR}/${port}
+ cd /usr/ports/${port}
make clean
make
make install
@@ -3687,6 +3648,7 @@
exit_err "make install of ${port} failed!"
fi
done
+
}
# Make any additional required ports
@@ -3696,10 +3658,10 @@
for port in ${PBI_MKPORTAFTER}
do
- if [ ! -d "${PORTSDIR}/${port}" ] ; then
- exit_err "${PORTSDIR}/${port} does not exist!"
+ if [ ! -d "/usr/ports/${port}" ] ; then
+ exit_err "/usr/ports/${port} does not exist!"
fi
- cd ${PORTSDIR}/${port}
+ cd /usr/ports/${port}
make clean
make
make install
@@ -3711,6 +3673,7 @@
exit_err "make install of ${port} failed!"
fi
done
+
}
# Start pbi_update processing
@@ -4654,30 +4617,45 @@
parse_make_pbi_cmdline "$@"
-
- do_pbi_make
+ do_pbi_make "$@"
}
-# Clean the WRKDIRPREFIX
-clean_wrkdirprefix() {
- if [ -z "${WRKDIRPREFIX}" ] ; then return 0; fi
- if [ ! -d "${WRKDIRPREFIX}" ] ; then return 0; fi
- rm -rf "${WRKDIRPREFIX}"
-}
-
do_pbi_make() {
+ # Load the PBI settings
+ get_pbi_progversion
+ get_pbi_progname
+ get_pbi_progdir
+
+ # Check if this is being called from within chroot or outside
+ if [ "`basename $0`" = "pbi_makeport" ] ; then
+ # Extract the chroot
+ chroot_extract
+
+ # Now re-run pbi_makeport in chroot environment
+ chroot "${PBI_CHROOTDIR}" "/usr/local/sbin/pbi_makeport_chroot" "$@"
+ _err=$?
+ if [ "$_err" = "0" ] ; then
+ mv ${PBI_CHROOTDIR}${PBI_CREATE_OUTDIR}/*.pbi ${PBI_CREATE_OUTDIR}/
+ mv ${PBI_CHROOTDIR}${PBI_CREATE_OUTDIR}/*.sha256 ${PBI_CREATE_OUTDIR}/
+ fi
+
+ # Lets cleanup the chroot environment
+ chroot_make_cleanup
+ rm_tmpdir
+
+ exit $_err
+ fi
+
+ if [ "`basename $0`" != "pbi_makeport_chroot" ] ; then return ; fi
+
+
# Check if we have some specific make options to use
load_pbi_conffile
# init tmpdir
init_tmpdir
- # Load the PBI settings
- get_pbi_progversion
- get_pbi_progname
- get_pbi_progdir
-
set_make_options
# See if we need to run a pre make script
@@ -4691,14 +4669,9 @@
# Prune any proto / build specific ports
start_pbi_prune_ports
- # Clean the WRKDIRPREFIX
- clean_wrkdirprefix
-
# See if we need to run a post make script
run_pbi_postportmake
- if [ ! -z "$OLDPATH}" ] ; then PATH=${OLDPATH} ; export PATH ; fi
-
# Auto-generate a external_links directive from plist info
mk_auto_ext_linksfile
@@ -4714,11 +4687,144 @@
exit 0
}
+# Clean the chroot environment
+chroot_make_cleanup() {
+ if [ -z "${PBI_CHROOTDIR}" ] ; then return ; fi
+ if [ ! -d "${PBI_CHROOTDIR}" ] ; then return ; fi
+ if [ "${PBI_CHROOTDIR}" = "/" ] ; then return ; fi
+
+ # Unmount /dev if mounted
+ umount ${PBI_CHROOTDIR}/dev >/dev/null 2>/dev/null
+ umount ${PBI_CHROOTDIR}/usr/ports/distfiles >/dev/null 2>/dev/null
+ rm -rf "${PBI_CHROOTDIR}" >/dev/null 2>/dev/null
+ chflags -R noschg ${PBI_CHROOTDIR} >/dev/null 2>/dev/null
+ rm -rf "${PBI_CHROOTDIR}" >/dev/null 2>/dev/null
+}
+
+# Function which extracts the clean chroot environment for the PBI
+chroot_extract() {
+
+ # If no chroot file exists, make it first
+ if [ ! -e "${PBI_CHROOTFILE}" ] ; then mk_chroot_file ; fi
+
+ PBI_CHROOTDIR="${PBI_PROGDIRPATH}.chroot"
+ export PBI_CHROOTDIR
+ mkdir -p "${PBI_CHROOTDIR}"
+ echo "Extracting chroot environment..."
+ tar xvf ${PBI_CHROOTFILE} -C "${PBI_CHROOTDIR}" >/dev/null 2>/dev/null
+ if [ "$?" != "0" ] ; then
+ exit_err "Failed extracting chroot environment!"
+ fi
+
+ echo "Copying ${PORTSDIR} -> ${PBI_CHROOTDIR}/usr/ports"
+ cp /etc/resolv.conf ${PBI_CHROOTDIR}/etc/resolv.conf
+ mkdir -p ${PBI_CHROOTDIR}/usr/ports
+ tar cvf - -C "${PORTSDIR}" --exclude ./distfiles . 2>/dev/null | tar xvf - -C "${PBI_CHROOTDIR}/usr/ports" 2>/dev/null
+ mkdir -p ${PBI_CHROOTDIR}/usr/ports/distfiles
+ if [ ! -d "${PORTSDIR}/usr/ports/distfiles" ] ; then
+ mkdir -p ${PORTSDIR}/usr/ports/distfiles
+ fi
+ mount_nullfs ${PORTSDIR}/usr/ports/distfiles ${PBI_CHROOTDIR}/usr/ports/distfiles
+
+ # Now copy over the pbi_* scripts
+ mkdir ${PBI_CHROOTDIR}/usr/local/sbin
+ cp /usr/local/sbin/pbi_* ${PBI_CHROOTDIR}/usr/local/sbin
+ cp ${PBI_CHROOTDIR}/usr/local/sbin/pbi_makeport ${PBI_CHROOTDIR}/usr/local/sbin/pbi_makeport_chroot
+ chmod 755 ${PBI_CHROOTDIR}/usr/local/sbin/pbi_*
+
+ mkdir -p ${PBI_CHROOTDIR}/var/db
+ cp -r ${PBI_DBDIR} ${PBI_CHROOTDIR}{PBI_DBDIR}
+
+ # Copy over the confdir as well
+ if [ ! -z "${PBI_CONFDIR}" ] ; then
+ local _cDir=`dirname "${PBI_CONFDIR}"`
+ mkdir -p "${PBI_CHROOTDIR}${_cDir}"
+ cp -r "${PBI_CONFDIR}" "${PBI_CHROOTDIR}${PBI_CONFDIR}"
+ fi
+
+ # Copy over the ssl priv key if used
+ if [ ! -z "$PBI_SSLPRIVKEY" ] ; then
+ local _sDir=`dirname "${PBI_SSLPRIVKEY}"`
+ mkdir -p "${PBI_CHROOTDIR}${_sDir}"
+ cp "${PBI_SSLPRIVKEY}" "${PBI_CHROOTDIR}${PBI_SSLPRIVKEY}"
+ fi
+
+ # Start devfs in the chroot
+ mount -t devfs devfs ${PBI_CHROOTDIR}/dev
+
+ # Make sure the outgoing dir exists
+ mkdir -p ${PBI_CHROOTDIR}${PBI_CREATE_OUTDIR} >/dev/null 2>/dev/null
+}
+
+# No chroot environment tar file exists yet, lets build one
+mk_chroot_file() {
+ # Make sure SVN is installed
+ which svn >/dev/null 2>/dev/null
+ if [ "$?" != "0" ] ; then
+ exit_err "Subversion is required to rebuild the chroot environment!"
+ fi
+
+ echo "Building the PBI chroot environment... This may take a while..."
+ PBI_BUILDSRC="${PBI_APPDIR}/.tmpSRC.$$"
+ PBI_BUILDTARGET="${PBI_APPDIR}/.worldTarget.$$"
+ PBI_BUILDLOG="${PBI_APPDIR}/.buildWorldLog"
+ echo "" > ${PBI_BUILDLOG}
+ mkdir -p "${PBI_BUILDSRC}"
+ mkdir -p "${PBI_BUILDTARGET}"
+
+ # Figure out which version of FreeBSD to checkout
+ local _osRel=`uname -r`
+ echo $_osRel | grep "CURRENT" >/dev/null 2>/dev/null
+ if [ "$?" = "0" ] ; then
+ local svnUrl="svn://svn.freebsd.org/base/head"
+ else
+ local _osMajor=`echo $_osRel | cut -c 1-1`
+ local svnUrl="svn://svn.freebsd.org/base/releng/${_osMajor}.0"
+ fi
+
+ echo "Checking out FreeBSD sources from $svnUrl"
+ svn co ${svnUrl} ${PBI_BUILDSRC} >>${PBI_BUILDLOG} 2>>${PBI_BUILDLOG}
+ if [ "$?" != "0" ] ; then
+ rm -rf "${PBI_BUILDSRC}"
+ rm -rf "${PBI_BUILDTARGET}"
+ exit_err "Subversion checkout failed! Logfile saved: ${PBI_BUILDLOG}"
+ fi
+
+ echo "Running buildworld / installworld"
+ cd ${PBI_BUILDSRC}
+ make buildworld installworld distribution DESTDIR=${PBI_BUILDTARGET} >>${PBI_BUILDLOG} 2>>${PBI_BUILDLOG}
+ if [ "$?" != "0" ] ; then
+ cd
+ rm -rf "${PBI_BUILDSRC}"
+ rm -rf "${PBI_BUILDTARGET}"
+ exit_err "Buildworld failed! Logfile saved: ${PBI_BUILDLOG}"
+ fi
+
+ cp -R ${PBI_BUILDSRC} ${PBI_BUILDTARGET}/usr/src
+
+ echo "Creating chroot environment tarball"
+ tar cvjf ${PBI_CHROOTFILE} -C ${PBI_BUILDTARGET} . >>${PBI_BUILDLOG} 2>>${PBI_BUILDLOG}
+ if [ "$?" != "0" ] ; then
+ cd
+ rm -rf "${PBI_BUILDSRC}"
+ rm -rf "${PBI_BUILDTARGET}"
+ rm -rf "${PBI_CHROOTFILE}"
+ exit_err "Making chroot environment tarball failed! Logfile saved: ${PBI_BUILDLOG}"
+ fi
+
+ # Cleanup after ourselves
+ chflags -R noschg "${PBI_BUILDTARGET}" >/dev/null 2>/dev/null
+ rm -rf "${PBI_BUILDSRC}" >/dev/null 2>/dev/null
+ rm -rf "${PBI_BUILDTARGET}" >/dev/null 2>/dev/null
+ rm ${PBI_BUILDLOG}
+}
+
# Read the target ports plist, and generate a external_links config based upon it
mk_auto_ext_linksfile() {
# Get ports name
get_pkgname "${PORTSDIR}/${PBI_MAKEPORT}"
_pname="${PKGNAME}"
+
pkg_info -L ${_pname} | sed "s|^${PBI_PROGDIRPATH}/||g" \
| grep -v "^Information for" \
| grep -v "^Files:" \
@@ -4899,6 +5005,7 @@
pbi_info) pbi_info_init "$@" ;;
pbi_listrepo) pbi_listrepo_init "$@" ;;
pbi_makeport) pbi_make_init "$@" ;;
+ pbi_makeport_chroot) pbi_make_init "$@" ;;
pbi_makepatch) pbi_makepatch_init "$@" ;;
pbi_makerepo) pbi_makerepo_init "$@" ;;
pbi_patch) pbi_patch_init "$@" ;;
More information about the Commits
mailing list