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