[c5c522c] | 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 svn 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 | #already installed? |
---|
| 86 | if grep -x "$NEED" ../npl/buildroot.list >/dev/null; then |
---|
| 87 | continue |
---|
| 88 | fi |
---|
| 89 | |
---|
| 90 | CONFIG=1 |
---|
| 91 | echo -n "Build-dependency $NEED installeren: " |
---|
| 92 | TGZ=`../npl/findpkg "$NEED"` || exit 1 |
---|
| 93 | echo "$TGZ" |
---|
| 94 | |
---|
| 95 | #Bepaal waar het pakketje in de buildroot moet terecht komen, ivm crosscompiling. |
---|
| 96 | #Zon pakketje mag niet in de buildroot zelf, omdat dan de bestaande libraries overschreven kunnen worden met die van een andere architectuur. |
---|
| 97 | #eerst moeten we de architectuur van het pakketje weten: |
---|
| 98 | NEEDHOST= |
---|
| 99 | if NEEDBUILD=`../npl/findbuild "$NEED"`; then |
---|
| 100 | #FIXME: dit klopt niet, bij perlmod_XML_Parser pakt hij nu buildmods.arch ipv perlmod_XML_Parser.arch! |
---|
| 101 | NEEDHOST=`cat $NEEDBUILD.arch 2>/dev/null` |
---|
| 102 | fi |
---|
| 103 | #als het er een directory naast npl bestaat is het een crosscomplile architectuur: |
---|
| 104 | if [ "$NEEDHOST" ] && [ -e ../$NEEDHOST ]; then |
---|
| 105 | #cross-architectuur, install |
---|
| 106 | #in een subdirectory onder buildroot, met naam van architectuur: |
---|
| 107 | echo "(Cross architecture detected, installing package in $NEEDHOST toolchain directory)" |
---|
| 108 | export ROOT=$BUILDROOT/usr/$NEEDHOST/$NEEDHOST |
---|
| 109 | else |
---|
| 110 | #gewoon direct in de buildroot pleuren: |
---|
| 111 | export ROOT=$BUILDROOT |
---|
| 112 | fi |
---|
| 113 | |
---|
| 114 | installpkg "$TGZ" >/dev/null || exit 1 |
---|
| 115 | |
---|
| 116 | #_dev niet gespecificeerd? |
---|
| 117 | #NO: findbuilddeps does this now |
---|
| 118 | # if ! echo "$NEEDS" | grep "$NEED""_dev"; then |
---|
| 119 | # #bestaat er wel een dev? |
---|
| 120 | # if TGZ=`../npl/findpkg "$NEED""_dev" 2>/dev/null`; then |
---|
| 121 | # echo "Auto selecting development package: $TGZ" |
---|
| 122 | # installpkg "$TGZ" >/dev/null || exit 1 |
---|
| 123 | # fi |
---|
| 124 | # fi |
---|
| 125 | |
---|
| 126 | done |
---|
| 127 | |
---|
| 128 | if [ "$CONFIG" ]; then |
---|
| 129 | echo "Nieuwe packages ldconfiggen..." |
---|
| 130 | ldconfig -r $BUILDROOT || exit 1 |
---|
| 131 | echo "etc-update doen" |
---|
| 132 | chroot $BUILDROOT "/bin/bash" -l -c "etc-update" || exit 1 |
---|
| 133 | fi |
---|
| 134 | |
---|
| 135 | #paden fixen ivm cross compile? |
---|
| 136 | if [ "$HOST" ]; then |
---|
| 137 | echo -n "Adjusting crossplatform library configs in toolchain directory..." |
---|
| 138 | #fix pkgconfig files that are in crossplatform-path: |
---|
| 139 | sed -i "s@=/usr@=/usr/$NEEDHOST/$NEEDHOST/usr@" $BUILDROOT/usr/$HOST/$HOST/usr/lib/pkgconfig/*.pc |
---|
| 140 | #fix *-config files that are in crossplatform-path: |
---|
| 141 | sed -i "s@=/usr@=/usr/$HOST/$HOST/usr@" $BUILDROOT/usr/$HOST/$HOST/usr/bin/*-config |
---|
| 142 | sed -i "s@\"/usr@\"/usr/$HOST/$HOST/usr@" $BUILDROOT/usr/$HOST/$HOST/usr/bin/*-config |
---|
| 143 | echo "DONE" |
---|
| 144 | fi |
---|
| 145 | |
---|
| 146 | fi |
---|
| 147 | |
---|
| 148 | #hack kernel versie tools |
---|
| 149 | cat arch > $BUILDROOT/bin/arch |
---|
| 150 | chmod +x $BUILDROOT/bin/arch |
---|
| 151 | KVER=`ls $BUILDROOT/lib/modules 2>/dev/null|cut -f1 -d'/'` |
---|
| 152 | if [ "$KVER" == "" ]; then |
---|
| 153 | KVER=`cat ../npl/kernel/linux_src/linux_src.version` || exit 1 |
---|
| 154 | fi |
---|
| 155 | cat uname |sed "s/#KVER#/$KVER/g" > $BUILDROOT/bin/uname |
---|
| 156 | chmod +x $BUILDROOT/bin/uname |
---|
| 157 | |
---|
| 158 | #vanaf hier is er een goede buildroot |
---|
| 159 | echo "$DIR word gekopieerd naar werkdirectory $WORKDIR" |
---|
| 160 | cp -a $DIR $WORKDIR || exit 1 |
---|
| 161 | chown -R root:root $WORKDIR || exit 1 |
---|
| 162 | |
---|
| 163 | #proc is needed for all kinds of things: |
---|
| 164 | umount $BUILDROOT/proc &>/dev/null |
---|
| 165 | mount -t proc none $BUILDROOT/proc || exit 1 |
---|
| 166 | |
---|
| 167 | #pts is needed for programs like 'Expect': |
---|
| 168 | umount $BUILDROOT/dev/pts &>/dev/null |
---|
| 169 | mount -t devpts none $BUILDROOT/dev/pts -o rw,nosuid,noexec,gid=5,mode=620 || exit 1 |
---|
| 170 | |
---|
| 171 | #put the logfile in top of the buildroot and not in /tmp/build, to not 'disrupt' smart SlackBuild that use file-times. |
---|
| 172 | export LOG="$BUILDROOT/$PGM.log" |
---|
| 173 | |
---|
| 174 | #log output and show progress info if pv is installed |
---|
| 175 | progress() |
---|
| 176 | { |
---|
| 177 | #use old logfile as reference for progress indication |
---|
| 178 | SIZE=`zcat $BUILDROOT/tmp/build/$PGM.log.gz 2>/dev/null|wc -c` |
---|
| 179 | if [ "$progress" ] && which pv &>/dev/null; then |
---|
| 180 | pv -s $SIZE -p -t -e | tee $LOG |
---|
| 181 | else |
---|
| 182 | tee $LOG |
---|
| 183 | fi |
---|
| 184 | } |
---|
| 185 | |
---|
| 186 | #clear environment, set some variables and do the actual chrooting: |
---|
| 187 | echo -e "\e[1;33m*** Chroot naar $BUILDROOT en starten van $PGM in $ROOTEDWORKDIR:\e[0m" >&2 |
---|
| 188 | CHROOT=`which chroot` |
---|
| 189 | env - $CHROOT $BUILDROOT "/bin/bash" -l -c " |
---|
| 190 | export MAKEFLAGS='$MAKEFLAGS' |
---|
| 191 | cd $ROOTEDWORKDIR |
---|
| 192 | export PS4='\[\e[1;32m\]\$LINENO \$PWD > \[\e[0m\]' |
---|
| 193 | export HOST=$HOST |
---|
| 194 | bash -x ./$PGM" 2>&1 | progress ; |
---|
| 195 | |
---|
| 196 | if [ "${PIPESTATUS[0]}" != "0" ]; then |
---|
| 197 | echo -e "\e[1;31m*** Er ging iets mis tijdens het bakken in de buildroot!\e[0m" >&2 |
---|
| 198 | echo "Chroot naar $BUILDROOT zodat je kunt onderzoeken (ctrl-d om te stoppen):" |
---|
| 199 | env - $CHROOT $BUILDROOT "/bin/bash" -l -c " |
---|
| 200 | export MAKEFLAGS='$MAKEFLAGS' |
---|
| 201 | export TERM='$TERM' |
---|
| 202 | cd $ROOTEDWORKDIR |
---|
| 203 | export HOST=$HOST |
---|
| 204 | bash" 2>&1 |
---|
| 205 | |
---|
| 206 | umount $BUILDROOT/proc |
---|
| 207 | umount $BUILDROOT/dev/pts |
---|
| 208 | echo "Om verder te testen/onderzoeken, tik:" |
---|
| 209 | echo "chroot $BUILDROOT" |
---|
| 210 | echo "Logfile: $LOG" |
---|
| 211 | exit 1 |
---|
| 212 | else |
---|
| 213 | echo -e "\e[1;32m*** Build gelukt.\e[0m" >&2 |
---|
| 214 | fi |
---|
| 215 | |
---|
| 216 | umount $BUILDROOT/proc |
---|
| 217 | umount $BUILDROOT/dev/pts |
---|
| 218 | |
---|
| 219 | echo "* Packages terugmoven naar originele directory.."; |
---|
| 220 | echo $WORKDIR/*.arch ... |
---|
| 221 | mv $WORKDIR/*.arch $DIR || exit 1 |
---|
| 222 | echo $WORKDIR/*.version ... |
---|
| 223 | mv $WORKDIR/*.version $DIR || exit 1 |
---|
| 224 | echo $WORKDIR/*.pkg ... |
---|
| 225 | mv $WORKDIR/*.pkg $DIR || exit 1 |
---|
| 226 | echo Compressing $LOG ... |
---|
| 227 | gzip $LOG || exit 1 |
---|
| 228 | mv $LOG.gz $DIR || exit 1 |
---|
| 229 | |
---|
| 230 | |
---|
| 231 | echo |
---|
| 232 | echo "* Klaar ja!"; |
---|