MONSTER-REVISION!
[ipfire-2.x.git] / make.sh
1 #!/bin/bash
2 #
3 ############################################################################
4 #                                                                          #
5 # This file is part of the IPFire Firewall.                                #
6 #                                                                          #
7 # IPFire is free software; you can redistribute it and/or modify           #
8 # it under the terms of the GNU General Public License as published by     #
9 # the Free Software Foundation; either version 2 of the License, or        #
10 # (at your option) any later version.                                      #
11 #                                                                          #
12 # IPFire is distributed in the hope that it will be useful,                #
13 # but WITHOUT ANY WARRANTY; without even the implied warranty of           #
14 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the            #
15 # GNU General Public License for more details.                             #
16 #                                                                          #
17 # You should have received a copy of the GNU General Public License        #
18 # along with IPFire; if not, write to the Free Software                    #
19 # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA #
20 #                                                                          #
21 # Copyright (C) 2006 IPFire-Team <entwickler@ipfire.org>.                  #
22 #                                                                          #
23 ############################################################################
24 #
25
26   NAME="IPFire"                 # Software name
27   SNAME="ipfire"                        # Short name
28   VERSION="2.0"                 # Version number
29   SLOGAN="www.ipfire.eu"                # Software slogan
30   CONFIG_ROOT=/var/ipfire               # Configuration rootdir
31   NICE=10
32   MAX_RETRIES=3                 # prefetch/check loop
33   KVER=`grep --max-count=1 VER lfs/linux | awk '{ print $3 }'`
34   MACHINE=`uname -m`
35   SVN_REVISION=`svn info | grep Revision | cut -c 11-`
36
37   # Setzen des IPFire Builds
38   if [ -e ./.svn ]; then
39     FIREBUILD=`cat .svn/entries |sed -n 's/^[ \t]*revision=\"// p' | sed -n 's/\".*$// p'`
40   fi
41
42   # Debian specific settings
43   if [ ! -e /etc/debian_version ]; then
44         FULLPATH=`which $0`
45   else
46         if [ -x /usr/bin/realpath ]; then
47                 FULLPATH=`/usr/bin/realpath $0`
48         else
49                 echo "ERROR: Need to do apt-get install realpath"
50                 exit 1
51         fi
52   fi
53
54   PWD=`pwd`
55   BASENAME=`basename $0`
56   BASEDIR=`echo $FULLPATH | sed "s/\/$BASENAME//g"`
57   LOGFILE=$BASEDIR/log/_build.preparation.log
58   export BASEDIR LOGFILE
59   DIR_CHK=$BASEDIR/cache/check
60   mkdir $BASEDIR/log/ 2>/dev/null
61
62   if [ -f .config ]; then
63         . .config
64   fi
65
66   if [ 'x86_64' = $MACHINE -o 'i686' = $MACHINE -o 'i586' = $MACHINE -o 'i486' = $MACHINE -o 'i386' = $MACHINE ]; then
67         echo "`date -u '+%b %e %T'`: Machine is ix86 (or equivalent)" >> $LOGFILE
68         MACHINE=i386
69         BUILDTARGET=i386-pc-linux-gnu
70         CFLAGS="-O2 -mcpu=i386 -march=i386 -pipe -fomit-frame-pointer"
71         CXXFLAGS="-O2 -mcpu=i386 -march=i386 -pipe -fomit-frame-pointer"
72   elif [ 'alpha' = $MACHINE ]; then
73         echo "`date -u '+%b %e %T'`: Machine is Alpha AXP" >> $LOGFILE
74         BUILDTARGET=alpha-unknown-linux-gnu
75         CFLAGS="-O2 -mcpu=ev4 -mieee -pipe"
76         CXXFLAGS="-O2 -mcpu=ev4 -mieee -pipe"
77   else
78         echo "`date -u '+%b %e %T'`: Can't determine your architecture - $MACHINE" >> $LOGFILE
79         exit 1
80   fi
81
82 # Define immediately
83 stdumount() {
84         umount $BASEDIR/build/dev/pts           2>/dev/null;
85         umount $BASEDIR/build/proc                      2>/dev/null;
86         umount $BASEDIR/build/install/mnt               2>/dev/null;
87         umount $BASEDIR/build/usr/src/cache     2>/dev/null;
88         umount $BASEDIR/build/usr/src/ccache    2>/dev/null;
89         umount $BASEDIR/build/usr/src/config    2>/dev/null;
90         umount $BASEDIR/build/usr/src/doc               2>/dev/null;
91         umount $BASEDIR/build/usr/src/html              2>/dev/null;
92         umount $BASEDIR/build/usr/src/langs     2>/dev/null;
93         umount $BASEDIR/build/usr/src/lfs               2>/dev/null;
94         umount $BASEDIR/build/usr/src/log               2>/dev/null;
95         umount $BASEDIR/build/usr/src/src               2>/dev/null;
96 }
97
98 exiterror() {
99         stdumount
100         for i in `seq 0 7`; do
101             if ( losetup /dev/loop${i} 2>/dev/null | grep -q "/install/images" ); then
102                 losetup -d /dev/loop${i} 2>/dev/null
103             fi;
104         done
105         echo "ERROR: $*"
106         echo "       Check $LOGFILE for errors if applicable"
107         exit 1
108 }
109
110 entershell() {
111         if [ ! -e $BASEDIR/build/usr/src/lfs/ ]; then
112                 exiterror "No such file or directory: $BASEDIR/build/usr/src/lfs/"
113         fi
114         echo "Entering to a shell inside LFS chroot, go out with exit"
115         chroot $LFS /tools/bin/env -i HOME=/root TERM=$TERM PS1='\u:\w\$ ' \
116                 PATH=/usr/local/bin:/bin:/usr/bin:/sbin:/usr/sbin:/tools/bin \
117                 VERSION=$VERSION CONFIG_ROOT=$CONFIG_ROOT \
118                 NAME="$NAME" SNAME="$SNAME" SLOGAN="$SLOGAN" \
119                 CFLAGS="$CFLAGS" CXXFLAGS="$CXXFLAGS" \
120                 CCACHE_DIR=/usr/src/ccache \
121                 CCACHE_HASHDIR=1 \
122                 KVER=$KVER \
123                 BUILDTARGET="$BUILDTARGET" MACHINE="$MACHINE" \
124                 KGCC="ccache /usr/bin/gcc" \
125                 /tools/bin/bash
126         if [ $? -ne 0 ]; then
127                         exiterror "chroot error"
128         else
129                 stdumount
130         fi
131 }
132
133 prepareenv() {
134     ############################################################################
135     #                                                                          #
136     # Are we running the right shell?                                          #
137     #                                                                          #
138     ############################################################################
139     if [ ! "$BASH" ]; then
140         exiterror "BASH environment variable is not set.  You're probably running the wrong shell."
141     fi
142
143     if [ -z "${BASH_VERSION}" ]; then
144         exiterror "Not running BASH shell."
145     fi
146
147
148     ############################################################################
149     #                                                                          #
150     # Trap on emergency exit                                                   #
151     #                                                                          #
152     ############################################################################
153     trap "exiterror 'Build process interrupted'" SIGINT SIGTERM SIGKILL SIGSTOP SIGQUIT
154
155
156     ############################################################################
157     #                                                                          #
158     # Resetting our nice level                                                 #
159     #                                                                          #
160     ############################################################################
161     echo "`date -u '+%b %e %T'`: Resetting our nice level to $NICE" | tee -a $LOGFILE
162     renice $NICE $$ > /dev/null
163     if [ `nice` != "$NICE" ]; then
164         exiterror "Failed to set correct nice level"
165     fi
166
167     ############################################################################
168     #                                                                          #
169     # Checking if running as root user                                         #
170     #                                                                          #
171     ############################################################################
172     echo "`date -u '+%b %e %T'`: Checking if we're running as root user" | tee -a $LOGFILE
173     if [ `id -u` != 0 ]; then
174         exiterror "Not building as root"
175     fi
176
177
178     ############################################################################
179     #                                                                          #
180     # Checking for necessary temporary space                                   #
181     #                                                                          #
182     ############################################################################
183     echo "`date -u '+%b %e %T'`: Checking for necessary space on disk $BASE_DEV" | tee -a $LOGFILE
184     BASE_DEV=`df -P -k $BASEDIR | tail -n 1 | awk '{ print $1 }'`
185     BASE_ASPACE=`df -P -k $BASEDIR | tail -n 1 | awk '{ print $4 }'`
186     if (( 2202000 > $BASE_ASPACE )); then
187         BASE_USPACE=`du -skx $BASEDIR | awk '{print $1}'`
188         if (( 2202000 - $BASE_USPACE > $BASE_ASPACE )); then
189                 exiterror "Not enough temporary space available, need at least 2.1GB on $BASE_DEV"
190         fi
191     fi
192
193     ############################################################################
194     #                                                                          #
195     # Building Linux From Scratch system                                       #
196     #                                                                          #
197     ############################################################################
198     echo "`date -u '+%b %e %T'`: Building Linux From Scratch system" | tee -a $LOGFILE
199
200     # Set umask
201     umask 022
202
203     # Set LFS Directory
204     LFS=$BASEDIR/build
205
206     # Check /tools symlink
207     if [ -h /tools ]; then
208         rm -f /tools
209     fi
210     if [ ! -a /tools ]; then
211         ln -s $BASEDIR/build/tools /
212     fi
213     if [ ! -h /tools ]; then
214         exiterror "Could not create /tools symbolic link."
215     fi
216
217     # Setup environment
218     set +h
219     LC_ALL=POSIX
220     export LFS LC_ALL CFLAGS CXXFLAGS
221     unset CC CXX CPP LD_LIBRARY_PATH LD_PRELOAD
222
223     # Make some extra directories
224     mkdir -p $BASEDIR/build/{tools,etc,usr/src} 2>/dev/null
225     mkdir -p $BASEDIR/{cache,ccache} 2>/dev/null
226     mkdir -p $BASEDIR/build/dev/pts $BASEDIR/build/proc $BASEDIR/build/usr/src/{cache,config,doc,html,langs,lfs,log,src,ccache}
227
228     # Make all sources and proc available under lfs build
229     mount --bind /dev/pts        $BASEDIR/build/dev/pts
230     mount --bind /proc           $BASEDIR/build/proc
231     mount --bind $BASEDIR/cache  $BASEDIR/build/usr/src/cache
232     mount --bind $BASEDIR/ccache $BASEDIR/build/usr/src/ccache
233     mount --bind $BASEDIR/config $BASEDIR/build/usr/src/config
234     mount --bind $BASEDIR/doc    $BASEDIR/build/usr/src/doc
235     mount --bind $BASEDIR/html   $BASEDIR/build/usr/src/html
236     mount --bind $BASEDIR/langs  $BASEDIR/build/usr/src/langs
237     mount --bind $BASEDIR/lfs    $BASEDIR/build/usr/src/lfs
238     mount --bind $BASEDIR/log    $BASEDIR/build/usr/src/log
239     mount --bind $BASEDIR/src    $BASEDIR/build/usr/src/src
240
241     # Run LFS static binary creation scripts one by one
242     export CCACHE_DIR=$BASEDIR/ccache
243     export CCACHE_HASHDIR=1
244
245     # Remove pre-install list of installed files in case user erase some files before rebuild
246     rm -f $BASEDIR/build/usr/src/lsalr 2>/dev/null
247 }
248
249
250 ############################################################################
251 #                                                                          #
252 # Necessary shell functions                                                #
253 #                                                                          #
254 ############################################################################
255 lfsmake1() {
256         if [ -f $BASEDIR/lfs/$1 ]; then
257                 echo "`date -u '+%b %e %T'`: Building $*" | tee -a $LOGFILE
258                 cd $BASEDIR/lfs && make -s -f $* LFS_BASEDIR=$BASEDIR MESSAGE="$1\t " download  >> $LOGFILE 2>&1
259                 if [ $? -ne 0 ]; then
260                         exiterror "Download error in $1"
261                 fi
262                 cd $BASEDIR/lfs && make -s -f $* LFS_BASEDIR=$BASEDIR MESSAGE="$1\t md5sum" md5  >> $LOGFILE 2>&1
263                 if [ $? -ne 0 ]; then
264                         exiterror "md5sum error in $1, check file in cache or signature"
265                 fi
266                 cd $BASEDIR/lfs && make -f $*   BUILDTARGET=$BUILDTARGET \
267                                                 MACHINE=$MACHINE \
268                                                 LFS_BASEDIR=$BASEDIR \
269                                                 ROOT=$LFS \
270                                                 KVER=$KVER \
271                                                 install >> $LOGFILE 2>&1
272                 if [ $? -ne 0 ]; then
273                         exiterror "Building $*";
274                 fi
275         else
276                 exiterror "No such file or directory: $BASEDIR/$1"
277         fi
278         return 0
279 }
280
281 lfsmake2() {
282         if [ -f $BASEDIR/build/usr/src/lfs/$1 ]; then
283                 echo "`date -u '+%b %e %T'`: Building $*" | tee -a $LOGFILE
284                 cd $BASEDIR/lfs && make -s -f $* LFS_BASEDIR=$BASEDIR MESSAGE="$1\t " download  >> $LOGFILE 2>&1
285                 if [ $? -ne 0 ]; then
286                         exiterror "Download error in $1"
287                 fi
288                 cd $BASEDIR/lfs && make -s -f $* LFS_BASEDIR=$BASEDIR MESSAGE="$1\t md5sum" md5  >> $LOGFILE 2>&1
289                 if [ $? -ne 0 ]; then
290                         exiterror "md5sum error in $1, check file in cache or signature"
291                 fi
292                 chroot $LFS /tools/bin/env -i   HOME=/root \
293                                                 TERM=$TERM PS1='\u:\w\$ ' \
294                                                 PATH=/usr/local/bin:/bin:/usr/bin:/sbin:/usr/sbin:/tools/bin \
295                                                 VERSION=$VERSION \
296                                                 CONFIG_ROOT=$CONFIG_ROOT \
297                                                 NAME="$NAME" SNAME="$SNAME" SLOGAN="$SLOGAN" \
298                                                 CFLAGS="$CFLAGS" CXXFLAGS="$CXXFLAGS" \
299                                                 CCACHE_DIR=/usr/src/ccache CCACHE_HASHDIR=1 \
300                                                 KVER=$KVER \
301                                                 BUILDTARGET="$BUILDTARGET" MACHINE="$MACHINE" \
302                     /tools/bin/bash -x -c "cd /usr/src/lfs && \
303                     make -f $* LFS_BASEDIR=/usr/src install" >>$LOGFILE 2>&1
304                 if [ $? -ne 0 ]; then
305                         exiterror "Building $*"
306                 fi
307         else
308                 exiterror "No such file or directory: $BASEDIR/build/usr/src/lfs/$1"
309         fi
310         return 0
311 }
312
313 ipcopmake() {
314         if [ -f $BASEDIR/build/usr/src/lfs/$1 ]; then
315                 echo "`date -u '+%b %e %T'`: Building $*" | tee -a $LOGFILE
316                 cd $BASEDIR/lfs && make -s -f $* LFS_BASEDIR=$BASEDIR MESSAGE="$1\t " download  >> $LOGFILE 2>&1
317                 if [ $? -ne 0 ]; then
318                         exiterror "Download error in $1"
319                 fi
320                 cd $BASEDIR/lfs && make -s -f $* LFS_BASEDIR=$BASEDIR MESSAGE="$1\t md5sum" md5  >> $LOGFILE 2>&1
321                 if [ $? -ne 0 ]; then
322                         exiterror "md5sum error in $1, check file in cache or signature"
323                 fi
324                 chroot $LFS /tools/bin/env -i   HOME=/root \
325                                                 TERM=$TERM PS1='\u:\w\$ ' \
326                                                 PATH=/usr/local/bin:/bin:/usr/bin:/sbin:/usr/sbin \
327                                                 VERSION=$VERSION \
328                                                 CONFIG_ROOT=$CONFIG_ROOT \
329                                                 NAME="$NAME" SNAME="$SNAME" SLOGAN="$SLOGAN" \
330                                                 CFLAGS="$CFLAGS" CXXFLAGS="$CXXFLAGS" \
331                                                 CCACHE_DIR=/usr/src/ccache CCACHE_HASHDIR=1 \
332                                                 KVER=$KVER \
333                                                 BUILDTARGET="$BUILDTARGET" MACHINE="$MACHINE" \
334                     /bin/bash -x -c "cd /usr/src/lfs && \
335                     make -f $* LFS_BASEDIR=/usr/src install" >>$LOGFILE 2>&1
336                 if [ $? -ne 0 ]; then
337                         exiterror "Building $*"
338                 fi
339         else
340                 exiterror "No such file or directory: $BASEDIR/build/usr/src/lfs/$1"
341         fi
342         return 0
343 }
344
345 ipfiredist() {
346         if [ -f $BASEDIR/build/usr/src/lfs/$1 ]; then
347 #          if [ ! `ls -w1 $BASEDIR/packages/*.ipfire | grep $1` ]; then
348                 echo "`date -u '+%b %e %T'`: Packaging $1" | tee -a $LOGFILE
349                 chroot $LFS /tools/bin/env -i   HOME=/root \
350                                                 TERM=$TERM PS1='\u:\w\$ ' \
351                                                 PATH=/usr/local/bin:/bin:/usr/bin:/sbin:/usr/sbin \
352                                                 VERSION=$VERSION \
353                                                 CONFIG_ROOT=$CONFIG_ROOT \
354                                                 NAME="$NAME" SNAME="$SNAME" SLOGAN="$SLOGAN" \
355                                                 CFLAGS="$CFLAGS" CXXFLAGS="$CXXFLAGS" \
356                                                 CCACHE_DIR=/usr/src/ccache CCACHE_HASHDIR=1 \
357                                                 KVER=$KVER \
358                                                 BUILDTARGET="$BUILDTARGET" MACHINE="$MACHINE" \
359                     /bin/bash -x -c "cd /usr/src/lfs && \
360                     make -f $1 LFS_BASEDIR=/usr/src dist" >>$LOGFILE 2>&1
361                 if [ $? -ne 0 ]; then
362                         exiterror "Packaging $1"
363                 fi
364 #          else
365 #               echo "`date -u '+%b %e %T'`: Packaging: The package $1 already exists"
366 #          fi
367         else
368                 exiterror "No such file or directory: $BASEDIR/build/usr/src/lfs/$1"
369         fi
370         return 0
371 }
372
373
374 installmake() {
375         if [ -f $BASEDIR/build/usr/src/lfs/$1 ]; then
376                 echo "`date -u '+%b %e %T'`: Building $*" | tee -a $LOGFILE
377                 cd $BASEDIR/lfs && make -s -f $* LFS_BASEDIR=$BASEDIR MESSAGE="$1\t " download  >> $LOGFILE 2>&1
378                 if [ $? -ne 0 ]; then
379                         exiterror "Download error in $1"
380                 fi
381                 cd $BASEDIR/lfs && make -s -f $* LFS_BASEDIR=$BASEDIR MESSAGE="$1\t md5sum" md5  >> $LOGFILE 2>&1
382                 if [ $? -ne 0 ]; then
383                         exiterror "md5sum error in $1, check file in cache or signature"
384                 fi
385                 chroot $LFS /tools/bin/env -i   HOME=/root \
386                                                 TERM=$TERM PS1='\u:\w\$ ' \
387                                                 PATH=/usr/local/bin:/opt/$MACHINE-uClibc/usr/bin:/bin:/usr/bin:/sbin:/usr/sbin \
388                                                 VERSION=$VERSION \
389                                                 CONFIG_ROOT=$CONFIG_ROOT \
390                                                 LFS_PASS="install" \
391                                                 NAME="$NAME" SNAME="$SNAME" SLOGAN="$SLOGAN" \
392                                                 CFLAGS="-Os" CXXFLAGS="-Os" \
393                                                 CCACHE_DIR=/usr/src/ccache CCACHE_HASHDIR=1 \
394                                                 KVER=$KVER \
395                                                 BUILDTARGET="$BUILDTARGET" MACHINE="$MACHINE" \
396                     /bin/bash -x -c "cd /usr/src/lfs && \
397                     make -f $* LFS_BASEDIR=/usr/src install" >>$LOGFILE 2>&1
398                 if [ $? -ne 0 ]; then
399                         exiterror "Building $*"
400                 fi
401         else
402                 exiterror "No such file or directory: $BASEDIR/build/usr/src/lfs/$1"
403         fi
404         return 0
405 }
406
407 buildtoolchain() {
408     LOGFILE="$BASEDIR/log/_build.toolchain.log"
409     export LOGFILE
410     echo -ne "`date -u '+%b %e %T'`: Stage1 toolchain build \n" | tee -a $LOGFILE
411     # Build sed now, as we use some extensions
412     ORG_PATH=$PATH
413     NATIVEGCC=`gcc --version | grep GCC | awk {'print $3'}`
414     export NATIVEGCC GCCmajor=${NATIVEGCC:0:1} GCCminor=${NATIVEGCC:2:1} GCCrelease=${NATIVEGCC:4:1}
415     lfsmake1 ccache
416     lfsmake1 sed        LFS_PASS=1
417     lfsmake1 m4         LFS_PASS=1
418     lfsmake1 bison      LFS_PASS=1
419     lfsmake1 flex       LFS_PASS=1
420     lfsmake1 binutils   LFS_PASS=1
421     lfsmake1 gcc        LFS_PASS=1
422     export PATH=$BASEDIR/build/usr/local/bin:$BASEDIR/build/tools/bin:$PATH
423     
424     lfsmake1 linux
425     lfsmake1 tcl
426     lfsmake1 expect
427     lfsmake1 glibc
428     lfsmake1 dejagnu
429     lfsmake1 gcc        LFS_PASS=2
430     lfsmake1 binutils   LFS_PASS=2
431     lfsmake1 gawk
432     lfsmake1 coreutils
433     lfsmake1 bzip2
434     lfsmake1 gzip
435     lfsmake1 diffutils
436     lfsmake1 findutils
437     lfsmake1 make
438     lfsmake1 grep
439     lfsmake1 sed        LFS_PASS=2
440     lfsmake1 m4         LFS_PASS=2
441     lfsmake1 bison      LFS_PASS=2
442     lfsmake1 flex       LFS_PASS=2
443     lfsmake1 gettext
444     lfsmake1 ncurses
445     lfsmake1 patch
446     lfsmake1 tar
447     lfsmake1 texinfo
448     lfsmake1 bash
449     lfsmake1 util-linux
450     lfsmake1 perl
451     export PATH=$ORG_PATH
452 }
453
454 buildbase() {
455     LOGFILE="$BASEDIR/log/_build.base.log"
456     export LOGFILE
457     echo -ne "`date -u '+%b %e %T'`: Stage2 linux base build \n" | tee -a $LOGFILE
458     # Run LFS dynamic binary creation scripts one by one
459     lfsmake2 stage2
460     lfsmake2 makedev
461     lfsmake2 linux
462     lfsmake2 man-pages
463     lfsmake2 glibc
464     lfsmake2 binutils
465     lfsmake2 gcc
466     lfsmake2 coreutils
467     lfsmake2 zlib
468     lfsmake2 mktemp
469     lfsmake2 iana-etc
470     lfsmake2 findutils
471     lfsmake2 gawk
472     lfsmake2 ncurses
473     lfsmake2 vim
474     lfsmake2 m4
475     lfsmake2 bison
476     lfsmake2 less
477     lfsmake2 groff
478     lfsmake2 sed
479     lfsmake2 flex
480     lfsmake2 gettext
481     lfsmake2 net-tools
482     lfsmake2 inetutils
483     lfsmake2 perl
484     lfsmake2 texinfo
485     lfsmake2 autoconf
486     lfsmake2 automake
487     lfsmake2 bash
488     lfsmake2 file
489     lfsmake2 libtool
490     lfsmake2 bzip2
491     lfsmake2 diffutils
492     lfsmake2 ed
493     lfsmake2 kbd
494     lfsmake2 e2fsprogs
495     lfsmake2 grep
496     if [ 'i386' = $MACHINE ]; then 
497         lfsmake2 grub
498     elif [ 'alpha' = $MACHINE ]; then 
499         lfsmake2 aboot
500     fi
501     lfsmake2 gzip
502     lfsmake2 man
503     lfsmake2 make
504     lfsmake2 modutils
505     lfsmake2 patch
506     lfsmake2 procinfo
507     lfsmake2 procps
508     lfsmake2 psmisc
509     lfsmake2 shadow
510     lfsmake2 sysklogd
511     lfsmake2 sysvinit
512     lfsmake2 tar
513     lfsmake2 util-linux
514 }
515
516 buildipcop() {
517   # Run IPFire make scripts one by one
518   LOGFILE="$BASEDIR/log/_build.ipfire.log"
519   export LOGFILE
520   echo -ne "`date -u '+%b %e %T'`: Stage3 $NAME build \n" | tee -a $LOGFILE
521
522   # Build these first as some of the kernel packages below rely on 
523   # these for some of their client program functionality 
524   ipcopmake configroot
525   ipcopmake dhcp
526   ipcopmake dhcpcd
527   ipcopmake libusb
528   ipcopmake libpcap
529   ipcopmake linux-atm
530   ipcopmake ppp
531   ipcopmake rp-pppoe
532   ipcopmake unzip
533   # Do SMP now
534   if [ 'i386' = $MACHINE ]; then 
535         # abuse the SMP flag, and make an minimal installer kernel first
536         # so that the boot floppy always works.....
537         ipcopmake linux         LFS_PASS=ipfire SMP=installer
538         ipcopmake linux         LFS_PASS=ipfire SMP=1
539         ipcopmake 3cp4218       SMP=1
540         ipcopmake amedyn        SMP=1
541         ipcopmake cxacru        SMP=1
542         ipcopmake eagle         SMP=1
543
544         # These are here because they have i386 only binary libraries
545         # included in the package.
546         ipcopmake cnx_pci       SMP=1
547         ipcopmake fcdsl         SMP=1
548         ipcopmake fcdsl2        SMP=1
549         ipcopmake fcdslsl       SMP=1
550         ipcopmake fcdslusb      SMP=1
551         ipcopmake fcdslslusb    SMP=1
552         ipcopmake fcpci SMP=1
553         ipcopmake fcclassic     SMP=1
554         ipcopmake pulsar        SMP=1
555         ipcopmake unicorn       SMP=1
556         ipcopmake promise-sata-300-tx SMP=1
557   fi
558
559   ipcopmake linux       LFS_PASS=ipfire
560   ipcopmake 3cp4218     
561   ipcopmake amedyn      
562   ipcopmake cxacru      
563   ipcopmake eciadsl     
564   ipcopmake eagle       
565   ipcopmake speedtouch  
566   if [ 'i386' = $MACHINE ]; then 
567         # These are here because they have i386 only binary libraries
568         # included in the package.
569         ipcopmake cnx_pci       
570         ipcopmake fcdsl         
571         ipcopmake fcdsl2        
572         ipcopmake fcdslsl       
573         ipcopmake fcdslusb      
574         ipcopmake fcdslslusb 
575         ipcopmake fcpci
576         ipcopmake fcclassic
577         ipcopmake pulsar        
578         ipcopmake unicorn
579         ipcopmake promise-sata-300-tx
580   fi
581
582   ipcopmake pcmcia-cs
583   ipcopmake expat
584   ipcopmake gdbm
585   ipcopmake gmp
586   ipcopmake openssl
587   ipcopmake python
588   ipcopmake libnet
589   ipcopmake libpng
590   ipcopmake libtiff
591   ipcopmake libjpeg
592   ipcopmake lcms
593   ipcopmake libmng
594   ipcopmake freetype
595   ipcopmake gd
596   ipcopmake popt
597   ipcopmake slang
598   ipcopmake newt
599   ipcopmake libcap
600   ipcopmake pciutils
601   ipcopmake pcre
602   ipcopmake readline
603   ipcopmake libxml2
604   ipcopmake berkeley
605   ipcopmake BerkeleyDB ## The Perl module
606   ipcopmake mysql
607   ipcopmake saslauthd PASS=1
608   ipcopmake openldap
609   ipcopmake apache2
610   ipcopmake php
611   ipcopmake arping
612   ipcopmake beep
613   ipcopmake bind
614   ipcopmake capi4k-utils
615   ipcopmake cdrtools
616   ipcopmake dnsmasq
617   ipcopmake dosfstools
618   ipcopmake ethtool
619   ipcopmake ez-ipupdate
620   ipcopmake fcron
621   ipcopmake perl-GD
622   ipcopmake gnupg
623   ipcopmake hdparm
624   ipcopmake ibod
625   ipcopmake initscripts
626   ipcopmake iptables
627   ipcopmake ipac-ng
628   ipcopmake ipaddr
629   ipcopmake iproute2
630   ipcopmake iptstate
631   ipcopmake iputils
632   ipcopmake l7-protocols
633   ipcopmake isapnptools
634   ipcopmake isdn4k-utils
635   ipcopmake kudzu
636   ipcopmake logrotate
637   ipcopmake logwatch
638   ipcopmake mingetty
639   ipcopmake misc-progs
640   ipcopmake mtools
641   ipcopmake nano
642   ipcopmake nash
643   ipcopmake nasm
644   ipcopmake URI
645   ipcopmake HTML-Tagset
646   ipcopmake HTML-Parser
647   ipcopmake Compress-Zlib
648   ipcopmake Digest
649   ipcopmake Digest-SHA1
650   ipcopmake Digest-HMAC
651   ipcopmake libwww-perl
652   ipcopmake Net-DNS
653   ipcopmake Net-IPv4Addr
654   ipcopmake Net_SSLeay
655   ipcopmake IO-Stringy
656   ipcopmake Unix-Syslog
657   ipcopmake Mail-Tools
658   ipcopmake MIME-Tools
659   ipcopmake Net-Server
660   ipcopmake Convert-TNEF
661   ipcopmake Convert-UUlib
662   ipcopmake Archive-Tar
663   ipcopmake Archive-Zip
664   ipcopmake Text-Tabs+Wrap
665   ipcopmake Locale-Country
666   ipcopmake GeoIP
667   ipcopmake fwhits
668   ipcopmake noip_updater
669   ipcopmake ntp
670   ipcopmake oinkmaster
671   ipcopmake openssh
672   ipcopmake openswan
673   ipcopmake pptpclient
674   ipcopmake rrdtool
675   ipcopmake setserial
676   ipcopmake setup
677   ipcopmake snort
678   ipcopmake squid
679   ipcopmake squid-graph
680   ipcopmake squidguard
681   ipcopmake tcpdump
682   ipcopmake traceroute
683   ipcopmake vlan
684   ipcopmake wireless
685   ipcopmake libsafe
686   ipcopmake 3c5x9setup
687   ipcopmake pakfire
688   ipcopmake startscripts
689   ipcopmake java
690   ipcopmake bootsplash
691   ipcopmake spandsp
692   ipcopmake lzo
693   ipcopmake openvpn
694   ipcopmake pkg-config
695   ipcopmake glib
696   ipcopmake pam
697   ipcopmake pammysql
698   ipcopmake saslauthd PASS=2
699   ipcopmake xinetd
700   ipcopmake ghostscript
701   ipcopmake cups
702   ipcopmake samba
703   ipcopmake sudo
704   ipcopmake mc
705   ipcopmake wget
706   ipcopmake wput
707   ipcopmake bridge-utils
708   ipcopmake screen
709   ipcopmake hddtemp
710   ipcopmake smartmontools
711   ipcopmake htop
712   ipcopmake lynx
713   echo -ne "`date -u '+%b %e %T'`: Building ### Mailserver ### \n" | tee -a $LOGFILE
714   ipcopmake postfix
715   ipcopmake procmail
716   ipcopmake fetchmail
717   ipcopmake cyrusimap
718   ipcopmake webcyradm
719   ipcopmake mailx
720   ipcopmake clamav
721   ipcopmake razor
722   ipcopmake spamassassin
723 #  ipcopmake amavisd
724   echo -ne "`date -u '+%b %e %T'`: Building ### VoIP-Server ### \n" | tee -a $LOGFILE
725   ipcopmake stund
726   ipcopmake zaptel
727   ipcopmake libpri
728   ipcopmake bristuff
729   ipcopmake asterisk
730   ipcopmake mpg123
731   echo -ne "`date -u '+%b %e %T'`: Building ### Multimedia-Server ### \n" | tee -a $LOGFILE
732   ipcopmake libmad
733   ipcopmake libogg
734   ipcopmake libvorbis
735   ipcopmake lame
736   ipcopmake xvid
737   ipcopmake mpeg2dec
738   ipcopmake ffmpeg
739   ipcopmake sox
740   ipcopmake gnump3d
741   ipcopmake videolan
742   echo -ne "`date -u '+%b %e %T'`: Building ### P2P-Clients ### \n" | tee -a $LOGFILE
743   ipcopmake applejuice
744   ipcopmake ocaml
745   ipcopmake mldonkey
746   echo -ne "`date -u '+%b %e %T'`: Building ### Net-Tools ### \n" | tee -a $LOGFILE
747   ipcopmake ntop
748   ipcopmake rsync
749   ipcopmake tcpwrapper
750   ipcopmake portmap
751   ipcopmake nfs
752   ipcopmake nmap
753   ipcopmake mbmon
754   ipcopmake iftop
755   ipcopmake ncftp
756   ipcopmake cftp
757   ipcopmake etherwake
758   ipcopmake ethereal
759   ipcopmake tftp-hpa
760   ipcopmake subversion
761   ipcopmake iptraf
762   ipcopmake nagios
763   ipcopmake yasuc
764   ipcopmake apache2 PASS=CONFIG
765 }
766
767 buildinstaller() {
768   # Run installer scripts one by one
769   LOGFILE="$BASEDIR/log/_build.installer.log"
770   export LOGFILE
771   echo -ne "`date -u '+%b %e %T'`: Stage4 installer build \n" | tee -a $LOGFILE
772   if [ 'i386' = $MACHINE ]; then 
773         ipcopmake syslinux
774         ipcopmake as86
775         ipcopmake mbr
776         ipcopmake uClibc
777   fi
778   installmake busybox
779   installmake sysvinit
780   installmake e2fsprogs
781   installmake misc-progs
782   installmake slang
783   installmake util-linux
784   installmake newt
785   installmake pciutils
786   installmake pcmcia-cs
787   installmake kbd
788   installmake installer
789   installmake scsi.img
790   installmake driver.img
791   installmake initrd
792   installmake boot.img
793 }
794
795 buildpackages() {
796   LOGFILE="$BASEDIR/log/_build.packages.log"
797   export LOGFILE
798   echo "... see detailed log in _build.*.log files" >> $LOGFILE
799   echo -ne "`date -u '+%b %e %T'`: Stage5 packages build \n" | tee -a $LOGFILE
800   # Strip files
801   echo "`date -u '+%b %e %T'`: Stripping files" | tee -a $LOGFILE
802   find $LFS/lib $LFS/usr/lib $LFS/usr/share/rrdtool-* $LFS/install ! -type l \( -name '*.so' -o -name '*.so[\.0-9]*' \) \
803         ! -name 'libc.so' ! -name 'libpthread.so' ! -name 'libcrypto.so.0.9.7.sha1' \
804          -exec $LFS/tools/bin/strip --strip-all {} \; >> $LOGFILE 2>&1
805   # add -ls before -exec if you want to verify what files are stripped
806
807   find $LFS/{,s}bin $LFS/usr/{,s}bin $LFS/usr/local/{,s}bin ! -type l \
808         -exec file {} \; | grep " ELF " | cut -f1 -d ':' | xargs $LFS/tools/bin/strip --strip-all >> $LOGFILE 2>&1
809   # there add -v to strip to verify
810
811   if [ 'i386' = $MACHINE ]; then
812         # Create fcdsl packages
813         echo "`date -u '+%b %e %T'`: Building fcdsl tgz" | tee -a $LOGFILE
814         cp $LFS/install/images/fcdsl/license.txt $LFS  >> $LOGFILE 2>&1
815         touch $LFS/var/run/{need-depmod-$KVER,need-depmod-$KVER-smp}
816         cd $LFS && tar cvfz $LFS/install/images/$SNAME-fcdsl-$VERSION.$MACHINE.tgz \
817                 lib/modules/$KVER/misc/fcdsl*.o.gz \
818                 lib/modules/$KVER-smp/misc/fcdsl*.o.gz \
819                 usr/lib/isdn/{fds?base.bin,fd?ubase.frm} \
820                 etc/fcdsl/fcdsl*.conf \
821                 etc/drdsl/{drdsl,drdsl.ini} \
822                 license.txt \
823                 var/run/{need-depmod-$KVER,need-depmod-$KVER-smp} >> $LOGFILE 2>&1
824         rm -f $LFS/license.txt >> $LOGFILE 2>&1
825         cd $BASEDIR
826   fi
827   
828   # Generating list of packages used
829   echo "`date -u '+%b %e %T'`: Generating packages list from logs" | tee -a $LOGFILE
830   rm -f $BASEDIR/doc/packages-list
831   for i in `ls -1tr $BASEDIR/log/[^_]*`; do
832         if [ "$i" != "$BASEDIR/log/FILES" -a -n $i ]; then
833                 echo "* `basename $i`" >>$BASEDIR/doc/packages-list
834         fi
835   done
836   echo "== List of softwares used to build $NAME Version: $VERSION ==" > $BASEDIR/doc/packages-list.txt
837   grep -v 'configroot$\|img$\|initrd$\|initscripts$\|installer$\|install$\|ipfire$\|setup$\|pakfire$\|stage2$\|smp$\|tools$\|tools1$\|tools2$\|.tgz$' \
838         $BASEDIR/doc/packages-list | sort >> $BASEDIR/doc/packages-list.txt
839   rm -f $BASEDIR/doc/packages-list
840   # packages-list.txt is ready to be displayed for wiki page
841
842   # Create ISO for CDRom and USB-superfloppy
843   ipcopmake cdrom
844   rm -f $LFS/install/images/*usb*
845   cp $LFS/install/images/{*.iso,*.tgz} $BASEDIR >> $LOGFILE 2>&1
846
847   ipfirepackages
848
849   # Cleanup
850   stdumount
851   rm -rf $BASEDIR/build/tmp/*
852
853   # Generating total list of files
854   echo "`date -u '+%b %e %T'`: Generating files list from logs" | tee -a $LOGFILE
855   rm -f $BASEDIR/log/FILES
856   for i in `ls -1tr $BASEDIR/log/[^_]*`; do
857         if [ "$i" != "$BASEDIR/log/FILES" -a -n $i ]; then
858                 echo "##" >>$BASEDIR/log/FILES
859                 echo "## `basename $i`" >>$BASEDIR/log/FILES
860                 echo "##" >>$BASEDIR/log/FILES
861                 cat $i | sed "s%^\./%#%" | sort >> $BASEDIR/log/FILES
862         fi
863   done
864   cd $BASEDIR/packages; ls -w1 *.ipfire | awk -F ".ipfire" '{ print $1 }' > $BASEDIR/packages/packages_list.txt
865   echo -n "###EOF###" >> $BASEDIR/packages/packages_list.txt
866
867   cd $PWD
868
869 }
870
871 ipfirepackages() {
872   if [ -d "$BASEDIR/packages" ]; then
873           for i in `ls $BASEDIR/packages`; do
874                 touch $BASEDIR/build/install/packages/$i.empty
875           done
876   fi
877 #  ipfiredist amavisd
878   ipfiredist applejuice
879   ipfiredist asterisk
880   ipfiredist clamav
881   ipfiredist cups
882   ipfiredist cyrusimap
883   ipfiredist fetchmail
884   ipfiredist ffmpeg
885   ipfiredist gnump3d
886   ipfiredist iptraf
887   ipfiredist java
888   ipfiredist lame
889   ipfiredist libmad
890   ipfiredist libogg
891   ipfiredist libtiff
892   ipfiredist libvorbis
893   ipfiredist mailx
894   ipfiredist mldonkey
895   ipfiredist mpeg2dec
896   ipfiredist nagios
897   ipfiredist nfs
898   ipfiredist nmap
899   ipfiredist ntop
900   ipfiredist portmap
901   ipfiredist postfix
902   ipfiredist procmail
903   ipfiredist samba
904   ipfiredist sox
905   ipfiredist spamassassin
906   ipfiredist subversion
907   ipfiredist videolan
908   ipfiredist webcyradm
909   ipfiredist xvid
910   ipfiredist yasuc
911   test -d $BASEDIR/packages || mkdir $BASEDIR/packages
912   mv -f $LFS/install/packages/*.{ipfire,md5} $BASEDIR/packages >> $LOGFILE 2>&1
913   rm -rf  $BASEDIR/build/install/packages/*
914 }
915
916 update_logs() {
917         tar cfz log/ipfire-logs-`date +'%Y-%m-%d-%H:%M'`.tgz log/_build.*
918         rm -f log/_build.*
919 }
920
921 # See what we're supposed to do
922 case "$1" in 
923 build)
924         BUILDMACHINE=`uname -m`
925         PACKAGE=`ls -v -r $BASEDIR/cache/toolchains/$SNAME-$VERSION-toolchain-$BUILDMACHINE.tar.gz 2> /dev/null | head -n 1`
926         #only restore on a clean disk
927         if [ ! -f log/perl-*-tools ]; then
928                 if [ ! -n "$PACKAGE" ]; then
929                         echo "`date -u '+%b %e %T'`: Full toolchain compilation" | tee -a $LOGFILE
930                         prepareenv
931                         buildtoolchain
932                 else
933                         PACKAGENAME=${PACKAGE%.tar.gz}
934                         echo "`date -u '+%b %e %T'`: Restore from $PACKAGE" | tee -a $LOGFILE
935                         if [ `md5sum $PACKAGE | awk '{print $1}'` == `cat $PACKAGENAME.md5 | awk '{print $1}'` ]; then
936                                 tar zxf $PACKAGE
937                                 prepareenv
938                         else
939                                 exiterror "$PACKAGENAME md5 did not match, check downloaded package"
940                         fi
941                 fi
942         else
943                 echo "`date -u '+%b %e %T'`: Using installed toolchain" | tee -a $LOGFILE
944                 prepareenv
945         fi
946
947         buildbase
948         buildipcop
949
950         # Setzen des IPFire Builds
951         if [ "$FIREBUILD" ]; then
952                 echo "$FIREBUILD" > $BASEDIR/build/var/ipfire/firebuild
953         else
954                 echo "_(OvO)_" > $BASEDIR/build/var/ipfire/firebuild
955         fi
956
957         buildinstaller
958         buildpackages
959         ;;
960 shell)
961         # enter a shell inside LFS chroot
962         # may be used to changed kernel settings
963         prepareenv
964         entershell
965         ;;
966 changelog)
967         echo -n "Loading new Changelog from SVN: "
968         svn log http://svn.ipfire.eu/svn/ipfire > doc/ChangeLog
969         echo "Finished!"
970         ;;
971 check)
972         echo "Checking sources files availability on the web"
973         if [ ! -d $DIR_CHK ]; then
974                 mkdir -p $DIR_CHK
975         fi
976         FINISHED=0
977         cd $BASEDIR/lfs
978         for c in `seq $MAX_RETRIES`; do
979                 if (( FINISHED==1 )); then
980                         break
981                 fi
982                 FINISHED=1
983                 cd $BASEDIR/lfs
984                 for i in *; do
985                         if [ -f "$i" -a "$i" != "Config" ]; then
986                                 make -s -f $i MACHINE=$MACHINE LFS_BASEDIR=$BASEDIR ROOT=$BASEDIR/build \
987                                         MESSAGE="$i\t ($c/$MAX_RETRIES)" check
988                                 if [ $? -ne 0 ]; then
989                                         echo "Check : wget error in lfs/$i"
990                                         FINISHED=0
991                                 fi
992                         fi
993                 done
994         done
995         cd -
996         ;;
997 checkclean)
998         echo "Erasing sources files availability tags"
999         rm -rf $DIR_CHK/*
1000         ;;
1001 clean)
1002         for i in `mount | grep $BASEDIR | sed 's/^.*loop=\(.*\))/\1/'`; do
1003                 $LOSETUP -d $i 2>/dev/null
1004         done
1005         for i in `mount | grep $BASEDIR | cut -d " " -f 1`; do
1006                 umount $i
1007         done
1008         stdumount
1009         for i in `seq 0 7`; do
1010             if ( losetup /dev/loop${i} 2>/dev/null | grep -q "/install/images" ); then
1011                 umount /dev/loop${i}     2>/dev/null;
1012                 losetup -d /dev/loop${i} 2>/dev/null;
1013             fi;
1014         done
1015         rm -rf $BASEDIR/build
1016         rm -rf $BASEDIR/cdrom
1017         rm -rf $BASEDIR/packages
1018         rm -rf $BASEDIR/log
1019         if [ -h /tools ]; then
1020                 rm -f /tools
1021         fi
1022         ;;
1023 newpak)
1024         # create structure for a new package
1025         echo -e "Name of the new package: $2"
1026         if [ ! -f "lfs/$2" ]; then
1027                 echo "`date -u '+%b %e %T'`: Creating directory src/paks/$2"
1028                 mkdir -p src/paks/$2
1029                 cd src/paks/$2
1030                 echo "`date -u '+%b %e %T'`: Creating files"
1031                 cp $BASEDIR/lfs/postfix $BASEDIR/lfs/$2
1032
1033                 touch ROOTFILES
1034                 touch {,un}install.sh
1035         ## install.sh
1036                 echo '#!/bin/bash' > install.sh
1037                 echo '#' >> install.sh
1038                 echo '#################################################################' >> install.sh
1039                 echo '#                                                               #' >> install.sh
1040                 echo '# This file belongs to IPFire Firewall - GPLv2 - www.ipfire.org #' >> install.sh
1041                 echo '#                                                               #' >> install.sh
1042                 echo '#################################################################' >> install.sh
1043                 echo '#' >> install.sh
1044                 echo '# Extract the files' >> install.sh
1045                 echo 'tar xfz files.tgz -C /' >> install.sh
1046                 echo 'cp -f ROOTFILES /opt/pakfire/installed/ROOTFILES.$2' >> install.sh
1047         ## uninstall.sh
1048                 echo '#!/bin/bash' > uninstall.sh
1049                 echo '#################################################################' >> uninstall.sh
1050                 echo '#                                                               #' >> uninstall.sh
1051                 echo '# This file belongs to IPFire Firewall - GPLv2 - www.ipfire.org #' >> uninstall.sh
1052                 echo '#                                                               #' >> uninstall.sh
1053                 echo '#################################################################' >> uninstall.sh
1054                 echo '#' >> uninstall.sh
1055                 echo '# Delete the files' >> uninstall.sh
1056                 echo '## Befehl fehlt noch' >> uninstall.sh
1057                 echo 'rm -f /opt/pakfire/installed/ROOTFILES.$2' >> uninstall.sh
1058                 echo "`date -u '+%b %e %T'`: Adding files to SVN"
1059                 cd - && svn add lfs/$2 && svn add src/paks/$2
1060
1061                 echo -n "Do you want to remove the folders? [y/n]"
1062                 read REM
1063                 if  [ "$REM" == "y" ]; then
1064                         echo "Removing the folders..."
1065                         svn del src/paks/$2 --force
1066                 else
1067                         echo "Folders are kept."
1068                 fi
1069         else
1070                 echo "$2 already exists"
1071         fi
1072         exit 0
1073         ;;
1074 prefetch)
1075         if [ ! -d $BASEDIR/cache ]; then
1076                 mkdir $BASEDIR/cache
1077         fi
1078         mkdir -p $BASEDIR/log
1079         echo "`date -u '+%b %e %T'`:Preload all source files" | tee -a $LOGFILE
1080         FINISHED=0
1081         cd $BASEDIR/lfs
1082         for c in `seq $MAX_RETRIES`; do
1083                 if (( FINISHED==1 )); then 
1084                         break
1085                 fi
1086                 FINISHED=1
1087                 cd $BASEDIR/lfs
1088                 for i in *; do
1089                         if [ -f "$i" -a "$i" != "Config" ]; then
1090                                 make -s -f $i LFS_BASEDIR=$BASEDIR MESSAGE="$i\t ($c/$MAX_RETRIES)" download >> $LOGFILE 2>&1
1091                                 if [ $? -ne 0 ]; then
1092                                         echo "Prefetch : wget error in lfs/$i"
1093                                         FINISHED=0
1094                                 else
1095                                         if [ $c -eq 1 ]; then
1096                                                 echo "Prefetch : lfs/$i files loaded"
1097                                         fi
1098                                 fi
1099                         fi
1100                 done
1101         done
1102         echo "Prefetch : verifying md5sum"
1103         ERROR=0
1104         for i in *; do
1105                 if [ -f "$i" -a "$i" != "Config" ]; then
1106                         make -s -f $i LFS_BASEDIR=$BASEDIR MESSAGE="$i\t " md5 >> $LOGFILE 2>&1
1107                         if [ $? -ne 0 ]; then
1108                                 echo "md5 difference in lfs/$i"
1109                                 ERROR=1
1110                         fi
1111                 fi
1112         done
1113         if [ $ERROR -eq 0 ]; then
1114                 echo "Prefetch : all files md5sum match"
1115         fi
1116         cd -
1117         ;;
1118 toolchain)
1119         prepareenv
1120         buildtoolchain
1121         BUILDMACHINE=`uname -m`
1122         echo "`date -u '+%b %e %T'`: Create toolchain tar.gz for $BUILDMACHINE" | tee -a $LOGFILE
1123         test -d $BASEDIR/cache/toolchains || mkdir $BASEDIR/cache/toolchains
1124         cd $BASEDIR && tar -zc --exclude='log/_build.*.log' -f cache/toolchains/$SNAME-$VERSION-toolchain-$BUILDMACHINE.tar.gz \
1125                 build/{bin,etc,usr/bin,usr/local} \
1126                 build/tools/{bin,etc,*-linux-gnu,include,lib,libexec,sbin,share,var} \
1127                 log >> $LOGFILE
1128         md5sum cache/toolchains/$SNAME-$VERSION-toolchain-$BUILDMACHINE.tar.gz \
1129                 > cache/toolchains/$SNAME-$VERSION-toolchain-$BUILDMACHINE.md5
1130         stdumount
1131         ;;
1132 gettoolchain)
1133         BUILDMACHINE=`uname -m`
1134         # arbitrary name to be updated in case of new toolchain package upload
1135         PACKAGE=$SNAME-$VERSION-toolchain-$BUILDMACHINE
1136         if [ ! -f $BASEDIR/cache/toolchains/$PACKAGE.tar.gz ]; then
1137                 URL_IPFIRE=`grep URL_IPFIRE lfs/Config | awk '{ print $3 }'`
1138                 test -d $BASEDIR/cache/toolchains || mkdir $BASEDIR/cache/toolchains
1139                 echo "`date -u '+%b %e %T'`: Load toolchain tar.gz for $BUILDMACHINE" | tee -a $LOGFILE
1140                 cd $BASEDIR/cache/toolchains
1141                 wget $URL_IPFIRE/toolchains/$PACKAGE.tar.gz $URL_IPFIRE/toolchains/$PACKAGE.md5 >& /dev/null
1142                 if [ $? -ne 0 ]; then
1143                         echo "`date -u '+%b %e %T'`: error downloading toolchain for $BUILDMACHINE machine" | tee -a $LOGFILE
1144                 else
1145                         if [ "`md5sum $PACKAGE.tar.gz | awk '{print $1}'`" = "`cat $PACKAGE.md5 | awk '{print $1}'`" ]; then
1146                                 echo "`date -u '+%b %e %T'`: toolchain md5 ok" | tee -a $LOGFILE
1147                         else
1148                                 exiterror "$PACKAGE.md5 did not match, check downloaded package"
1149                         fi
1150                 fi
1151         else
1152                 echo "Toolchain is already downloaded. Exiting..."
1153         fi
1154         ;;
1155 sources-iso)
1156         prepareenv
1157         echo "`date -u '+%b %e %T'`: Build sources iso for $MACHINE" | tee -a $LOGFILE
1158         chroot $LFS /tools/bin/env -i   HOME=/root \
1159         TERM=$TERM PS1='\u:\w\$ ' \
1160         PATH=/usr/local/bin:/bin:/usr/bin:/sbin:/usr/sbin \
1161         VERSION=$VERSION NAME="$NAME" SNAME="$SNAME" MACHINE=$MACHINE \
1162         /bin/bash -x -c "cd /usr/src/lfs && make -f sources-iso LFS_BASEDIR=/usr/src install" >>$LOGFILE 2>&1
1163         mv $LFS/install/images/ipfire-* $BASEDIR >> $LOGFILE 2>&1
1164         stdumount
1165         ;;
1166 svn)
1167         case "$2" in
1168           update|up)
1169                 # clear
1170                 echo "Loading the latest source files..."
1171                 if [ $3 ]; then
1172                         svn update -r $3 | tee -a $PWD/log/_build.svn.update.log
1173                 else
1174                         svn update | tee -a $PWD/log/_build.svn.update.log
1175                 fi
1176                 if [ $? -eq 0 ]; then
1177                         echo "Finished!"
1178                 else
1179                         echo "Failure!"
1180                         exit 1
1181                 fi
1182                 echo -n "Writing the svn-info to a file..."
1183                 svn info > $PWD/svn_status
1184                 if [ "$?" -eq "0" ]; then
1185                         echo ".Finished!"
1186                 else
1187                         echo ".Failure!"
1188                         exit 1
1189                 fi
1190                 chmod 755 $0
1191                 exit 0
1192           ;;
1193           commit|ci)
1194                 clear
1195                 if [ -e /sbin/yast ]; then
1196                         if [ "`echo $SVN_REVISION | cut -c 3`" -eq "0" ]; then
1197                                 $0 changelog
1198                         fi
1199                 fi
1200                 echo "Upload the changed files..."
1201                 sleep 1
1202                 IPFIRE_SVN_MESSAGE=/tmp/ipfire-svn-co-message.txt
1203                 rm -f $IPFIRE_SVN_MESSAGE
1204                 mcedit $IPFIRE_SVN_MESSAGE
1205                 svn commit -F $IPFIRE_SVN_MESSAGE
1206                 rm -f $IPFIRE_SVN_MESSAGE
1207                 $0 svn up
1208           ;;
1209           dist)
1210                 if [ $3 ]; then
1211                         SVN_REVISION=$3
1212                 fi
1213                 if [ -f ipfire-source-r$SVN_REVISION.tar.gz ]; then
1214                         echo -ne "REV $SVN_REVISION: SKIPPED!\n"
1215                         exit 0
1216                 fi
1217                 echo -en "REV $SVN_REVISION: Downloading..."
1218                 svn export http://svn.ipfire.eu/svn/ipfire ipfire-source/ --force > /dev/null
1219                 svn log http://svn.ipfire.eu/svn/ipfire -r 1:$SVN_REVISION > ipfire-source/Changelog
1220                 #svn info http://svn.ipfire.eu/svn/ipfire -r $SVN_REVISION > ipfire-source/svn_status
1221                 if [ "$?" -eq "0" ]; then
1222                         echo -en "\r"
1223                 else
1224                         echo -en "\n"
1225                         exit 1
1226                 fi
1227                 echo -en "REV $SVN_REVISION: Compressing files..."
1228                 if [ -e ipfire-source/trunk/make.sh ]; then
1229                         chmod 755 ipfire-source/trunk/make.sh
1230                 fi
1231                 tar cfz ipfire-source-r$SVN_REVISION.tar.gz ipfire-source
1232                 if [ "$?" -eq "0" ]; then
1233                         echo -ne "\r"
1234                 else
1235                         echo -ne "\n"
1236                         exit 1
1237                 fi
1238                 echo -en "REV $SVN_REVISION: Cleaning up..."
1239                 rm ipfire-source/ -r
1240                 if [ "$?" -eq "0" ]; then
1241                         echo -ne "\rREV $SVN_REVISION: ##### FINISHED! #####\n"
1242                 else
1243                         echo -ne "\n"
1244                         exit 1
1245                 fi
1246           ;;
1247           alldist|ad)
1248                 echo -e "### THIS WILL TAKE A LONG TIME!\nDOING A FETCH FROM REV 1 TO REV $SVN_REVISION!\n"
1249                 for i in `seq 1 $SVN_REVISION`; do
1250                         $0 svn dist $i
1251                 done
1252           ;;
1253           diff|di)
1254                 echo -ne "Make a local diff to last svn revision..."
1255                 svn diff > ipfire-diff-`date +'%Y-%m-%d-%H:%M'`-r`svn info | grep Revision | cut -c 11-`.diff
1256                 if [ "$?" -eq "0" ]; then
1257                         echo ".Done!"
1258                 else
1259                         echo ".Fail!"
1260                         exit 1
1261                 fi
1262                 echo "Diff was successfully saved to ipfire-diff-`date +'%Y-%m-%d-%H:%M'`-r`svn info | grep Revision | cut -c 11-`.diff"
1263           ;;
1264         esac
1265         ;;
1266 make-config)
1267         echo -e "This is for creating your configuration..."
1268         echo -e "We will need some input:"
1269         echo -e ""
1270         echo -n "FTP-DOMAIN FOR THE ISO: "
1271         read IPFIRE_FTP_URL_EXT
1272         echo -n "PATH FOR $IPFIRE_FTP_URL_EXT: "
1273         read IPFIRE_FTP_PATH_EXT
1274         echo -n "USERNAME FOR $IPFIRE_FTP_URL_EXT: "
1275         read IPFIRE_FTP_USER_EXT
1276         echo -n "PASSWORD FOR $IPFIRE_FTP_URL_EXT: "
1277         read -s IPFIRE_FTP_PASS_EXT
1278         echo ""
1279         echo "(You can leave this empty if the cache-server is the same as your iso-server.)"
1280         echo -n "FTP-DOMAIN FOR THE CACHE: "
1281         read IPFIRE_FTP_URL_INT
1282         echo -n "PATH FOR $IPFIRE_FTP_URL_INT: "
1283         read IPFIRE_FTP_PATH_INT
1284         if [ $IPFIRE_FTP_URL_INT ]; then
1285                 echo -n "USERNAME FOR $IPFIRE_FTP_URL_INT: "
1286                 read IPFIRE_FTP_USER_INT
1287                 echo -n "PASSWORD FOR $IPFIRE_FTP_URL_INT: "
1288                 read -s IPFIRE_FTP_PASS_INT
1289         else
1290                 IPFIRE_FTP_URL_INT=$IPFIRE_FTP_URL_EXT
1291                 IPFIRE_FTP_USER_INT=$IPFIRE_FTP_USER_EXT
1292                 IPFIRE_FTP_PASS_INT=$IPFIRE_FTP_PASS_EXT
1293                 echo "USERNAME FOR $IPFIRE_FTP_URL_INT: $IPFIRE_FTP_USER_INT"
1294                 echo "PASSWORD FOR $IPFIRE_FTP_URL_INT: !HIDDEN!"
1295         fi
1296         echo ""
1297         echo "(You can leave this empty if the pak-server is the same as your iso-server.)"
1298         echo -n "FTP-DOMAIN FOR THE PAKS: "
1299         read IPFIRE_FTP_URL_PAK
1300         echo -n "PATH FOR $IPFIRE_FTP_URL_PAK: "
1301         read IPFIRE_FTP_PATH_PAK
1302         if [ $IPFIRE_FTP_URL_PAK ]; then
1303                 echo -n "USERNAME FOR $IPFIRE_FTP_URL_PAK: "
1304                 read IPFIRE_FTP_USER_PAK
1305                 echo -n "PASSWORD FOR $IPFIRE_FTP_URL_PAK: "
1306                 read -s IPFIRE_FTP_PASS_PAK
1307         else
1308                 IPFIRE_FTP_URL_PAK=$IPFIRE_FTP_URL_EXT
1309                 IPFIRE_FTP_USER_PAK=$IPFIRE_FTP_USER_EXT
1310                 IPFIRE_FTP_PASS_PAK=$IPFIRE_FTP_PASS_EXT
1311                 echo "USERNAME FOR $IPFIRE_FTP_URL_PAK: $IPFIRE_FTP_USER_PAK"
1312                 echo "PASSWORD FOR $IPFIRE_FTP_URL_PAK: !HIDDEN!"
1313         fi
1314         echo ""
1315         echo -e "ONE OR MORE EMAIL ADDRESS(ES) TO WHICH THE REPORTS WILL BE SENT"
1316         echo -e "(seperated by comma)"
1317         read IPFIRE_MAIL_REPORT
1318         echo -n "EMAIL FROM: "
1319         read IPFIRE_MAIL_FROM
1320         echo -n "EMAIL SERVER: "
1321         read IPFIRE_MAIL_SERVER
1322         echo -n "LOGIN TO MAIL SERVER: "
1323         read IPFIRE_MAIL_USER
1324         echo -n "MAIL PASSWORD: "
1325         read -s IPFIRE_MAIL_PASS
1326         echo -n "Saving..."
1327         for i in `seq 20`; do
1328                 sleep 0.1; echo -n "."
1329         done
1330         echo ".Finished!"
1331         cat <<END > .config
1332 ### ISO server
1333 IPFIRE_FTP_URL_EXT=$IPFIRE_FTP_URL_EXT
1334 IPFIRE_FTP_PATH_EXT=$IPFIRE_FTP_PATH_EXT
1335 IPFIRE_FTP_USER_EXT=$IPFIRE_FTP_USER_EXT
1336 IPFIRE_FTP_PASS_EXT=$IPFIRE_FTP_PASS_EXT
1337 ### cache server
1338 IPFIRE_FTP_URL_INT=$IPFIRE_FTP_URL_INT
1339 IPFIRE_FTP_PATH_INT=$IPFIRE_FTP_PATH_INT
1340 IPFIRE_FTP_USER_INT=$IPFIRE_FTP_USER_INT
1341 IPFIRE_FTP_PASS_INT=$IPFIRE_FTP_PASS_INT
1342 ### paks server
1343 IPFIRE_FTP_URL_PAK=$IPFIRE_FTP_URL_PAK
1344 IPFIRE_FTP_PATH_PAK=$IPFIRE_FTP_PATH_PAK
1345 IPFIRE_FTP_USER_PAK=$IPFIRE_FTP_USER_PAK
1346 IPFIRE_FTP_PASS_PAK=$IPFIRE_FTP_PASS_PAK
1347 ### mail reports
1348 IPFIRE_MAIL_REPORT=$IPFIRE_MAIL_REPORT
1349 IPFIRE_MAIL_FROM=$IPFIRE_MAIL_FROM
1350 IPFIRE_MAIL_SERVER=$IPFIRE_MAIL_SERVER
1351 IPFIRE_MAIL_USER=$IPFIRE_MAIL_USER
1352 IPFIRE_MAIL_PASS=$IPFIRE_MAIL_PASS
1353 END
1354         ;;
1355 sync)
1356         echo -e "Syncing cache to ftp:"
1357 #       rm -f doc/packages-to-remove-from-ftp
1358         ncftpls -u $IPFIRE_FTP_USER_INT -p $IPFIRE_FTP_PASS_INT ftp://$IPFIRE_FTP_URL_INT$IPFIRE_FTP_PATH_INT/ > ftplist
1359         for i in `ls -w1 cache/`; do
1360                 grep $i ftplist
1361                 if [ "$?" -ne "0" ]; then
1362                         ncftpput -u $IPFIRE_FTP_USER_INT -p $IPFIRE_FTP_PASS_INT $IPFIRE_FTP_URL_INT $IPFIRE_FTP_PATH_INT/ cache/$i
1363                         if [ "$?" -eq "0" ]; then
1364                                 echo -e "$i was successfully uploaded to the ftp server."
1365                         else
1366                                 echo -e "There was an error while uploading $i to the ftp server."
1367                         fi
1368                 fi
1369         done
1370         rm -f ftplist
1371         ;;
1372 upload)
1373         case "$2" in
1374           iso)
1375                 echo -e "Uploading the iso to $IPFIRE_FTP_URL_EXT."
1376                 cat <<EOF > .ftp-commands
1377 mkdir $IPFIRE_FTP_PATH_EXT
1378 ls -lah
1379 quit
1380 EOF
1381                 ncftp -u $IPFIRE_FTP_USER_EXT -p $IPFIRE_FTP_PASS_EXT $IPFIRE_FTP_URL_EXT < .ftp-commands
1382                 rm -f .ftp-commands
1383                 md5sum ipfire-install-$VERSION.i386.iso > ipfire-install-$VERSION.i386.iso.md5
1384                 ncftpput -u $IPFIRE_FTP_USER_EXT -p $IPFIRE_FTP_PASS_EXT $IPFIRE_FTP_URL_EXT $IPFIRE_FTP_PATH_EXT/ ipfire-install-$VERSION.i386.iso
1385                 ncftpput -u $IPFIRE_FTP_USER_EXT -p $IPFIRE_FTP_PASS_EXT $IPFIRE_FTP_URL_EXT $IPFIRE_FTP_PATH_EXT/ ipfire-install-$VERSION.i386.iso.md5
1386                 ncftpput -u $IPFIRE_FTP_USER_EXT -p $IPFIRE_FTP_PASS_EXT $IPFIRE_FTP_URL_EXT $IPFIRE_FTP_PATH_EXT/ ipfire-source-r$SVN_REVISION.tar.gz
1387                 ncftpput -u $IPFIRE_FTP_USER_EXT -p $IPFIRE_FTP_PASS_EXT $IPFIRE_FTP_URL_EXT $IPFIRE_FTP_PATH_EXT/ svn_status
1388                 if [ "$?" -eq "0" ]; then
1389                         echo -e "The iso of Revision $SVN_REVISION was successfully uploaded to $IPFIRE_FTP_URL_EXT$IPFIRE_FTP_PATH_EXT/."
1390                 else
1391                         echo -e "There was an error while uploading the iso to the ftp server."
1392                         exit 1
1393                 fi
1394                 if [ "$3" = "--with-sources-cd" ]; then
1395                         ncftpput -u $IPFIRE_FTP_USER_EXT -p $IPFIRE_FTP_PASS_EXT $IPFIRE_FTP_URL_EXT $IPFIRE_FTP_PATH_EXT/ ipfire-sources-cd-$VERSION.$MACHINE.iso
1396                 fi
1397                 ;;
1398           paks)
1399                 cat <<EOF > .ftp-commands
1400 mkdir $IPFIRE_FTP_PATH_PAK
1401 ls -lah
1402 quit
1403 EOF
1404                 ncftp -u $IPFIRE_FTP_USER_PAK -p $IPFIRE_FTP_PASS_PAK $IPFIRE_FTP_URL_PAK < .ftp-commands
1405                 rm -f .ftp-commands
1406                 ncftpput -z -u $IPFIRE_FTP_USER_PAK -p $IPFIRE_FTP_PASS_PAK $IPFIRE_FTP_URL_PAK $IPFIRE_FTP_PATH_PAK/ packages/*
1407                 if [ "$?" -eq "0" ]; then
1408                         echo -e "The packages were successfully uploaded to $IPFIRE_FTP_URL_PAK$IPFIRE_FTP_PATH_PAK/."
1409                 else
1410                         echo -e "There was an error while uploading the packages to the ftp server."
1411                         exit 1
1412                 fi
1413           ;;
1414         esac
1415         ;;
1416 build-only)
1417         rm -f $BASEDIR/log/$2*
1418         BUILDMACHINE=`uname -m`
1419         prepareenv
1420         ipcopmake $2
1421         ;;
1422 build-silent)
1423         screen -dmS ipfire $0 build
1424         echo "Build started... This will take a while!"
1425         echo "You can see the status with 'screen -x ipfire'."
1426         ;;
1427 mail)
1428         chmod 755 tools/sendEmail
1429         ATTACHMENT=/tmp/ipfire-build-logs-R$SVN_REVISION.tar.gz
1430         if [ "$2" = "ERROR" ]; then
1431                 SUBJECT="ERROR: IPFIRE-BUILD R$SVN_REVISION on `hostname`"
1432                 echo "ERROR: $0 build!"
1433                 cat <<END > /tmp/ipfire_mail_body
1434 When I was building IPFire on `hostname`, I have found an ERROR!
1435 Here you can see the logs and detect the reason for this error.
1436
1437 Best Regards
1438 Your IPFire-Build-Script
1439 END
1440         fi
1441         if [ "$2" = "SUCCESS" ]; then
1442                 SUBJECT="SUCCESS: IPFIRE-BUILD R$SVN_REVISION on `hostname`"
1443                 cat <<END > /tmp/ipfire_mail_body
1444 Building IPFire on `hostname` in Revision $SVN_REVISION was successfull!
1445 You can find the ISO on your ftp server.
1446
1447 Statistics:
1448 -----------
1449 Started:        $IPFIRE_START_TIME
1450 Finished:       `date`
1451
1452 Best Regards
1453 Your IPFire-Build-Script
1454 END
1455         fi
1456         if [ "$2" = "SVNUPDATE" ]; then
1457                 SUBJECT="SVNUPDATE: IPFIRE-BUILD R$SVN_REVISION on `hostname`"
1458                 echo "ERROR: $0 svn up!"
1459                 cat <<END > /tmp/ipfire_mail_body
1460 When I was downloading the latest svn source,
1461 I have found an ERROR!
1462 Here you can see the logs and detect the reason for this error.
1463
1464 Best Regards
1465 Your IPFire-Build-Script
1466 END
1467         fi
1468
1469         if [ "$2" = "SVNDIST" ]; then
1470                 SUBJECT="SVNDIST: IPFIRE-BUILD R$SVN_REVISION on `hostname`"
1471                 echo "ERROR: $0 svn dist!"
1472                 cat <<END > /tmp/ipfire_mail_body
1473 When I was exporting the latest svn source,
1474 I have found an ERROR!
1475 Here you can see the logs and detect the reason for this error.
1476
1477 Best Regards
1478 Your IPFire-Build-Script
1479 END
1480         fi
1481
1482         if [ "$2" = "PREFETCH" ]; then
1483                 SUBJECT="PREFETCH: IPFIRE-BUILD R$SVN_REVISION on `hostname`"
1484                 echo "ERROR: $0 prefetch!"
1485                 cat <<END > /tmp/ipfire_mail_body
1486 When I was downloading the source packages,
1487 I have found an ERROR!
1488 Here you can see the logs and detect the reason for this error.
1489
1490 Best Regards
1491 Your IPFire-Build-Script
1492 END
1493         fi
1494
1495         if [ "$2" = "ISO" ]; then
1496                 SUBJECT="ISO: IPFIRE-BUILD R$SVN_REVISION on `hostname`"
1497                 echo "ERROR: $0 upload iso!"
1498                 cat <<END > /tmp/ipfire_mail_body
1499 When I was uploading the iso image,
1500 I have found an ERROR!
1501 Here you can see the logs and detect the reason for this error.
1502
1503 Best Regards
1504 Your IPFire-Build-Script
1505 END
1506         fi
1507
1508         if [ "$2" = "PAKS" ]; then
1509                 SUBJECT="PAKS: IPFIRE-BUILD R$SVN_REVISION on `hostname`"
1510                 echo "ERROR: $0 upload paks!"
1511                 cat <<END > /tmp/ipfire_mail_body
1512 When I was uploading the packages,
1513 I have found an ERROR!
1514 Here you can see the logs and detect the reason for this error.
1515
1516 Best Regards
1517 Your IPFire-Build-Script
1518 END
1519         fi
1520
1521         tar cfz $ATTACHMENT log/_build*
1522         cat <<END >> /tmp/ipfire_mail_body
1523
1524 Here is a summary... The full logs are in the attachment.
1525 ---------------------------------------------------------
1526
1527 `tail log/_*`
1528 END
1529         cat /tmp/ipfire_mail_body | tools/sendEmail -q \
1530                 -f $IPFIRE_MAIL_FROM \
1531                 -t $IPFIRE_MAIL_REPORT \
1532                 -u $SUBJECT \
1533                 -s $IPFIRE_MAIL_SERVER:25 \
1534                 -xu $IPFIRE_MAIL_USER \
1535                 -xp $IPFIRE_MAIL_PASS \
1536                 -l log/_build.mail.log \
1537                 -a $ATTACHMENT # -v
1538         rm -f /tmp/ipfire_mail_body $ATTACHMENT
1539         ;;
1540 unattended)
1541         if [ ! -f .config ]; then
1542                 echo "No configuration found. Try ./make.sh make-config."
1543         fi
1544         ### This is our procedure that will compile the IPFire by herself...
1545         echo "### UPDATE LOGS"
1546         update_logs
1547
1548         if [ "$IPFIRE_REBUILD" -eq "0" ]; then
1549                 echo "### SAVING TIME"
1550                 export IPFIRE_START_TIME=`date`
1551
1552                 echo "### GETTING TOOLCHAIN"
1553                 $0 gettoolchain
1554
1555                 echo "### RUNNING SVN-UPDATE"
1556                 $0 svn update
1557                 if [ $? -ne 0 ]; then
1558                         $0 mail SVNUPDATE
1559                         exit 1
1560                 fi
1561         
1562                 echo "### EXPORT SOURCES"
1563                 $0 svn dist
1564                 if [ $? -ne 0 ]; then
1565                         $0 mail SVNDIST
1566                         exit 1
1567                 fi
1568
1569                 echo "### RUNNING PREFETCH"
1570                 $0 prefetch | grep -q "md5 difference"
1571                 if [ $? -eq 0 ]; then
1572                         $0 mail PREFETCH
1573                         exit 1
1574                 fi
1575         fi
1576
1577         echo "### RUNNING BUILD"
1578         $0 build
1579         if [ $? -ne 0 ]; then
1580                 $0 mail ERROR
1581                 exit 1
1582         fi
1583
1584         echo "### MAKING SOURCES-ISO"
1585         echo "DISABLED by Delaco!"
1586         #$0 sources-iso
1587
1588         echo "### UPLOADING ISO"
1589         $0 upload iso
1590         if [ $? -ne 0 ]; then
1591                 $0 mail ISO
1592                 exit 1
1593         fi
1594         
1595         echo "### UPLOADING PAKS"
1596         $0 upload paks
1597         if [ $? -ne 0 ]; then
1598                 $0 mail PAKS
1599                 exit 1
1600         fi
1601
1602         echo "### SUCCESS!"
1603         $0 mail SUCCESS
1604         exit 0
1605         ;;
1606 batch)
1607         if [ `screen -ls | grep -q ipfire` ]; then
1608                 echo "Build is already running, sorry!"
1609                 exit 1
1610         else
1611                 if [ "$2" = "--rebuild" ]; then
1612                         export IPFIRE_REBUILD=1
1613                         echo "REBUILD!"
1614                 else
1615                         export IPFIRE_REBUILD=0
1616                 fi
1617                 echo -n "IPFire-Batch-Build is starting..."
1618                 screen -dmS ipfire $0 unattended
1619                 if [ "$?" -eq "0" ]; then
1620                         echo ".Done!"
1621                 else
1622                         echo ".ERROR!"
1623                         exit 1
1624                 fi
1625                 exit 0
1626         fi
1627         ;;
1628 watch)
1629         echo "Exit with Ctrl+A, Ctrl+D."
1630         echo -n "Preparing..."
1631         for i in `seq 5`; do
1632                 sleep 0.1; echo -n "."
1633         done
1634         echo ".Ready!"
1635         sleep 0.3
1636         screen -x ipfire
1637         ;;
1638 *)
1639         clear
1640         svn info
1641         select name in "Exit" "IPFIRE: Prefetch" "IPFIRE: Build (silent)" "IPFIRE: Watch Build" "IPFIRE: Batch" "IPFIRE: Clean" "SVN: Commit" "SVN: Update" "SVN: Status" "SVN: Diff" "LOG: Tail" "Help"
1642         do
1643         case $name in
1644         "IPFIRE: Prefetch")
1645                 $0 prefetch
1646                 ;;
1647         "IPFIRE: Build (silent)")
1648                 $0 build-silent
1649                 ;;
1650         "IPFIRE: Watch Build")
1651                 $0 watch
1652                 ;;
1653         "IPFIRE: Batch")
1654                 $0 batch
1655                 ;;
1656         "IPFIRE: Clean")
1657                 $0 clean
1658                 ;;
1659         "SVN: Commit")
1660                 echo "Are your sure to Update all Files to the Server (write: yes)?"; read input
1661                 if [ "$input" == "yes" ]; then
1662                         $0 svn commit
1663                 fi
1664                 $0 sync
1665                 ;;
1666         "SVN: Update")
1667                 $0 svn update
1668                 ;;
1669         "SVN: Status")
1670                 svn status # | grep -v ^?
1671                 ;;
1672         "SVN: Diff")
1673                 $0 svn diff
1674                 ;;
1675         "Help")
1676                 echo "Usage: $0 {build|changelog|check|checkclean|clean|gettoolchain|newpak|prefetch|shell|sync|toolchain}"
1677                 cat doc/make.sh-usage
1678                 ;;
1679         "LOG: Tail")
1680                 tail -f log/_*
1681                 ;;
1682         "Exit")
1683                 break
1684                 ;;
1685         esac
1686         done
1687         ;;
1688 esac