# # Global config file for buildpkg # # This file is designed to be sourced by pr. package buildscripts # # Variables that *must* be overridden pr. package # They are used to construct paths and more so they # must have sane values # topdir= The toplevel dir name under $buildpkgbase # It is also used pr. default in the pkgname # and it is also used pr. default as the toplevel name inside the sourcetar ($topsrcdir) # version= source version ie. 0.14.2b # pkgver= the package revision, an increasing number is recommended but a date could be used instead # source[0..x] = source filenames - source[0] *must* be defined and contain a legal filename # pr. default we will look for source[0] relative to $srcfiles # A filename that begin with / will be treated as absolute paths # Note! only source[0] will be automatically unpacked # patch[0..x] = patch filenames - patch[0] must be defined but *can* be empty # pr. default we expect these to be listed relative to $srcdir # filenames that begin with / will be treated as absolute paths # All patching will be done from *within* $srcdir/$topsrcdir directory with patch -p1 # patches must be in uncompressed format # Define tool programs PKGMK=/usr/bin/pkgmk PKGTRANS=/usr/bin/pkgtrans STRIP=/usr/ccs/bin/strip UNAME=/usr/bin/uname TAR=/usr/local/bin/tar # GNU tar please! BZIP2=/usr/bin/bzip2 GZIP=/usr/bin/gzip PATCH=/usr/local/bin/patch # GNU patch 2.5 or better please! RM=/usr/bin/rm MKDIR=/usr/bin/mkdir MAKE_PROG=/usr/local/bin/make # GNU make please! FIND=/usr/bin/find XARGS=/usr/bin/xargs # Define defaults buildpkgbase=${HOME}/buildpkg stagedir=$buildpkgbase/$topdir/build srcdir=$buildpkgbase/$topdir/src metadir=$buildpkgbase/$topdir/meta topsrcdir=$topdir-$version # it may be necessary to override this srcfiles=$buildpkgbase/srcfiles # defaults used for prepping the source topinstalldir=/usr/local prefix=$topinstalldir pkgname=SB$topdir cpu=sparcv9 os=sol`$UNAME -s` pkgdirdesig=${topinstalldir##/*/} # topinstalldir suffix # Distfiles should be named like this # ---sb--- # ie: libmad-0.14.2b-1.sb-sol5.8-sparcv9-local distfile=$topdir-$version-$pkgver.sb-$os-$cpu-$pkgdirdesig # Define error codes and texts E_MISSING_STAGEDIR=30 E_BAD_FILE=32 E_PATCH_FAILED=33 E_BAD_DIR=34 E_BAD_UNPACK=35 E_BAD_COMPRESS=36 E_BAD_CONFIG=37 E_BAD_MAKE=38 E_BAD_CLEANOPTIONS=39 E_BAD_STRIP=40 error_txt[$E_BAD_FILE]="File not found" error_txt[$E_PATCH_FAILED]="Patch failed" error_txt[$E_BAD_DIR]="Directory not found" error_txt[$E_BAD_UNPACK]="Unable to decompress sourcearchive" error_txt[$E_BAD_COMPRESS]="Unknown compression method" #error_txt[$E_BAD_CONFIG]="configure failed" #error_txt[$E_BAD_MAKE]="make failed" # # Helper functions # # # error(): exit with errorcode and possibly a message # params: $1 = errorcode $2 = name of caller error() { if [ -n "${error_txt[$1]}" ]; then echo "$2: ${error_txt[$1]}" fi exit $1 } # setdir(): switch tsetdir "$srcdir"o a directory, but check destination first # params: $1=dir to cd to # Switches to the directory in $1 but first checks if the destination exists setdir() { echo "Switching to $1" if [ -z "$1" ]; then error $E_BAD_DIR setdir fi if [ -d "$1" ]; then cd "$1" else error $E_BAD_DIR setdir fi } # # patch(): patch unpacked source # params: $1 = patch number (arrayindex) $2 = patch params (defaults to -p1) # It will verify the existence of the patch file passed to it and # exit gracefully if it cannot be found. # An empty $2 argument will be treated as undefined and mapped to -p1 patch() { local pnum=$1 local p2=$2 local pparam=${p2:-"-p1"} setdir $srcdir/$topsrcdir if [ ! -z ${patch[$pnum]} ]; then # They didn't give us an empty string if [ "${patch[$pnum]:0:1}" != "/" ]; then # We have a relative pathname # expand to absolute patch[$pnum]=$srcdir/${patch[$pnum]} fi # We are now sure that $patch[$pnum] contains file with absolute path echo "Processing patch[$pnum] - ${patch[$pnum]}" if [ -r ${patch[$pnum]} ]; then # file is readable $PATCH -Es $2 < ${patch[$pnum]} if [ $? -ne 0 ]; then error $E_PATCH_FAILED patch fi else error $E_BAD_FILE patch fi else echo "Patch $pnum has empty filename" fi } # unpack(): Unpack source # params: $1 = source number (arrayindex) # It will detect filetype and unpack # .tar, .tgz, .gz, .bz2 and .Z supported unpack() { local snum=$1 setdir $srcdir if [ "${source[$snum]:0:1}" != "/" ]; then # We have a relative pathname # expand to absolute source[$snum]=$srcfiles/${source[$snum]} fi # We are now sure that ${source[$snum]} contains file with absolute path echo "Unpacking ${source[$snum]}" if [ -r ${source[$snum]} ]; then # file is readable local absfilename=${source[$snum]} local filename=${absfilename##/*/} # Strip down to the filename local suffix=${filename##*.} # Strip down to filename suffix (strip down to the last .) # Determine filetype and unpack case $suffix in 'tar') $TAR -xf ${source[$snum]};; 'gz') $GZIP -dc ${source[$snum]} | $TAR -xf -;; 'bz2') $BZIP2 -dc ${source[$snum]} | $TAR -xf -;; 'Z') $GZIP -dc ${source[$snum]} | $TAR -xf -;; 'tgz') $GZIP -dc ${source[$snum]} | $TAR -xf -;; *) error $E_BAD_COMPRESS unpack esac if [ $? -ne 0 ]; then error $E_BAD_UNPACK unpack fi else error $E_BAD_FILE unpack fi } # clean(): Scrub build environment # params: $1=stage|source clean() { case $1 in 'source') if [ -d "$srcdir/$topsrcdir" ]; then $RM -rf $srcdir/$topsrcdir else echo "No unpacked source to scrub" fi ;; 'stage') if [ -d $stagedir -a "$stagedir" != "/" ]; then $RM -rf $stagedir # This is very dangerous! $MKDIR $stagedir else error $E_BAD_DIR clean fi ;; *) error $E_BAD_CLEANOPTION clean esac } # strip(): strip binaries in stagedir # params: none # Automatically switches to $stagedir # On exit cwd is $stagedir strip() { setdir "$stagedir" $FIND . -type f -perm -700 | $XARGS $STRIP if [ $? -ne 0 ]; then error $E_BAD_STRIP strip fi } # # Define generic functions for different build stages # # generic_prep(): Unpack source and apply any patches # params: none generic_prep() { clean source unpack 0 # Patching local numpatch=${#patch[@]} local i=0 # Argh! - The C-style for loop doesn't work in bash-2.0.3 as distributed # with Solaris 8 :( (it works just fine on Redhat Linux 7.3, bash 2.0.5a) # for ((i=0; i < numpatch; i++)) # do # patch $i -p1 # done while [ $i -lt $numpatch ] do patch $i -p1 let i=i+1 done } # generic_build(): Take the necessary steps to build already prepared source # params: none generic_build() { setdir "$srcdir/$topsrcdir" ./configure --prefix=$prefix if [ $? -ne 0 ]; then error $E_BAD_CONFIG generic_build fi $MAKE_PROG if [ $? -ne 0 ]; then error $E_BAD_MAKE generic_build fi } # generic_install(): Install already built source generic_install() { clean stage setdir "$srcdir/$topsrcdir" $MAKE_PROG DESTDIR=$stagedir install if [ $? -ne 0 ]; then error $E_BAD_MAKE generic_install fi strip } # generic_pack(): Build package using files from 'install' stage generic_pack() { echo }