#!/bin/sh # $NetBSD: build,v 1.17 2001/11/08 02:52:25 jmc Exp $ # # Copyright (c) 1999, 2000 Hubert Feyrer # All rights reserved. # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions # are met: # 1. Redistributions of source code must retain the above copyright # notice, this list of conditions and the following disclaimer. # 2. Redistributions in binary form must reproduce the above copyright # notice, this list of conditions and the following disclaimer in the # documentation and/or other materials provided with the distribution. # 3. All advertising materials mentioning features or use of this software # must display the following acknowledgement: # This product includes software developed by Hubert Feyrer for # the NetBSD Project. # # THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR # IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES # OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. # IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, # INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT # NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, # DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY # THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF # THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. # # # Do builk build # # Set ressource limits as high as possible ulimit -S -s `ulimit -H -s` ulimit -S -d `ulimit -H -d` echo Bulk build started: `date` echo "" # Pull in ADMIN etc.: if [ -f "$BULK_BUILD_CONF" ]; then . $BULK_BUILD_CONF else conf=`dirname $0`/build.conf if [ -f "$conf" ]; then . $conf else echo "$0: Cannot find config file $conf, aborting." exit 1 fi fi if [ "$http_proxy" != "" ]; then echo "Using HTTP proxy $http_proxy" export http_proxy fi if [ "$ftp_proxy" != "" ]; then echo "Using FTP proxy $ftp_proxy" export ftp_proxy fi echo "" unset DISPLAY # allow sane failure for gimp, xlispstat cd ${USR_PKGSRC} if [ "$1" = "restart" ]; then echo Restarting - skipping pre-build script else sh mk/bulk/pre-build # make veryveryclean :) fi fail=no if [ -d pkgtools/pkglint ]; then cd pkgtools/pkglint DEPENDSTREEFILE=`make show-var VARNAME=DEPENDSTREEFILE` || fail=yes DEPENDSFILE=`make show-var VARNAME=DEPENDSFILE` || fail=yes SUPPORTSFILE=`make show-var VARNAME=SUPPORTSFILE` || fail=yes INDEXFILE=`make show-var VARNAME=INDEXFILE` || fail=yes ORDERFILE=`make show-var VARNAME=ORDERFILE` || fail=yes BROKENFILE=`make show-var VARNAME=BROKENFILE` || fail=yes BUILDLOG=`make show-var VARNAME=BUILDLOG` || fail=yes else echo "The pkgtools/pkglint directory does not exist. Please update" echo "your pkgsrc tree in ${USR_PKGSRC}" exit 1 fi echo "----------------------------------" echo "| Build Temporary Files: |" echo "----------------------------------" echo "DEPENDSTREEFILE = $DEPENDSTREEFILE" echo "DEPENDSFILE = $DEPENDSFILE" echo "SUPPORTSFILE = $SUPPORTSFILE" echo "INDEXFILE = $INDEXFILE" echo "ORDERFILE = $ORDERFILE" echo "BROKENFILE = $BROKENFILE" echo "BUILDLOG = $BUILDLOG" echo "----------------------------------" # make sure we have values for these very important # variables if [ $fail = "yes" -o \ -z "$DEPENDSTREEFILE" -o \ -z "$DEPENDSFILE" -o \ -z "$SUPPORTSFILE" -o \ -z "$INDEXFILE" -o \ -z "$ORDERFILE" -o \ -z "$BROKENFILE" -o \ -z "$BUILDLOG" \ ]; then echo "ERROR: build failed to extract certain key variables." echo " please examine the above list and correct the" echo " problem." exit 1 fi cd ${USR_PKGSRC} # get the list of packages which should always be installed during the build cd ${USR_PKGSRC}/pkgtools/pkglint BULK_PREREQ=`make show-var VARNAME=BULK_PREREQ` cd ${USR_PKGSRC} # install prerequisite packages. Note: we do this _before_ the depends tree # because some packages like xpkgwedge only become DEPENDS if its installed echo "Installing prerequisite packages specified with BULK_PREREQ..." for pkgdir in $BULK_PREREQ do echo $pkgdir # make sure its installed _and_ packaged cd ${USR_PKGSRC}/$pkgdir && make bulk-install done # Figure out optimal build order. cd ${USR_PKGSRC} if [ "$1" != "restart" ]; then echo "Building dependency tree (this may take a while)..." sh mk/bulk/printdepends $BROKENFILE > $DEPENDSTREEFILE echo "Sorting build order..." tsort $DEPENDSTREEFILE > $ORDERFILE echo "Generating up and down dependency files..." ./mk/bulk/tflat -u $DEPENDSTREEFILE > $SUPPORTSFILE ./mk/bulk/tflat -d $DEPENDSTREEFILE > $DEPENDSFILE echo "Generating package name <=> package directory cross reference file (this may take a while)..." sh mk/bulk/printindex $BROKENFILE > $INDEXFILE fi echo "Starting actual build using the order specified in $ORDERFILE..." cd ${USR_PKGSRC} # make sure we have something to grep in in the build loop touch $BUILDLOG # Loop over every package in the correct order. Before building # each one, check to see if we've already processed this package # before. This could happen if the build got interrupted and we # started it again with the 'restart' option. This prevents us # from having to do a potentially very large number of make's to # get back to where we let off. After we build each package, add # it to the top level buildlog # (usually '.make' or '.make.${MACHINE}'). As a side benefit, this # can make a progress-meter very simple to add! tot=`wc -l $ORDERFILE | awk '{print $1}'` for pkgdir in `cat $ORDERFILE` do if ! grep -q "^${pkgdir}\$" $BUILDLOG ; then built=`wc -l $BUILDLOG | awk '{print $1}'` percent=`echo $built $tot | awk '{printf("%4.1f%%",$1*100/$2);}'` (cd $pkgdir && nice -n 20 make USE_BULK_CACHE=yes bulk-package | sed "s;^;`date '+%m/%d/%y %H:%M:%S'` $built/${tot}=$percent $pkgdir @ `uname -p`> ;g") echo "$pkgdir" >> $BUILDLOG fi done echo "Build finished. Removing all installed packages left over from build..." for pkgname in `pkg_info -e \*` do if `pkg_info -qe $pkgname`; then pkgdir=`grep " $pkgname " $INDEXFILE | awk '{print $1}'` case "${BULK_PREREQ}" in *$pkgdir* ) echo "Keeping BULK_PREREQ: $pkgname ($pkgdir)" ; ;; * ) echo pkg_delete -r $pkgname pkg_delete -r $pkgname if `pkg_info -qe $pkgname` ; then echo "$pkgname ($pkgdir) did not deinstall nicely. Forcing the deinstall" pkg_delete -f $pkgname || true fi ;; esac fi done echo "Post processing bulk build results..." #rm $DEPENDSTREEFILE $DEPENDSFILE $SUPPORTSFILE $INDEXFILE $ORDERFILE # Perl was wiped, reinstall it! ( cd lang/perl5 && make bulk-install ) perl mk/bulk/post-build | mail -s "pkgsrc/`uname -p` bulk build results `date +%F`" $ADMIN # Done! echo "" echo Bulk build ended: `date`