diff -r 71503088f51b -r f880f219c566 openpkg/stack.sh --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/openpkg/stack.sh Tue Jul 31 12:23:42 2012 +0200 @@ -0,0 +1,967 @@ +## +## OpenPKG Software Stack Generation +## Copyright (c) 2010-2012 OpenPKG GmbH +## +## This software is property of the OpenPKG GmbH, DE MUC HRB 160208. +## All rights reserved. Licenses which grant limited permission to use, +## copy, modify and distribute this software are available from the +## OpenPKG GmbH. +## +## THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESSED 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 AUTHORS AND COPYRIGHT HOLDERS AND THEIR +## CONTRIBUTORS 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. +## + +# configuration +openpkg="${OPENPKG_PREFIX}/bin/openpkg" +curl="${OPENPKG_PREFIX}/bin/openpkg curl" +shtool="${OPENPKG_PREFIX}/lib/openpkg/shtool" + +## +## COMMAND LINE PARSING +## + +str_usage="[-h|--help] [-v|--verbose ] [-o|--output ] [-D|--define = ...] [-u|--unversioned] [-q|--query] .stk" +arg_spec="1=" +opt_spec="h.v:o:D+u.q." +opt_alias="h:help,v:verbose,o:output,D:define,u:unversioned,q:query" +opt_h=no +opt_v=4 +opt_o="." +opt_D="" +opt_u=no +opt_q=no + +# parse argument specification string +eval `echo $arg_spec |\ + sed -e 's/^\([0-9]*\)\([+=]\)/arg_NUMS=\1; arg_MODE=\2/'` + +# parse option specification string +eval `echo $opt_spec |\ + sed -e 's/\([a-zA-Z0-9]\)\([.:+]\)/opt_MODE_\1=\2;/g'` + +# parse option alias string +eval `echo $opt_alias |\ + sed -e 's/-/_/g' -e 's/\([a-zA-Z0-9]\):\([^,]*\),*/opt_ALIAS_\2=\1;/g'` + +# interate over argument line +opt_PREV='' +while [ $# -gt 0 ]; do + # special option stops processing + if [ ".$1" = ".--" ]; then + shift + break + fi + + # determine option and argument + opt_ARG_OK=no + if [ ".$opt_PREV" != . ]; then + # merge previous seen option with argument + opt_OPT="$opt_PREV" + opt_ARG="$1" + opt_ARG_OK=yes + opt_PREV='' + else + # split argument into option and argument + case "$1" in + --[a-zA-Z0-9]*=*) + eval `echo "x$1" |\ + sed -e 's/^x--\([a-zA-Z0-9-]*\)=\(.*\)$/opt_OPT="\1";opt_ARG="\2"/'` + opt_STR=`echo $opt_OPT | sed -e 's/-/_/g'` + eval "opt_OPT=\${opt_ALIAS_${opt_STR}-${opt_OPT}}" + ;; + --[a-zA-Z0-9]*) + opt_OPT=`echo "x$1" | cut -c4-` + opt_STR=`echo $opt_OPT | sed -e 's/-/_/g'` + eval "opt_OPT=\${opt_ALIAS_${opt_STR}-${opt_OPT}}" + opt_ARG='' + ;; + -[a-zA-Z0-9]*) + eval `echo "x$1" |\ + sed -e 's/^x-\([a-zA-Z0-9]\)/opt_OPT="\1";/' \ + -e 's/";\(.*\)$/"; opt_ARG="\1"/'` + ;; + -[a-zA-Z0-9]) + opt_OPT=`echo "x$1" | cut -c3-` + opt_ARG='' + ;; + *) + break + ;; + esac + fi + + # eat up option + shift + + # determine whether option needs an argument + eval "opt_MODE=\$opt_MODE_${opt_OPT}" + if [ ".$opt_ARG" = . ] && [ ".$opt_ARG_OK" != .yes ]; then + if [ ".$opt_MODE" = ".:" ] || [ ".$opt_MODE" = ".+" ]; then + opt_PREV="$opt_OPT" + continue + fi + fi + + # process option + case $opt_MODE in + '.' ) + # boolean option + eval "opt_${opt_OPT}=yes" + ;; + ':' ) + # option with argument (multiple occurances override) + eval "opt_${opt_OPT}=\"\$opt_ARG\"" + ;; + '+' ) + # option with argument (multiple occurances append) + eval "opt_${opt_OPT}=\"\$opt_${opt_OPT} \$opt_ARG\"" + ;; + * ) + echo "$0: ERROR: unknown option: \`$opt_OPT'" 1>&2 + exit 1 + ;; + esac +done +if [ ".$opt_PREV" != . ]; then + echo "$0: ERROR: missing argument to option \`$opt_PREV'" 1>&2 + exit 1 +fi + +# process help option +if [ ".$opt_h" = .yes ]; then + echo "Usage: $0 $str_usage" + exit 0 +fi + +# complain about incorrect number of arguments +case $arg_MODE in + '=' ) + if [ $# -ne $arg_NUMS ]; then + echo "$0: ERROR: invalid number of arguments (exactly $arg_NUMS expected)" 1>&2 + exit 1 + fi + ;; + '+' ) + if [ $# -lt $arg_NUMS ]; then + echo "$0: ERROR: invalid number of arguments (at least $arg_NUMS expected)" 1>&2 + exit 1 + fi + ;; +esac + +## +## HELPER FUNCTIONS +## + +# helper function for graceful termination +die () { + echo "$0: ERROR: $*" + exit 1 +} + +# helper function for verbose messages +verbose () { + lvl="$1" + msg="$2" + if [ $opt_v -ge $lvl ]; then + case "$lvl" in + 1 ) str_prefix="**" ;; + 2 ) str_prefix="++" ;; + 3 ) str_prefix="--" ;; + 4 ) str_prefix=".." ;; + esac + echo "${str_prefix} ${msg}" + fi +} + +# expand macros +macro_expand () { + stk="$1" + + # load all options and their default values + options="" + for option in `sed <$stk \ + -e "1,/^%options/d" -e '/^%/,$d' \ + -e 's/#.*$//' -e 's/^ *//' -e 's/ *$//' -e '/^ *$/d' \ + -e 's; *[^ ]*$;;'`; do + options="$options $option" + done + eval `sed <$stk \ + -e "1,/^%options/d" -e '/^%/,$d' \ + -e 's/#.*$//' -e 's/^ *//' -e '/^ *$/d' \ + -e 's:^\([^ ]*\) *\([^ ]*\)$:option_\1="\2";:'` + + # override options with defined values + for define in $opt_D; do + name=`echo "$define" | sed -e 's;=.*$;;'` + value=`echo "$define" | sed -e 's;^.*=;;'` + eval "exists=\"\${option_${name}}\"" + if [ ".$exists" = . ]; then + die "definition of not-existing option \"$name\"" + fi + eval "option_${name}=\"${value}\"" + done + + # expand macros + cmd="sed" + for name in $options; do + eval "value=\"\${option_${name}}\"" + cmd="$cmd -e 's;%{[?]$name:\\([^}]*\\)};\1;g'" + cmd="$cmd -e 's;%{![?]$name:\\([^}]*\\)};;g'" + cmd="$cmd -e 's;%{$name};$value;g'" + done + cmd="$cmd -e 's;%{[?][^:}]*:[^}]*};;g'" + cmd="$cmd -e 's;%{![?][^:}]*:\([^}]*\)};\1;g'" + eval "$cmd" +} + +# extract macro-expanded header +header () { + stk="$1" + hdr="$2" + exists=`egrep "^${hdr}" $stk` + if [ ".$exists" != . ]; then + egrep "^${hdr}:" $stk | \ + sed -e 's;^[^:]*: *;;' -e 's/#.*$//' -e 's/^ *//' -e 's/ *$//' -e '/^ *$/d' | \ + macro_expand "$stk" + fi +} + +# extract macro-expanded section +section () { + stk="$1" + sec="$2" + exists=`egrep "^%${sec}" $stk` + if [ ".$exists" != . ]; then + sed <$stk \ + -e "1,/^%${sec}/d" -e '/^%/,$d' \ + -e 's/#.*$//' -e 's/^ *//' -e 's/ *$//' -e '/^ *$/d' | \ + macro_expand "$stk" + fi +} + +## +## MAIN +## + +# determine stack file +stk="$1" +shift + +# support stand-alone query operation +if [ ".$opt_q" = .yes ]; then + name=`header "$stk" "Name"` + summary=`header "$stk" "Summary"` + packager=`header "$stk" "Packager"` + version=`header "$stk" "Version"` + release=`header "$stk" "Release"` + echo "name=\"$name\";" + echo "summary=\"$summary\";" + echo "packager=\"$packager\";" + echo "version=\"$version\";" + echo "release=\"$release\";" + sed <$stk \ + -e "1,/^%options/d" -e '/^%/,$d' \ + -e 's/#.*$//' -e 's/^ *//' -e '/^ *$/d' \ + -e 's:^\([^ ]*\) *\([^ ]*\)$:\1="\2";:' + exit 0 +fi + +# determine temporary directory +tmpdir="${TMPDIR-/tmp}" + +# provide verbose header +verbose 1 "OpenPKG Software Stack Generation" + +# determine information +verbose 2 "determining software stack information" +name=`header "$stk" "Name"` +summary=`header "$stk" "Summary"` +packager=`header "$stk" "Packager"` +version=`header "$stk" "Version"` +release=`header "$stk" "Release"` +verbose 3 "Name: $name" +verbose 3 "Summary: $summary" +verbose 3 "Packager: $packager" +verbose 3 "Version: $version" +verbose 3 "Release: $release" +if [ ".$opt_u" = .yes ]; then + basename="$name" +else + basename="$name-$version-$release" +fi + +# determine URLs +verbose 2 "determining software stack packages" +repo=`section "$stk" "repository"` +verbose 3 "repository: [URL] $repo" +$openpkg build -r "$repo" -Z -u -K -B \ + `section "$stk" "packages"` | \ + egrep "openpkg curl" | \ + sed -e 's;^.* \([^ ]*\) || exit.*$;\1;' \ + -e '/\/openpkg-[0-9].*\.src\.rpm/{h;s/\.src\.rpm$/.src.sh/;p;x}' \ + >$tmpdir/url.txt + +# provide header +verbose 2 "assembling software stack sources" + +# download source packages +if [ ! -d "$opt_o/$basename.src.d" ]; then + verbose 3 "creating: [DIR] $opt_o/$basename.src.d" + $shtool mkdir -p -m 755 "$opt_o/$basename.src.d" +else + verbose 3 "reusing: [DIR] $opt_o/$basename.src.d" +fi +for url in `cat $tmpdir/url.txt`; do + url_file=`echo $url | sed -e 's;^.*/\([^/]*\)$;\1;'` + if [ ! -f "$opt_o/$basename.src.d/$url_file" ]; then + verbose 3 "downloading: [FILE] $opt_o/$basename.src.d/$url_file" + if [ $opt_v -ge 4 ]; then + $curl '-#' -L -k -o $opt_o/$basename.src.d/$url_file $url + else + $curl -s -L -k -o $opt_o/$basename.src.d/$url_file $url + fi + else + verbose 3 "reusing: [FILE] $opt_o/$basename.src.d/$url_file" + fi +done +for path in $opt_o/$basename.src.d/*.src.sh $opt_o/$basename.src.d/*.src.rpm; do + if [ ! -f "$path" ]; then + continue + fi + path_file=`echo $path | sed -e 's;^.*/\([^/]*\)$;\1;'` + found=no + for url in `cat $tmpdir/url.txt`; do + url_file=`echo $url | sed -e 's;^.*/\([^/]*\)$;\1;'` + if [ ".$url_file" = ".$path_file" ]; then + found=yes + break + fi + done + if [ ".$found" = .no ]; then + verbose 3 "removing: [FILE] $path" + rm -f "$path" + fi +done +rm -f $tmpdir/url.txt + +# generate XML/RDF index for SRPM packages +verbose 3 "generating: [FILE] $opt_o/$basename.src.d/00INDEX.rdf" +$openpkg index -r "OpenPKG/SRPM" \ + -o $opt_o/$basename.src.d/00INDEX.rdf \ + -i $opt_o/$basename.src.d + +# generate deployment utility +verbose 3 "generating: [FILE] $opt_o/$basename.sh"; \ +section "$stk" "framework" >$tmpdir/framework.txt +section "$stk" "prolog" >$tmpdir/prolog.txt +section "$stk" "epilog" >$tmpdir/epilog.txt +HAVE_PROLOG=no; if [ ".`cat $tmpdir/prolog.txt`" != . ]; then HAVE_PROLOG=yes; fi +HAVE_EPILOG=no; if [ ".`cat $tmpdir/epilog.txt`" != . ]; then HAVE_EPILOG=yes; fi +$openpkg build -r "$repo" -Z -u -K \ + `section "$stk" "packages"` | \ +grep -v "^#" | \ +grep -v "^echo" | \ +grep -v "^rm" | \ +egrep -v "^(if|fi)" | \ +grep -v "openpkg curl" | \ +grep -v "openpkg rpm -Uvh" | \ +sed -e 's;.*openpkg rpm ;;' \ + -e 's; || exit.*;;' \ + -e 's;--rebuild ;;' \ + -e 's;/.*/\([^/]*\.src\.rpm\);\1;' \ + -e 's;^\(.*\) \([^/]*\.src\.rpm\);\2 \1;' \ + -e "s;--define '\\([^ ]*\\) \\([^ ]*\\)';\\1=\\2;g" \ + -e 's;\.src\.rpm;;' \ + >$tmpdir/packages.txt +sed <$0 \ + -e '1,/^____/d' \ + -e "/^CFG_FRAMEWORK=\"/r $tmpdir/framework.txt" \ + -e "/^CFG_PACKAGES=\"/r $tmpdir/packages.txt" \ + -e "s;@HAVE_PROLOG@;$HAVE_PROLOG;" \ + -e "/%prolog/r $tmpdir/prolog.txt" \ + -e "s;@HAVE_EPILOG@;$HAVE_EPILOG;" \ + -e "/%epilog/r $tmpdir/epilog.txt" \ + -e "/^## SHTOOL ##/r $shtool" \ + -e "s;^\\(CFG_NAME=\"\\).*\\(\"\\);\\1$name\\2;" \ + -e "s;^\\(CFG_SUMMARY=\"\\).*\\(\"\\);\\1$summary\\2;" \ + -e "s;^\\(CFG_PACKAGER=\"\\).*\\(\"\\);\\1$packager\\2;" \ + -e "s;^\\(CFG_VERSION=\"\\).*\\(\"\\);\\1$version\\2;" \ + -e "s;^\\(CFG_RELEASE=\"\\).*\\(\"\\);\\1$release\\2;" \ + -e "s;^\\(CFG_UNVERSIONED=\"\\).*\\(\"\\);\\1$opt_u\\2;" \ + >$opt_o/$basename.sh + +# cleanup +rm -f $tmpdir/framework.txt +rm -f $tmpdir/packages.txt +rm -f $tmpdir/prolog.txt +rm -f $tmpdir/epilog.txt + +# exit gracefully +exit 0 + +## +## DEPLOYMENT SCRIPT +## + +______________________________________________________________________________ +#!/bin/sh +#![OpenPKG] +## +## OpenPKG Software Stack Deployment +## Copyright (c) 2010-2012 OpenPKG GmbH +## +## This software is property of the OpenPKG GmbH, DE MUC HRB 160208. +## All rights reserved. Licenses which grant limited permission to use, +## copy, modify and distribute this software are available from the +## OpenPKG GmbH. +## +## THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESSED 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 AUTHORS AND COPYRIGHT HOLDERS AND THEIR +## CONTRIBUTORS 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. +## + +## +## COMMAND LINE PARSING +## + +str_usage="[-h|--help] [-v|--verbose ] [-c|--cleanup ] [-D|--define = ...] [-s|--srcdir ] [-o|--outdir ] [-t|--tmpdir ] [-S ]" +arg_spec="0=" +opt_spec="h.v:c:D+s:o:t:S:" +opt_alias="h:help,v:verbose,c:cleanup,D:define,s:srcdir,o:outdir,t:tmpdir,S:sudo" +opt_h=no +opt_v=3 +opt_c=1 +opt_D="" +opt_s="" +opt_o="" +opt_t="${TMPDIR-/tmp}" +opt_S="" + +# parse argument specification string +eval `echo $arg_spec |\ + sed -e 's/^\([0-9]*\)\([+=]\)/arg_NUMS=\1; arg_MODE=\2/'` + +# parse option specification string +eval `echo $opt_spec |\ + sed -e 's/\([a-zA-Z0-9]\)\([.:+]\)/opt_MODE_\1=\2;/g'` + +# parse option alias string +eval `echo $opt_alias |\ + sed -e 's/-/_/g' -e 's/\([a-zA-Z0-9]\):\([^,]*\),*/opt_ALIAS_\2=\1;/g'` + +# interate over argument line +opt_PREV='' +while [ $# -gt 0 ]; do + # special option stops processing + if [ ".$1" = ".--" ]; then + shift + break + fi + + # determine option and argument + opt_ARG_OK=no + if [ ".$opt_PREV" != . ]; then + # merge previous seen option with argument + opt_OPT="$opt_PREV" + opt_ARG="$1" + opt_ARG_OK=yes + opt_PREV='' + else + # split argument into option and argument + case "$1" in + --[a-zA-Z0-9]*=*) + eval `echo "x$1" |\ + sed -e 's/^x--\([a-zA-Z0-9-]*\)=\(.*\)$/opt_OPT="\1";opt_ARG="\2"/'` + opt_STR=`echo $opt_OPT | sed -e 's/-/_/g'` + eval "opt_OPT=\${opt_ALIAS_${opt_STR}-${opt_OPT}}" + ;; + --[a-zA-Z0-9]*) + opt_OPT=`echo "x$1" | cut -c4-` + opt_STR=`echo $opt_OPT | sed -e 's/-/_/g'` + eval "opt_OPT=\${opt_ALIAS_${opt_STR}-${opt_OPT}}" + opt_ARG='' + ;; + -[a-zA-Z0-9]*) + eval `echo "x$1" |\ + sed -e 's/^x-\([a-zA-Z0-9]\)/opt_OPT="\1";/' \ + -e 's/";\(.*\)$/"; opt_ARG="\1"/'` + ;; + -[a-zA-Z0-9]) + opt_OPT=`echo "x$1" | cut -c3-` + opt_ARG='' + ;; + *) + break + ;; + esac + fi + + # eat up option + shift + + # determine whether option needs an argument + eval "opt_MODE=\$opt_MODE_${opt_OPT}" + if [ ".$opt_ARG" = . ] && [ ".$opt_ARG_OK" != .yes ]; then + if [ ".$opt_MODE" = ".:" ] || [ ".$opt_MODE" = ".+" ]; then + opt_PREV="$opt_OPT" + continue + fi + fi + + # process option + case $opt_MODE in + '.' ) + # boolean option + eval "opt_${opt_OPT}=yes" + ;; + ':' ) + # option with argument (multiple occurances override) + eval "opt_${opt_OPT}=\"\$opt_ARG\"" + ;; + '+' ) + # option with argument (multiple occurances append) + eval "opt_${opt_OPT}=\"\$opt_${opt_OPT} \$opt_ARG\"" + ;; + * ) + echo "$0: ERROR: unknown option: \`$opt_OPT'" 1>&2 + exit 1 + ;; + esac +done +if [ ".$opt_PREV" != . ]; then + echo "$0: ERROR: missing argument to option \`$opt_PREV'" 1>&2 + exit 1 +fi + +# process help option +if [ ".$opt_h" = .yes ]; then + echo "Usage: $0 $str_usage" + exit 0 +fi + +# complain about incorrect number of arguments +case $arg_MODE in + '=' ) + if [ $# -ne $arg_NUMS ]; then + echo "$0: ERROR: invalid number of arguments (exactly $arg_NUMS expected)" 1>&2 + exit 1 + fi + ;; + '+' ) + if [ $# -lt $arg_NUMS ]; then + echo "$0: ERROR: invalid number of arguments (at least $arg_NUMS expected)" 1>&2 + exit 1 + fi + ;; +esac + +# helper function for verbose messages +verbose () { + lvl="$1" + msg="$2" + if [ $opt_v -ge $lvl ]; then + case "$lvl" in + 1 ) str_prefix="**" ;; + 2 ) str_prefix="++" ;; + 3 ) str_prefix="--" ;; + 4 ) str_prefix=".." ;; + esac + echo "${str_prefix} ${msg}" + fi +} + +# helper function for graceful termination +die () { + echo "$0: ERROR: $*" + exit 1 +} + +## +## MAIN +## + +# the stack information +CFG_NAME="" +CFG_SUMMARY="" +CFG_PACKAGER="" +CFG_VERSION="" +CFG_RELEASE="" + +# the required OpenPKG framework parameters +CFG_FRAMEWORK=" +" + +# the required OpenPKG packages +# (in topological order and with build options resolved) +CFG_PACKAGES=" +" + +# whether unversioned output directory should be used +CFG_UNVERSIONED="" + +# display information +verbose 1 "OpenPKG Software Stack Deployment" +verbose 2 "determining information" + +# parse OpenPKG framework parameters +params=" + prefix + user group + susr musr rusr nusr + sgrp mgrp rgrp ngrp + suid muid ruid nuid + sgid mgid rgid ngid + tag +" +for param in $params; do + eval "CF_$param=''" +done +for opt in $CFG_FRAMEWORK; do + case "$opt" in + --[a-zA-Z0-9-]*=* ) + name=`echo "$opt" | sed -e 's;^--\([^=]*\)=.*$;\1;'` + value=`echo "$opt" | sed -e 's;^--[^=]*=\(.*\)$;\1;'` + eval "CF_$name='$value'" + ;; + esac +done +for define in $opt_D; do + name=`echo "$define" | sed -e 's;=.*$;;'` + value=`echo "$define" | sed -e 's;^.*=;;'` + eval "CF_$name='$value'" +done +CFG_FRAMEWORK='' +for name in $params; do + eval "value=\"\$CF_$name\"" + if [ ".$value" != . ]; then + if [ ".$CFG_FRAMEWORK" = . ]; then + CFG_FRAMEWORK="--$name=$value" + else + CFG_FRAMEWORK="$CFG_FRAMEWORK --$name=$value" + fi + fi +done +if [ ".$CF_musr" = . ]; then CF_musr="$CF_user"; fi +if [ ".$CF_mgrp" = . ]; then CF_mgrp="$CF_group"; fi +if [ ".$CF_rusr" = . ]; then CF_rusr="$CF_user-r"; fi +if [ ".$CF_rgrp" = . ]; then CF_rgrp="$CF_group-r"; fi +if [ ".$CF_nusr" = . ]; then CF_nusr="$CF_user-n"; fi +if [ ".$CF_ngrp" = . ]; then CF_ngrp="$CF_group-n"; fi +verbose 3 "name: $CFG_NAME" +verbose 3 "summary: $CFG_SUMMARY" +verbose 3 "packager: $CFG_PACKAGER" +verbose 3 "version: $CFG_VERSION" +verbose 3 "release: $CFG_RELEASE" + +# determine target parameters +if [ ".$CF_prefix" = . ]; then + die "OpenPKG Framework parameter \"prefix\" required" +fi +prefix="$CF_prefix" +if [ ".$CF_tag" = . ]; then + die "OpenPKG Framework parameter \"tag\" required" +fi +tag="$CF_tag" +shtool="$opt_t/$CFG_NAME-$CFG_VERSION-$CFG_RELEASE.shtool.sh" +sed <$0 -e '1,/^## SHTOOL ##.*/d' >$shtool +platform=`sh $shtool platform -n -L -S "" -C "+" -F '%-%'` +verbose 3 "platform: $platform" +verbose 3 "tag: $tag" +verbose 3 "prefix: $prefix" + +# determine operation directories +srcdir="$opt_s" +if [ ".$srcdir" = . ]; then + srcdir="$CFG_NAME-$CFG_VERSION-$CFG_RELEASE.src.d" +fi +tmpdir="$opt_t/$CFG_NAME-$CFG_VERSION-$CFG_RELEASE.d" +if [ ! -d "$tmpdir" ]; then + ( umask 077 + rm -rf "$tmpdir" >/dev/null 2>&1 || true + sh $shtool mkdir -p -m 700 "$tmpdir" >/dev/null 2>&1 + if [ $? -ne 0 ]; then + die "failed to create temporary directory: \"$tmpdir\"" + fi + ) || exit $? +fi +outdir="$opt_o" +if [ ".$outdir" = . ]; then + if [ ".$CFG_UNVERSIONED" = .yes ]; then + outdir="$CFG_NAME.$platform-$tag.d" + else + outdir="$CFG_NAME-$CFG_VERSION-$CFG_RELEASE.$platform-$tag.d" + fi +fi +if [ ! -d "$outdir" ]; then + sh $shtool mkdir -p -m 755 "$outdir" >/dev/null 2>&1 + if [ $? -ne 0 ]; then + die "failed to create output directory: \"$outdir\"" + fi +fi +verbose 3 "srcdir: $srcdir" +verbose 3 "outdir: $outdir" +verbose 3 "tmpdir: $tmpdir" + +# execute prolog script +if [ ".@HAVE_PROLOG@" = .yes ]; then + verbose 2 "execute prolog script" + cat >$tmpdir/prolog.sh </dev/null` + if [ ".$check" != ".$pkg" ]; then + # upgrade (regular) + if [ ! -f "$outdir/$pkg.$platform-$tag.rpm" ]; then + die "binary RPM package not existing: $outdir/$pkg.$platform-$tag.rpm" + fi + verbose 3 "UPGRADE: $outdir/$pkg.$platform-$tag.rpm" + rpm_opt="-U"; if [ $opt_v -ge 4 ]; then rpm_opt="${rpm_opt}vh"; fi + $opt_S $prefix/bin/openpkg rpm $rpm_opt \ + $outdir/$pkg.$platform-$tag.rpm || \ + die "failed to upgrade package: $outdir/$pkg.$platform-$tag.rpm" + else + # keep as-is + verbose 3 "KEEP AS-IS: $pkg @ $prefix" + fi + fi + else + # + # OpenPKG Packages + # + if [ ! -x "$prefix/bin/openpkg" ]; then + # usually will not happen because of correctly + # generated topologically correct package list + die "command \"$prefix/bin/openpkg\" has to exit for building a regular OpenPKG package" 1>&2 + fi + if [ ! -f $outdir/$pkg.$platform-$tag.rpm ]; then + # build (regular) + if [ ! -f "$srcdir/$pkg.src.rpm" ]; then + die "source RPM package not existing: $srcdir/$pkg.src.rpm" + fi + verbose 3 "BUILD: $srcdir/$pkg.src.rpm" + if [ ".$opts" != . ]; then + verbose 4 "options: $opts" + fi + rm -rf "$tmpdir/$pkg" >/dev/null 2>&1 || true + sh $shtool mkdir -p -m 755 "$tmpdir/$pkg" >/dev/null 2>&1 + cmd="$prefix/bin/openpkg --keep-privileges" + cmd="$cmd rpm --rebuild" + cmd="$cmd --define \"_specdir $tmpdir/$pkg\"" + cmd="$cmd --define \"_sourcedir $tmpdir/$pkg\"" + cmd="$cmd --define \"_builddir $tmpdir/$pkg\"" + cmd="$cmd --define \"_tmppath $tmpdir/$pkg\"" + cmd="$cmd --define \"_srcrpmdir $tmpdir/$pkg\"" + cmd="$cmd --define \"_rpmdir $outdir\"" + OIFS2="$IFS"; IFS="$DIFS" + for opt in $opts; do + opt_name=`echo "$opt" | sed -e 's;^\([^=]*\)=.*$;\1;'` + opt_value=`echo "$opt" | sed -e 's;^[^=]*=\(.*\)$;\1;'` + cmd="$cmd --define \"$opt_name $opt_value\"" + done + IFS="$OIFS2" + cmd="$cmd $srcdir/$pkg.src.rpm" + if [ $opt_v -lt 4 ]; then cmd="$cmd >/dev/null 2>&1"; fi + eval "$cmd" || \ + die "failed to build package \"$srcdir/$pkg.src.rpm\"" + fi + check=`$prefix/bin/openpkg rpm -q "$name" 2>/dev/null` + if [ ".$check" = ".package $name is not installed" ]; then + # install (regular) + if [ ! -f "$outdir/$pkg.$platform-$tag.rpm" ]; then + die "binary RPM package not existing: $outdir/$pkg.$platform-$tag.rpm" + fi + verbose 3 "INSTALL: $outdir/$pkg.$platform-$tag.rpm" + rpm_opt="-i"; if [ $opt_v -ge 4 ]; then rpm_opt="${rpm_opt}vh"; fi + $opt_S $prefix/bin/openpkg rpm $rpm_opt \ + $outdir/$pkg.$platform-$tag.rpm || \ + die "failed to install package: $outdir/$pkg.$platform-$tag.rpm" + elif [ ".$check" != ".$pkg" ]; then + # upgrade (regular) + if [ ! -f "$outdir/$pkg.$platform-$tag.rpm" ]; then + die "binary RPM package not existing: $outdir/$pkg.$platform-$tag.rpm" + fi + verbose 3 "UPGRADE: $outdir/$pkg.$platform-$tag.rpm" + rpm_opt="-U"; if [ $opt_v -ge 4 ]; then rpm_opt="${rpm_opt}vh"; fi + $opt_S $prefix/bin/openpkg rpm $rpm_opt \ + $outdir/$pkg.$platform-$tag.rpm || \ + die "failed to upgrade package: $outdir/$pkg.$platform-$tag.rpm" + else + # keep as-is + verbose 3 "KEEP AS-IS: $pkg @ $prefix" + fi + fi +done +IFS="$OIFS" + +# optionally remove residue packages from binary RPM package directory +if [ $opt_c -lt 3 ]; then + verbose 2 "cleanup target directory from residue packages" + for pkg in $outdir/*.sh $outdir/*.rpm; do + if [ ! -f "$pkg" ]; then + continue + fi + pkg_base=`echo "$pkg" | sed -e 's;^.*/\([^/][^/]*-[0-9][^/-]*-[0-9][0-9.]*\)\.[^/][^/]*$;\1;'` + erase=yes + for spec in $CFG_PACKAGES; do + spec_base=`echo "$spec" | sed -e 's;^\(.*-[^-][^-]*-[^-][^-]*\).*$;\1;'` + if [ ".$pkg_base" = ".$spec_base" ]; then + erase=no + break + fi + done + if [ ".$erase" = .yes ]; then + verbose 3 "REMOVE: $pkg" + rm -f "$pkg" + fi + done +fi + +# optionally remove residue packages from OpenPKG instance +if [ $opt_c -lt 3 ]; then + verbose 2 "cleanup OpenPKG instance from residue packages" + for pkg1 in `$prefix/bin/openpkg rpm -qa | egrep -v '^(openpkg-[0-9]|gpg-pubkey-)'`; do + name1=`echo "$pkg1" | sed -e 's;^\(.*\)-[^-][^-]*-[^-][^-]*$;\1;'` + erase=yes + for spec in $CFG_PACKAGES; do + name2=`echo "$spec" | sed -e 's;^\(.*\)-[^-][^-]*-[^-][^-]*.*$;\1;'` + if [ ".$name1" = ".$name2" ]; then + erase=no + break + fi + done + if [ ".$erase" = .yes ]; then + verbose 3 "REMOVE: pkg1 @ $prefix" + $opt_S $prefix/bin/openpkg rpm -e "$pkg1" || \ + die "failed to erase residue package \"$pkg1\"" + fi + done +fi + +# execute epilog script +if [ ".@HAVE_EPILOG@" = .yes ]; then + verbose 2 "execute epilog script" + cat >$tmpdir/epilog.sh </dev/null 3>&1 || true +rm -rf $tmpdir >/dev/null 2>&1 || true + +exit 0 + +## SHTOOL ################################################################### +