X-Git-Url: https://git.pld-linux.org/?a=blobdiff_plain;f=cleanbuild;h=498b5de6a68d6831175ed7f2f20cec6e176e5899;hb=e39bba153313883649838acbaa3b1b4ad68d64e9;hp=2a4ab1a61a94cf3241b1287e45315065f375b265;hpb=49e7169654568c673f8dc3c1a804b1000eb8f626;p=projects%2Fcleanbuild.git diff --git a/cleanbuild b/cleanbuild index 2a4ab1a..498b5de 100755 --- a/cleanbuild +++ b/cleanbuild @@ -1,484 +1,14 @@ -#!/usr/bin/sudo /bin/sh +#!/bin/sh +set -e -RPMS_FROM="$HOME/rpm/cleanRPMS.repo" -DEST="th" -SRC="-n th-x86_64-test" -SUFFIX="" -CACHEDIR="$PWD/poldekcache" -IGNORE="" -NODEBUG=true +program=$(readlink -f "$0") +dir=$(dirname "$program") -[ -r .cleanbuildrc ] && . ./.cleanbuildrc +cd "$dir" -[ -z "$USER" ] && echo "USER not defined" && exit 1 -[ "$USER" == "root" ] && echo "USER must not be root" && exit 1 +[ -r .cleanbuildrc ] && . .cleanbuildrc -export LC_ALL=C -unset LANGUAGE -unset LANG +# backend to use: vserver or docker +BACKEND=${BACKEND:-docker} -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 " ./create [cleanbuild options]" - 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 -CREATE=false -BUILD=false -INSTALL=false -CLEANAFTER=false - -case "$0" in - *clean) - CLEAN=exit_after - ;; - *cleanbuild) - FETCH=true - CLEAN=true - CREATE=true - BUILD=true - ;; - *build) - CREATE=true - BUILD=true - ;; - *create) - CLEAN=true - CREATE=exit_after - ;; - *install) - CREATE=true - INSTALL=exit_after - ;; - *) - 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" ;; - -ti-32) OPT="-ti-i686" ;; - -ti-64) OPT="-ti-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-ready" - ;; - -th-i[46]86-test | -th-x86_64-test) - DEST="$V" - SRC="-n $V" - ;; - -ti-i[56]86 | -ti-x86_64) - DEST="$V" - SRC="-n $V-ready" - ;; - -ti-i[56]86-test | -ti-x86_64-test) - DEST="$V" - SRC="-n $V" - ;; - -ac-amd64 | -ac-i[356]86 | -ac-athlon) - DEST="$V" - SRC="-n $V-ready" - ;; - --cleanafter | -ca) - CLEANAFTER=true - ;; - --debug) - NODEBUG=false - ;; - -[a-z]) - SUFFIX="$OPT" - ;; - -~*) - SUFFIX="$V" - ;; - *) - break - ;; - esac - shift -done - -if $BUILD; then - [ $# -ne 0 ] || usage - build_pkg="${1}" - shift - - builder_options="$*" -fi - -$NODEBUG || set -x - -CHNAME="chroot-$DEST$SUFFIX" -CHDIR="$PWD/$CHNAME" -CHHOME="/home/users/$USER" - -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 -} - -exit_after() -{ - return 0; -} - -check_running() -{ - [ -r "$CHDIR/.pid" ] || return - PID=$(< "$CHDIR/.pid") - if [ -d /proc/$PID ]; then - die 10 "Another process ($PID) already running in $CHNAME" - fi -} - -for D in installed buildlogs $CACHEDIR; do - if [ ! -d "$D" ]; then - info "mkdir $D" - su $USER -c "mkdir -p $D" || die 13 "Cannot create work directories" - fi -done - -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-gcj-\* libgcj -# java-sun-jre - - -rebuilddb() -{ - #rpm --root=$CHDIR --rebuilddb -} - -poldek() -{ - $NODEBUG || set -x - rebuilddb - /usr/bin/poldek $SRC -s "$RPMS_FROM" -r "$CHDIR" "--cachedir=$CACHEDIR" --conf=$PWD/poldekconf/poldek.conf "$@" -} - - -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 -} - -clean() -{ - info "Cleaning $CHNAME" - title "cleaning chroot" - build_umount - build_remove_root -} - -build_prepare_root() -{ - title "preparing chroot" - set -e - $NODEBUG || set -x - mkdir $CHDIR - mount -t tmpfs -o size=8G,relatime /dev/null $CHDIR - echo $$ > $CHDIR/.pid - - rpm --root=$CHDIR --initdb - poldek --up || : - poldek -O "ignore=$IGNORE" -u rpm-build pwdutils coreutils - - for DIR in dev proc sys; do - # We need to create these directories manually, because they are marked - # as netsharedpath in cleanbuild poldek.conf - mkdir $CHDIR/$DIR - mount -o bind /$DIR $CHDIR/$DIR - done - - chroot $CHDIR useradd -m $USER -u$(getent passwd $USER | cut -d: -f3) - - # replicate files which already belong to $USER - # so they will have correct owner and permissions - 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) - %_rpmdirname cleanRPMS - %_rpmdir %{expand:%%global _rpmdir %([ -d %{_topdir}/../%{_rpmdirname} ] && (cd %{_topdir}/../%{_rpmdirname}; pwd) || echo %{_topdir}/%{_rpmdirname})}%_rpmdir - %distribution CleanPLD - %_binary_payload w1.gzdio - #%_smp_mflags -j4 -EOM - - cp -a $CHDIR/$CHHOME/{.bashrc,.builderrc} - cat <<-'EORC' > $CHDIR/$CHHOME/.builderrc - TITLECHANGE=no -EORC - set +e -} - -build_mount_home() -{ - $NODEBUG || set -x - mount -o bind $HOME/rpm $CHDIR/$CHHOME/rpm -} - - -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 - - return - echo "*** $build_pkg $(date --rfc-3339=seconds) ***" >> $LIST - print_installed echo >> $LIST -} - -builddie() -{ - LIST="$1"; shift - CODE="$1"; shift - MSG="$*" - - rm -f $CHDIR/.pid - - $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 -} - -maybe_call() -{ - local cond="$1"; shift - local func="$1"; shift - - [ $cond == "false" ] && return - $func "$@" - [ $cond == "exit_after" ] && exit -} - -fetch() -{ - info "Fetching $build_pkg" - title "fetch" - $NODEBUG || set -x - su $USER -c "$HOME/rpm/packages/builder -g $build_pkg $builder_options" \ - || die 11 "Fetch failed" -} - -create() -{ - $NODEBUG || set -x - su $USER -c "poldek -s $RPMS_FROM --mkidx" - - if [ ! -d $CHDIR ]; then - info "Preparing $CHNAME" - build_prepare_root - build_mount_home - fi -} - - -maybe_call $FETCH fetch - -check_running - -maybe_call $CLEAN clean - -maybe_call $CREATE create - -echo $$ > $CHDIR/.pid - -maybe_call $INSTALL poldek_install "$*" - -$BUILD || exit - -if [ -p /tmp/fixfreq ]; then - echo $$ > /tmp/fixfreq -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 - ./findunusedbr -c $CHDIR $HOME/rpm/packages/$build_pkg/$build_pkg.spec - 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 - ./findunusedbr $CHDIR $HOME/rpm/packages/$build_pkg/$build_pkg.spec - 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 +exec ./bin/cleanbuild-$BACKEND.sh "$@"