SRC="-n th-x86_64-test"
SUFFIX=""
CACHEDIR="$PWD/poldekcache"
+RPMMACROS=""
+BUILDERRC=""
IGNORE=""
+CHROOTSIZE="4G"
+ignore() { IGNORE="$IGNORE $*"; }
NODEBUG=true
+CLEANAFTER=false
+FORCE_UMOUNT=false
+NOREBUILDDB=true
+MULTILIB=false
+# Whatever you set here as value, consider that it may not be shorter than
+# /usr/lib/debug (or /usr/src/debug) for debuginfo to work.
+# You get "Only dest dir longer than base dir not supported" error otherwise.
+BUILDDIR=/usr/src/BUILD
[ -r .cleanbuildrc ] && . ./.cleanbuildrc
[ -z "$USER" ] && echo "USER not defined" && exit 1
-[ "$USER" == "root" ] && echo "USER must not be root" && exit 1
+[ "$USER" = "root" ] && echo "USER must not be root" && exit 1
export LC_ALL=C
unset LANGUAGE
echo ""
echo "cleanbuild options:"
echo " -32, -64, -th-i486 - select architecture"
- echo " -a, -b, -c, -d - select chroot directory"
+ echo " --cleanafter | -ca - clean after build"
+ echo " --forceumount | -fu - force umount tmpfs"
+ echo " --debug - enable debug"
+ echo " --network - allow build to use networking"
+ echo " -a, -b, -c, -d, -e - select alternative chroot directory"
exit 1
}
CLEAN=false
CREATE=false
BUILD=false
+NETWORK=false
INSTALL=false
-CLEANAFTER=false
case "$0" in
*clean)
-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" ;;
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"
;;
+ -[1-9]G | -[1-9][0-9]G )
+ CHROOTSIZE="$V"
+ ;;
--cleanafter | -ca)
CLEANAFTER=true
;;
--debug)
NODEBUG=false
;;
- -[a-z])
+ --network)
+ NETWORK=true
+ ;;
+ --forceumount | -fu)
+ FORCE_UMOUNT=true
+ ;;
+ -[a-e])
SUFFIX="$OPT"
;;
-~*)
if $BUILD; then
[ $# -ne 0 ] || usage
build_pkg="${1}"
+ build_pkg="${build_pkg%/}"
+ build_pkg="${build_pkg%.spec}"
+ build_pkg="${build_pkg#*/}"
shift
builder_options="$*"
fi
done
-ignore() { IGNORE="$IGNORE $*"; }
ignore \
- vserver-packages \
upstart\* \
+ upstart \
+ compat-\* \
+ systemd-init \
+ hhvm \
+ vserver-packages \
xorg-driver-video-fglrx\* xorg-driver-video-nvidia\* xorg-xserver-xgl-libGL \
+ xorg-driver-video-vboxvideo \
xorg-data-xbitmaps \
compat-gcc\* \
libpng1\* \
+ libjpeg libjpeg-devel \
+ freetype1-devel-* \
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 \
+ perl-Scalar-List-Utils \
+ perl-ExtUtils-Install \
+ phonon-backend-mplayer phonon-backend-vlc \
+ libgcj libgcj-devel \
+ icedtea6-jre icedtea6-jdk \
+ icedtea7-jre icedtea7-jdk \
+ java-sun-jre java-sun-jdk \
+ java5-sun-jre java5-sun-jdk \
+ oracle-java7-jre oracle-java7-jdk \
gnome-menus \
- texlive-jadetex \
- java-gcj-\* libgcj
-# java-sun-jre
+ gnome-speech-driver-festival gnome-speech-driver-speech-dispatcher
+if ! $MULTILIB; then
+ ignore '*-multilib-*'
+fi
rebuilddb()
{
- rpm --root=$CHDIR --rebuilddb
+ $NOREBUILDDB || rpm --root=$CHDIR --rebuilddb
}
poldek()
build_remove_root()
{
- umount $CHDIR
+ $NODEBUG || set -x
+ if $FORCE_UMOUNT; then
+ # safety checks.
+ [ "$CHDIR" ] || exit 1
+ [ -d "$CHDIR" ] || exit 1
+ rm -rf $CHDIR/*
+ umount -l $CHDIR
+ else
+ umount $CHDIR
+ fi
rmdir $CHDIR
}
set -e
$NODEBUG || set -x
mkdir $CHDIR
- mount -t tmpfs -o size=8G,relatime /dev/null $CHDIR
+ mount -t tmpfs -o size=$CHROOTSIZE,relatime /dev/null $CHDIR
echo $$ > $CHDIR/.pid
- rpm --root=$CHDIR --initdb
+ rpmversion=$(rpm -E '%(v=%{_rpmversion}; IFS=.; set -- $v; echo $1)')
+ rpmversion=${rpmversion:-4}
+
+ if [ "$rpmversion" -ge 5 ]; then
+ rpm --root=$CHDIR -qa
+ else
+ rpm --root=$CHDIR --initdb
+ fi
poldek --up || :
- poldek -O "ignore=$IGNORE" -u rpm-build pwdutils coreutils
+ poldek -O "ignore=$IGNORE" -u rpm-build pwdutils coreutils time util-linux git-core gawk
+ echo Poldek exit: $?
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)
+ # group 'users' may already exist, so ignore errors
+ chroot $CHDIR groupadd $(id $USER -gn) -g$(id $USER -g) || :
+ chroot $CHDIR useradd -m $USER -u$(id $USER -u) -g $(id $USER -gn)
+
+ # 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/tmp $CHDIR$BUILDDIR
+
cp -a $CHDIR/$CHHOME/{.bashrc,.rpmmacros}
- cat <<-'EOM' > $CHDIR/$CHHOME/.rpmmacros
- %_builddir /BUILD
+ cat <<-EOM > $CHDIR/$CHHOME/.rpmmacros
+ %_builddir $BUILDDIR
%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
+ [ -z "$RPMMACROS" ] || echo "$RPMMACROS" >> $CHDIR/$CHHOME/.rpmmacros
+
+ cp -a $CHDIR/$CHHOME/{.bashrc,.builderrc}
cat <<-'EORC' > $CHDIR/$CHHOME/.builderrc
TITLECHANGE=no
EORC
+ [ -z "$BUILDERRC" ] || echo "$BUILDERRC" >> $CHDIR/$CHHOME/.builderrc
+
set +e
}
{
$NODEBUG || set -x
mount -o bind $HOME/rpm $CHDIR/$CHHOME/rpm
-}
+ # ensure RPMS dir is available
+ chroot $CHDIR su $USER -c 'mkdir -p $(rpm -E %_rpmdir)'
+}
print_installed()
{
LAST_INSTALL=""
poldek_install()
{
- I="$1";
+ local I="$1" ret
# Nothing to install
[ -n "$I" ] || return 1
# Installing same packets second time
[ -n "$ret" ] && return $ret
# try harder
+ info "Poldek install failed, retry without ignore"
poldek -u $I && return 0
+ info "Poldek install failed, retry once more without ignore"
poldek -u $I && return 0
warn "Poldek:" "Could not install" $I
return 1
local cond="$1"; shift
local func="$1"; shift
- [ $cond == "false" ] && return
- $func "$@"
- [ $cond == "exit_after" ] && exit
+ [ $cond = "false" ] && return
+ "$func" "$@"
+ [ $cond = "exit_after" ] && exit
}
fetch()
}
+info "Configured Poldek sources"
+poldek -l
+
maybe_call $FETCH fetch
check_running
maybe_call $INSTALL poldek_install "$*"
+maybe_call $NETWORK cp -bf /etc/resolv.conf $CHDIR/etc/
+
$BUILD || exit
if [ -p /tmp/fixfreq ]; then
while true; do
info "Building $build_pkg in $CHNAME"
rebuilddb
+ ./cleanup-la $CHDIR
buildlog="buildlogs/$build_pkg"
if [ -r $buildlog ]; then
i=1
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
+ ./teeboth $buildlog chroot $CHDIR su $USER -c "$CHHOME/rpm/packages/builder -nn --define '_enable_debug_packages 0' -bb $build_pkg $builder_options"
+ 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 }')
fi
fi
- ./findbr $CHDIR/BUILD $buildlog > $$.installed
+ ./findbr $CHDIR/$BUILDDIR $buildlog > $$.installed
installed_something=false
while read pkg msg; do
if poldek_install $pkg; then