|
|
#!/bin/bash # --- SDE-COPYRIGHT-NOTE-BEGIN --- # This copyright note is auto-generated by ./scripts/Create-CopyPatch. # # Filename: scripts/Emerge-Pkg # Copyright (C) 2006 - 2011 The OpenSDE Project # Copyright (C) 2004 - 2006 The T2 SDE Project # # More information can be found in the files COPYING and README. # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; version 2 of the License. A copy of the # GNU General Public License can be found in the file COPYING. # --- SDE-COPYRIGHT-NOTE-END ---
exec 2>&1
blacklist=" fhs binutils gcc glibc uclibc linux24 linux linux-header "
options= config=default deps=fast debug=0 downloadonly=0 verbose=1 ignore_chksum=1 update=1 dryrun=0 force=0 rebuild=1 repositories= system=0 depth=0
# # ---- Functions #
. lib/functions.in
help_msg() { spacer=" " echo echo "Usage: Emerge-Pkg [ -cfg <config> ] [ -dry-run ] [ -force ] [ -noupdate ]" echo "$spacer [ -consider-chksum ] [ -norebuild ]" echo "$spacer [ -deps=none|fast|indirect ] [ -download-only ]" echo "$spacer [ -repository repository-name ] [ -system ] [ pkg-name(s) ]" echo echo "pkg-name(s) are only optional if a repository is specified." echo }
# # ---- Parse options + config #
if [ $# = 0 ]; then help_msg exit 1 fi
while [ "$1" ] ; do case "$1" in -cfg) options="$options $1 $2" ; config="$2" ; shift ;; -deps=*) deps=${1/-deps=/} ;; -dry-run) dryrun=1 ;; -force) force=1 ;; -debug) debug=1 ;; -noupdate) update=0 ;; -consider-chksum) ignore_chksum=0 ;; -norebuild) rebuild=0 ;; -download-only) downloadonly=1 ;; -repository) repositories="$repositories $2" deps=none ; shift ;; -prefix) options="$options -prefix $2" ; shift ;; -system) system=1 ; deps=none ;; -*) help_msg ; exit 1 ;; *) break ;; esac shift done
. lib/parse-config
add_if_req() { [ "$verbose" = 1 ] && echo -n "$1"
if [ $depth != 0 -a "$blacklist" != "${blacklist/ $package /}" ]; then [ $verbose = 1 ] && echo " Automatic update avoided." else [ $verbose = 1 ] && echo " Added." var_append deplist " " "$package" [ $deps = indirect ] && dep4pkg "$package" fi }
add_if_updated() { local package=$1
# some variable name mangling ... local var=__BEEN_HERE_${package//-/_} var=${var//+/_} eval local x=\$$var if [ "$x" = 1 ]; then [ $debug = 1 ] && echo "already been at $package ..." return else eval $var=1 fi
[ $verbose = 1 ] && echo -n "checking $package ..." confdir= for x in package/*/$package/$package.desc; do if [ -f "$x" ]; then if [ "$confdir" ]; then echo " Error: Package in multiple trees!" return fi confdir=${x/$package.desc/} fi done if [ -z "$confdir" ]; then echo " Error: No such package." return fi
if [ ! -f /var/adm/packages/$package ]; then add_if_req ' Not installed.' return fi
o_ver=$(grep '^Package Name and Version' \ /var/adm/packages/$package | cut -f6 -d' ') n_ver=$(grep '^\[V\] ' $confdir/$package.desc | cut -f2 -d' ') if [ "$o_ver" != "$n_ver" -a "$n_ver" != "0000" ]; then add_if_req " New version ($o_ver -> $n_ver)." return fi
o_ck=$(grep '^\(ROCK Linux\|T2\|OpenSDE\) Package Source Checksum' \ /var/adm/packages/$package | sed 's,.*: ,,') n_ck=$( pkgchksum package/*/$package ) if [ $ignore_chksum = 0 -a "$o_ck" != "$n_ck" ]; then add_if_req " New source checksum." return fi
if [ -f /var/adm/cache/$package ] && grep -q '\[BUILDTIME\] .* ERROR' \ /var/adm/cache/$package; then [ $verbose = 1 ] && echo -n " Former build was broken." if [ $rebuild = 1 ]; then add_if_req '' else [ $verbose = 1 ] && echo " Skipped." fi return fi
if [ $force = 1 -a $depth = 0 ]; then add_if_req ' Build forced.' return fi
if [ $debug = 1 ]; then echo " Installed and up-to-date." else echo -ne \ "\r \r" fi }
dep4pkg() { : $(( depth++ )) for x in `grep '\[DEP\]' package/*/$1/$1.cache 2>/dev/null | cut -d ' ' -f 2`; do add_if_updated $x done : $(( depth-- )) }
# the remaining arguments are packages to be built for x in $*; do add_if_updated $x done
# packages from repositories for x in $repositories ; do for x in `egrep "^X .* $x .*" config/$config/packages | cut -d ' ' -f 5`; do add_if_updated $x done done
# all packages if a system update if [ $system -eq 1 ]; then for x in `grep "^X" config/$config/packages | cut -d ' ' -f 5`; do add_if_updated $x done fi
case $deps in fast|indirect) # we have to create a complete dependency graph ... tmp=`mktemp` for x in $deplist ; do dep4pkg $x done ;; none) ;; *) echo "Unknown dependency resolution mode. Valid are none and fast." exit 1 esac
# sort by priority deplist=`echo -n $deplist | tr '\n' ' ' | tr -s ' '` deplist=`grep "^. .* .* .* \\(${deplist// /\\|}\\) " \ config/$config/packages | sort -k 3 | cut -d ' ' -f 5 | tr '\n' ' '`
echo "Packages scheduled to build: ${deplist:-none}"
[ $dryrun = 1 ] && exit
# the deplist is quite unsorted (in alphabetically sorted chunks) # so we need to work arround this here ...
[ $update = 1 ] && options="$options -update"
. config/$config/config
for package in $deplist ; do if ./bin/sde-download $package ; then [ $downloadonly != 1 ] && \ if ! ./scripts/Build-Pkg $options $package; then if [ $SDECFG_CONTINUE_ON_ERROR_AFTER -gt 8 ]; then echo "Aborting further builds, check SDECFG_CONTINUE_ON_ERROR_AFTER." exit 1 fi fi else echo "The download for package $package failed!" exit 1 fi done
|