]> git.pld-linux.org Git - projects/cleanbuild.git/blame - cleanbuild
- a simple input/output wrapper to be used instead of tee with lots of magic
[projects/cleanbuild.git] / cleanbuild
CommitLineData
82208ca0 1#!/usr/bin/sudo /bin/sh
2
82208ca0 3RPMS_FROM="$HOME/rpm/cleanRPMS.repo"
4DEST="th"
11aa2a39 5SRC="-n th-x86_64-test"
82208ca0 6SUFFIX=""
7CACHEDIR="$PWD/poldekcache"
08b388ad 8RPMMACROS=""
9BUILDERRC=""
febc90ba 10IGNORE=""
5cff6047 11CHROOTSIZE="4G"
3cb48d43 12ignore() { IGNORE="$IGNORE $*"; }
311d51c7 13NODEBUG=true
5e0e7403 14CLEANAFTER=false
15FORCE_UMOUNT=false
c8aae0a1 16NOREBUILDDB=true
646fa345
ER
17# Whatever you set here as value, consider that it may not be shorter than
18# /usr/lib/debug (or /usr/src/debug) for debuginfo to work.
19# You get "Only dest dir longer than base dir not supported" error otherwise.
20BUILDDIR=/usr/src/BUILD
82208ca0 21
cca1186a 22[ -r .cleanbuildrc ] && . ./.cleanbuildrc
23
24[ -z "$USER" ] && echo "USER not defined" && exit 1
25[ "$USER" == "root" ] && echo "USER must not be root" && exit 1
82208ca0 26
27export LC_ALL=C
28unset LANGUAGE
29unset LANG
30
31usage() {
32 [ $# -gt 0 ] && echo "$*"
33 echo "Usage:"
34 echo " ./cleanbuild [cleanbuild options] specname [builder options]"
35 echo " ./build [cleanbuild options] specname [builder options]"
36 echo " ./clean [cleanbuild options]"
febc90ba 37 echo " ./create [cleanbuild options]"
82208ca0 38 echo " ./install [cleanbuild options] packages"
39 echo ""
40 echo "cleanbuild options:"
41 echo " -32, -64, -th-i486 - select architecture"
91d5d67b 42 echo " --cleanafter | -ca - clean after build"
5e0e7403 43 echo " --forceumount | -fu - force umount tmpfs"
91d5d67b 44 echo " --debug - enable debug"
3cc55bb0 45 echo " -a, -b, -c, -d, -e - select alternative chroot directory"
82208ca0 46 exit 1
47}
48
49FETCH=false
50CLEAN=false
febc90ba 51CREATE=false
82208ca0 52BUILD=false
53INSTALL=false
82208ca0 54
55case "$0" in
febc90ba 56 *clean)
57 CLEAN=exit_after
58 ;;
82208ca0 59 *cleanbuild)
60 FETCH=true
61 CLEAN=true
febc90ba 62 CREATE=true
82208ca0 63 BUILD=true
64 ;;
82208ca0 65 *build)
febc90ba 66 CREATE=true
82208ca0 67 BUILD=true
68 ;;
febc90ba 69 *create)
82208ca0 70 CLEAN=true
febc90ba 71 CREATE=exit_after
82208ca0 72 ;;
73 *install)
febc90ba 74 CREATE=true
75 INSTALL=exit_after
82208ca0 76 ;;
77 *)
78 usage
79 ;;
80esac
81
82while [ $# -gt 0 ]; do
83 OPT="${1}"
84 case "$OPT" in
85 -32) OPT="-th-i686" ;;
86 -64) OPT="-th-x86_64" ;;
87 -th-32) OPT="-th-i686" ;;
88 -th-64) OPT="-th-x86_64" ;;
560aa27b 89 -ti-32) OPT="-ti-i686" ;;
90 -ti-64) OPT="-ti-x86_64" ;;
82208ca0 91 -ac) OPT="-ac-amd64" ;;
92 -ac-32) OPT="-ac-i586" ;;
93 -ac-64) OPT="-ac-amd64" ;;
94 esac
95
96 V="${OPT#-}"
97 case "$OPT" in
98 -th-i[46]86 | -th-x86_64)
99 DEST="$V"
11aa2a39 100 SRC="-n $V-ready"
82208ca0 101 ;;
560aa27b 102 -th-i[46]86-test | -th-x86_64-test)
103 DEST="$V"
104 SRC="-n $V"
105 ;;
106 -ti-i[56]86 | -ti-x86_64)
107 DEST="$V"
108 SRC="-n $V-ready"
109 ;;
110 -ti-i[56]86-test | -ti-x86_64-test)
111 DEST="$V"
112 SRC="-n $V"
113 ;;
82208ca0 114 -ac-amd64 | -ac-i[356]86 | -ac-athlon)
115 DEST="$V"
11aa2a39 116 SRC="-n $V-ready"
82208ca0 117 ;;
5cff6047 118 -[1-9]G | -[1-9][0-9]G )
119 CHROOTSIZE="$V"
120 ;;
febc90ba 121 --cleanafter | -ca)
82208ca0 122 CLEANAFTER=true
123 ;;
311d51c7 124 --debug)
125 NODEBUG=false
126 ;;
5e0e7403 127 --forceumount | -fu)
128 FORCE_UMOUNT=true
c6fcd6a8 129 ;;
3cc55bb0 130 -[a-e])
82208ca0 131 SUFFIX="$OPT"
132 ;;
133 -~*)
134 SUFFIX="$V"
135 ;;
136 *)
137 break
138 ;;
139 esac
140 shift
141done
142
143if $BUILD; then
144 [ $# -ne 0 ] || usage
145 build_pkg="${1}"
6361ea4c 146 build_pkg="${build_pkg%/}"
147 build_pkg="${build_pkg%.spec}"
148 build_pkg="${build_pkg#*/}"
82208ca0 149 shift
150
151 builder_options="$*"
152fi
153
311d51c7 154$NODEBUG || set -x
155
febc90ba 156CHNAME="chroot-$DEST$SUFFIX"
157CHDIR="$PWD/$CHNAME"
158CHHOME="/home/users/$USER"
159
160warn()
161{
82208ca0 162 echo -n -e "\033[31;1m" >&2
163 echo -n "$*" >&2
164 echo -e "\033[0m" >&2
165}
febc90ba 166
167die()
168{
82208ca0 169 code=$1
170 shift
171 warn "$*"
172 exit $code
173}
febc90ba 174
175info()
176{
82208ca0 177 echo -n -e "\033[32m"
178 echo -n "$*"
179 echo -e "\033[0m"
180}
febc90ba 181
182title()
183{
82208ca0 184 [ -t 1 ] || return 0
185 local msg="$CHNAME: $build_pkg: $*"
186 case "$TERM" in
187 cygwin|xterm*)
188 echo -ne "\033]1;$msg\007\033]2;$msg\007" >&2
189 ;;
190 screen*)
191 echo -ne "\033]0;$msg\007" >&2
192 ;;
193 esac
194 return 0
195}
196
febc90ba 197exit_after()
198{
199 return 0;
200}
82208ca0 201
febc90ba 202check_running()
203{
82208ca0 204 [ -r "$CHDIR/.pid" ] || return
205 PID=$(< "$CHDIR/.pid")
206 if [ -d /proc/$PID ]; then
207 die 10 "Another process ($PID) already running in $CHNAME"
208 fi
209}
210
82208ca0 211for D in installed buildlogs $CACHEDIR; do
212 if [ ! -d "$D" ]; then
febc90ba 213 info "mkdir $D"
82208ca0 214 su $USER -c "mkdir -p $D" || die 13 "Cannot create work directories"
215 fi
216done
217
82208ca0 218ignore \
219 vserver-packages \
220 upstart\* \
221 xorg-driver-video-fglrx\* xorg-driver-video-nvidia\* xorg-xserver-xgl-libGL \
222 xorg-data-xbitmaps \
223 compat-gcc\* \
224 libpng1\* \
932132fc 225 freetype1-devel-* \
82208ca0 226 anacron fcron hc-cron \
227 masqmail msmtp-sendmail omta postfix sendmail ssmtp nail-mail nullmailer \
228 ghostscript-esp \
229 \*-multilib-\* \
3cb48d43 230 gnome-speech-driver-festival gnome-speech-driver-speech-dispatcher
82208ca0 231
232
febc90ba 233rebuilddb()
234{
c8aae0a1 235 $NOREBUILDDB || rpm --root=$CHDIR --rebuilddb
82208ca0 236}
237
febc90ba 238poldek()
239{
311d51c7 240 $NODEBUG || set -x
82208ca0 241 rebuilddb
11aa2a39 242 /usr/bin/poldek $SRC -s "$RPMS_FROM" -r "$CHDIR" "--cachedir=$CACHEDIR" --conf=$PWD/poldekconf/poldek.conf "$@"
82208ca0 243}
244
245
febc90ba 246build_umount()
247{
82208ca0 248 for DIR in $CHHOME/rpm $CHHOME dev proc sys; do
249 [ -d $CHDIR/$DIR ] && umount $CHDIR/$DIR
250 done
251}
252
febc90ba 253build_remove_root()
254{
714fcf38 255 $NODEBUG || set -x
5e0e7403 256 if $FORCE_UMOUNT; then
c6fcd6a8 257 # safety checks.
258 [ "$CHDIR" ] || exit 1
259 [ -d "$CHDIR" ] || exit 1
260 rm -rf $CHDIR/*
261 umount -l $CHDIR
262 else
263 umount $CHDIR
264 fi
82208ca0 265 rmdir $CHDIR
266}
267
febc90ba 268clean()
269{
82208ca0 270 info "Cleaning $CHNAME"
7bf0c1e6 271 title "cleaning chroot"
82208ca0 272 build_umount
273 build_remove_root
82208ca0 274}
275
febc90ba 276build_prepare_root()
277{
7bf0c1e6 278 title "preparing chroot"
82208ca0 279 set -e
311d51c7 280 $NODEBUG || set -x
82208ca0 281 mkdir $CHDIR
5cff6047 282 mount -t tmpfs -o size=$CHROOTSIZE,relatime /dev/null $CHDIR
82208ca0 283 echo $$ > $CHDIR/.pid
284
285 rpm --root=$CHDIR --initdb
286 poldek --up || :
11aa2a39 287 poldek -O "ignore=$IGNORE" -u rpm-build pwdutils coreutils
82208ca0 288
289 for DIR in dev proc sys; do
49e71696 290 # We need to create these directories manually, because they are marked
291 # as netsharedpath in cleanbuild poldek.conf
292 mkdir $CHDIR/$DIR
82208ca0 293 mount -o bind /$DIR $CHDIR/$DIR
294 done
295
08b388ad 296 chroot $CHDIR useradd -m $USER -u$(id $USER -u)
b259c625 297
298 # replicate files which already belong to $USER
299 # so they will have correct owner and permissions
82208ca0 300 cp -a $CHDIR/$CHHOME/{tmp,rpm}
646fa345 301 cp -a $CHDIR/$CHHOME/tmp $CHDIR$BUILDDIR
b259c625 302
82208ca0 303 cp -a $CHDIR/$CHHOME/{.bashrc,.rpmmacros}
646fa345
ER
304 cat <<-EOM > $CHDIR/$CHHOME/.rpmmacros
305 %_builddir $BUILDDIR
82208ca0 306 %buildroot %{_builddir}/%{name}-%{version}-root-%(id -u -n)
11aa2a39 307 %_rpmdirname cleanRPMS
308 %_rpmdir %{expand:%%global _rpmdir %([ -d %{_topdir}/../%{_rpmdirname} ] && (cd %{_topdir}/../%{_rpmdirname}; pwd) || echo %{_topdir}/%{_rpmdirname})}%_rpmdir
82208ca0 309 %distribution CleanPLD
310 %_binary_payload w1.gzdio
311EOM
08b388ad 312 [ -z "$RPMMACROS" ] || echo "$RPMMACROS" >> $CHDIR/$CHHOME/.rpmmacros
b259c625 313
314 cp -a $CHDIR/$CHHOME/{.bashrc,.builderrc}
82208ca0 315 cat <<-'EORC' > $CHDIR/$CHHOME/.builderrc
316 TITLECHANGE=no
317EORC
08b388ad 318 [ -z "$BUILDERRC" ] || echo "$BUILDERRC" >> $CHDIR/$CHHOME/.builderrc
319
82208ca0 320 set +e
321}
322
febc90ba 323build_mount_home()
324{
311d51c7 325 $NODEBUG || set -x
82208ca0 326 mount -o bind $HOME/rpm $CHDIR/$CHHOME/rpm
327}
328
82208ca0 329
febc90ba 330print_installed()
331{
82208ca0 332 echo=$1
333 if [ -r installed/$build_pkg ]; then
334 $echo "$(cat installed/$build_pkg | awk '{print $1}' | sort -u \
335 | awk '{br=br ", " $1} END{gsub(/^, /, "- BR: ", br ); print br}')"
336 cat installed/$build_pkg
337 fi
338}
339
febc90ba 340addlist()
341{
82208ca0 342 LIST="$1"
343
344 print_installed info
11aa2a39 345
346 return
82208ca0 347 echo "*** $build_pkg $(date --rfc-3339=seconds) ***" >> $LIST
348 print_installed echo >> $LIST
349}
350
febc90ba 351builddie()
352{
82208ca0 353 LIST="$1"; shift
354 CODE="$1"; shift
355 MSG="$*"
356
febc90ba 357 rm -f $CHDIR/.pid
358
82208ca0 359 $CLEANAFTER && clean
360 title "failed !"
361
362 addlist "ERROR_$LIST"
363 die $CODE "$MSG"
364}
365
366LAST_INSTALL=""
febc90ba 367poldek_install()
368{
82208ca0 369 I="$1";
370 # Nothing to install
371 [ -n "$I" ] || return 1
372 # Installing same packets second time
373 [ "$LAST_INSTALL" != "$I" ] || return 1
374 LAST_INSTALL="$I"
375
376 info "Installing" $I
377 poldek -O "ignore=$IGNORE" -u $I | tee $$.poldek_install
378 ret=
379 if grep -q "Preparing... ##################################################" $$.poldek_install \
380 && ! grep -q "file .* from install of .* conflicts with file from package" $$.poldek_install
381 then
382 info "Poldek:" $I "installed"
383 ret=0
384 elif grep -q "Nothing to do" $$.poldek_install; then
385 warn "Poldek:" $I "installed already"
386 ret=1
387 fi
388 rm $$.poldek_install
389 [ -n "$ret" ] && return $ret
390
391 # try harder
392 poldek -u $I && return 0
393 poldek -u $I && return 0
394 warn "Poldek:" "Could not install" $I
395 return 1
396}
397
febc90ba 398maybe_call()
399{
400 local cond="$1"; shift
401 local func="$1"; shift
402
403 [ $cond == "false" ] && return
404 $func "$@"
405 [ $cond == "exit_after" ] && exit
406}
407
408fetch()
409{
410 info "Fetching $build_pkg"
411 title "fetch"
311d51c7 412 $NODEBUG || set -x
febc90ba 413 su $USER -c "$HOME/rpm/packages/builder -g $build_pkg $builder_options" \
414 || die 11 "Fetch failed"
415}
416
417create()
418{
311d51c7 419 $NODEBUG || set -x
febc90ba 420 su $USER -c "poldek -s $RPMS_FROM --mkidx"
421
422 if [ ! -d $CHDIR ]; then
423 info "Preparing $CHNAME"
424 build_prepare_root
425 build_mount_home
426 fi
427}
428
429
430maybe_call $FETCH fetch
431
432check_running
433
434maybe_call $CLEAN clean
435
436maybe_call $CREATE create
437
438echo $$ > $CHDIR/.pid
439
440maybe_call $INSTALL poldek_install "$*"
441
442$BUILD || exit
443
444if [ -p /tmp/fixfreq ]; then
445 echo $$ > /tmp/fixfreq
82208ca0 446fi
447
448while true; do
449 info "Building $build_pkg in $CHNAME"
450 rebuilddb
71469ba3 451 find $CHDIR/usr/lib{,64} -name "*.la" -print0 | \
1595b5d5 452 xargs -0 -r sed -i -e "s@dependency_libs=.*@dependency_libs=' '@"
82208ca0 453 buildlog="buildlogs/$build_pkg"
454 if [ -r $buildlog ]; then
455 i=1
456 while [ -r $buildlog.$i ]; do
457 i=$((i+1))
458 done
459 info "moving $buildlog to $buildlog.$i"
460 mv $buildlog $buildlog.$i
461 fi
11aa2a39 462 ./findunusedbr -c $CHDIR $HOME/rpm/packages/$build_pkg/$build_pkg.spec
82208ca0 463 title "building"
20fda3e4 464 { chroot $CHDIR su $USER -c "$CHHOME/rpm/packages/builder -nn -bb $build_pkg $builder_options" < /dev/null 2>&1; echo $? > ecode; } | tee $buildlog
82208ca0 465
466 ECODE=$(< ecode)
467 rm -f ecode
468
469 if grep -q "error: Failed build dependencies:" $buildlog; then
470 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 }')
471 INSTALL=$(poldek -O "ignore=$IGNORE" --shcmd="$SEARCH" | awk '{ if ( p ) { print; p = 0; } } / package\(s\) found:$/ { p = 1 }' | sed 's/^\(.*\)-.*-.*$/\1/' | sort -u)
472
473 if poldek_install "$INSTALL"; then
474 info "Deps installed"
475 continue
476 else
477 addlist ERROR_BRINSTALL
478 die 4 "Cannot install BRs"
479 fi
480 fi
481
f34b364a 482 ./findbr $CHDIR/$BUILDDIR $buildlog > $$.installed
82208ca0 483 installed_something=false
484 while read pkg msg; do
485 if poldek_install $pkg; then
486 info "findbr:" $pkg "installed"
487 echo "$pkg $msg" >> installed/$build_pkg
488 ./addbr $build_pkg "$pkg" "$msg"
489 installed_something=true
490 else
491 warn "findbr:" $pkg "not installed"
492 fi
493 done < $$.installed
494 rm -f $$.installed
495 $installed_something && continue
496
497 if [ $ECODE -eq 0 ]; then
498 $CLEANAFTER && clean
499 addlist BUILT_OK
11aa2a39 500 ./findunusedbr $CHDIR $HOME/rpm/packages/$build_pkg/$build_pkg.spec
82208ca0 501 info "$build_pkg built OK !"
502 title "OK !"
503 exit 0
504 else
505 builddie UNKNOWN 1 "Got error but dunno what to do !"
506 fi
507done
508
509
510# vim: ts=4 sw=4 filetype=sh
This page took 0.190351 seconds and 4 git commands to generate.