]> git.pld-linux.org Git - projects/cleanbuild.git/blame - cleanbuild
fix bashisms
[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
e02fff67 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\* \
aa0c3fdf
ER
221 compat-\* \
222 systemd-init \
223 kmod \
82208ca0 224 xorg-driver-video-fglrx\* xorg-driver-video-nvidia\* xorg-xserver-xgl-libGL \
225 xorg-data-xbitmaps \
226 compat-gcc\* \
227 libpng1\* \
aa0c3fdf 228 libjpeg-turbo \
932132fc 229 freetype1-devel-* \
82208ca0 230 anacron fcron hc-cron \
231 masqmail msmtp-sendmail omta postfix sendmail ssmtp nail-mail nullmailer \
232 ghostscript-esp \
233 \*-multilib-\* \
3cb48d43 234 gnome-speech-driver-festival gnome-speech-driver-speech-dispatcher
82208ca0 235
236
febc90ba 237rebuilddb()
238{
c8aae0a1 239 $NOREBUILDDB || rpm --root=$CHDIR --rebuilddb
82208ca0 240}
241
febc90ba 242poldek()
243{
311d51c7 244 $NODEBUG || set -x
82208ca0 245 rebuilddb
11aa2a39 246 /usr/bin/poldek $SRC -s "$RPMS_FROM" -r "$CHDIR" "--cachedir=$CACHEDIR" --conf=$PWD/poldekconf/poldek.conf "$@"
82208ca0 247}
248
249
febc90ba 250build_umount()
251{
82208ca0 252 for DIR in $CHHOME/rpm $CHHOME dev proc sys; do
253 [ -d $CHDIR/$DIR ] && umount $CHDIR/$DIR
254 done
255}
256
febc90ba 257build_remove_root()
258{
714fcf38 259 $NODEBUG || set -x
5e0e7403 260 if $FORCE_UMOUNT; then
c6fcd6a8 261 # safety checks.
262 [ "$CHDIR" ] || exit 1
263 [ -d "$CHDIR" ] || exit 1
264 rm -rf $CHDIR/*
265 umount -l $CHDIR
266 else
267 umount $CHDIR
268 fi
82208ca0 269 rmdir $CHDIR
270}
271
febc90ba 272clean()
273{
82208ca0 274 info "Cleaning $CHNAME"
7bf0c1e6 275 title "cleaning chroot"
82208ca0 276 build_umount
277 build_remove_root
82208ca0 278}
279
febc90ba 280build_prepare_root()
281{
7bf0c1e6 282 title "preparing chroot"
82208ca0 283 set -e
311d51c7 284 $NODEBUG || set -x
82208ca0 285 mkdir $CHDIR
5cff6047 286 mount -t tmpfs -o size=$CHROOTSIZE,relatime /dev/null $CHDIR
82208ca0 287 echo $$ > $CHDIR/.pid
288
abb791ce 289 rpm --root=$CHDIR --initdb
82208ca0 290 poldek --up || :
11aa2a39 291 poldek -O "ignore=$IGNORE" -u rpm-build pwdutils coreutils
abb791ce 292 echo Poldek exit: $?
82208ca0 293
294 for DIR in dev proc sys; do
49e71696 295 # We need to create these directories manually, because they are marked
296 # as netsharedpath in cleanbuild poldek.conf
297 mkdir $CHDIR/$DIR
82208ca0 298 mount -o bind /$DIR $CHDIR/$DIR
299 done
300
08b388ad 301 chroot $CHDIR useradd -m $USER -u$(id $USER -u)
b259c625 302
303 # replicate files which already belong to $USER
304 # so they will have correct owner and permissions
82208ca0 305 cp -a $CHDIR/$CHHOME/{tmp,rpm}
646fa345 306 cp -a $CHDIR/$CHHOME/tmp $CHDIR$BUILDDIR
b259c625 307
82208ca0 308 cp -a $CHDIR/$CHHOME/{.bashrc,.rpmmacros}
646fa345
ER
309 cat <<-EOM > $CHDIR/$CHHOME/.rpmmacros
310 %_builddir $BUILDDIR
82208ca0 311 %buildroot %{_builddir}/%{name}-%{version}-root-%(id -u -n)
11aa2a39 312 %_rpmdirname cleanRPMS
313 %_rpmdir %{expand:%%global _rpmdir %([ -d %{_topdir}/../%{_rpmdirname} ] && (cd %{_topdir}/../%{_rpmdirname}; pwd) || echo %{_topdir}/%{_rpmdirname})}%_rpmdir
82208ca0 314 %distribution CleanPLD
315 %_binary_payload w1.gzdio
316EOM
08b388ad 317 [ -z "$RPMMACROS" ] || echo "$RPMMACROS" >> $CHDIR/$CHHOME/.rpmmacros
b259c625 318
319 cp -a $CHDIR/$CHHOME/{.bashrc,.builderrc}
82208ca0 320 cat <<-'EORC' > $CHDIR/$CHHOME/.builderrc
321 TITLECHANGE=no
322EORC
08b388ad 323 [ -z "$BUILDERRC" ] || echo "$BUILDERRC" >> $CHDIR/$CHHOME/.builderrc
324
82208ca0 325 set +e
326}
327
febc90ba 328build_mount_home()
329{
311d51c7 330 $NODEBUG || set -x
82208ca0 331 mount -o bind $HOME/rpm $CHDIR/$CHHOME/rpm
332}
333
82208ca0 334
febc90ba 335print_installed()
336{
82208ca0 337 echo=$1
338 if [ -r installed/$build_pkg ]; then
339 $echo "$(cat installed/$build_pkg | awk '{print $1}' | sort -u \
340 | awk '{br=br ", " $1} END{gsub(/^, /, "- BR: ", br ); print br}')"
341 cat installed/$build_pkg
342 fi
343}
344
febc90ba 345addlist()
346{
82208ca0 347 LIST="$1"
348
349 print_installed info
11aa2a39 350
351 return
82208ca0 352 echo "*** $build_pkg $(date --rfc-3339=seconds) ***" >> $LIST
353 print_installed echo >> $LIST
354}
355
febc90ba 356builddie()
357{
82208ca0 358 LIST="$1"; shift
359 CODE="$1"; shift
360 MSG="$*"
361
febc90ba 362 rm -f $CHDIR/.pid
363
82208ca0 364 $CLEANAFTER && clean
365 title "failed !"
366
367 addlist "ERROR_$LIST"
368 die $CODE "$MSG"
369}
370
371LAST_INSTALL=""
febc90ba 372poldek_install()
373{
82208ca0 374 I="$1";
375 # Nothing to install
376 [ -n "$I" ] || return 1
377 # Installing same packets second time
378 [ "$LAST_INSTALL" != "$I" ] || return 1
379 LAST_INSTALL="$I"
380
381 info "Installing" $I
382 poldek -O "ignore=$IGNORE" -u $I | tee $$.poldek_install
383 ret=
384 if grep -q "Preparing... ##################################################" $$.poldek_install \
385 && ! grep -q "file .* from install of .* conflicts with file from package" $$.poldek_install
386 then
387 info "Poldek:" $I "installed"
388 ret=0
389 elif grep -q "Nothing to do" $$.poldek_install; then
390 warn "Poldek:" $I "installed already"
391 ret=1
392 fi
393 rm $$.poldek_install
394 [ -n "$ret" ] && return $ret
395
396 # try harder
397 poldek -u $I && return 0
398 poldek -u $I && return 0
399 warn "Poldek:" "Could not install" $I
400 return 1
401}
402
febc90ba 403maybe_call()
404{
405 local cond="$1"; shift
406 local func="$1"; shift
407
e02fff67 408 [ $cond = "false" ] && return
febc90ba 409 $func "$@"
e02fff67 410 [ $cond = "exit_after" ] && exit
febc90ba 411}
412
413fetch()
414{
415 info "Fetching $build_pkg"
416 title "fetch"
311d51c7 417 $NODEBUG || set -x
febc90ba 418 su $USER -c "$HOME/rpm/packages/builder -g $build_pkg $builder_options" \
419 || die 11 "Fetch failed"
420}
421
422create()
423{
311d51c7 424 $NODEBUG || set -x
febc90ba 425 su $USER -c "poldek -s $RPMS_FROM --mkidx"
426
427 if [ ! -d $CHDIR ]; then
428 info "Preparing $CHNAME"
429 build_prepare_root
430 build_mount_home
431 fi
432}
433
434
abb791ce
ER
435info "Configured Poldek sources"
436poldek -l
437
febc90ba 438maybe_call $FETCH fetch
439
440check_running
441
442maybe_call $CLEAN clean
443
444maybe_call $CREATE create
445
446echo $$ > $CHDIR/.pid
447
448maybe_call $INSTALL poldek_install "$*"
449
450$BUILD || exit
451
452if [ -p /tmp/fixfreq ]; then
453 echo $$ > /tmp/fixfreq
82208ca0 454fi
455
456while true; do
457 info "Building $build_pkg in $CHNAME"
458 rebuilddb
71469ba3 459 find $CHDIR/usr/lib{,64} -name "*.la" -print0 | \
1595b5d5 460 xargs -0 -r sed -i -e "s@dependency_libs=.*@dependency_libs=' '@"
82208ca0 461 buildlog="buildlogs/$build_pkg"
462 if [ -r $buildlog ]; then
463 i=1
464 while [ -r $buildlog.$i ]; do
465 i=$((i+1))
466 done
467 info "moving $buildlog to $buildlog.$i"
468 mv $buildlog $buildlog.$i
469 fi
11aa2a39 470 ./findunusedbr -c $CHDIR $HOME/rpm/packages/$build_pkg/$build_pkg.spec
82208ca0 471 title "building"
7bb76476 472 ./teeboth $buildlog chroot $CHDIR su $USER -c "$CHHOME/rpm/packages/builder -nn -bb $build_pkg $builder_options"
473 ECODE=$?
82208ca0 474
475 if grep -q "error: Failed build dependencies:" $buildlog; then
476 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 }')
477 INSTALL=$(poldek -O "ignore=$IGNORE" --shcmd="$SEARCH" | awk '{ if ( p ) { print; p = 0; } } / package\(s\) found:$/ { p = 1 }' | sed 's/^\(.*\)-.*-.*$/\1/' | sort -u)
478
479 if poldek_install "$INSTALL"; then
480 info "Deps installed"
481 continue
482 else
483 addlist ERROR_BRINSTALL
484 die 4 "Cannot install BRs"
485 fi
486 fi
487
f34b364a 488 ./findbr $CHDIR/$BUILDDIR $buildlog > $$.installed
82208ca0 489 installed_something=false
490 while read pkg msg; do
491 if poldek_install $pkg; then
492 info "findbr:" $pkg "installed"
493 echo "$pkg $msg" >> installed/$build_pkg
494 ./addbr $build_pkg "$pkg" "$msg"
495 installed_something=true
496 else
497 warn "findbr:" $pkg "not installed"
498 fi
499 done < $$.installed
500 rm -f $$.installed
501 $installed_something && continue
502
503 if [ $ECODE -eq 0 ]; then
504 $CLEANAFTER && clean
505 addlist BUILT_OK
11aa2a39 506 ./findunusedbr $CHDIR $HOME/rpm/packages/$build_pkg/$build_pkg.spec
82208ca0 507 info "$build_pkg built OK !"
508 title "OK !"
509 exit 0
510 else
511 builddie UNKNOWN 1 "Got error but dunno what to do !"
512 fi
513done
514
515
516# vim: ts=4 sw=4 filetype=sh
This page took 0.36707 seconds and 4 git commands to generate.