Author: sparky
Date: Sun Dec  6 15:32:28 2009
New Revision: 11006

Added:
   toys/tools/cleanbuild/build   (contents, props changed)
   toys/tools/cleanbuild/clean   (contents, props changed)
   toys/tools/cleanbuild/cleanbuild   (contents, props changed)
   toys/tools/cleanbuild/cleaninstall   (contents, props changed)
   toys/tools/cleanbuild/install   (contents, props changed)
Log:
- NEW
-- cleanbuild: create new chroot and build package inside
-- build: build package inside existing chroot
-- clean: remove chroot
-- install: install packages inside existing chroot
-- cleaninstall: create new chroot and install packages


Added: toys/tools/cleanbuild/build
==============================================================================
--- (empty file)
+++ toys/tools/cleanbuild/build Sun Dec  6 15:32:28 2009
@@ -0,0 +1 @@
+link cleanbuild
\ No newline at end of file

Added: toys/tools/cleanbuild/clean
==============================================================================
--- (empty file)
+++ toys/tools/cleanbuild/clean Sun Dec  6 15:32:28 2009
@@ -0,0 +1 @@
+link cleanbuild
\ No newline at end of file

Added: toys/tools/cleanbuild/cleanbuild
==============================================================================
--- (empty file)
+++ toys/tools/cleanbuild/cleanbuild    Sun Dec  6 15:32:28 2009
@@ -0,0 +1,405 @@
+#!/usr/bin/sudo /bin/sh
+
+USER="sparky"
+RPMS_FROM="$HOME/rpm/cleanRPMS.repo"
+DEST="th"
+SRC="-n th -n th-ready"
+SUFFIX=""
+CACHEDIR="$PWD/poldekcache"
+
+[ -r .cleanbuildrc ] && . .cleanbuildrc
+
+export LC_ALL=C
+unset LANGUAGE
+unset LANG
+
+usage() {
+       [ $# -gt 0 ] && echo "$*"
+       echo "Usage:"
+       echo "  ./cleanbuild [cleanbuild options] specname [builder options]"
+       echo "  ./build [cleanbuild options] specname [builder options]"
+       echo "  ./clean [cleanbuild options]"
+       echo "  ./cleaninstall [cleanbuild options] packages"
+       echo "  ./install [cleanbuild options] packages"
+       echo ""
+       echo "cleanbuild options:"
+       echo " -32, -64, -th-i486  - select architecture"
+       echo " -a, -b, -c, -d      - select chroot directory"
+       exit 1
+}
+
+FETCH=false
+CLEAN=false
+BUILD=false
+INSTALL=false
+CLEANAFTER=false
+
+case "$0" in
+       *cleanbuild)
+               FETCH=true
+               CLEAN=true
+               BUILD=true
+               ;;
+       *clean)
+               CLEAN=true
+               ;;
+       *build)
+               BUILD=true
+               ;;
+       *cleaninstall)
+               CLEAN=true
+               INSTALL=true
+               ;;
+       *install)
+               INSTALL=true
+               ;;
+       *)
+               usage
+               ;;
+esac
+
+while [ $# -gt 0 ]; do
+       OPT="${1}"
+       case "$OPT" in
+               -32)    OPT="-th-i686" ;;
+               -64)    OPT="-th-x86_64" ;;
+               -th-32) OPT="-th-i686" ;;
+               -th-64) OPT="-th-x86_64" ;;
+               -ac)    OPT="-ac-amd64" ;;
+               -ac-32) OPT="-ac-i586" ;;
+               -ac-64) OPT="-ac-amd64" ;;
+       esac
+
+       V="${OPT#-}"
+       case "$OPT" in
+               -th-i[46]86 | -th-x86_64)
+                       DEST="$V"
+                       SRC="-n $V -n $V-ready -n th-noarch -n th-noarch-ready"
+                       ;;
+               -ac-amd64 | -ac-i[356]86 | -ac-athlon)
+                       DEST="$V"
+                       SRC="-n $V"
+                       ;;
+               -cleanafter | -ca)
+                       CLEANAFTER=true
+                       ;;
+               -[a-z])
+                       SUFFIX="$OPT"
+                       ;;
+               -~*)
+                       SUFFIX="$V"
+                       ;;
+               *)
+                       break
+                       ;;
+       esac
+       shift
+done
+
+if $BUILD; then
+       [ $# -ne 0 ] || usage
+       build_pkg="${1}"
+       shift
+
+       builder_options="$*"
+fi
+
+warn() {
+       echo -n -e "\033[31;1m" >&2
+       echo -n "$*" >&2
+       echo -e "\033[0m" >&2
+}
+die() {
+       code=$1
+       shift
+       warn "$*"
+       exit $code
+}
+info() {
+       echo -n -e "\033[32m"
+       echo -n "$*"
+       echo -e "\033[0m"
+}
+title() {
+       [ -t 1 ] || return 0
+       local msg="$CHNAME: $build_pkg: $*"
+       case "$TERM" in
+               cygwin|xterm*)
+                       echo -ne "\033]1;$msg\007\033]2;$msg\007" >&2
+                       ;;
+               screen*)
+                       echo -ne "\033]0;$msg\007" >&2
+                       ;;
+       esac
+       return 0
+}
+
+
+CHNAME="chroot-$DEST$SUFFIX"
+CHDIR="$PWD/$CHNAME"
+
+check_running() {
+       [ -r "$CHDIR/.pid" ] || return
+       PID=$(< "$CHDIR/.pid")
+       if [ -d /proc/$PID ]; then
+               die 10 "Another process ($PID) already running in $CHNAME"
+       fi
+}
+
+check_running
+
+for D in installed buildlogs $CACHEDIR; do
+       if [ ! -d "$D" ]; then
+               echo "mkdir $D"
+               su $USER -c "mkdir -p $D" || die 13 "Cannot create work 
directories"
+       fi
+done
+
+if $FETCH; then
+       info "Fetching $build_pkg"
+       title "fetch"
+       su $USER -c "$HOME/rpm/packages/builder -g $build_pkg $builder_options" 
\
+               || die 11 "Fetch failed"
+fi
+
+poldek_options="-O keep_downloads=yes -O suggests=no -O 
ignore=vserver-packages -O unique_package_names=yes -O particle_install=no"
+
+IGNORE=""
+ignore() { IGNORE="$IGNORE $*"; }
+ignore \
+       vserver-packages \
+       upstart\* \
+       xorg-driver-video-fglrx\* xorg-driver-video-nvidia\* 
xorg-xserver-xgl-libGL \
+       xorg-data-xbitmaps \
+       compat-gcc\* \
+       libpng1\* \
+       anacron fcron hc-cron \
+       masqmail msmtp-sendmail omta postfix sendmail ssmtp nail-mail 
nullmailer \
+       ghostscript-esp \
+       \*-multilib-\* \
+       stfl-python \
+       perl-PathTools perl-MIME-Base64 \
+       gnome-speech-driver-festival gnome-speech-driver-speech-dispatcher \
+       phonon-backend-xine \
+       xemacs-extras \
+       freetype1-devel \
+       kde-icons-actions kipi-plugins \
+       gnome-menus \
+       java-sun-jre
+
+
+rebuilddb() {
+       rpm --root=$CHDIR --rebuilddb
+}
+
+poldek() {
+       rebuilddb
+       /usr/bin/poldek $SRC -s "$RPMS_FROM" -r "$CHDIR" "--cachedir=$CACHEDIR" 
$poldek_options "$@"
+}
+
+
+CHHOME="/home/users/$USER"
+
+#set -x
+
+build_umount() {
+       for DIR in $CHHOME/rpm $CHHOME dev proc sys; do
+               [ -d $CHDIR/$DIR ] && umount $CHDIR/$DIR
+       done
+}
+
+build_remove_root() {
+       umount $CHDIR
+       rmdir $CHDIR
+}
+
+check_running
+
+clean() {
+       info "Cleaning $CHNAME"
+       build_umount
+       build_remove_root
+       title "clean"
+}
+
+$CLEAN && clean
+
+build_prepare_root() {
+       set -e
+       mkdir $CHDIR
+       mount -t tmpfs -o size=8G /dev/null $CHDIR
+       echo $$ > $CHDIR/.pid
+
+       rpm --root=$CHDIR --initdb 
+       poldek --up || :
+       poldek --noask -u FHS
+       poldek --noask -u libstdc++
+       poldek --noask -u rpm-build
+       poldek --upgrade-dist
+
+
+       for DIR in dev proc sys; do
+               mount -o bind /$DIR $CHDIR/$DIR
+       done
+
+       chroot $CHDIR useradd -m $USER
+       cp -a $CHDIR/$CHHOME/{tmp,rpm}
+       cp -a $CHDIR/$CHHOME/tmp $CHDIR/BUILD
+       cp -a $CHDIR/$CHHOME/{.bashrc,.rpmmacros}
+       cat <<-'EOM' > $CHDIR/$CHHOME/.rpmmacros
+       %_builddir              /BUILD
+       %buildroot              %{_builddir}/%{name}-%{version}-root-%(id -u -n)
+       %_rpmdir                %{_topdir}/cleanRPMS
+       %distribution   CleanPLD
+       %_binary_payload        w1.gzdio
+EOM
+       cat <<-'EORC' > $CHDIR/$CHHOME/.builderrc
+       TITLECHANGE=no
+EORC
+       set +e
+}
+
+build_mount_home() {
+       mount -o bind $HOME/rpm $CHDIR/$CHHOME/rpm
+}
+
+if ! $BUILD && ! $INSTALL; then
+       exit
+fi
+
+if $CLEAN; then
+       su $USER -c "poldek -s $RPMS_FROM --mkidx"
+
+       # rm -f installed/$build_pkg
+
+       info "Preparing $CHNAME"
+       build_prepare_root
+       build_mount_home
+fi
+
+echo $$ > $CHDIR/.pid
+
+print_installed() {
+       echo=$1
+       if [ -r installed/$build_pkg ]; then
+               $echo "$(cat installed/$build_pkg | awk '{print $1}' | sort -u \
+                       | awk '{br=br ", " $1} END{gsub(/^, /, "- BR: ", br ); 
print br}')"
+               cat installed/$build_pkg
+       fi
+}
+
+addlist() {
+       LIST="$1"
+
+       print_installed info
+       echo "*** $build_pkg $(date --rfc-3339=seconds) ***" >> $LIST
+       print_installed echo >> $LIST
+}
+
+builddie() {
+       LIST="$1"; shift
+       CODE="$1"; shift
+       MSG="$*"
+
+       $CLEANAFTER && clean
+       title "failed !"
+
+       addlist "ERROR_$LIST"
+       die $CODE "$MSG"
+}
+
+LAST_INSTALL=""
+poldek_install() {
+       I="$1";
+       # Nothing to install
+       [ -n "$I" ] || return 1
+       # Installing same packets second time
+       [ "$LAST_INSTALL" != "$I" ] || return 1
+       LAST_INSTALL="$I"
+
+       info "Installing" $I
+       poldek -O "ignore=$IGNORE" -u $I | tee $$.poldek_install
+       ret=
+       if grep -q "Preparing...                
##################################################" $$.poldek_install \
+                       && ! grep -q "file .* from install of .* conflicts with 
file from package" $$.poldek_install
+               then
+               info "Poldek:" $I "installed"
+               ret=0
+       elif grep -q "Nothing to do" $$.poldek_install; then
+               warn "Poldek:" $I "installed already"
+               ret=1
+       fi
+       rm $$.poldek_install
+       [ -n "$ret" ] && return $ret
+
+       # try harder
+       poldek -u $I && return 0
+       poldek -u $I && return 0
+       warn "Poldek:" "Could not install" $I
+       return 1
+}
+
+if $INSTALL; then
+       poldek_install "$*"
+       exit
+fi
+
+while true; do
+       info "Building $build_pkg in $CHNAME"
+       rebuilddb
+       buildlog="buildlogs/$build_pkg"
+       if [ -r $buildlog ]; then
+               i=1
+               while [ -r $buildlog.$i ]; do
+                       i=$((i+1))
+               done
+               info "moving $buildlog to $buildlog.$i"
+               mv $buildlog $buildlog.$i
+       fi
+       title "building"
+       { chroot $CHDIR su $USER -c "$CHHOME/rpm/packages/builder -nn -bb 
$build_pkg $builder_options" 2>&1; echo $? > ecode; } | tee $buildlog
+
+       ECODE=$(< ecode)
+       rm -f ecode
+
+       if grep -q "error: Failed build dependencies:" $buildlog; then
+               SEARCH=$(cat $buildlog | awk '/^Error:/ { p = 0 }; { if ( p ) { 
f="p"; if ( $1 ~ /^\// ) f="f"; printf "search -%c %s; ", f, $1; } }; /error: 
Failed build dependencies:/ { p = 1 }')
+               INSTALL=$(poldek -O "ignore=$IGNORE" --shcmd="$SEARCH" | awk '{ 
if ( p ) { print; p = 0; } } / package\(s\) found:$/ { p = 1 }' | sed 
's/^\(.*\)-.*-.*$/\1/' | sort -u)
+
+               if poldek_install "$INSTALL"; then
+                       info "Deps installed"
+                       continue
+               else
+                       addlist ERROR_BRINSTALL
+                       die 4 "Cannot install BRs"
+               fi
+       fi
+
+       ./findbr $CHDIR/BUILD $buildlog > $$.installed
+       installed_something=false
+       while read pkg msg; do
+               if poldek_install $pkg; then
+                       info "findbr:" $pkg "installed"
+                       echo "$pkg $msg" >> installed/$build_pkg
+                       ./addbr $build_pkg "$pkg" "$msg"
+                       installed_something=true
+               else
+                       warn "findbr:" $pkg "not installed"
+               fi
+       done < $$.installed
+       rm -f $$.installed
+       $installed_something && continue
+
+       if [ $ECODE -eq 0 ]; then
+               $CLEANAFTER && clean
+               addlist BUILT_OK
+               info "$build_pkg built OK !"
+               title "OK !"
+               exit 0
+       else
+               builddie UNKNOWN 1 "Got error but dunno what to do !"
+       fi
+done
+
+
+# vim: ts=4 sw=4 filetype=sh

Added: toys/tools/cleanbuild/cleaninstall
==============================================================================
--- (empty file)
+++ toys/tools/cleanbuild/cleaninstall  Sun Dec  6 15:32:28 2009
@@ -0,0 +1 @@
+link cleanbuild
\ No newline at end of file

Added: toys/tools/cleanbuild/install
==============================================================================
--- (empty file)
+++ toys/tools/cleanbuild/install       Sun Dec  6 15:32:28 2009
@@ -0,0 +1 @@
+link cleanbuild
\ No newline at end of file
_______________________________________________
pld-cvs-commit mailing list
[email protected]
http://lists.pld-linux.org/mailman/listinfo/pld-cvs-commit

Reply via email to