Imported a small .gitignore.
[ipfire-2.x.git] / make.sh
1 #!/bin/bash
2 ############################################################################
3 #                                                                          #
4 # This file is part of the IPFire Firewall.                                #
5 #                                                                          #
6 # IPFire is free software; you can redistribute it and/or modify           #
7 # it under the terms of the GNU General Public License as published by     #
8 # the Free Software Foundation; either version 2 of the License, or        #
9 # (at your option) any later version.                                      #
10 #                                                                          #
11 # IPFire is distributed in the hope that it will be useful,                #
12 # but WITHOUT ANY WARRANTY; without even the implied warranty of           #
13 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the            #
14 # GNU General Public License for more details.                             #
15 #                                                                          #
16 # You should have received a copy of the GNU General Public License        #
17 # along with IPFire; if not, write to the Free Software                    #
18 # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA #
19 #                                                                          #
20 # Copyright (C) 2007 IPFire-Team <info@ipfire.org>.                        #
21 #                                                                          #
22 ############################################################################
23 #
24
25 NAME="IPFire"                                                                           # Software name
26 SNAME="ipfire"                                                                  # Short name
27 VERSION="2.1"                                                                           # Version number
28 SLOGAN="www.ipfire.org"                                 # Software slogan
29 CONFIG_ROOT=/var/ipfire                                 # Configuration rootdir
30 NICE=10                                                                                                 # Nice level
31 MAX_RETRIES=1                                                                           # prefetch/check loop
32 KVER=`grep --max-count=1 VER lfs/linux | awk '{ print $3 }'`
33 MACHINE=`uname -m`
34
35 IPFVER="full"                           # Which versions should be compiled? (full|devel)
36
37 # Debian specific settings
38 if [ ! -e /etc/debian_version ]; then
39         FULLPATH=`which $0`
40 else
41         if [ -x /usr/bin/realpath ]; then
42                 FULLPATH=`/usr/bin/realpath $0`
43         else
44                 echo "ERROR: Need to do apt-get install realpath"
45                 exit 1
46         fi
47 fi
48
49 PWD=`pwd`
50 BASENAME=`basename $0`
51 BASEDIR=`echo $FULLPATH | sed "s/\/$BASENAME//g"`
52 LOGFILE=$BASEDIR/log/_build.preparation.log
53 export BASEDIR LOGFILE
54 DIR_CHK=$BASEDIR/cache/check
55 mkdir $BASEDIR/log/ 2>/dev/null
56
57 # Include funtions
58 . tools/make-functions
59
60 if [ -f .config ]; then
61         . .config
62 else
63         echo -e  "${BOLD}No configuration found!${NORMAL}"
64         echo -ne "Do you want to create one (y/N)?"
65         read CREATE_CONFIG
66         echo ""
67         if [ "$CREATE_CONFIG" == "y" ]; then
68                 make_config
69         fi
70 fi
71
72 if [ -z $EDITOR ]; then
73         for i in nano emacs vi; do
74                 EDITOR=$(which $i 2>/dev/null)
75                 if ! [ -z $EDITOR ]; then
76                         export EDITOR=$EDITOR
77                         break
78                 fi
79         done
80         [ -z $EDITOR ] && exiterror "You should have installed an editor."
81 fi
82
83 prepareenv() {
84     ############################################################################
85     #                                                                          #
86     # Are we running the right shell?                                          #
87     #                                                                          #
88     ############################################################################
89     if [ ! "$BASH" ]; then
90                         exiterror "BASH environment variable is not set.  You're probably running the wrong shell."
91     fi
92
93     if [ -z "${BASH_VERSION}" ]; then
94                         exiterror "Not running BASH shell."
95     fi
96
97
98     ############################################################################
99     #                                                                          #
100     # Trap on emergency exit                                                   #
101     #                                                                          #
102     ############################################################################
103     trap "exiterror 'Build process interrupted'" SIGINT SIGTERM SIGKILL SIGSTOP SIGQUIT
104
105
106     ############################################################################
107     #                                                                          #
108     # Resetting our nice level                                                 #
109     #                                                                          #
110     ############################################################################
111     echo -ne "Resetting our nice level to $NICE" | tee -a $LOGFILE
112     renice $NICE $$ > /dev/null
113     if [ `nice` != "$NICE" ]; then
114                         beautify message FAIL
115                         exiterror "Failed to set correct nice level"
116     else
117                         beautify message DONE
118     fi
119
120
121     ############################################################################
122     #                                                                          #
123     # Checking if running as root user                                         #
124     #                                                                          #
125     ############################################################################
126     echo -ne "Checking if we're running as root user" | tee -a $LOGFILE
127     if [ `id -u` != 0 ]; then
128                         beautify message FAIL
129                         exiterror "Not building as root"
130     else
131                         beautify message DONE
132     fi
133
134
135     ############################################################################
136     #                                                                          #
137     # Checking for necessary temporary space                                   #
138     #                                                                          #
139     ############################################################################
140     echo -ne "Checking for necessary space on disk $BASE_DEV" | tee -a $LOGFILE
141     BASE_DEV=`df -P -k $BASEDIR | tail -n 1 | awk '{ print $1 }'`
142     BASE_ASPACE=`df -P -k $BASEDIR | tail -n 1 | awk '{ print $4 }'`
143     if (( 2048000 > $BASE_ASPACE )); then
144                         BASE_USPACE=`du -skx $BASEDIR | awk '{print $1}'`
145                         if (( 2048000 - $BASE_USPACE > $BASE_ASPACE )); then
146                                 beautify message FAIL
147                                 exiterror "Not enough temporary space available, need at least 2GB on $BASE_DEV"
148                         fi
149     else
150                         beautify message DONE
151     fi
152
153     ############################################################################
154     #                                                                          #
155     # Building Linux From Scratch system                                       #
156     #                                                                          #
157     ############################################################################
158     # Set umask
159     umask 022
160
161     # Set LFS Directory
162     LFS=$BASEDIR/build
163
164     # Check /tools symlink
165     if [ -h /tools ]; then
166         rm -f /tools
167     fi
168     if [ ! -a /tools ]; then
169                         ln -s $BASEDIR/build/tools /
170     fi
171     if [ ! -h /tools ]; then
172                         exiterror "Could not create /tools symbolic link."
173     fi
174
175     # Setup environment
176     set +h
177     LC_ALL=POSIX
178     MAKETUNING="-j6"
179     export LFS LC_ALL CFLAGS CXXFLAGS MAKETUNING
180     unset CC CXX CPP LD_LIBRARY_PATH LD_PRELOAD
181
182     # Make some extra directories
183     mkdir -p $BASEDIR/build/{tools,etc,usr/src} 2>/dev/null
184     mkdir -p $BASEDIR/build/{dev/{shm,pts},proc,sys}
185     mkdir -p $BASEDIR/{cache,ccache} 2>/dev/null
186     mkdir -p $BASEDIR/build/usr/src/{cache,config,doc,html,langs,lfs,log,src,ccache}
187
188     mknod -m 600 $BASEDIR/build/dev/console c 5 1 2>/dev/null
189     mknod -m 666 $BASEDIR/build/dev/null c 1 3 2>/dev/null
190
191     # Make all sources and proc available under lfs build
192     mount --bind /dev            $BASEDIR/build/dev
193     mount --bind /dev/pts        $BASEDIR/build/dev/pts
194     mount --bind /dev/shm        $BASEDIR/build/dev/shm
195     mount --bind /proc           $BASEDIR/build/proc
196     mount --bind /sys            $BASEDIR/build/sys
197     mount --bind $BASEDIR/cache  $BASEDIR/build/usr/src/cache
198     mount --bind $BASEDIR/ccache $BASEDIR/build/usr/src/ccache
199     mount --bind $BASEDIR/config $BASEDIR/build/usr/src/config
200     mount --bind $BASEDIR/doc    $BASEDIR/build/usr/src/doc
201     mount --bind $BASEDIR/html   $BASEDIR/build/usr/src/html
202     mount --bind $BASEDIR/langs  $BASEDIR/build/usr/src/langs
203     mount --bind $BASEDIR/lfs    $BASEDIR/build/usr/src/lfs
204     mount --bind $BASEDIR/log    $BASEDIR/build/usr/src/log
205     mount --bind $BASEDIR/src    $BASEDIR/build/usr/src/src
206
207     # This is a temporary hack!!!
208     if [ ! -f /tools/bin/hostname ]; then
209       cp -f /bin/hostname /tools/bin/hostname 2>/dev/null
210     fi
211
212     # Run LFS static binary creation scripts one by one
213     export CCACHE_DIR=$BASEDIR/ccache
214     export CCACHE_HASHDIR=1
215
216     # Remove pre-install list of installed files in case user erase some files before rebuild
217     rm -f $BASEDIR/build/usr/src/lsalr 2>/dev/null
218 }
219
220 buildtoolchain() {
221     LOGFILE="$BASEDIR/log/_build.toolchain.log"
222     export LOGFILE
223     ORG_PATH=$PATH
224     NATIVEGCC=`gcc --version | grep GCC | awk {'print $3'}`
225     export NATIVEGCC GCCmajor=${NATIVEGCC:0:1} GCCminor=${NATIVEGCC:2:1} GCCrelease=${NATIVEGCC:4:1}
226     lfsmake1 ccache
227     lfsmake1 binutils   PASS=1
228     lfsmake1 gcc                PASS=1
229     export PATH=$BASEDIR/build/usr/local/bin:$BASEDIR/build/tools/bin:$PATH
230     lfsmake1 linux-libc-header
231     lfsmake1 glibc
232     lfsmake1 cleanup-toolchain PASS=1
233     lfsmake1 tcl
234     lfsmake1 expect
235     lfsmake1 dejagnu
236     lfsmake1 gcc                PASS=2
237     lfsmake1 binutils   PASS=2
238     lfsmake1 ncurses
239     lfsmake1 bash
240     lfsmake1 bzip2
241     lfsmake1 coreutils
242     lfsmake1 diffutils
243     lfsmake1 findutils
244     lfsmake1 gawk
245     lfsmake1 gettext
246     lfsmake1 grep
247     lfsmake1 gzip
248     lfsmake1 m4
249     lfsmake1 make
250     lfsmake1 patch
251     lfsmake1 perl
252     lfsmake1 sed
253     lfsmake1 tar
254     lfsmake1 texinfo
255     lfsmake1 util-linux
256     lfsmake1 cleanup-toolchain  PASS=2
257     export PATH=$ORG_PATH
258 }
259
260 buildbase() {
261     LOGFILE="$BASEDIR/log/_build.base.log"
262     export LOGFILE
263     lfsmake2 stage2
264     lfsmake2 linux-libc-header
265     lfsmake2 man-pages
266     lfsmake2 glibc
267     lfsmake2 cleanup-toolchain  PASS=3
268     lfsmake2 binutils
269     lfsmake2 gcc
270     lfsmake2 berkeley
271     lfsmake2 coreutils
272     lfsmake2 iana-etc
273     lfsmake2 m4
274     lfsmake2 bison
275     lfsmake2 ncurses
276     lfsmake2 procps
277     lfsmake2 sed
278     lfsmake2 libtool
279     lfsmake2 perl
280     lfsmake2 readline
281     lfsmake2 zlib
282     lfsmake2 autoconf
283     lfsmake2 automake
284     lfsmake2 bash
285     lfsmake2 bzip2
286     lfsmake2 diffutils
287     lfsmake2 e2fsprogs
288     lfsmake2 ed
289     lfsmake2 file
290     lfsmake2 findutils
291     lfsmake2 flex
292     lfsmake2 gawk
293     lfsmake2 gettext
294     lfsmake2 grep
295     lfsmake2 groff
296     lfsmake2 gzip
297     lfsmake2 inetutils
298     lfsmake2 iproute2
299     lfsmake2 kbd
300     lfsmake2 less
301     lfsmake2 libaal
302     lfsmake2 make
303     lfsmake2 man
304     lfsmake2 mktemp
305     lfsmake2 modutils
306     lfsmake2 mtd
307     lfsmake2 net-tools
308     lfsmake2 patch
309     lfsmake2 psmisc
310     lfsmake2 reiser4progs
311     lfsmake2 shadow
312     lfsmake2 sysklogd
313     lfsmake2 sysvinit
314     lfsmake2 tar
315     lfsmake2 texinfo
316     lfsmake2 udev
317     lfsmake2 util-linux
318     lfsmake2 vim
319     lfsmake2 grub
320 }
321
322 buildipfire() {
323   LOGFILE="$BASEDIR/log/_build.ipfire.log"
324   export LOGFILE
325   ipfiremake configroot
326   ipfiremake backup
327   ipfiremake dhcp
328   ipfiremake dhcpcd
329   ipfiremake libusb
330   ipfiremake libpcap
331   ipfiremake ppp
332   ipfiremake rp-pppoe
333   ipfiremake unzip
334   ipfiremake linux                      SMP=1
335   ipfiremake ipp2p                      SMP=1
336   ipfiremake zaptel                     SMP=1
337   ipfiremake r8169                      SMP=1
338   ipfiremake r8168                      SMP=1
339   ipfiremake mcs7830                    SMP=1
340   ipfiremake atl1                       SMP=1
341   ipfiremake dm9601                     SMP=1
342   ipfiremake kqemu                      SMP=1
343   ipfiremake sane               KMOD=1  SMP=1
344   ipfiremake linux
345   ipfiremake ipp2p
346   ipfiremake zaptel
347   ipfiremake r8169
348   ipfiremake r8168
349   ipfiremake mcs7830
350   ipfiremake atl1
351   ipfiremake dm9601
352   ipfiremake kqemu
353   ipfiremake sane               KMOD=1
354   ipfiremake pkg-config
355   ipfiremake linux-atm
356   ipfiremake cpio
357   ipfiremake klibc
358   ipfiremake mkinitcpio
359   ipfiremake udev                               KLIBC=1
360   ipfiremake expat
361   ipfiremake gdbm
362   ipfiremake gmp
363   ipfiremake pam
364   ipfiremake openssl
365   ipfiremake curl
366   ipfiremake python
367   ipfiremake libnet
368   ipfiremake libidn
369   ipfiremake libjpeg
370   ipfiremake libpng
371   ipfiremake libtiff
372   ipfiremake libart
373   ipfiremake freetype
374   ipfiremake gd
375   ipfiremake popt
376   ipfiremake pcre
377   ipfiremake slang
378   ipfiremake newt
379   ipfiremake libcap
380   ipfiremake pciutils
381   ipfiremake usbutils
382   ipfiremake libxml2
383   ipfiremake libxslt
384   ipfiremake BerkeleyDB
385   ipfiremake mysql
386   ipfiremake cyrus-sasl
387   ipfiremake openldap
388   ipfiremake apache2
389   ipfiremake php
390   ipfiremake apache2                    PASS=C
391   ipfiremake arping
392   ipfiremake beep
393   ipfiremake bind
394   ipfiremake cdrtools
395   ipfiremake dnsmasq
396   ipfiremake dosfstools
397   ipfiremake squashfstools
398   ipfiremake reiserfsprogs
399   ipfiremake xfsprogs
400   ipfiremake sysfsutils
401   ipfiremake fuse
402   ipfiremake ntfs-3g
403   ipfiremake ethtool
404   ipfiremake ez-ipupdate
405   ipfiremake fcron
406   ipfiremake perl-GD
407   ipfiremake GD-Graph
408   ipfiremake GD-TextUtil
409   ipfiremake gnupg
410   ipfiremake hdparm
411   ipfiremake sdparm
412   ipfiremake mtools
413   ipfiremake initscripts
414   ipfiremake whatmask
415   ipfiremake iptables
416   ipfiremake libupnp
417   ipfiremake ipp2p                      IPT=1
418   ipfiremake linux-igd
419   ipfiremake ipac-ng
420   ipfiremake ipaddr
421   ipfiremake iptstate
422   ipfiremake iputils
423   ipfiremake l7-protocols
424   ipfiremake mISDN
425   ipfiremake capi4k-utils
426   ipfiremake hwdata
427   ipfiremake kudzu
428   ipfiremake logrotate
429   ipfiremake logwatch
430   ipfiremake misc-progs
431   ipfiremake nano
432   ipfiremake nasm
433   ipfiremake URI
434   ipfiremake HTML-Tagset
435   ipfiremake HTML-Parser
436   ipfiremake Compress-Zlib
437   ipfiremake Digest
438   ipfiremake Digest-SHA1
439   ipfiremake Digest-HMAC
440   ipfiremake libwww-perl
441   ipfiremake Net-DNS
442   ipfiremake Net-IPv4Addr
443   ipfiremake Net_SSLeay
444   ipfiremake IO-Stringy
445   ipfiremake Unix-Syslog
446   ipfiremake Mail-Tools
447   ipfiremake MIME-Tools
448   ipfiremake Net-Server
449   ipfiremake Convert-TNEF
450   ipfiremake Convert-UUlib
451   ipfiremake Archive-Tar
452   ipfiremake Archive-Zip
453   ipfiremake Text-Tabs+Wrap
454   ipfiremake Locale-Country
455   ipfiremake XML-Parser
456   ipfiremake glib
457   ipfiremake GeoIP
458   ipfiremake fwhits
459   ipfiremake noip_updater
460   ipfiremake ntp
461   ipfiremake openssh
462   ipfiremake openswan
463   ipfiremake rrdtool
464   ipfiremake setserial
465   ipfiremake setup
466   ipfiremake snort
467   ipfiremake oinkmaster
468   ipfiremake squid
469   ipfiremake squid-graph
470   ipfiremake squidguard
471   ipfiremake calamaris
472   ipfiremake tcpdump
473   ipfiremake traceroute
474   ipfiremake vlan
475   ipfiremake wireless
476   ipfiremake libsafe
477   ipfiremake pakfire
478   ipfiremake java
479   ipfiremake spandsp
480   ipfiremake lzo
481   ipfiremake openvpn
482   ipfiremake pammysql
483   ipfiremake cups
484   ipfiremake ghostscript
485   ipfiremake foomatic
486   ipfiremake hplip
487   ipfiremake samba
488   ipfiremake sudo
489   ipfiremake mc
490   ipfiremake wget
491   ipfiremake bridge-utils
492   ipfiremake screen
493   ipfiremake hddtemp
494   ipfiremake smartmontools
495   ipfiremake htop
496   ipfiremake postfix
497   ipfiremake fetchmail
498   ipfiremake cyrus-imapd
499   ipfiremake openmailadmin
500   ipfiremake clamav
501   ipfiremake spamassassin
502   ipfiremake amavisd
503   ipfiremake alsa
504   ipfiremake mpg123
505   ipfiremake mpfire
506   ipfiremake guardian
507   ipfiremake libid3tag
508   ipfiremake libmad
509   ipfiremake libogg
510   ipfiremake libvorbis
511   ipfiremake lame
512   ipfiremake sox
513   ipfiremake libshout
514   ipfiremake icecast
515   ipfiremake icegenerator
516   ipfiremake mpd
517   ipfiremake mpc
518   ipfiremake xvid
519   ipfiremake libmpeg2
520   ipfiremake videolan
521   ipfiremake libpri
522   ipfiremake asterisk
523   ipfiremake gnump3d
524   ipfiremake libsigc++
525   ipfiremake applejuice
526   ipfiremake ocaml
527   ipfiremake mldonkey
528   ipfiremake libtorrent
529   ipfiremake rtorrent
530   ipfiremake ipfireseeder
531   ipfiremake rsync
532   ipfiremake tcpwrapper
533   ipfiremake portmap
534   ipfiremake nfs
535   ipfiremake nmap
536   ipfiremake mbmon
537   ipfiremake ncftp
538   ipfiremake etherwake
539   ipfiremake bwm-ng
540   ipfiremake tripwire
541   ipfiremake sysstat
542   ipfiremake vsftpd
543   ipfiremake which
544   ipfiremake lsof
545   ipfiremake centerim
546   ipfiremake br2684ctl
547   ipfiremake pcmciautils
548   ipfiremake collectd
549   ipfiremake lcd4linux
550   ipfiremake neon
551   ipfiremake subversion
552   ipfiremake tcptrack
553   ipfiremake teamspeak
554   ipfiremake elinks
555   ipfiremake igmpproxy
556   ipfiremake sdl
557   ipfiremake qemu
558   ipfiremake sane
559   ipfiremake netpbm
560   ipfiremake phpSANE
561   ipfiremake tunctl
562   ipfiremake nagios
563   ipfiremake ebtables
564   ipfiremake arptables
565   ipfiremake fontconfig
566   ipfiremake freefont
567   ipfiremake vdr
568   ipfiremake git
569 }
570
571 buildinstaller() {
572   # Run installer scripts one by one
573   LOGFILE="$BASEDIR/log/_build.installer.log"
574   export LOGFILE
575   ipfiremake syslinux
576   ipfiremake as86
577   ipfiremake mbr
578   ipfiremake memtest
579   installmake linux-libc-header
580   installmake binutils
581   ipfiremake uClibc                     PASS=1
582   ipfiremake gcc                        INST=1
583   installmake uClibc                    PASS=2
584   installmake gcc                       INST=2
585   installmake uClibc                    PASS=3
586   installmake busybox
587   installmake udev
588   installmake slang
589   installmake newt
590   installmake gettext
591   installmake kbd
592   installmake popt
593   installmake sysvinit
594   installmake misc-progs
595   installmake libaal
596   installmake reiser4progs
597   installmake reiserfsprogs
598   installmake sysfsutils
599   installmake util-linux
600   installmake pciutils
601   installmake zlib
602   installmake mtd
603   installmake wget
604   installmake hwdata
605   installmake kudzu
606   installmake pcmciautils
607   installmake installer
608   installmake initrd
609 }
610
611 buildpackages() {
612   LOGFILE="$BASEDIR/log/_build.packages.log"
613   export LOGFILE
614   echo "... see detailed log in _build.*.log files" >> $LOGFILE
615
616   installmake strip
617   
618   # Generating list of packages used
619   echo -n "Generating packages list from logs" | tee -a $LOGFILE
620   rm -f $BASEDIR/doc/packages-list
621   for i in `ls -1tr $BASEDIR/log/[^_]*`; do
622         if [ "$i" != "$BASEDIR/log/FILES" -a -n $i ]; then
623                 echo "* `basename $i`" >>$BASEDIR/doc/packages-list
624         fi
625   done
626   echo "== List of softwares used to build $NAME Version: $VERSION ==" > $BASEDIR/doc/packages-list.txt
627   grep -v 'configroot$\|img$\|initrd$\|initscripts$\|installer$\|install$\|setup$\|pakfire$\|stage2$\|smp$\|tools$\|tools1$\|tools2$\|.tgz$\|-config$\|_missing_rootfile$\|install1$\|install2$\|pass1$\|pass2$\|pass3$' \
628         $BASEDIR/doc/packages-list | sort >> $BASEDIR/doc/packages-list.txt
629   rm -f $BASEDIR/doc/packages-list
630   # packages-list.txt is ready to be displayed for wiki page
631   beautify message DONE
632
633   # Create images for install
634         ipfiremake cdrom ED=full
635         
636   # Check if there is a loop device for building in virtual environments
637   if [ -e /dev/loop/0 ] || [ -e /dev/loop0 ]; then
638         ipfiremake usb-stick
639   fi
640   mv $LFS/install/images/{*.iso,*.tgz,*.img.gz} $BASEDIR >> $LOGFILE 2>&1
641
642   ipfirepackages
643
644   # Cleanup
645   stdumount
646   rm -rf $BASEDIR/build/tmp/*
647
648   # Generating total list of files
649   echo -n "Generating files list from logs" | tee -a $LOGFILE
650   rm -f $BASEDIR/log/FILES
651   for i in `ls -1tr $BASEDIR/log/[^_]*`; do
652         if [ "$i" != "$BASEDIR/log/FILES" -a -n $i ]; then
653                 echo "##" >>$BASEDIR/log/FILES
654                 echo "## `basename $i`" >>$BASEDIR/log/FILES
655                 echo "##" >>$BASEDIR/log/FILES
656                 cat $i | sed "s%^\./%#%" | sort >> $BASEDIR/log/FILES
657         fi
658   done
659   beautify message DONE
660
661   cd $PWD
662 }
663
664 ipfirepackages() {
665         ipfiremake core-updates
666         for i in $(ls -1 $BASEDIR/config/rootfiles/packages); do
667                 if [ -e $BASEDIR/lfs/$i ]; then
668                         ipfiredist $i
669                 else
670                         echo -n $i
671                         beautify message SKIP
672                 fi
673         done
674   test -d $BASEDIR/packages || mkdir $BASEDIR/packages
675   mv -f $LFS/install/packages/* $BASEDIR/packages >> $LOGFILE 2>&1
676   rm -rf  $BASEDIR/build/install/packages/*
677 }
678
679 # See what we're supposed to do
680 case "$1" in 
681 build)
682         clear
683         BUILDMACHINE=`uname -m`
684         PACKAGE=`ls -v -r $BASEDIR/cache/toolchains/$SNAME-$VERSION-toolchain-$BUILDMACHINE.tar.gz 2> /dev/null | head -n 1`
685         #only restore on a clean disk
686         if [ ! -f log/cleanup-toolchain-2-tools ]; then
687                 if [ ! -n "$PACKAGE" ]; then
688                         beautify build_stage "Full toolchain compilation - Native GCC: `gcc --version | grep GCC | awk {'print $3'}`"
689                         prepareenv
690                         buildtoolchain
691                 else
692                         PACKAGENAME=${PACKAGE%.tar.gz}
693                         beautify build_stage "Packaged toolchain compilation"
694                         if [ `md5sum $PACKAGE | awk '{print $1}'` == `cat $PACKAGENAME.md5 | awk '{print $1}'` ]; then
695                                 tar zxf $PACKAGE
696                                 prepareenv
697                         else
698                                 exiterror "$PACKAGENAME md5 did not match, check downloaded package"
699                         fi
700                 fi
701         else
702                 echo -n "Using installed toolchain" | tee -a $LOGFILE
703                 beautify message SKIP
704                 prepareenv
705         fi
706
707         beautify build_start
708         beautify build_stage "Building LFS"
709         buildbase
710
711         beautify build_stage "Building IPFire"
712         buildipfire
713
714         beautify build_stage "Building installer"
715         buildinstaller
716
717         beautify build_stage "Building packages"
718         buildpackages
719         beautify build_end
720         ;;
721 shell)
722         # enter a shell inside LFS chroot
723         # may be used to changed kernel settings
724         prepareenv
725         entershell
726         ;;
727 clean)
728         echo -en "${BOLD}Cleaning build directory...${NORMAL}"
729         for i in `mount | grep $BASEDIR | sed 's/^.*loop=\(.*\))/\1/'`; do
730                 $LOSETUP -d $i 2>/dev/null
731         done
732         for i in `mount | grep $BASEDIR | cut -d " " -f 1`; do
733                 umount $i
734         done
735         stdumount
736         for i in `seq 0 7`; do
737             if ( losetup /dev/loop${i} 2>/dev/null | grep -q "/install/images" ); then
738                 umount /dev/loop${i}     2>/dev/null;
739                 losetup -d /dev/loop${i} 2>/dev/null;
740             fi;
741         done
742         rm -rf $BASEDIR/build
743         rm -rf $BASEDIR/cdrom
744         rm -rf $BASEDIR/packages
745         rm -rf $BASEDIR/log
746         if [ -h /tools ]; then
747                 rm -f /tools
748         fi
749         beautify message DONE
750         ;;
751 downloadsrc)
752         if [ ! -d $BASEDIR/cache ]; then
753                 mkdir $BASEDIR/cache
754         fi
755         mkdir -p $BASEDIR/log
756         echo -e "${BOLD}Preload all source files${NORMAL}" | tee -a $LOGFILE
757         FINISHED=0
758         cd $BASEDIR/lfs
759         for c in `seq $MAX_RETRIES`; do
760                 if (( FINISHED==1 )); then 
761                         break
762                 fi
763                 FINISHED=1
764                 cd $BASEDIR/lfs
765                 for i in *; do
766                         if [ -f "$i" -a "$i" != "Config" ]; then
767                                 echo -ne "Loading $i"
768                                 make -s -f $i LFS_BASEDIR=$BASEDIR MESSAGE="$i\t ($c/$MAX_RETRIES)" download >> $LOGFILE 2>&1
769                                 if [ $? -ne 0 ]; then
770                                         beautify message FAIL
771                                         FINISHED=0
772                                 else
773                                         if [ $c -eq 1 ]; then
774                                         beautify message DONE
775                                         fi
776                                 fi
777                         fi
778                 done
779         done
780         echo -e "${BOLD}***Verifying md5sums${NORMAL}"
781         ERROR=0
782         for i in *; do
783                 if [ -f "$i" -a "$i" != "Config" ]; then
784                         make -s -f $i LFS_BASEDIR=$BASEDIR MESSAGE="$i\t " md5 >> $LOGFILE 2>&1
785                         if [ $? -ne 0 ]; then
786                                 echo -ne "MD5 difference in lfs/$i"
787                                 beautify message FAIL
788                                 ERROR=1
789                         fi
790                 fi
791         done
792         if [ $ERROR -eq 0 ]; then
793                 echo -ne "${BOLD}all files md5sum match${NORMAL}"
794                 beautify message DONE
795         else
796                 echo -ne "${BOLD}not all files were correctly download${NORMAL}"
797                 beautify message FAIL
798         fi
799         cd - >/dev/null 2>&1
800         ;;
801 toolchain)
802         clear
803         prepareenv
804         beautify build_stage "Toolchain compilation - Native GCC: `gcc --version | grep GCC | awk {'print $3'}`"
805         buildtoolchain
806         BUILDMACHINE=`uname -m`
807         echo "`date -u '+%b %e %T'`: Create toolchain tar.gz for $BUILDMACHINE" | tee -a $LOGFILE
808         test -d $BASEDIR/cache/toolchains || mkdir $BASEDIR/cache/toolchains
809         cd $BASEDIR && tar -zc --exclude='log/_build.*.log' -f cache/toolchains/$SNAME-$VERSION-toolchain-$BUILDMACHINE.tar.gz \
810                 build/{bin,etc,usr/bin,usr/local} \
811                 build/tools/{bin,etc,*-linux-gnu,include,lib,libexec,sbin,share,var} \
812                 log >> $LOGFILE
813         md5sum cache/toolchains/$SNAME-$VERSION-toolchain-$BUILDMACHINE.tar.gz \
814                 > cache/toolchains/$SNAME-$VERSION-toolchain-$BUILDMACHINE.md5
815         stdumount
816         ;;
817 gettoolchain)
818         BUILDMACHINE=`uname -m`
819         # arbitrary name to be updated in case of new toolchain package upload
820         PACKAGE=$SNAME-$VERSION-toolchain-$BUILDMACHINE
821         if [ ! -f $BASEDIR/cache/toolchains/$PACKAGE.tar.gz ]; then
822                 URL_TOOLCHAIN=`grep URL_TOOLCHAIN lfs/Config | awk '{ print $3 }'`
823                 test -d $BASEDIR/cache/toolchains || mkdir $BASEDIR/cache/toolchains
824                 echo "`date -u '+%b %e %T'`: Load toolchain tar.gz for $BUILDMACHINE" | tee -a $LOGFILE
825                 cd $BASEDIR/cache/toolchains
826                 wget $URL_TOOLCHAIN/$PACKAGE.tar.gz $URL_TOOLCHAIN/$PACKAGE.md5 >& /dev/null
827                 if [ $? -ne 0 ]; then
828                         echo "`date -u '+%b %e %T'`: error downloading toolchain for $BUILDMACHINE machine" | tee -a $LOGFILE
829                 else
830                         if [ "`md5sum $PACKAGE.tar.gz | awk '{print $1}'`" = "`cat $PACKAGE.md5 | awk '{print $1}'`" ]; then
831                                 echo "`date -u '+%b %e %T'`: toolchain md5 ok" | tee -a $LOGFILE
832                         else
833                                 exiterror "$PACKAGE.md5 did not match, check downloaded package"
834                         fi
835                 fi
836         else
837                 echo "Toolchain is already downloaded. Exiting..."
838         fi
839         ;;
840 othersrc)
841         prepareenv
842         echo -ne "`date -u '+%b %e %T'`: Build sources iso for $MACHINE" | tee -a $LOGFILE
843         chroot $LFS /tools/bin/env -i   HOME=/root \
844         TERM=$TERM PS1='\u:\w\$ ' \
845         PATH=/usr/local/bin:/bin:/usr/bin:/sbin:/usr/sbin \
846         VERSION=$VERSION NAME="$NAME" SNAME="$SNAME" MACHINE=$MACHINE \
847         /bin/bash -x -c "cd /usr/src/lfs && make -f sources-iso LFS_BASEDIR=/usr/src install" >>$LOGFILE 2>&1
848         mv $LFS/install/images/ipfire-* $BASEDIR >> $LOGFILE 2>&1
849         if [ $? -eq "0" ]; then
850                 beautify message DONE
851         else
852                 beautify message FAIL
853         fi
854         stdumount
855         ;;
856 git)
857         case "$2" in
858           update|up)
859                         git pull
860                 ;;
861           commit|ci)
862                 shift 2
863                         git commit $*
864                         
865                         [ "$?" -eq "0" ] || exiterror "git commit $* failed."
866                         
867                         echo -e "${BOLD}Do you want to push, too? [y/N]${NORMAL}"
868                         read
869                         [ -z $REPLY ] && exit 0
870                         for i in y Y j J; do
871                                 if [ "$i" == "$REPLY" ]; then
872                                         $0 git push
873                                         exit $?
874                                 fi
875                         done
876                         exiterror "\"$REPLY\" is not a valid answer."
877                 ;;
878           dist)
879                         git archive HEAD | gzip -9 > ${SNAME}-${VERSION}.tar.gz
880                   ;;
881           diff|di)
882                         echo -ne "Make a local diff to last revision"
883                         git diff HEAD > ipfire-diff-$(date +'%Y-%m-%d-%H:%M').diff
884                         evaluate 1
885                         echo "Diff was successfully saved to ipfire-diff-$(date +'%Y-%m-%d-%H:%M').diff"
886                         git diff --stat
887                 ;;
888           push)
889                 [ -z $GIT_USER ] && exiterror "You have to setup GIT_USER first."
890                         GIT_URL="ssh://${GIT_USER}@git.ipfire.org/pub/git/ipfire-2.x"
891                         
892                 git push ${GIT_URL} master
893                 ;;
894         esac
895         ;;
896 uploadsrc)
897         PWD=`pwd`
898         cd $BASEDIR/cache/
899         echo -e "Uploading cache to ftp server:"
900         ncftpls -u $FTP_CACHE_USER -p $FTP_CACHE_PASS ftp://$FTP_CACHE_URL/$FTP_CACHE_PATH/ > /tmp/ftplist
901         for i in *; do
902                 if [ "$(basename $i)" == "toolchains" ]; then continue; fi
903                 grep -q $(basename $i) /tmp/ftplist
904                 if [ "$?" -ne "0" ]; then
905                         echo -ne "$(basename $i)"
906                         ncftpput -u $FTP_CACHE_USER -p $FTP_CACHE_PASS $FTP_CACHE_URL $FTP_CACHE_PATH/ $(basename $i)
907                         if [ "$?" -ne "0" ]; then
908                                 beautify message FAIL
909                         fi
910                 fi
911         done
912         rm -f /tmp/ftplist
913         cd $PWD
914         exit 0
915         ;;
916 upload)
917         FTP_ISO_PORT=`echo "$FTP_ISO_URL" | awk -F: '{ print $2 }'`
918         FTP_ISO_URL=`echo "$FTP_ISO_URL" | awk -F: '{ print $1 }'`
919         if [ -z $FTP_ISO_PORT ]; then
920             FTP_ISO_PORT=21
921         fi
922         cat <<EOF > .ftp-commands
923 mkdir -p $FTP_ISO_PATH$SVN_REVISION
924 mkdir -p $FTP_ISO_PATH$SVN_REVISION/paks
925 quit
926 EOF
927         ncftp -u $FTP_ISO_USER -p $FTP_ISO_PASS -P $FTP_ISO_PORT $FTP_ISO_URL < .ftp-commands
928         rm -f .ftp-commands
929                 
930         case "$2" in
931           iso)
932                 echo -e "Uploading the iso to $FTP_ISO_PATH/$SVN_REVISION."
933
934                 md5sum ipfire-$VERSION.$MACHINE-full.iso > ipfire-$VERSION.$MACHINE-full.iso.md5
935                 for i in svn_status ipfire-source-r$SVN_REVISION.tar.gz ipfire-$VERSION.$MACHINE-full.iso ipfire-$VERSION.$MACHINE-full.iso.md5 ipfire-$VERSION.$MACHINE-devel.iso ipfire-$VERSION.$MACHINE-devel.iso.md5; do
936                                 if [ -e "$i" ]; then
937                             ncftpput -u $FTP_ISO_USER -p $FTP_ISO_PASS -P $FTP_ISO_PORT $FTP_ISO_URL $FTP_ISO_PATH$SVN_REVISION/ $i
938                                         if [ "$?" -eq "0" ]; then
939                                                 echo "The file with name $i was successfully uploaded to $FTP_ISO_URL$FTP_ISO_PATH$SVN_REVISION/."
940                                         else
941                                                 echo "There was an error while uploading the file $i to the ftp server."
942                                                 exit 1
943                                         fi
944                                 fi
945                 done
946                 rm -f ipfire-$VERSION.$MACHINE-full.iso.md5
947                 if [ "$3" = "--with-sources-cd" ]; then
948                         ncftpput -u $FTP_ISO_USER -p $FTP_ISO_PASS -P $FTP_ISO_PORT $FTP_ISO_URL $FTP_ISO_PATH/$SVN_REVISION/ ipfire-sources-cd-$VERSION.$MACHINE.iso
949                 fi
950                 ;;
951           paks)
952                 ncftpput -u $FTP_ISO_USER -p $FTP_ISO_PASS -P $FTP_ISO_PORT $FTP_ISO_URL $FTP_ISO_PATH$SVN_REVISION/paks packages/*
953                 if [ "$?" -eq "0" ]; then
954                         echo -e "The packages were successfully uploaded to $FTP_ISO_URL$FTP_ISO_PATH$SVN_REVISION/."
955                 else
956                         echo -e "There was an error while uploading the packages to the ftp server."
957                         exit 1
958                 fi
959           ;;
960         esac
961         ;;
962 batch)
963         if [ "$2" = "--background" ]; then
964                 batch_script
965                 exit $?
966         fi
967         if [ `screen -ls | grep -q ipfire` ]; then
968                 echo "Build is already running, sorry!"
969                 exit 1
970         else
971                 if [ "$2" = "--rebuild" ]; then
972                         export IPFIRE_REBUILD=1
973                         echo "REBUILD!"
974                 else
975                         export IPFIRE_REBUILD=0
976                 fi
977                 echo -en "${BOLD}***IPFire-Batch-Build is starting...${NORMAL}"
978                 screen -dmS ipfire $0 batch --background
979                 evaluate 1
980                 exit 0
981         fi
982         ;;
983 watch)
984         watch_screen
985         ;;
986 pxe)
987         case "$2" in
988           start)
989                 start_tftpd
990                 ;;
991           stop)
992                 stop_tftpd
993                 ;;
994           reload|restart)
995                 reload_tftpd
996                 ;;              
997         esac
998         exit 0
999         ;;
1000 lang)
1001         update_langs
1002         ;;
1003 "")
1004         clear
1005         select name in "Exit" "IPFIRE: Downloadsrc" "IPFIRE: Build (silent)" "IPFIRE: Watch Build" "IPFIRE: Batch" "IPFIRE: Clean" "LOG: Tail" "Help"
1006         do
1007         case $name in
1008         "IPFIRE: Downloadsrc")
1009                 $0 downloadsrc
1010                 ;;
1011         "IPFIRE: Build (silent)")
1012                 $0 build-silent
1013                 ;;
1014         "IPFIRE: Watch Build")
1015                 $0 watch
1016                 ;;
1017         "IPFIRE: Batch")
1018                 $0 batch
1019                 ;;
1020         "IPFIRE: Clean")
1021                 $0 clean
1022                 ;;
1023         "Help")
1024                 echo "Usage: $0 {build|changelog|clean|gettoolchain|downloadsrc|shell|sync|toolchain}"
1025                 cat doc/make.sh-usage
1026                 ;;
1027         "LOG: Tail")
1028                 tail -f log/_*
1029                 ;;
1030         "Exit")
1031                 break
1032                 ;;
1033         esac
1034         done
1035         ;;
1036 config)
1037         make_config
1038         ;;
1039 *)
1040         echo "Usage: $0 {build|changelog|clean|gettoolchain|downloadsrc|shell|sync|toolchain}"
1041         cat doc/make.sh-usage
1042         ;;
1043 esac