1.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 1.2 +++ b/openpkg/stack.sh Tue Jul 31 12:23:42 2012 +0200 1.3 @@ -0,0 +1,967 @@ 1.4 +## 1.5 +## OpenPKG Software Stack Generation 1.6 +## Copyright (c) 2010-2012 OpenPKG GmbH <http://openpkg.com/> 1.7 +## 1.8 +## This software is property of the OpenPKG GmbH, DE MUC HRB 160208. 1.9 +## All rights reserved. Licenses which grant limited permission to use, 1.10 +## copy, modify and distribute this software are available from the 1.11 +## OpenPKG GmbH. 1.12 +## 1.13 +## THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESSED OR IMPLIED 1.14 +## WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF 1.15 +## MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 1.16 +## IN NO EVENT SHALL THE AUTHORS AND COPYRIGHT HOLDERS AND THEIR 1.17 +## CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 1.18 +## SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 1.19 +## LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF 1.20 +## USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND 1.21 +## ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, 1.22 +## OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT 1.23 +## OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 1.24 +## SUCH DAMAGE. 1.25 +## 1.26 + 1.27 +# configuration 1.28 +openpkg="${OPENPKG_PREFIX}/bin/openpkg" 1.29 +curl="${OPENPKG_PREFIX}/bin/openpkg curl" 1.30 +shtool="${OPENPKG_PREFIX}/lib/openpkg/shtool" 1.31 + 1.32 +## 1.33 +## COMMAND LINE PARSING 1.34 +## 1.35 + 1.36 +str_usage="[-h|--help] [-v|--verbose <level>] [-o|--output <dir>] [-D|--define <name>=<value> ...] [-u|--unversioned] [-q|--query] <name>.stk" 1.37 +arg_spec="1=" 1.38 +opt_spec="h.v:o:D+u.q." 1.39 +opt_alias="h:help,v:verbose,o:output,D:define,u:unversioned,q:query" 1.40 +opt_h=no 1.41 +opt_v=4 1.42 +opt_o="." 1.43 +opt_D="" 1.44 +opt_u=no 1.45 +opt_q=no 1.46 + 1.47 +# parse argument specification string 1.48 +eval `echo $arg_spec |\ 1.49 + sed -e 's/^\([0-9]*\)\([+=]\)/arg_NUMS=\1; arg_MODE=\2/'` 1.50 + 1.51 +# parse option specification string 1.52 +eval `echo $opt_spec |\ 1.53 + sed -e 's/\([a-zA-Z0-9]\)\([.:+]\)/opt_MODE_\1=\2;/g'` 1.54 + 1.55 +# parse option alias string 1.56 +eval `echo $opt_alias |\ 1.57 + sed -e 's/-/_/g' -e 's/\([a-zA-Z0-9]\):\([^,]*\),*/opt_ALIAS_\2=\1;/g'` 1.58 + 1.59 +# interate over argument line 1.60 +opt_PREV='' 1.61 +while [ $# -gt 0 ]; do 1.62 + # special option stops processing 1.63 + if [ ".$1" = ".--" ]; then 1.64 + shift 1.65 + break 1.66 + fi 1.67 + 1.68 + # determine option and argument 1.69 + opt_ARG_OK=no 1.70 + if [ ".$opt_PREV" != . ]; then 1.71 + # merge previous seen option with argument 1.72 + opt_OPT="$opt_PREV" 1.73 + opt_ARG="$1" 1.74 + opt_ARG_OK=yes 1.75 + opt_PREV='' 1.76 + else 1.77 + # split argument into option and argument 1.78 + case "$1" in 1.79 + --[a-zA-Z0-9]*=*) 1.80 + eval `echo "x$1" |\ 1.81 + sed -e 's/^x--\([a-zA-Z0-9-]*\)=\(.*\)$/opt_OPT="\1";opt_ARG="\2"/'` 1.82 + opt_STR=`echo $opt_OPT | sed -e 's/-/_/g'` 1.83 + eval "opt_OPT=\${opt_ALIAS_${opt_STR}-${opt_OPT}}" 1.84 + ;; 1.85 + --[a-zA-Z0-9]*) 1.86 + opt_OPT=`echo "x$1" | cut -c4-` 1.87 + opt_STR=`echo $opt_OPT | sed -e 's/-/_/g'` 1.88 + eval "opt_OPT=\${opt_ALIAS_${opt_STR}-${opt_OPT}}" 1.89 + opt_ARG='' 1.90 + ;; 1.91 + -[a-zA-Z0-9]*) 1.92 + eval `echo "x$1" |\ 1.93 + sed -e 's/^x-\([a-zA-Z0-9]\)/opt_OPT="\1";/' \ 1.94 + -e 's/";\(.*\)$/"; opt_ARG="\1"/'` 1.95 + ;; 1.96 + -[a-zA-Z0-9]) 1.97 + opt_OPT=`echo "x$1" | cut -c3-` 1.98 + opt_ARG='' 1.99 + ;; 1.100 + *) 1.101 + break 1.102 + ;; 1.103 + esac 1.104 + fi 1.105 + 1.106 + # eat up option 1.107 + shift 1.108 + 1.109 + # determine whether option needs an argument 1.110 + eval "opt_MODE=\$opt_MODE_${opt_OPT}" 1.111 + if [ ".$opt_ARG" = . ] && [ ".$opt_ARG_OK" != .yes ]; then 1.112 + if [ ".$opt_MODE" = ".:" ] || [ ".$opt_MODE" = ".+" ]; then 1.113 + opt_PREV="$opt_OPT" 1.114 + continue 1.115 + fi 1.116 + fi 1.117 + 1.118 + # process option 1.119 + case $opt_MODE in 1.120 + '.' ) 1.121 + # boolean option 1.122 + eval "opt_${opt_OPT}=yes" 1.123 + ;; 1.124 + ':' ) 1.125 + # option with argument (multiple occurances override) 1.126 + eval "opt_${opt_OPT}=\"\$opt_ARG\"" 1.127 + ;; 1.128 + '+' ) 1.129 + # option with argument (multiple occurances append) 1.130 + eval "opt_${opt_OPT}=\"\$opt_${opt_OPT} \$opt_ARG\"" 1.131 + ;; 1.132 + * ) 1.133 + echo "$0: ERROR: unknown option: \`$opt_OPT'" 1>&2 1.134 + exit 1 1.135 + ;; 1.136 + esac 1.137 +done 1.138 +if [ ".$opt_PREV" != . ]; then 1.139 + echo "$0: ERROR: missing argument to option \`$opt_PREV'" 1>&2 1.140 + exit 1 1.141 +fi 1.142 + 1.143 +# process help option 1.144 +if [ ".$opt_h" = .yes ]; then 1.145 + echo "Usage: $0 $str_usage" 1.146 + exit 0 1.147 +fi 1.148 + 1.149 +# complain about incorrect number of arguments 1.150 +case $arg_MODE in 1.151 + '=' ) 1.152 + if [ $# -ne $arg_NUMS ]; then 1.153 + echo "$0: ERROR: invalid number of arguments (exactly $arg_NUMS expected)" 1>&2 1.154 + exit 1 1.155 + fi 1.156 + ;; 1.157 + '+' ) 1.158 + if [ $# -lt $arg_NUMS ]; then 1.159 + echo "$0: ERROR: invalid number of arguments (at least $arg_NUMS expected)" 1>&2 1.160 + exit 1 1.161 + fi 1.162 + ;; 1.163 +esac 1.164 + 1.165 +## 1.166 +## HELPER FUNCTIONS 1.167 +## 1.168 + 1.169 +# helper function for graceful termination 1.170 +die () { 1.171 + echo "$0: ERROR: $*" 1.172 + exit 1 1.173 +} 1.174 + 1.175 +# helper function for verbose messages 1.176 +verbose () { 1.177 + lvl="$1" 1.178 + msg="$2" 1.179 + if [ $opt_v -ge $lvl ]; then 1.180 + case "$lvl" in 1.181 + 1 ) str_prefix="**" ;; 1.182 + 2 ) str_prefix="++" ;; 1.183 + 3 ) str_prefix="--" ;; 1.184 + 4 ) str_prefix=".." ;; 1.185 + esac 1.186 + echo "${str_prefix} ${msg}" 1.187 + fi 1.188 +} 1.189 + 1.190 +# expand macros 1.191 +macro_expand () { 1.192 + stk="$1" 1.193 + 1.194 + # load all options and their default values 1.195 + options="" 1.196 + for option in `sed <$stk \ 1.197 + -e "1,/^%options/d" -e '/^%/,$d' \ 1.198 + -e 's/#.*$//' -e 's/^ *//' -e 's/ *$//' -e '/^ *$/d' \ 1.199 + -e 's; *[^ ]*$;;'`; do 1.200 + options="$options $option" 1.201 + done 1.202 + eval `sed <$stk \ 1.203 + -e "1,/^%options/d" -e '/^%/,$d' \ 1.204 + -e 's/#.*$//' -e 's/^ *//' -e '/^ *$/d' \ 1.205 + -e 's:^\([^ ]*\) *\([^ ]*\)$:option_\1="\2";:'` 1.206 + 1.207 + # override options with defined values 1.208 + for define in $opt_D; do 1.209 + name=`echo "$define" | sed -e 's;=.*$;;'` 1.210 + value=`echo "$define" | sed -e 's;^.*=;;'` 1.211 + eval "exists=\"\${option_${name}}\"" 1.212 + if [ ".$exists" = . ]; then 1.213 + die "definition of not-existing option \"$name\"" 1.214 + fi 1.215 + eval "option_${name}=\"${value}\"" 1.216 + done 1.217 + 1.218 + # expand macros 1.219 + cmd="sed" 1.220 + for name in $options; do 1.221 + eval "value=\"\${option_${name}}\"" 1.222 + cmd="$cmd -e 's;%{[?]$name:\\([^}]*\\)};\1;g'" 1.223 + cmd="$cmd -e 's;%{![?]$name:\\([^}]*\\)};;g'" 1.224 + cmd="$cmd -e 's;%{$name};$value;g'" 1.225 + done 1.226 + cmd="$cmd -e 's;%{[?][^:}]*:[^}]*};;g'" 1.227 + cmd="$cmd -e 's;%{![?][^:}]*:\([^}]*\)};\1;g'" 1.228 + eval "$cmd" 1.229 +} 1.230 + 1.231 +# extract macro-expanded header 1.232 +header () { 1.233 + stk="$1" 1.234 + hdr="$2" 1.235 + exists=`egrep "^${hdr}" $stk` 1.236 + if [ ".$exists" != . ]; then 1.237 + egrep "^${hdr}:" $stk | \ 1.238 + sed -e 's;^[^:]*: *;;' -e 's/#.*$//' -e 's/^ *//' -e 's/ *$//' -e '/^ *$/d' | \ 1.239 + macro_expand "$stk" 1.240 + fi 1.241 +} 1.242 + 1.243 +# extract macro-expanded section 1.244 +section () { 1.245 + stk="$1" 1.246 + sec="$2" 1.247 + exists=`egrep "^%${sec}" $stk` 1.248 + if [ ".$exists" != . ]; then 1.249 + sed <$stk \ 1.250 + -e "1,/^%${sec}/d" -e '/^%/,$d' \ 1.251 + -e 's/#.*$//' -e 's/^ *//' -e 's/ *$//' -e '/^ *$/d' | \ 1.252 + macro_expand "$stk" 1.253 + fi 1.254 +} 1.255 + 1.256 +## 1.257 +## MAIN 1.258 +## 1.259 + 1.260 +# determine stack file 1.261 +stk="$1" 1.262 +shift 1.263 + 1.264 +# support stand-alone query operation 1.265 +if [ ".$opt_q" = .yes ]; then 1.266 + name=`header "$stk" "Name"` 1.267 + summary=`header "$stk" "Summary"` 1.268 + packager=`header "$stk" "Packager"` 1.269 + version=`header "$stk" "Version"` 1.270 + release=`header "$stk" "Release"` 1.271 + echo "name=\"$name\";" 1.272 + echo "summary=\"$summary\";" 1.273 + echo "packager=\"$packager\";" 1.274 + echo "version=\"$version\";" 1.275 + echo "release=\"$release\";" 1.276 + sed <$stk \ 1.277 + -e "1,/^%options/d" -e '/^%/,$d' \ 1.278 + -e 's/#.*$//' -e 's/^ *//' -e '/^ *$/d' \ 1.279 + -e 's:^\([^ ]*\) *\([^ ]*\)$:\1="\2";:' 1.280 + exit 0 1.281 +fi 1.282 + 1.283 +# determine temporary directory 1.284 +tmpdir="${TMPDIR-/tmp}" 1.285 + 1.286 +# provide verbose header 1.287 +verbose 1 "OpenPKG Software Stack Generation" 1.288 + 1.289 +# determine information 1.290 +verbose 2 "determining software stack information" 1.291 +name=`header "$stk" "Name"` 1.292 +summary=`header "$stk" "Summary"` 1.293 +packager=`header "$stk" "Packager"` 1.294 +version=`header "$stk" "Version"` 1.295 +release=`header "$stk" "Release"` 1.296 +verbose 3 "Name: $name" 1.297 +verbose 3 "Summary: $summary" 1.298 +verbose 3 "Packager: $packager" 1.299 +verbose 3 "Version: $version" 1.300 +verbose 3 "Release: $release" 1.301 +if [ ".$opt_u" = .yes ]; then 1.302 + basename="$name" 1.303 +else 1.304 + basename="$name-$version-$release" 1.305 +fi 1.306 + 1.307 +# determine URLs 1.308 +verbose 2 "determining software stack packages" 1.309 +repo=`section "$stk" "repository"` 1.310 +verbose 3 "repository: [URL] $repo" 1.311 +$openpkg build -r "$repo" -Z -u -K -B \ 1.312 + `section "$stk" "packages"` | \ 1.313 + egrep "openpkg curl" | \ 1.314 + sed -e 's;^.* \([^ ]*\) || exit.*$;\1;' \ 1.315 + -e '/\/openpkg-[0-9].*\.src\.rpm/{h;s/\.src\.rpm$/.src.sh/;p;x}' \ 1.316 + >$tmpdir/url.txt 1.317 + 1.318 +# provide header 1.319 +verbose 2 "assembling software stack sources" 1.320 + 1.321 +# download source packages 1.322 +if [ ! -d "$opt_o/$basename.src.d" ]; then 1.323 + verbose 3 "creating: [DIR] $opt_o/$basename.src.d" 1.324 + $shtool mkdir -p -m 755 "$opt_o/$basename.src.d" 1.325 +else 1.326 + verbose 3 "reusing: [DIR] $opt_o/$basename.src.d" 1.327 +fi 1.328 +for url in `cat $tmpdir/url.txt`; do 1.329 + url_file=`echo $url | sed -e 's;^.*/\([^/]*\)$;\1;'` 1.330 + if [ ! -f "$opt_o/$basename.src.d/$url_file" ]; then 1.331 + verbose 3 "downloading: [FILE] $opt_o/$basename.src.d/$url_file" 1.332 + if [ $opt_v -ge 4 ]; then 1.333 + $curl '-#' -L -k -o $opt_o/$basename.src.d/$url_file $url 1.334 + else 1.335 + $curl -s -L -k -o $opt_o/$basename.src.d/$url_file $url 1.336 + fi 1.337 + else 1.338 + verbose 3 "reusing: [FILE] $opt_o/$basename.src.d/$url_file" 1.339 + fi 1.340 +done 1.341 +for path in $opt_o/$basename.src.d/*.src.sh $opt_o/$basename.src.d/*.src.rpm; do 1.342 + if [ ! -f "$path" ]; then 1.343 + continue 1.344 + fi 1.345 + path_file=`echo $path | sed -e 's;^.*/\([^/]*\)$;\1;'` 1.346 + found=no 1.347 + for url in `cat $tmpdir/url.txt`; do 1.348 + url_file=`echo $url | sed -e 's;^.*/\([^/]*\)$;\1;'` 1.349 + if [ ".$url_file" = ".$path_file" ]; then 1.350 + found=yes 1.351 + break 1.352 + fi 1.353 + done 1.354 + if [ ".$found" = .no ]; then 1.355 + verbose 3 "removing: [FILE] $path" 1.356 + rm -f "$path" 1.357 + fi 1.358 +done 1.359 +rm -f $tmpdir/url.txt 1.360 + 1.361 +# generate XML/RDF index for SRPM packages 1.362 +verbose 3 "generating: [FILE] $opt_o/$basename.src.d/00INDEX.rdf" 1.363 +$openpkg index -r "OpenPKG/SRPM" \ 1.364 + -o $opt_o/$basename.src.d/00INDEX.rdf \ 1.365 + -i $opt_o/$basename.src.d 1.366 + 1.367 +# generate deployment utility 1.368 +verbose 3 "generating: [FILE] $opt_o/$basename.sh"; \ 1.369 +section "$stk" "framework" >$tmpdir/framework.txt 1.370 +section "$stk" "prolog" >$tmpdir/prolog.txt 1.371 +section "$stk" "epilog" >$tmpdir/epilog.txt 1.372 +HAVE_PROLOG=no; if [ ".`cat $tmpdir/prolog.txt`" != . ]; then HAVE_PROLOG=yes; fi 1.373 +HAVE_EPILOG=no; if [ ".`cat $tmpdir/epilog.txt`" != . ]; then HAVE_EPILOG=yes; fi 1.374 +$openpkg build -r "$repo" -Z -u -K \ 1.375 + `section "$stk" "packages"` | \ 1.376 +grep -v "^#" | \ 1.377 +grep -v "^echo" | \ 1.378 +grep -v "^rm" | \ 1.379 +egrep -v "^(if|fi)" | \ 1.380 +grep -v "openpkg curl" | \ 1.381 +grep -v "openpkg rpm -Uvh" | \ 1.382 +sed -e 's;.*openpkg rpm ;;' \ 1.383 + -e 's; || exit.*;;' \ 1.384 + -e 's;--rebuild ;;' \ 1.385 + -e 's;/.*/\([^/]*\.src\.rpm\);\1;' \ 1.386 + -e 's;^\(.*\) \([^/]*\.src\.rpm\);\2 \1;' \ 1.387 + -e "s;--define '\\([^ ]*\\) \\([^ ]*\\)';\\1=\\2;g" \ 1.388 + -e 's;\.src\.rpm;;' \ 1.389 + >$tmpdir/packages.txt 1.390 +sed <$0 \ 1.391 + -e '1,/^____/d' \ 1.392 + -e "/^CFG_FRAMEWORK=\"/r $tmpdir/framework.txt" \ 1.393 + -e "/^CFG_PACKAGES=\"/r $tmpdir/packages.txt" \ 1.394 + -e "s;@HAVE_PROLOG@;$HAVE_PROLOG;" \ 1.395 + -e "/%prolog/r $tmpdir/prolog.txt" \ 1.396 + -e "s;@HAVE_EPILOG@;$HAVE_EPILOG;" \ 1.397 + -e "/%epilog/r $tmpdir/epilog.txt" \ 1.398 + -e "/^## SHTOOL ##/r $shtool" \ 1.399 + -e "s;^\\(CFG_NAME=\"\\).*\\(\"\\);\\1$name\\2;" \ 1.400 + -e "s;^\\(CFG_SUMMARY=\"\\).*\\(\"\\);\\1$summary\\2;" \ 1.401 + -e "s;^\\(CFG_PACKAGER=\"\\).*\\(\"\\);\\1$packager\\2;" \ 1.402 + -e "s;^\\(CFG_VERSION=\"\\).*\\(\"\\);\\1$version\\2;" \ 1.403 + -e "s;^\\(CFG_RELEASE=\"\\).*\\(\"\\);\\1$release\\2;" \ 1.404 + -e "s;^\\(CFG_UNVERSIONED=\"\\).*\\(\"\\);\\1$opt_u\\2;" \ 1.405 + >$opt_o/$basename.sh 1.406 + 1.407 +# cleanup 1.408 +rm -f $tmpdir/framework.txt 1.409 +rm -f $tmpdir/packages.txt 1.410 +rm -f $tmpdir/prolog.txt 1.411 +rm -f $tmpdir/epilog.txt 1.412 + 1.413 +# exit gracefully 1.414 +exit 0 1.415 + 1.416 +## 1.417 +## DEPLOYMENT SCRIPT 1.418 +## 1.419 + 1.420 +______________________________________________________________________________ 1.421 +#!/bin/sh 1.422 +#![OpenPKG] 1.423 +## 1.424 +## OpenPKG Software Stack Deployment 1.425 +## Copyright (c) 2010-2012 OpenPKG GmbH <http://openpkg.com/> 1.426 +## 1.427 +## This software is property of the OpenPKG GmbH, DE MUC HRB 160208. 1.428 +## All rights reserved. Licenses which grant limited permission to use, 1.429 +## copy, modify and distribute this software are available from the 1.430 +## OpenPKG GmbH. 1.431 +## 1.432 +## THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESSED OR IMPLIED 1.433 +## WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF 1.434 +## MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 1.435 +## IN NO EVENT SHALL THE AUTHORS AND COPYRIGHT HOLDERS AND THEIR 1.436 +## CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 1.437 +## SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 1.438 +## LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF 1.439 +## USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND 1.440 +## ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, 1.441 +## OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT 1.442 +## OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 1.443 +## SUCH DAMAGE. 1.444 +## 1.445 + 1.446 +## 1.447 +## COMMAND LINE PARSING 1.448 +## 1.449 + 1.450 +str_usage="[-h|--help] [-v|--verbose <level>] [-c|--cleanup <level>] [-D|--define <name>=<value> ...] [-s|--srcdir <dir>] [-o|--outdir <dir>] [-t|--tmpdir <dir>] [-S <sudo>]" 1.451 +arg_spec="0=" 1.452 +opt_spec="h.v:c:D+s:o:t:S:" 1.453 +opt_alias="h:help,v:verbose,c:cleanup,D:define,s:srcdir,o:outdir,t:tmpdir,S:sudo" 1.454 +opt_h=no 1.455 +opt_v=3 1.456 +opt_c=1 1.457 +opt_D="" 1.458 +opt_s="" 1.459 +opt_o="" 1.460 +opt_t="${TMPDIR-/tmp}" 1.461 +opt_S="" 1.462 + 1.463 +# parse argument specification string 1.464 +eval `echo $arg_spec |\ 1.465 + sed -e 's/^\([0-9]*\)\([+=]\)/arg_NUMS=\1; arg_MODE=\2/'` 1.466 + 1.467 +# parse option specification string 1.468 +eval `echo $opt_spec |\ 1.469 + sed -e 's/\([a-zA-Z0-9]\)\([.:+]\)/opt_MODE_\1=\2;/g'` 1.470 + 1.471 +# parse option alias string 1.472 +eval `echo $opt_alias |\ 1.473 + sed -e 's/-/_/g' -e 's/\([a-zA-Z0-9]\):\([^,]*\),*/opt_ALIAS_\2=\1;/g'` 1.474 + 1.475 +# interate over argument line 1.476 +opt_PREV='' 1.477 +while [ $# -gt 0 ]; do 1.478 + # special option stops processing 1.479 + if [ ".$1" = ".--" ]; then 1.480 + shift 1.481 + break 1.482 + fi 1.483 + 1.484 + # determine option and argument 1.485 + opt_ARG_OK=no 1.486 + if [ ".$opt_PREV" != . ]; then 1.487 + # merge previous seen option with argument 1.488 + opt_OPT="$opt_PREV" 1.489 + opt_ARG="$1" 1.490 + opt_ARG_OK=yes 1.491 + opt_PREV='' 1.492 + else 1.493 + # split argument into option and argument 1.494 + case "$1" in 1.495 + --[a-zA-Z0-9]*=*) 1.496 + eval `echo "x$1" |\ 1.497 + sed -e 's/^x--\([a-zA-Z0-9-]*\)=\(.*\)$/opt_OPT="\1";opt_ARG="\2"/'` 1.498 + opt_STR=`echo $opt_OPT | sed -e 's/-/_/g'` 1.499 + eval "opt_OPT=\${opt_ALIAS_${opt_STR}-${opt_OPT}}" 1.500 + ;; 1.501 + --[a-zA-Z0-9]*) 1.502 + opt_OPT=`echo "x$1" | cut -c4-` 1.503 + opt_STR=`echo $opt_OPT | sed -e 's/-/_/g'` 1.504 + eval "opt_OPT=\${opt_ALIAS_${opt_STR}-${opt_OPT}}" 1.505 + opt_ARG='' 1.506 + ;; 1.507 + -[a-zA-Z0-9]*) 1.508 + eval `echo "x$1" |\ 1.509 + sed -e 's/^x-\([a-zA-Z0-9]\)/opt_OPT="\1";/' \ 1.510 + -e 's/";\(.*\)$/"; opt_ARG="\1"/'` 1.511 + ;; 1.512 + -[a-zA-Z0-9]) 1.513 + opt_OPT=`echo "x$1" | cut -c3-` 1.514 + opt_ARG='' 1.515 + ;; 1.516 + *) 1.517 + break 1.518 + ;; 1.519 + esac 1.520 + fi 1.521 + 1.522 + # eat up option 1.523 + shift 1.524 + 1.525 + # determine whether option needs an argument 1.526 + eval "opt_MODE=\$opt_MODE_${opt_OPT}" 1.527 + if [ ".$opt_ARG" = . ] && [ ".$opt_ARG_OK" != .yes ]; then 1.528 + if [ ".$opt_MODE" = ".:" ] || [ ".$opt_MODE" = ".+" ]; then 1.529 + opt_PREV="$opt_OPT" 1.530 + continue 1.531 + fi 1.532 + fi 1.533 + 1.534 + # process option 1.535 + case $opt_MODE in 1.536 + '.' ) 1.537 + # boolean option 1.538 + eval "opt_${opt_OPT}=yes" 1.539 + ;; 1.540 + ':' ) 1.541 + # option with argument (multiple occurances override) 1.542 + eval "opt_${opt_OPT}=\"\$opt_ARG\"" 1.543 + ;; 1.544 + '+' ) 1.545 + # option with argument (multiple occurances append) 1.546 + eval "opt_${opt_OPT}=\"\$opt_${opt_OPT} \$opt_ARG\"" 1.547 + ;; 1.548 + * ) 1.549 + echo "$0: ERROR: unknown option: \`$opt_OPT'" 1>&2 1.550 + exit 1 1.551 + ;; 1.552 + esac 1.553 +done 1.554 +if [ ".$opt_PREV" != . ]; then 1.555 + echo "$0: ERROR: missing argument to option \`$opt_PREV'" 1>&2 1.556 + exit 1 1.557 +fi 1.558 + 1.559 +# process help option 1.560 +if [ ".$opt_h" = .yes ]; then 1.561 + echo "Usage: $0 $str_usage" 1.562 + exit 0 1.563 +fi 1.564 + 1.565 +# complain about incorrect number of arguments 1.566 +case $arg_MODE in 1.567 + '=' ) 1.568 + if [ $# -ne $arg_NUMS ]; then 1.569 + echo "$0: ERROR: invalid number of arguments (exactly $arg_NUMS expected)" 1>&2 1.570 + exit 1 1.571 + fi 1.572 + ;; 1.573 + '+' ) 1.574 + if [ $# -lt $arg_NUMS ]; then 1.575 + echo "$0: ERROR: invalid number of arguments (at least $arg_NUMS expected)" 1>&2 1.576 + exit 1 1.577 + fi 1.578 + ;; 1.579 +esac 1.580 + 1.581 +# helper function for verbose messages 1.582 +verbose () { 1.583 + lvl="$1" 1.584 + msg="$2" 1.585 + if [ $opt_v -ge $lvl ]; then 1.586 + case "$lvl" in 1.587 + 1 ) str_prefix="**" ;; 1.588 + 2 ) str_prefix="++" ;; 1.589 + 3 ) str_prefix="--" ;; 1.590 + 4 ) str_prefix=".." ;; 1.591 + esac 1.592 + echo "${str_prefix} ${msg}" 1.593 + fi 1.594 +} 1.595 + 1.596 +# helper function for graceful termination 1.597 +die () { 1.598 + echo "$0: ERROR: $*" 1.599 + exit 1 1.600 +} 1.601 + 1.602 +## 1.603 +## MAIN 1.604 +## 1.605 + 1.606 +# the stack information 1.607 +CFG_NAME="" 1.608 +CFG_SUMMARY="" 1.609 +CFG_PACKAGER="" 1.610 +CFG_VERSION="" 1.611 +CFG_RELEASE="" 1.612 + 1.613 +# the required OpenPKG framework parameters 1.614 +CFG_FRAMEWORK=" 1.615 +" 1.616 + 1.617 +# the required OpenPKG packages 1.618 +# (in topological order and with build options resolved) 1.619 +CFG_PACKAGES=" 1.620 +" 1.621 + 1.622 +# whether unversioned output directory should be used 1.623 +CFG_UNVERSIONED="" 1.624 + 1.625 +# display information 1.626 +verbose 1 "OpenPKG Software Stack Deployment" 1.627 +verbose 2 "determining information" 1.628 + 1.629 +# parse OpenPKG framework parameters 1.630 +params=" 1.631 + prefix 1.632 + user group 1.633 + susr musr rusr nusr 1.634 + sgrp mgrp rgrp ngrp 1.635 + suid muid ruid nuid 1.636 + sgid mgid rgid ngid 1.637 + tag 1.638 +" 1.639 +for param in $params; do 1.640 + eval "CF_$param=''" 1.641 +done 1.642 +for opt in $CFG_FRAMEWORK; do 1.643 + case "$opt" in 1.644 + --[a-zA-Z0-9-]*=* ) 1.645 + name=`echo "$opt" | sed -e 's;^--\([^=]*\)=.*$;\1;'` 1.646 + value=`echo "$opt" | sed -e 's;^--[^=]*=\(.*\)$;\1;'` 1.647 + eval "CF_$name='$value'" 1.648 + ;; 1.649 + esac 1.650 +done 1.651 +for define in $opt_D; do 1.652 + name=`echo "$define" | sed -e 's;=.*$;;'` 1.653 + value=`echo "$define" | sed -e 's;^.*=;;'` 1.654 + eval "CF_$name='$value'" 1.655 +done 1.656 +CFG_FRAMEWORK='' 1.657 +for name in $params; do 1.658 + eval "value=\"\$CF_$name\"" 1.659 + if [ ".$value" != . ]; then 1.660 + if [ ".$CFG_FRAMEWORK" = . ]; then 1.661 + CFG_FRAMEWORK="--$name=$value" 1.662 + else 1.663 + CFG_FRAMEWORK="$CFG_FRAMEWORK --$name=$value" 1.664 + fi 1.665 + fi 1.666 +done 1.667 +if [ ".$CF_musr" = . ]; then CF_musr="$CF_user"; fi 1.668 +if [ ".$CF_mgrp" = . ]; then CF_mgrp="$CF_group"; fi 1.669 +if [ ".$CF_rusr" = . ]; then CF_rusr="$CF_user-r"; fi 1.670 +if [ ".$CF_rgrp" = . ]; then CF_rgrp="$CF_group-r"; fi 1.671 +if [ ".$CF_nusr" = . ]; then CF_nusr="$CF_user-n"; fi 1.672 +if [ ".$CF_ngrp" = . ]; then CF_ngrp="$CF_group-n"; fi 1.673 +verbose 3 "name: $CFG_NAME" 1.674 +verbose 3 "summary: $CFG_SUMMARY" 1.675 +verbose 3 "packager: $CFG_PACKAGER" 1.676 +verbose 3 "version: $CFG_VERSION" 1.677 +verbose 3 "release: $CFG_RELEASE" 1.678 + 1.679 +# determine target parameters 1.680 +if [ ".$CF_prefix" = . ]; then 1.681 + die "OpenPKG Framework parameter \"prefix\" required" 1.682 +fi 1.683 +prefix="$CF_prefix" 1.684 +if [ ".$CF_tag" = . ]; then 1.685 + die "OpenPKG Framework parameter \"tag\" required" 1.686 +fi 1.687 +tag="$CF_tag" 1.688 +shtool="$opt_t/$CFG_NAME-$CFG_VERSION-$CFG_RELEASE.shtool.sh" 1.689 +sed <$0 -e '1,/^## SHTOOL ##.*/d' >$shtool 1.690 +platform=`sh $shtool platform -n -L -S "" -C "+" -F '%<ap>-%<sp>'` 1.691 +verbose 3 "platform: $platform" 1.692 +verbose 3 "tag: $tag" 1.693 +verbose 3 "prefix: $prefix" 1.694 + 1.695 +# determine operation directories 1.696 +srcdir="$opt_s" 1.697 +if [ ".$srcdir" = . ]; then 1.698 + srcdir="$CFG_NAME-$CFG_VERSION-$CFG_RELEASE.src.d" 1.699 +fi 1.700 +tmpdir="$opt_t/$CFG_NAME-$CFG_VERSION-$CFG_RELEASE.d" 1.701 +if [ ! -d "$tmpdir" ]; then 1.702 + ( umask 077 1.703 + rm -rf "$tmpdir" >/dev/null 2>&1 || true 1.704 + sh $shtool mkdir -p -m 700 "$tmpdir" >/dev/null 2>&1 1.705 + if [ $? -ne 0 ]; then 1.706 + die "failed to create temporary directory: \"$tmpdir\"" 1.707 + fi 1.708 + ) || exit $? 1.709 +fi 1.710 +outdir="$opt_o" 1.711 +if [ ".$outdir" = . ]; then 1.712 + if [ ".$CFG_UNVERSIONED" = .yes ]; then 1.713 + outdir="$CFG_NAME.$platform-$tag.d" 1.714 + else 1.715 + outdir="$CFG_NAME-$CFG_VERSION-$CFG_RELEASE.$platform-$tag.d" 1.716 + fi 1.717 +fi 1.718 +if [ ! -d "$outdir" ]; then 1.719 + sh $shtool mkdir -p -m 755 "$outdir" >/dev/null 2>&1 1.720 + if [ $? -ne 0 ]; then 1.721 + die "failed to create output directory: \"$outdir\"" 1.722 + fi 1.723 +fi 1.724 +verbose 3 "srcdir: $srcdir" 1.725 +verbose 3 "outdir: $outdir" 1.726 +verbose 3 "tmpdir: $tmpdir" 1.727 + 1.728 +# execute prolog script 1.729 +if [ ".@HAVE_PROLOG@" = .yes ]; then 1.730 + verbose 2 "execute prolog script" 1.731 + cat >$tmpdir/prolog.sh <<EOT 1.732 +#!/bin/sh 1.733 +#![OpenPKG] 1.734 +# %prolog 1.735 +EOT 1.736 + $opt_S sh $tmpdir/prolog.sh 1.737 + rm -f $tmpdir/prolog.sh 1.738 +fi 1.739 + 1.740 +if [ $opt_c -le 1 -a -x "$prefix/bin/openpkg" ]; then 1.741 + # optionally fresh-up OpenPKG instance 1.742 + pkgs=`$prefix/bin/openpkg rpm -qa | egrep -v '^(openpkg-[0-9]|gpg-pubkey-)'` 1.743 + if [ ".$pkgs" != . ]; then 1.744 + verbose 2 "uninstall already installed OpenPKG packages" 1.745 + for pkg in $pkgs; do 1.746 + verbose 3 "REMOVE: $pkg @ $prefix" 1.747 + done 1.748 + $opt_S $prefix/bin/openpkg rpm -e $pkgs || \ 1.749 + die "failed to uninstall already installed OpenPKG packages" 1.750 + fi 1.751 +fi 1.752 +if [ $opt_c -le 0 -a -x "$prefix/bin/openpkg" ]; then 1.753 + # optionally destroy OpenPKG instance 1.754 + verbose 2 "destroy existing OpenPKG framework" 1.755 + $opt_S $prefix/bin/openpkg rpm -e openpkg || \ 1.756 + die "failed to destroy existing OpenPKG framework" 1.757 +fi 1.758 + 1.759 +# check whether an already existing OpenPKG instance can be reused 1.760 +if [ -x "$prefix/bin/openpkg" ]; then 1.761 + verbose 2 "checking compatibility of existing OpenPKG framework" 1.762 + for name in $params; do 1.763 + case "$name" in 1.764 + user|group ) continue ;; 1.765 + esac 1.766 + eval "value_required=\"\$CF_$name\"" 1.767 + if [ ".$value_required" != . ]; then 1.768 + value_existing=`$prefix/bin/openpkg rpm --eval "%{l_${name}}"` 1.769 + if [ ".$value_existing" != ".$value_required" ]; then 1.770 + die "conflict on parameter \"$name\": value required: \"$value_required\", value existing: \"$value_existing\"" 1.771 + fi 1.772 + fi 1.773 + done 1.774 +fi 1.775 + 1.776 +# install or upgrade all packages 1.777 +verbose 2 "install or upgrade all OpenPKG packages" 1.778 +DIFS="$IFS" 1.779 +OIFS="$IFS"; IFS=" 1.780 +" 1.781 +for spec in $CFG_PACKAGES; do 1.782 + # determine information 1.783 + pkg=`echo "$spec" | sed -e 's;^\([^ ]*\).*$;\1;'` 1.784 + opts=`echo "$spec" | sed -e 's;^[^ ]*;;' -e 's;^ *;;'` 1.785 + name=`echo "$pkg" | sed -e 's;^\(.*\)-[^-][^-]*-[^-][^-]*$;\1;'` 1.786 + version=`echo "$pkg" | sed -e 's;^.*-\([^-][^-]*\)-[^-][^-]*$;\1;'` 1.787 + release=`echo "$pkg" | sed -e 's;^.*-[^-][^-]*-\([^-][^-]*\)$;\1;'` 1.788 + 1.789 + if [ ".$name" = .openpkg ]; then 1.790 + # 1.791 + # OpenPKG Framework 1.792 + # 1.793 + if [ ! -f "$outdir/$pkg.$platform-$tag.sh" \ 1.794 + -o ! -f "$outdir/$pkg.$platform-$tag.rpm" ]; then 1.795 + # build (bootstrap & regular) 1.796 + verbose 3 "BOOTSTRAP-BUILD: $srcdir/$pkg.src.sh" 1.797 + verbose 4 "options: $CFG_FRAMEWORK" 1.798 + if [ ! -f "$srcdir/$pkg.src.sh" ]; then 1.799 + die "source shell package not existing: $srcdir/$pkg.src.sh" 1.800 + fi 1.801 + ( TMPDIR="$tmpdir" 1.802 + srcdir="`cd $srcdir && pwd`" 1.803 + cd "$outdir" || exit $? 1.804 + cmd="sh \"$srcdir/$pkg.src.sh\" $CFG_FRAMEWORK" 1.805 + if [ $opt_v -lt 4 ]; then cmd="$cmd >/dev/null 2>&1"; fi 1.806 + eval "$cmd" || \ 1.807 + die "failed to build package \"$srcdir/$pkg.src.sh\"" 1.808 + rm -f $pkg.src.rpm 1.809 + ) || exit $? 1.810 + fi 1.811 + if [ ! -x "$prefix/bin/openpkg" ]; then 1.812 + # install (bootstrap) 1.813 + if [ ! -f "$outdir/$pkg.$platform-$tag.sh" ]; then 1.814 + die "binary shell package not existing: $outdir/$pkg.$platform-$tag.sh" 1.815 + fi 1.816 + verbose 3 "BOOTSTRAP-INSTALL: $outdir/$pkg.$platform-$tag.sh" 1.817 + cmd="$opt_S sh \"$outdir/$pkg.$platform-$tag.sh\"" 1.818 + if [ $opt_v -lt 4 ]; then cmd="$cmd >/dev/null 2>&1"; fi 1.819 + eval "$cmd" || \ 1.820 + die "failed to install package \"$outdir/$pkg.$platform-$tag.sh\"" 1.821 + else 1.822 + check=`$prefix/bin/openpkg rpm -q openpkg 2>/dev/null` 1.823 + if [ ".$check" != ".$pkg" ]; then 1.824 + # upgrade (regular) 1.825 + if [ ! -f "$outdir/$pkg.$platform-$tag.rpm" ]; then 1.826 + die "binary RPM package not existing: $outdir/$pkg.$platform-$tag.rpm" 1.827 + fi 1.828 + verbose 3 "UPGRADE: $outdir/$pkg.$platform-$tag.rpm" 1.829 + rpm_opt="-U"; if [ $opt_v -ge 4 ]; then rpm_opt="${rpm_opt}vh"; fi 1.830 + $opt_S $prefix/bin/openpkg rpm $rpm_opt \ 1.831 + $outdir/$pkg.$platform-$tag.rpm || \ 1.832 + die "failed to upgrade package: $outdir/$pkg.$platform-$tag.rpm" 1.833 + else 1.834 + # keep as-is 1.835 + verbose 3 "KEEP AS-IS: $pkg @ $prefix" 1.836 + fi 1.837 + fi 1.838 + else 1.839 + # 1.840 + # OpenPKG Packages 1.841 + # 1.842 + if [ ! -x "$prefix/bin/openpkg" ]; then 1.843 + # usually will not happen because of correctly 1.844 + # generated topologically correct package list 1.845 + die "command \"$prefix/bin/openpkg\" has to exit for building a regular OpenPKG package" 1>&2 1.846 + fi 1.847 + if [ ! -f $outdir/$pkg.$platform-$tag.rpm ]; then 1.848 + # build (regular) 1.849 + if [ ! -f "$srcdir/$pkg.src.rpm" ]; then 1.850 + die "source RPM package not existing: $srcdir/$pkg.src.rpm" 1.851 + fi 1.852 + verbose 3 "BUILD: $srcdir/$pkg.src.rpm" 1.853 + if [ ".$opts" != . ]; then 1.854 + verbose 4 "options: $opts" 1.855 + fi 1.856 + rm -rf "$tmpdir/$pkg" >/dev/null 2>&1 || true 1.857 + sh $shtool mkdir -p -m 755 "$tmpdir/$pkg" >/dev/null 2>&1 1.858 + cmd="$prefix/bin/openpkg --keep-privileges" 1.859 + cmd="$cmd rpm --rebuild" 1.860 + cmd="$cmd --define \"_specdir $tmpdir/$pkg\"" 1.861 + cmd="$cmd --define \"_sourcedir $tmpdir/$pkg\"" 1.862 + cmd="$cmd --define \"_builddir $tmpdir/$pkg\"" 1.863 + cmd="$cmd --define \"_tmppath $tmpdir/$pkg\"" 1.864 + cmd="$cmd --define \"_srcrpmdir $tmpdir/$pkg\"" 1.865 + cmd="$cmd --define \"_rpmdir $outdir\"" 1.866 + OIFS2="$IFS"; IFS="$DIFS" 1.867 + for opt in $opts; do 1.868 + opt_name=`echo "$opt" | sed -e 's;^\([^=]*\)=.*$;\1;'` 1.869 + opt_value=`echo "$opt" | sed -e 's;^[^=]*=\(.*\)$;\1;'` 1.870 + cmd="$cmd --define \"$opt_name $opt_value\"" 1.871 + done 1.872 + IFS="$OIFS2" 1.873 + cmd="$cmd $srcdir/$pkg.src.rpm" 1.874 + if [ $opt_v -lt 4 ]; then cmd="$cmd >/dev/null 2>&1"; fi 1.875 + eval "$cmd" || \ 1.876 + die "failed to build package \"$srcdir/$pkg.src.rpm\"" 1.877 + fi 1.878 + check=`$prefix/bin/openpkg rpm -q "$name" 2>/dev/null` 1.879 + if [ ".$check" = ".package $name is not installed" ]; then 1.880 + # install (regular) 1.881 + if [ ! -f "$outdir/$pkg.$platform-$tag.rpm" ]; then 1.882 + die "binary RPM package not existing: $outdir/$pkg.$platform-$tag.rpm" 1.883 + fi 1.884 + verbose 3 "INSTALL: $outdir/$pkg.$platform-$tag.rpm" 1.885 + rpm_opt="-i"; if [ $opt_v -ge 4 ]; then rpm_opt="${rpm_opt}vh"; fi 1.886 + $opt_S $prefix/bin/openpkg rpm $rpm_opt \ 1.887 + $outdir/$pkg.$platform-$tag.rpm || \ 1.888 + die "failed to install package: $outdir/$pkg.$platform-$tag.rpm" 1.889 + elif [ ".$check" != ".$pkg" ]; then 1.890 + # upgrade (regular) 1.891 + if [ ! -f "$outdir/$pkg.$platform-$tag.rpm" ]; then 1.892 + die "binary RPM package not existing: $outdir/$pkg.$platform-$tag.rpm" 1.893 + fi 1.894 + verbose 3 "UPGRADE: $outdir/$pkg.$platform-$tag.rpm" 1.895 + rpm_opt="-U"; if [ $opt_v -ge 4 ]; then rpm_opt="${rpm_opt}vh"; fi 1.896 + $opt_S $prefix/bin/openpkg rpm $rpm_opt \ 1.897 + $outdir/$pkg.$platform-$tag.rpm || \ 1.898 + die "failed to upgrade package: $outdir/$pkg.$platform-$tag.rpm" 1.899 + else 1.900 + # keep as-is 1.901 + verbose 3 "KEEP AS-IS: $pkg @ $prefix" 1.902 + fi 1.903 + fi 1.904 +done 1.905 +IFS="$OIFS" 1.906 + 1.907 +# optionally remove residue packages from binary RPM package directory 1.908 +if [ $opt_c -lt 3 ]; then 1.909 + verbose 2 "cleanup target directory from residue packages" 1.910 + for pkg in $outdir/*.sh $outdir/*.rpm; do 1.911 + if [ ! -f "$pkg" ]; then 1.912 + continue 1.913 + fi 1.914 + pkg_base=`echo "$pkg" | sed -e 's;^.*/\([^/][^/]*-[0-9][^/-]*-[0-9][0-9.]*\)\.[^/][^/]*$;\1;'` 1.915 + erase=yes 1.916 + for spec in $CFG_PACKAGES; do 1.917 + spec_base=`echo "$spec" | sed -e 's;^\(.*-[^-][^-]*-[^-][^-]*\).*$;\1;'` 1.918 + if [ ".$pkg_base" = ".$spec_base" ]; then 1.919 + erase=no 1.920 + break 1.921 + fi 1.922 + done 1.923 + if [ ".$erase" = .yes ]; then 1.924 + verbose 3 "REMOVE: $pkg" 1.925 + rm -f "$pkg" 1.926 + fi 1.927 + done 1.928 +fi 1.929 + 1.930 +# optionally remove residue packages from OpenPKG instance 1.931 +if [ $opt_c -lt 3 ]; then 1.932 + verbose 2 "cleanup OpenPKG instance from residue packages" 1.933 + for pkg1 in `$prefix/bin/openpkg rpm -qa | egrep -v '^(openpkg-[0-9]|gpg-pubkey-)'`; do 1.934 + name1=`echo "$pkg1" | sed -e 's;^\(.*\)-[^-][^-]*-[^-][^-]*$;\1;'` 1.935 + erase=yes 1.936 + for spec in $CFG_PACKAGES; do 1.937 + name2=`echo "$spec" | sed -e 's;^\(.*\)-[^-][^-]*-[^-][^-]*.*$;\1;'` 1.938 + if [ ".$name1" = ".$name2" ]; then 1.939 + erase=no 1.940 + break 1.941 + fi 1.942 + done 1.943 + if [ ".$erase" = .yes ]; then 1.944 + verbose 3 "REMOVE: pkg1 @ $prefix" 1.945 + $opt_S $prefix/bin/openpkg rpm -e "$pkg1" || \ 1.946 + die "failed to erase residue package \"$pkg1\"" 1.947 + fi 1.948 + done 1.949 +fi 1.950 + 1.951 +# execute epilog script 1.952 +if [ ".@HAVE_EPILOG@" = .yes ]; then 1.953 + verbose 2 "execute epilog script" 1.954 + cat >$tmpdir/epilog.sh <<EOT 1.955 +#!/bin/sh 1.956 +#![OpenPKG] 1.957 +# %epilog 1.958 +EOT 1.959 + $opt_S sh $tmpdir/epilog.sh 1.960 + rm -f $tmpdir/epilog.sh 1.961 +fi 1.962 + 1.963 +# cleanup 1.964 +rm -f $shtool >/dev/null 3>&1 || true 1.965 +rm -rf $tmpdir >/dev/null 2>&1 || true 1.966 + 1.967 +exit 0 1.968 + 1.969 +## SHTOOL ################################################################### 1.970 +