1 #!/usr/bin/sudo /bin/sh
4 RPMS_FROM="$HOME/rpm/cleanRPMS.repo"
6 SRC="-n th-x86_64-test"
8 CACHEDIR="$PWD/poldekcache"
11 [ -r .cleanbuildrc ] && . .cleanbuildrc
18 [ $# -gt 0 ] && echo "$*"
20 echo " ./cleanbuild [cleanbuild options] specname [builder options]"
21 echo " ./build [cleanbuild options] specname [builder options]"
22 echo " ./clean [cleanbuild options]"
23 echo " ./create [cleanbuild options]"
24 echo " ./install [cleanbuild options] packages"
26 echo "cleanbuild options:"
27 echo " -32, -64, -th-i486 - select architecture"
28 echo " -a, -b, -c, -d - select chroot directory"
66 while [ $# -gt 0 ]; do
69 -32) OPT="-th-i686" ;;
70 -64) OPT="-th-x86_64" ;;
71 -th-32) OPT="-th-i686" ;;
72 -th-64) OPT="-th-x86_64" ;;
73 -ac) OPT="-ac-amd64" ;;
74 -ac-32) OPT="-ac-i586" ;;
75 -ac-64) OPT="-ac-amd64" ;;
80 -th-i[46]86 | -th-x86_64)
84 -ac-amd64 | -ac-i[356]86 | -ac-athlon)
105 [ $# -ne 0 ] || usage
112 CHNAME="chroot-$DEST$SUFFIX"
114 CHHOME="/home/users/$USER"
118 echo -n -e "\033[31;1m" >&2
120 echo -e "\033[0m" >&2
133 echo -n -e "\033[32m"
141 local msg="$CHNAME: $build_pkg: $*"
144 echo -ne "\033]1;$msg\007\033]2;$msg\007" >&2
147 echo -ne "\033]0;$msg\007" >&2
160 [ -r "$CHDIR/.pid" ] || return
161 PID=$(< "$CHDIR/.pid")
162 if [ -d /proc/$PID ]; then
163 die 10 "Another process ($PID) already running in $CHNAME"
167 for D in installed buildlogs $CACHEDIR; do
168 if [ ! -d "$D" ]; then
170 su $USER -c "mkdir -p $D" || die 13 "Cannot create work directories"
174 ignore() { IGNORE="$IGNORE $*"; }
178 xorg-driver-video-fglrx\* xorg-driver-video-nvidia\* xorg-xserver-xgl-libGL \
182 anacron fcron hc-cron \
183 masqmail msmtp-sendmail omta postfix sendmail ssmtp nail-mail nullmailer \
187 perl-PathTools perl-MIME-Base64 \
188 gnome-speech-driver-festival gnome-speech-driver-speech-dispatcher \
189 phonon-backend-xine \
192 kde-icons-actions kipi-plugins \
201 rpm --root=$CHDIR --rebuilddb
207 /usr/bin/poldek $SRC -s "$RPMS_FROM" -r "$CHDIR" "--cachedir=$CACHEDIR" --conf=$PWD/poldekconf/poldek.conf "$@"
213 for DIR in $CHHOME/rpm $CHHOME dev proc sys; do
214 [ -d $CHDIR/$DIR ] && umount $CHDIR/$DIR
226 info "Cleaning $CHNAME"
227 title "cleaning chroot"
234 title "preparing chroot"
237 mount -t tmpfs -o size=8G,relatime /dev/null $CHDIR
238 echo $$ > $CHDIR/.pid
240 rpm --root=$CHDIR --initdb
242 poldek -O "ignore=$IGNORE" -u rpm-build pwdutils coreutils
244 for DIR in dev proc sys; do
245 mount -o bind /$DIR $CHDIR/$DIR
248 chroot $CHDIR useradd -m $USER -u$(getent passwd $USER | cut -d: -f3)
249 cp -a $CHDIR/$CHHOME/{tmp,rpm}
250 cp -a $CHDIR/$CHHOME/tmp $CHDIR/BUILD
251 cp -a $CHDIR/$CHHOME/{.bashrc,.rpmmacros}
252 cat <<-'EOM' > $CHDIR/$CHHOME/.rpmmacros
254 %buildroot %{_builddir}/%{name}-%{version}-root-%(id -u -n)
255 %_rpmdirname cleanRPMS
256 %_rpmdir %{expand:%%global _rpmdir %([ -d %{_topdir}/../%{_rpmdirname} ] && (cd %{_topdir}/../%{_rpmdirname}; pwd) || echo %{_topdir}/%{_rpmdirname})}%_rpmdir
257 %distribution CleanPLD
258 %_binary_payload w1.gzdio
261 cat <<-'EORC' > $CHDIR/$CHHOME/.builderrc
269 mount -o bind $HOME/rpm $CHDIR/$CHHOME/rpm
276 if [ -r installed/$build_pkg ]; then
277 $echo "$(cat installed/$build_pkg | awk '{print $1}' | sort -u \
278 | awk '{br=br ", " $1} END{gsub(/^, /, "- BR: ", br ); print br}')"
279 cat installed/$build_pkg
290 echo "*** $build_pkg $(date --rfc-3339=seconds) ***" >> $LIST
291 print_installed echo >> $LIST
305 addlist "ERROR_$LIST"
314 [ -n "$I" ] || return 1
315 # Installing same packets second time
316 [ "$LAST_INSTALL" != "$I" ] || return 1
320 poldek -O "ignore=$IGNORE" -u $I | tee $$.poldek_install
322 if grep -q "Preparing... ##################################################" $$.poldek_install \
323 && ! grep -q "file .* from install of .* conflicts with file from package" $$.poldek_install
325 info "Poldek:" $I "installed"
327 elif grep -q "Nothing to do" $$.poldek_install; then
328 warn "Poldek:" $I "installed already"
332 [ -n "$ret" ] && return $ret
335 poldek -u $I && return 0
336 poldek -u $I && return 0
337 warn "Poldek:" "Could not install" $I
343 local cond="$1"; shift
344 local func="$1"; shift
346 [ $cond == "false" ] && return
348 [ $cond == "exit_after" ] && exit
353 info "Fetching $build_pkg"
355 su $USER -c "$HOME/rpm/packages/builder -g $build_pkg $builder_options" \
356 || die 11 "Fetch failed"
361 su $USER -c "poldek -s $RPMS_FROM --mkidx"
363 if [ ! -d $CHDIR ]; then
364 info "Preparing $CHNAME"
371 maybe_call $FETCH fetch
375 maybe_call $CLEAN clean
377 maybe_call $CREATE create
379 echo $$ > $CHDIR/.pid
381 maybe_call $INSTALL poldek_install "$*"
385 if [ -p /tmp/fixfreq ]; then
386 echo $$ > /tmp/fixfreq
390 info "Building $build_pkg in $CHNAME"
392 buildlog="buildlogs/$build_pkg"
393 if [ -r $buildlog ]; then
395 while [ -r $buildlog.$i ]; do
398 info "moving $buildlog to $buildlog.$i"
399 mv $buildlog $buildlog.$i
401 ./findunusedbr -c $CHDIR $HOME/rpm/packages/$build_pkg/$build_pkg.spec
403 { chroot $CHDIR su $USER -c "$CHHOME/rpm/packages/builder -nn -bb $build_pkg $builder_options" 2>&1; echo $? > ecode; } | tee $buildlog
408 if grep -q "error: Failed build dependencies:" $buildlog; then
409 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 }')
410 INSTALL=$(poldek -O "ignore=$IGNORE" --shcmd="$SEARCH" | awk '{ if ( p ) { print; p = 0; } } / package\(s\) found:$/ { p = 1 }' | sed 's/^\(.*\)-.*-.*$/\1/' | sort -u)
412 if poldek_install "$INSTALL"; then
413 info "Deps installed"
416 addlist ERROR_BRINSTALL
417 die 4 "Cannot install BRs"
421 ./findbr $CHDIR/BUILD $buildlog > $$.installed
422 installed_something=false
423 while read pkg msg; do
424 if poldek_install $pkg; then
425 info "findbr:" $pkg "installed"
426 echo "$pkg $msg" >> installed/$build_pkg
427 ./addbr $build_pkg "$pkg" "$msg"
428 installed_something=true
430 warn "findbr:" $pkg "not installed"
434 $installed_something && continue
436 if [ $ECODE -eq 0 ]; then
439 ./findunusedbr $CHDIR $HOME/rpm/packages/$build_pkg/$build_pkg.spec
440 info "$build_pkg built OK !"
444 builddie UNKNOWN 1 "Got error but dunno what to do !"
449 # vim: ts=4 sw=4 filetype=sh