source: builder/runrooted @ 07ead96

perl-5.22
Last change on this file since 07ead96 was 07ead96, checked in by Edwin Eefting <edwin@datux.nl>, 8 years ago

Merge branch 'gcc484'

  • Property mode set to 100755
File size: 7.4 KB
Line 
1#!/bin/bash
2#(C)DatuX 2005 - all rights reserved
3#-kijkt of er een goede (ongewijzigde) buildroot aanwezig is
4#-genereerd indien nodig een nieuwe buildroot (oude word dan gewist)
5#-copy de directory waar het programma staat naar de buildroot
6#-start het programma chrootted
7#-kopieer nieuwe files in de directory (niet de subdirs) terug naar orginenele plek
8#-geeft een overzicht van de gewijzigde files. (als het programma de buildroot dus sloopt)
9#-de tmp dir in de buildroot word niet meegenomene met wijzigingen en word altijd
10# opnieuw gemaakt.
11
12
13if [ -z $1 ]; then
14    echo "Geef scriptnaam op!"
15    echo "$0 <scriptnaam> [nocheck] [nodep]"
16#    echo " rebuildroot: haal hele buildroot weg, alles opnieuw"
17    echo " nocheck:   repareer de buildroot niet. "
18    echo "              (alleen als je zelfde package nog een keer bouwt)"
19    echo " nodep:     installeer dependencies niet"
20    echo " progress: progress indicator tonen. (pv dient geinstalleerd te zijn voor progress indicators)"
21    exit 1
22fi
23
24for PAR in $*; do eval "$PAR=1" &>/dev/null; done
25
26#unieke identifier voor deze lokale checkout. Op dit moment gebruiken we hier het lokale pad voor:
27SVNID=`pwd|tr / _`
28
29export ROOTCOPY=/tmp/buildroot.copy.$SVNID
30
31#bepaal welke buildroot 'vrij' is om te gebruiken
32NR=0
33export BUILDROOT=/tmp/buildroot$NR.$SVNID
34while ! lockfile-create -r0 $BUILDROOT ; do
35        (( NR++ ))
36        BUILDROOT=/tmp/buildroot$NR.$SVNID
37        if [ "$NR" -ge 10 ]; then
38                echo "No more free buildroots, giving up."
39                exit 1
40        fi
41done
42#always remove lockfile on exit!
43trap "rm $BUILDROOT.lock &>/dev/null" 0
44
45
46PGMPATH=$1
47DIR=`dirname "$PGMPATH"`;
48PGM=`basename "$PGMPATH"`;
49ROOTEDWORKDIR=/tmp/build
50WORKDIR=$BUILDROOT$ROOTEDWORKDIR
51
52if [ ! -x $PGMPATH ] || [ ! -f $PGMPATH ]; then
53    echo "Exectubable $PGMPATH bestaat niet!"
54    exit 1
55fi
56
57#root helemaal rebuilden?
58#if [ "$rebuildroot" ]; then
59#    echo "Deleting old buildroot..."
60#    rm -r $BUILDROOT
61#fi
62
63#ivm snelheid
64#echo "Buildroot opschonen.."
65#rm -rf $BUILDROOT/tmp/* &>/dev/null
66
67
68#buildroot controleren/fixen/voorbereiden?
69if [ "$nocheck" ] ; then
70    echo "(skipping buildroot check..)"
71else
72    mkdir $BUILDROOT &>/dev/null
73    ./chkbuildroot $BUILDROOT $ROOTCOPY $* || exit 1
74fi
75
76
77if [ "$nodep" ]; then
78    echo "(skipping dependency install..)"
79else
80        CONFIG=
81        #bepaal de build dependencies:
82
83        NEEDS=`../npl/findbuilddeps $PGMPATH` || exit 1
84        for NEED in $NEEDS; do
85
86                CONFIG=1
87                echo -n "Finding dependency $NEED: "
88                TGZ=`../npl/findpkg "$NEED"` || exit 1
89                echo -n "$TGZ"
90               
91                PKGNAME=`basename "$TGZ"|sed 's/.tgz$//'`
92
93                #already installed?
94                if [ -e "$BUILDROOT/var/log/packages/$PKGNAME" ]; then
95                        echo " (already installed, skipping)"
96                        continue
97                else
98                        echo " (installing)"
99                fi
100
101                #Bepaal waar het pakketje in de buildroot moet terecht komen, ivm crosscompiling.
102                #Zon pakketje mag niet in de buildroot zelf, omdat dan de bestaande libraries overschreven kunnen worden met die van een andere architectuur.
103                #eerst moeten we de architectuur van het pakketje weten:
104                NEEDHOST=
105                if NEEDBUILD=`../npl/findbuild "$NEED"`; then
106                    #FIXME: dit klopt niet, bij perlmod_XML_Parser pakt hij nu buildmods.arch ipv perlmod_XML_Parser.arch!
107                    NEEDHOST=`cat $NEEDBUILD.arch 2>/dev/null`
108                fi
109                #als het er een directory naast npl bestaat is het een crosscomplile architectuur:
110                if [ "$NEEDHOST" ] && [ -e ../$NEEDHOST ]; then
111                    #cross-architectuur, install
112                    #in een subdirectory onder buildroot, met naam van architectuur:
113                    echo "(Cross architecture detected, installing package in $NEEDHOST toolchain directory)"
114                    export ROOT=$BUILDROOT/usr/$NEEDHOST/$NEEDHOST
115                else
116                    #gewoon direct in de buildroot pleuren:
117                    export ROOT=$BUILDROOT
118                fi
119
120                installpkg "$TGZ" >/dev/null || exit 1
121
122                #_dev niet gespecificeerd?
123#NO: findbuilddeps does this now
124#               if ! echo "$NEEDS" | grep "$NEED""_dev"; then
125#                       #bestaat er wel een dev?
126#                       if TGZ=`../npl/findpkg "$NEED""_dev" 2>/dev/null`; then
127#                               echo "Auto selecting development package: $TGZ"
128#                               installpkg "$TGZ" >/dev/null || exit 1
129#                       fi
130#               fi
131
132        done
133
134        if [ "$CONFIG" ]; then
135                echo "Nieuwe packages ldconfiggen..."
136                ldconfig -r $BUILDROOT || exit 1
137                echo "etc-update doen"
138                chroot $BUILDROOT "/bin/bash" -l -c "etc-update" || exit 1
139        fi
140
141        #paden fixen ivm cross compile?
142        if [ "$HOST" ]; then
143                echo -n "Adjusting crossplatform library configs in toolchain directory..."
144                #fix pkgconfig files that are in crossplatform-path:
145                sed -i "s@=/usr@=/usr/$NEEDHOST/$NEEDHOST/usr@" $BUILDROOT/usr/$HOST/$HOST/usr/lib/pkgconfig/*.pc
146                #fix *-config files that are in crossplatform-path:
147                sed -i "s@=/usr@=/usr/$HOST/$HOST/usr@" $BUILDROOT/usr/$HOST/$HOST/usr/bin/*-config
148                sed -i "s@\"/usr@\"/usr/$HOST/$HOST/usr@" $BUILDROOT/usr/$HOST/$HOST/usr/bin/*-config
149                echo "DONE"
150        fi
151
152fi
153
154#hack kernel versie tools
155cat arch > $BUILDROOT/bin/arch
156chmod +x $BUILDROOT/bin/arch
157KVER=`ls $BUILDROOT/lib/modules 2>/dev/null|cut -f1 -d'/'`
158if [ "$KVER" == "" ]; then
159        KVER=`cat ../npl/kernel/linux_src/linux_src.version` || exit 1
160fi
161cat uname |sed "s/#KVER#/$KVER/g" > $BUILDROOT/bin/uname
162chmod +x $BUILDROOT/bin/uname
163
164#vanaf hier is er een goede buildroot
165echo "$DIR word gekopieerd naar werkdirectory $WORKDIR"
166cp -a $DIR $WORKDIR || exit 1
167chown -R root:root $WORKDIR || exit 1
168
169#proc is needed for all kinds of things:
170umount $BUILDROOT/proc &>/dev/null
171mount -t proc none $BUILDROOT/proc || exit 1
172
173#pts is needed for programs like 'Expect':
174umount $BUILDROOT/dev/pts &>/dev/null
175mount -t devpts none $BUILDROOT/dev/pts -o rw,nosuid,noexec,gid=5,mode=620 || exit 1
176
177#put the logfile in top of the buildroot and not in /tmp/build, to not 'disrupt' smart SlackBuild that use file-times.
178export LOG="$BUILDROOT/$PGM.log"
179
180#log output and show progress info if pv is installed
181progress()
182{
183        #use old logfile as reference for progress indication
184        SIZE=`zcat $BUILDROOT/tmp/build/$PGM.log.gz 2>/dev/null|wc -c`
185        if [ "$progress" ] && which pv &>/dev/null; then
186                pv -s $SIZE -p -t -e  | tee $LOG
187        else
188                tee $LOG
189        fi
190}
191
192#clear environment, set some variables and do the actual chrooting:
193echo -e "\e[1;33m*** Chroot naar $BUILDROOT en starten van $PGM in $ROOTEDWORKDIR:\e[0m" >&2
194CHROOT=`which chroot`
195env - $CHROOT $BUILDROOT "/bin/bash" -l -c "
196        export MAKEFLAGS='$MAKEFLAGS'
197        cd $ROOTEDWORKDIR
198        export PS4='\[\e[1;32m\]\$LINENO \$PWD > \[\e[0m\]'
199        export HOST=$HOST
200        bash -x ./$PGM" 2>&1 | progress ;
201
202if [ "${PIPESTATUS[0]}" != "0" ]; then
203        echo -e "\e[1;31m*** Er ging iets mis tijdens het bakken in de buildroot!\e[0m" >&2
204        echo "Chroot naar $BUILDROOT zodat je kunt onderzoeken (ctrl-d om te stoppen):"
205        env - $CHROOT $BUILDROOT "/bin/bash" -l -c "
206            export MAKEFLAGS='$MAKEFLAGS'
207            export TERM='$TERM'
208            cd $ROOTEDWORKDIR
209            export HOST=$HOST
210            bash" 2>&1
211
212        umount $BUILDROOT/proc
213        umount $BUILDROOT/dev/pts
214        echo "Om verder te testen/onderzoeken, tik:"
215        echo "chroot $BUILDROOT"
216        echo "Logfile: $LOG"
217        exit 1
218else
219        echo -e "\e[1;32m*** Build gelukt.\e[0m" >&2
220fi
221
222umount $BUILDROOT/proc
223umount $BUILDROOT/dev/pts
224
225echo "* Packages terugmoven naar originele directory..";
226echo $WORKDIR/*.arch ...
227mv $WORKDIR/*.arch $DIR || exit 1
228echo $WORKDIR/*.version ...
229mv $WORKDIR/*.version $DIR || exit 1
230
231#move packages from buildroot to workdir
232for PKG in $WORKDIR/*.pkg; do
233        NAME=`basename $PKG|sed 's/.pkg$//g'`
234        if ! cmp $PKG $DIR/$NAME.pkg; then
235                mv $PKG $DIR || exit 1
236        fi
237done
238
239
240echo Compressing $LOG ...
241gzip $LOG || exit 1
242mv $LOG.gz $DIR || exit 1
243
244
245echo
246echo "* Klaar ja!";
Note: See TracBrowser for help on using the repository browser.