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