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 | |
---|
13 | if [ -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 |
---|
22 | fi |
---|
23 | |
---|
24 | for 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: |
---|
27 | SVNID=`pwd|tr / _` |
---|
28 | |
---|
29 | export ROOTCOPY=/tmp/buildroot.copy.$SVNID |
---|
30 | |
---|
31 | #bepaal welke buildroot 'vrij' is om te gebruiken |
---|
32 | NR=0 |
---|
33 | export BUILDROOT=/tmp/buildroot$NR.$SVNID |
---|
34 | while ! 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 |
---|
41 | done |
---|
42 | #always remove lockfile on exit! |
---|
43 | trap "rm $BUILDROOT.lock &>/dev/null" 0 |
---|
44 | |
---|
45 | |
---|
46 | PGMPATH=$1 |
---|
47 | DIR=`dirname "$PGMPATH"`; |
---|
48 | PGM=`basename "$PGMPATH"`; |
---|
49 | ROOTEDWORKDIR=/tmp/build |
---|
50 | WORKDIR=$BUILDROOT$ROOTEDWORKDIR |
---|
51 | |
---|
52 | if [ ! -x $PGMPATH ] || [ ! -f $PGMPATH ]; then |
---|
53 | echo "Exectubable $PGMPATH bestaat niet!" |
---|
54 | exit 1 |
---|
55 | fi |
---|
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? |
---|
69 | if [ "$nocheck" ] ; then |
---|
70 | echo "(skipping buildroot check..)" |
---|
71 | else |
---|
72 | mkdir $BUILDROOT &>/dev/null |
---|
73 | ./chkbuildroot $BUILDROOT $ROOTCOPY $* || exit 1 |
---|
74 | fi |
---|
75 | |
---|
76 | |
---|
77 | if [ "$nodep" ]; then |
---|
78 | echo "(skipping dependency install..)" |
---|
79 | else |
---|
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 | |
---|
152 | fi |
---|
153 | |
---|
154 | #hack kernel versie tools |
---|
155 | cat arch > $BUILDROOT/bin/arch |
---|
156 | chmod +x $BUILDROOT/bin/arch |
---|
157 | KVER=`ls $BUILDROOT/lib/modules 2>/dev/null|cut -f1 -d'/'` |
---|
158 | if [ "$KVER" == "" ]; then |
---|
159 | KVER=`cat ../npl/kernel/linux_src/linux_src.version` || exit 1 |
---|
160 | fi |
---|
161 | cat uname |sed "s/#KVER#/$KVER/g" > $BUILDROOT/bin/uname |
---|
162 | chmod +x $BUILDROOT/bin/uname |
---|
163 | |
---|
164 | #vanaf hier is er een goede buildroot |
---|
165 | echo "$DIR word gekopieerd naar werkdirectory $WORKDIR" |
---|
166 | cp -a $DIR $WORKDIR || exit 1 |
---|
167 | chown -R root:root $WORKDIR || exit 1 |
---|
168 | |
---|
169 | #proc is needed for all kinds of things: |
---|
170 | umount $BUILDROOT/proc &>/dev/null |
---|
171 | mount -t proc none $BUILDROOT/proc || exit 1 |
---|
172 | |
---|
173 | #pts is needed for programs like 'Expect': |
---|
174 | umount $BUILDROOT/dev/pts &>/dev/null |
---|
175 | mount -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. |
---|
178 | export LOG="$BUILDROOT/$PGM.log" |
---|
179 | |
---|
180 | #log output and show progress info if pv is installed |
---|
181 | progress() |
---|
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: |
---|
193 | echo -e "\e[1;33m*** Chroot naar $BUILDROOT en starten van $PGM in $ROOTEDWORKDIR:\e[0m" >&2 |
---|
194 | CHROOT=`which chroot` |
---|
195 | env - $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 | |
---|
202 | if [ "${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 |
---|
218 | else |
---|
219 | echo -e "\e[1;32m*** Build gelukt.\e[0m" >&2 |
---|
220 | fi |
---|
221 | |
---|
222 | umount $BUILDROOT/proc |
---|
223 | umount $BUILDROOT/dev/pts |
---|
224 | |
---|
225 | echo "* Packages terugmoven naar originele directory.."; |
---|
226 | echo $WORKDIR/*.arch ... |
---|
227 | mv $WORKDIR/*.arch $DIR || exit 1 |
---|
228 | echo $WORKDIR/*.version ... |
---|
229 | mv $WORKDIR/*.version $DIR || exit 1 |
---|
230 | |
---|
231 | #move packages from buildroot to workdir |
---|
232 | for 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 |
---|
237 | done |
---|
238 | |
---|
239 | |
---|
240 | echo Compressing $LOG ... |
---|
241 | gzip $LOG || exit 1 |
---|
242 | mv $LOG.gz $DIR || exit 1 |
---|
243 | |
---|
244 | |
---|
245 | echo |
---|
246 | echo "* Klaar ja!"; |
---|