]> git.pld-linux.org Git - projects/cleanbuild.git/blame - cleanbuild
- su is now in util-linux
[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
ef4e7e6c
ER
289 rpmversion=$(rpm -E '%(v=%{_rpmversion}; IFS=.; set -- $v; echo $1)')
290 rpmversion=${rpmversion:-4}
291
292 if [ "$rpmversion" -ge 5 ]; then
293 rpm --root=$CHDIR -qa
294 else
295 rpm --root=$CHDIR --initdb
296 fi
82208ca0 297 poldek --up || :
5b4a76cf 298 poldek -O "ignore=$IGNORE" -u rpm-build util-linux
abb791ce 299 echo Poldek exit: $?
82208ca0 300
301 for DIR in dev proc sys; do
49e71696 302 # We need to create these directories manually, because they are marked
303 # as netsharedpath in cleanbuild poldek.conf
304 mkdir $CHDIR/$DIR
82208ca0 305 mount -o bind /$DIR $CHDIR/$DIR
306 done
307
08b388ad 308 chroot $CHDIR useradd -m $USER -u$(id $USER -u)
b259c625 309
310 # replicate files which already belong to $USER
311 # so they will have correct owner and permissions
82208ca0 312 cp -a $CHDIR/$CHHOME/{tmp,rpm}
646fa345 313 cp -a $CHDIR/$CHHOME/tmp $CHDIR$BUILDDIR
b259c625 314
82208ca0 315 cp -a $CHDIR/$CHHOME/{.bashrc,.rpmmacros}
646fa345
ER
316 cat <<-EOM > $CHDIR/$CHHOME/.rpmmacros
317 %_builddir $BUILDDIR
82208ca0 318 %buildroot %{_builddir}/%{name}-%{version}-root-%(id -u -n)
11aa2a39 319 %_rpmdirname cleanRPMS
320 %_rpmdir %{expand:%%global _rpmdir %([ -d %{_topdir}/../%{_rpmdirname} ] && (cd %{_topdir}/../%{_rpmdirname}; pwd) || echo %{_topdir}/%{_rpmdirname})}%_rpmdir
82208ca0 321 %distribution CleanPLD
322 %_binary_payload w1.gzdio
323EOM
08b388ad 324 [ -z "$RPMMACROS" ] || echo "$RPMMACROS" >> $CHDIR/$CHHOME/.rpmmacros
b259c625 325
326 cp -a $CHDIR/$CHHOME/{.bashrc,.builderrc}
82208ca0 327 cat <<-'EORC' > $CHDIR/$CHHOME/.builderrc
328 TITLECHANGE=no
329EORC
08b388ad 330 [ -z "$BUILDERRC" ] || echo "$BUILDERRC" >> $CHDIR/$CHHOME/.builderrc
331
82208ca0 332 set +e
333}
334
febc90ba 335build_mount_home()
336{
311d51c7 337 $NODEBUG || set -x
82208ca0 338 mount -o bind $HOME/rpm $CHDIR/$CHHOME/rpm
339}
340
82208ca0 341
febc90ba 342print_installed()
343{
82208ca0 344 echo=$1
345 if [ -r installed/$build_pkg ]; then
346 $echo "$(cat installed/$build_pkg | awk '{print $1}' | sort -u \
347 | awk '{br=br ", " $1} END{gsub(/^, /, "- BR: ", br ); print br}')"
348 cat installed/$build_pkg
349 fi
350}
351
febc90ba 352addlist()
353{
82208ca0 354 LIST="$1"
355
356 print_installed info
11aa2a39 357
358 return
82208ca0 359 echo "*** $build_pkg $(date --rfc-3339=seconds) ***" >> $LIST
360 print_installed echo >> $LIST
361}
362
febc90ba 363builddie()
364{
82208ca0 365 LIST="$1"; shift
366 CODE="$1"; shift
367 MSG="$*"
368
febc90ba 369 rm -f $CHDIR/.pid
370
82208ca0 371 $CLEANAFTER && clean
372 title "failed !"
373
374 addlist "ERROR_$LIST"
375 die $CODE "$MSG"
376}
377
378LAST_INSTALL=""
febc90ba 379poldek_install()
380{
82208ca0 381 I="$1";
382 # Nothing to install
383 [ -n "$I" ] || return 1
384 # Installing same packets second time
385 [ "$LAST_INSTALL" != "$I" ] || return 1
386 LAST_INSTALL="$I"
387
388 info "Installing" $I
389 poldek -O "ignore=$IGNORE" -u $I | tee $$.poldek_install
390 ret=
391 if grep -q "Preparing... ##################################################" $$.poldek_install \
392 && ! grep -q "file .* from install of .* conflicts with file from package" $$.poldek_install
393 then
394 info "Poldek:" $I "installed"
395 ret=0
396 elif grep -q "Nothing to do" $$.poldek_install; then
397 warn "Poldek:" $I "installed already"
398 ret=1
399 fi
400 rm $$.poldek_install
401 [ -n "$ret" ] && return $ret
402
403 # try harder
404 poldek -u $I && return 0
405 poldek -u $I && return 0
406 warn "Poldek:" "Could not install" $I
407 return 1
408}
409
febc90ba 410maybe_call()
411{
412 local cond="$1"; shift
413 local func="$1"; shift
414
e02fff67 415 [ $cond = "false" ] && return
febc90ba 416 $func "$@"
e02fff67 417 [ $cond = "exit_after" ] && exit
febc90ba 418}
419
420fetch()
421{
422 info "Fetching $build_pkg"
423 title "fetch"
311d51c7 424 $NODEBUG || set -x
febc90ba 425 su $USER -c "$HOME/rpm/packages/builder -g $build_pkg $builder_options" \
426 || die 11 "Fetch failed"
427}
428
429create()
430{
311d51c7 431 $NODEBUG || set -x
febc90ba 432 su $USER -c "poldek -s $RPMS_FROM --mkidx"
433
434 if [ ! -d $CHDIR ]; then
435 info "Preparing $CHNAME"
436 build_prepare_root
437 build_mount_home
438 fi
439}
440
441
abb791ce
ER
442info "Configured Poldek sources"
443poldek -l
444
febc90ba 445maybe_call $FETCH fetch
446
447check_running
448
449maybe_call $CLEAN clean
450
451maybe_call $CREATE create
452
453echo $$ > $CHDIR/.pid
454
455maybe_call $INSTALL poldek_install "$*"
456
457$BUILD || exit
458
459if [ -p /tmp/fixfreq ]; then
460 echo $$ > /tmp/fixfreq
82208ca0 461fi
462
463while true; do
464 info "Building $build_pkg in $CHNAME"
465 rebuilddb
71469ba3 466 find $CHDIR/usr/lib{,64} -name "*.la" -print0 | \
1595b5d5 467 xargs -0 -r sed -i -e "s@dependency_libs=.*@dependency_libs=' '@"
82208ca0 468 buildlog="buildlogs/$build_pkg"
469 if [ -r $buildlog ]; then
470 i=1
471 while [ -r $buildlog.$i ]; do
472 i=$((i+1))
473 done
474 info "moving $buildlog to $buildlog.$i"
475 mv $buildlog $buildlog.$i
476 fi
11aa2a39 477 ./findunusedbr -c $CHDIR $HOME/rpm/packages/$build_pkg/$build_pkg.spec
82208ca0 478 title "building"
7bb76476 479 ./teeboth $buildlog chroot $CHDIR su $USER -c "$CHHOME/rpm/packages/builder -nn -bb $build_pkg $builder_options"
480 ECODE=$?
82208ca0 481
482 if grep -q "error: Failed build dependencies:" $buildlog; then
483 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 }')
484 INSTALL=$(poldek -O "ignore=$IGNORE" --shcmd="$SEARCH" | awk '{ if ( p ) { print; p = 0; } } / package\(s\) found:$/ { p = 1 }' | sed 's/^\(.*\)-.*-.*$/\1/' | sort -u)
485
486 if poldek_install "$INSTALL"; then
487 info "Deps installed"
488 continue
489 else
490 addlist ERROR_BRINSTALL
491 die 4 "Cannot install BRs"
492 fi
493 fi
494
f34b364a 495 ./findbr $CHDIR/$BUILDDIR $buildlog > $$.installed
82208ca0 496 installed_something=false
497 while read pkg msg; do
498 if poldek_install $pkg; then
499 info "findbr:" $pkg "installed"
500 echo "$pkg $msg" >> installed/$build_pkg
501 ./addbr $build_pkg "$pkg" "$msg"
502 installed_something=true
503 else
504 warn "findbr:" $pkg "not installed"
505 fi
506 done < $$.installed
507 rm -f $$.installed
508 $installed_something && continue
509
510 if [ $ECODE -eq 0 ]; then
511 $CLEANAFTER && clean
512 addlist BUILT_OK
11aa2a39 513 ./findunusedbr $CHDIR $HOME/rpm/packages/$build_pkg/$build_pkg.spec
82208ca0 514 info "$build_pkg built OK !"
515 title "OK !"
516 exit 0
517 else
518 builddie UNKNOWN 1 "Got error but dunno what to do !"
519 fi
520done
521
522
523# vim: ts=4 sw=4 filetype=sh
This page took 0.138405 seconds and 4 git commands to generate.