Paketmanagement umgeschrieben, GPG-Signatur jetzt moeglich.
[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"                           # Which versions should be compiled? (full|light|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="-j6"
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 gawk
288     lfsmake2 gettext
289     lfsmake2 grep
290     lfsmake2 groff
291     lfsmake2 gzip
292     lfsmake2 inetutils
293     lfsmake2 iproute2
294     lfsmake2 kbd
295     lfsmake2 less
296     lfsmake2 libaal
297     lfsmake2 make
298     lfsmake2 man
299     lfsmake2 mktemp
300     lfsmake2 modutils
301     lfsmake2 net-tools
302     lfsmake2 patch
303     lfsmake2 psmisc
304     lfsmake2 reiser4progs
305     lfsmake2 shadow
306     lfsmake2 sysklogd
307     lfsmake2 sysvinit
308     lfsmake2 tar
309     lfsmake2 texinfo
310     lfsmake2 udev
311     lfsmake2 util-linux
312     lfsmake2 vim
313     lfsmake2 grub
314 }
315
316 buildipfire() {
317   LOGFILE="$BASEDIR/log/_build.ipfire.log"
318   export LOGFILE
319   ipfiremake configroot
320   ipfiremake dhcp
321   ipfiremake dhcpcd
322   ipfiremake libusb
323   ipfiremake libpcap
324   ipfiremake linux-atm
325   ipfiremake ppp
326   ipfiremake rp-pppoe
327   ipfiremake unzip
328   ipfiremake linux                      SMP=1
329   ipfiremake ipp2p                      SMP=1
330   ipfiremake fcdsl                      SMP=1
331   ipfiremake fcdsl2                     SMP=1
332   ipfiremake fcdslsl                    SMP=1
333   ipfiremake fcdslusb           SMP=1
334   ipfiremake fcdslslusb         SMP=1
335   ipfiremake fcpci                      SMP=1
336 #  ipfiremake promise-sata-300-tx       SMP=1
337   ipfiremake zaptel                     SMP=1
338   ipfiremake fuse                       SMP=1
339   ipfiremake linux
340   ipfiremake ipp2p
341   ipfiremake fcdsl
342   ipfiremake fcdsl2
343   ipfiremake fcdslsl
344   ipfiremake fcdslusb
345   ipfiremake fcdslslusb
346   ipfiremake fcpci
347 #  ipfiremake promise-sata-300-tx
348   ipfiremake zaptel
349   ipfiremake fuse
350   ipfiremake pkg-config
351   ipfiremake cpio
352   ipfiremake expat
353   ipfiremake gdbm
354   ipfiremake gmp
355   ipfiremake pam
356   ipfiremake openssl
357   ipfiremake python
358   ipfiremake libnet
359   ipfiremake libjpeg
360   ipfiremake libpng
361   ipfiremake libtiff
362   ipfiremake lcms
363   ipfiremake libmng
364   ipfiremake freetype
365   ipfiremake libart
366   ipfiremake gd
367   ipfiremake popt
368   ipfiremake pcre
369   ipfiremake slang
370   ipfiremake newt
371   ipfiremake libcap
372   ipfiremake pciutils
373   ipfiremake libxml2
374   ipfiremake BerkeleyDB
375   ipfiremake mysql
376   ipfiremake cyrus-sasl
377   ipfiremake openldap
378   ipfiremake apache2
379   ipfiremake php
380   ipfiremake apache2                    PASS=C
381   ipfiremake arping
382   ipfiremake beep
383   ipfiremake bind
384   ipfiremake capi4k-utils
385   ipfiremake cdrtools
386   ipfiremake dnsmasq
387   ipfiremake libaal
388   ipfiremake dosfstools
389   ipfiremake reiserfsprogs
390   ipfiremake squashfstools
391   ipfiremake sysfsutils
392   ipfiremake ntfs-3g
393   ipfiremake ethtool
394   ipfiremake ez-ipupdate
395   ipfiremake fcron
396   ipfiremake GD
397   ipfiremake GD-Graph
398   ipfiremake GD-TextUtil
399   ipfiremake gnupg
400   ipfiremake hdparm
401   ipfiremake ibod
402   ipfiremake initscripts
403   ipfiremake whatmask
404   ipfiremake iptables
405   ipfiremake libupnp
406   ipfiremake ipp2p                      IPT=1
407   ipfiremake moblock
408   ipfiremake linux-igd
409   ipfiremake ipac-ng
410   ipfiremake ipaddr
411   ipfiremake iptstate
412   ipfiremake iputils
413   ipfiremake l7-protocols
414   ipfiremake isapnptools
415 #  ipfiremake isdn4k-utils # What about mISDN???
416   ipfiremake hwdata
417   ipfiremake kudzu
418   ipfiremake logrotate
419   ipfiremake logwatch
420   ipfiremake misc-progs
421   ipfiremake mtools
422   ipfiremake nano
423   ipfiremake nash
424   ipfiremake nasm
425   ipfiremake URI
426   ipfiremake HTML-Tagset
427   ipfiremake HTML-Parser
428   ipfiremake Compress-Zlib
429   ipfiremake Digest
430   ipfiremake Digest-SHA1
431   ipfiremake Digest-HMAC
432   ipfiremake libwww-perl
433   ipfiremake Net-DNS
434   ipfiremake Net-IPv4Addr
435   ipfiremake Net_SSLeay
436   ipfiremake IO-Stringy
437   ipfiremake Unix-Syslog
438   ipfiremake Mail-Tools
439   ipfiremake MIME-Tools
440   ipfiremake Net-Server
441   ipfiremake Convert-TNEF
442   ipfiremake Convert-UUlib
443   ipfiremake Archive-Tar
444   ipfiremake Archive-Zip
445   ipfiremake Text-Tabs+Wrap
446   ipfiremake Locale-Country
447   ipfiremake XML-Parser
448   ipfiremake glib
449   ipfiremake GeoIP
450   ipfiremake fwhits
451   ipfiremake noip_updater
452   ipfiremake ntp
453   ipfiremake oinkmaster
454   ipfiremake openssh
455   ipfiremake openswan
456   ipfiremake pptpclient
457   ipfiremake rrdtool
458   ipfiremake setserial
459   ipfiremake setup
460   ipfiremake snort
461   ipfiremake squid
462   ipfiremake squid-graph
463   ipfiremake squidguard
464   ipfiremake calamaris
465   ipfiremake tcpdump
466   ipfiremake traceroute
467   ipfiremake vlan
468   ipfiremake wireless
469   ipfiremake libsafe
470   ipfiremake 3c5x9setup
471   ipfiremake pakfire
472   ipfiremake java
473   ipfiremake bootsplash
474   ipfiremake spandsp
475   ipfiremake lzo
476   ipfiremake openvpn
477   ipfiremake pammysql
478   ipfiremake xinetd
479   ipfiremake ghostscript
480   ipfiremake cups
481   ipfiremake samba
482   ipfiremake sudo
483   ipfiremake mc
484   ipfiremake wget
485   ipfiremake wput
486   ipfiremake bridge-utils
487   ipfiremake screen
488   ipfiremake hddtemp
489   ipfiremake smartmontools
490   ipfiremake htop
491   ipfiremake lynx
492   ipfiremake postfix
493   ipfiremake procmail
494   ipfiremake fetchmail
495   ipfiremake cyrusimap
496   ipfiremake webcyradm
497   ipfiremake mailx
498   ipfiremake clamav
499   ipfiremake razor
500   ipfiremake spamassassin
501   ipfiremake amavisd
502   ipfiremake stund
503   ipfiremake libpri
504 # ipfiremake bristuff
505   ipfiremake asterisk
506   ipfiremake mpg123
507   ipfiremake libmad
508   ipfiremake libogg
509   ipfiremake libvorbis
510   ipfiremake lame
511   ipfiremake xvid
512   ipfiremake mpeg2dec
513   ipfiremake ffmpeg
514   ipfiremake sox
515   ipfiremake gnump3d
516   ipfiremake videolan
517   ipfiremake applejuice
518   ipfiremake ocaml
519   ipfiremake mldonkey
520   ipfiremake ntop
521   ipfiremake rsync
522   ipfiremake tcpwrapper
523   ipfiremake portmap
524   ipfiremake nfs
525   ipfiremake nmap
526   ipfiremake mbmon
527   ipfiremake iftop
528   ipfiremake ncftp
529   ipfiremake cftp
530   ipfiremake etherwake
531   ipfiremake ethereal
532   ipfiremake tftp-hpa
533   ipfiremake bwm-ng
534   ipfiremake tripwire
535   ipfiremake sysstat
536 }
537
538 buildinstaller() {
539   # Run installer scripts one by one
540   LOGFILE="$BASEDIR/log/_build.installer.log"
541   export LOGFILE
542   ipfiremake syslinux
543   ipfiremake as86
544   ipfiremake mbr
545   ipfiremake memtest
546   installmake linux-libc-header
547   installmake binutils
548   ipfiremake uClibc                     PASS=1
549   ipfiremake gcc                        INST=1
550   installmake uClibc                    PASS=2
551   installmake gcc                       INST=2
552   installmake uClibc                    PASS=3
553   installmake busybox
554   installmake udev
555   installmake slang
556   installmake newt
557   installmake gettext
558   installmake kbd
559   installmake popt
560   installmake sysvinit
561   installmake misc-progs
562   installmake e2fsprogs
563   installmake libaal
564   installmake reiser4progs
565   installmake reiserfsprogs
566   installmake sysfsutils
567   installmake util-linux
568   installmake pciutils
569   installmake zlib
570   installmake wget
571   installmake hwdata
572   installmake kudzu
573   installmake installer
574   installmake initrd
575 }
576
577 buildpackages() {
578   LOGFILE="$BASEDIR/log/_build.packages.log"
579   export LOGFILE
580   echo "... see detailed log in _build.*.log files" >> $LOGFILE
581
582   installmake strip
583   
584   # Generating list of packages used
585   echo -n "Generating packages list from logs" | tee -a $LOGFILE
586   rm -f $BASEDIR/doc/packages-list
587   for i in `ls -1tr $BASEDIR/log/[^_]*`; do
588         if [ "$i" != "$BASEDIR/log/FILES" -a -n $i ]; then
589                 echo "* `basename $i`" >>$BASEDIR/doc/packages-list
590         fi
591   done
592   echo "== List of softwares used to build $NAME Version: $VERSION ==" > $BASEDIR/doc/packages-list.txt
593   grep -v 'configroot$\|img$\|initrd$\|initscripts$\|installer$\|install$\|setup$\|pakfire$\|stage2$\|smp$\|tools$\|tools1$\|tools2$\|.tgz$\|-config$\|_missing_rootfile$' \
594         $BASEDIR/doc/packages-list | sort >> $BASEDIR/doc/packages-list.txt
595   rm -f $BASEDIR/doc/packages-list
596   # packages-list.txt is ready to be displayed for wiki page
597   beautify message DONE
598
599   # Create images for install
600   if [ "$DEVEL" == "1" ]; then
601                 ipfiremake cdrom ED=devel
602         fi
603         ipfiremake cdrom ED=full
604         
605   # Check if there is a loop device for building in virtual environments
606   if [ -e /dev/loop0 ]; then
607         ipfiremake usb-stick
608   fi
609   ipfiremake pxe
610   mv $LFS/install/images/{*.iso,*.tgz,*.img.gz} $BASEDIR >> $LOGFILE 2>&1
611
612   ipfirepackages
613
614   # Cleanup
615   stdumount
616   rm -rf $BASEDIR/build/tmp/*
617
618   # Generating total list of files
619   echo -n "Generating files list from logs" | tee -a $LOGFILE
620   rm -f $BASEDIR/log/FILES
621   for i in `ls -1tr $BASEDIR/log/[^_]*`; do
622         if [ "$i" != "$BASEDIR/log/FILES" -a -n $i ]; then
623                 echo "##" >>$BASEDIR/log/FILES
624                 echo "## `basename $i`" >>$BASEDIR/log/FILES
625                 echo "##" >>$BASEDIR/log/FILES
626                 cat $i | sed "s%^\./%#%" | sort >> $BASEDIR/log/FILES
627         fi
628   done
629   beautify message DONE
630
631   cd $PWD
632 }
633
634 ipfirepackages() {
635 #  ipfiredist amavisd
636 #  ipfiredist applejuice
637 #  ipfiredist asterisk
638   ipfiredist clamav
639 #  ipfiredist cups
640 #  ipfiredist cyrusimap
641 #  ipfiredist fetchmail
642 #  ipfiredist gnump3d
643 #  ipfiredist java
644 #  ipfiredist mailx
645 #  ipfiredist mldonkey
646 #  ipfiredist nfs
647 #  ipfiredist postfix
648 #  ipfiredist samba
649 #  ipfiredist sox
650 #  ipfiredist spamassassin
651 #  ipfiredist webcyradm
652   test -d $BASEDIR/packages || mkdir $BASEDIR/packages
653   mv -f $LFS/install/packages/*.{ipfire,md5} $BASEDIR/packages >> $LOGFILE 2>&1
654   rm -rf  $BASEDIR/build/install/packages/*
655 }
656
657 # See what we're supposed to do
658 case "$1" in 
659 build)
660         clear
661         BUILDMACHINE=`uname -m`
662         DEVEL=0
663         if [ "$2" == "--devel" ]; then
664           DEVEL=1
665         fi
666         PACKAGE=`ls -v -r $BASEDIR/cache/toolchains/$SNAME-$VERSION-toolchain-$BUILDMACHINE.tar.gz 2> /dev/null | head -n 1`
667         #only restore on a clean disk
668         if [ ! -f log/cleanup-toolchain-2-tools ]; then
669                 if [ ! -n "$PACKAGE" ]; then
670                         beautify build_stage "Full toolchain compilation - Native GCC: `gcc --version | grep GCC | awk {'print $3'}`"
671                         prepareenv
672                         buildtoolchain
673                 else
674                         PACKAGENAME=${PACKAGE%.tar.gz}
675                         beautify build_stage "Packaged toolchain compilation"
676                         if [ `md5sum $PACKAGE | awk '{print $1}'` == `cat $PACKAGENAME.md5 | awk '{print $1}'` ]; then
677                                 tar zxf $PACKAGE
678                                 prepareenv
679                         else
680                                 exiterror "$PACKAGENAME md5 did not match, check downloaded package"
681                         fi
682                 fi
683         else
684                 echo -n "Using installed toolchain" | tee -a $LOGFILE
685                 beautify message SKIP
686                 prepareenv
687         fi
688
689         beautify build_start
690         beautify build_stage "Building LFS"
691         buildbase
692
693         beautify build_stage "Building IPFire"
694         buildipfire
695
696         # Setzen des IPFire Builds
697         if [ "$FIREBUILD" ]; then
698                 echo "$FIREBUILD" > $BASEDIR/build/var/ipfire/firebuild
699         else
700                 echo "_(OvO)_" > $BASEDIR/build/var/ipfire/firebuild
701         fi
702
703         beautify build_stage "Building installer"
704         buildinstaller
705
706         beautify build_stage "Building packages"
707         buildpackages
708         beautify build_end
709         ;;
710 shell)
711         # enter a shell inside LFS chroot
712         # may be used to changed kernel settings
713         prepareenv
714         entershell
715         ;;
716 changelog)
717         echo -n "Loading new Changelog from SVN: "
718         svn log http://svn.ipfire.org/svn/ipfire > doc/ChangeLog
719         beautify message DONE
720         ;;
721 clean)
722         echo -en "${BOLD}Cleaning build directory...${NORMAL}"
723         for i in `mount | grep $BASEDIR | sed 's/^.*loop=\(.*\))/\1/'`; do
724                 $LOSETUP -d $i 2>/dev/null
725         done
726         for i in `mount | grep $BASEDIR | cut -d " " -f 1`; do
727                 umount $i
728         done
729         stdumount
730         for i in `seq 0 7`; do
731             if ( losetup /dev/loop${i} 2>/dev/null | grep -q "/install/images" ); then
732                 umount /dev/loop${i}     2>/dev/null;
733                 losetup -d /dev/loop${i} 2>/dev/null;
734             fi;
735         done
736         rm -rf $BASEDIR/build
737         rm -rf $BASEDIR/cdrom
738         rm -rf $BASEDIR/packages
739         rm -rf $BASEDIR/log
740         if [ -h /tools ]; then
741                 rm -f /tools
742         fi
743         beautify message DONE
744         ;;
745 downloadsrc)
746         if [ ! -d $BASEDIR/cache ]; then
747                 mkdir $BASEDIR/cache
748         fi
749         mkdir -p $BASEDIR/log
750         echo -e "${BOLD}Preload all source files${NORMAL}" | tee -a $LOGFILE
751         FINISHED=0
752         cd $BASEDIR/lfs
753         for c in `seq $MAX_RETRIES`; do
754                 if (( FINISHED==1 )); then 
755                         break
756                 fi
757                 FINISHED=1
758                 cd $BASEDIR/lfs
759                 for i in *; do
760                         if [ -f "$i" -a "$i" != "Config" ]; then
761                                 echo -ne "Loading $i"
762                                 make -s -f $i LFS_BASEDIR=$BASEDIR MESSAGE="$i\t ($c/$MAX_RETRIES)" download >> $LOGFILE 2>&1
763                                 if [ $? -ne 0 ]; then
764                                         beautify message FAIL
765                                         FINISHED=0
766                                 else
767                                         if [ $c -eq 1 ]; then
768                                         beautify message DONE
769                                         fi
770                                 fi
771                         fi
772                 done
773         done
774         echo -e "${BOLD}***Verifying md5sums${NORMAL}"
775         ERROR=0
776         for i in *; do
777                 if [ -f "$i" -a "$i" != "Config" ]; then
778                         make -s -f $i LFS_BASEDIR=$BASEDIR MESSAGE="$i\t " md5 >> $LOGFILE 2>&1
779                         if [ $? -ne 0 ]; then
780                                 echo -ne "MD5 difference in lfs/$i"
781                                 beautify message FAIL
782                                 ERROR=1
783                         fi
784                 fi
785         done
786         if [ $ERROR -eq 0 ]; then
787                 echo -ne "${BOLD}all files md5sum match${NORMAL}"
788                 beautify message DONE
789         else
790                 echo -ne "${BOLD}not all files were correctly download${NORMAL}"
791                 beautify message FAIL
792         fi
793         cd - >/dev/null 2>&1
794         ;;
795 toolchain)
796         clear
797         prepareenv
798         beautify build_stage "Toolchain compilation - Native GCC: `gcc --version | grep GCC | awk {'print $3'}`"
799         buildtoolchain
800         BUILDMACHINE=`uname -m`
801         echo "`date -u '+%b %e %T'`: Create toolchain tar.gz for $BUILDMACHINE" | tee -a $LOGFILE
802         test -d $BASEDIR/cache/toolchains || mkdir $BASEDIR/cache/toolchains
803         cd $BASEDIR && tar -zc --exclude='log/_build.*.log' -f cache/toolchains/$SNAME-$VERSION-toolchain-$BUILDMACHINE.tar.gz \
804                 build/{bin,etc,usr/bin,usr/local} \
805                 build/tools/{bin,etc,*-linux-gnu,include,lib,libexec,sbin,share,var} \
806                 log >> $LOGFILE
807         md5sum cache/toolchains/$SNAME-$VERSION-toolchain-$BUILDMACHINE.tar.gz \
808                 > cache/toolchains/$SNAME-$VERSION-toolchain-$BUILDMACHINE.md5
809         stdumount
810         ;;
811 gettoolchain)
812         BUILDMACHINE=`uname -m`
813         # arbitrary name to be updated in case of new toolchain package upload
814         PACKAGE=$SNAME-$VERSION-toolchain-$BUILDMACHINE
815         if [ ! -f $BASEDIR/cache/toolchains/$PACKAGE.tar.gz ]; then
816                 URL_TOOLCHAIN=`grep URL_TOOLCHAIN lfs/Config | awk '{ print $3 }'`
817                 test -d $BASEDIR/cache/toolchains || mkdir $BASEDIR/cache/toolchains
818                 echo "`date -u '+%b %e %T'`: Load toolchain tar.gz for $BUILDMACHINE" | tee -a $LOGFILE
819                 cd $BASEDIR/cache/toolchains
820                 wget $URL_TOOLCHAIN/$PACKAGE.tar.gz $URL_TOOLCHAIN/$PACKAGE.md5 >& /dev/null
821                 if [ $? -ne 0 ]; then
822                         echo "`date -u '+%b %e %T'`: error downloading toolchain for $BUILDMACHINE machine" | tee -a $LOGFILE
823                 else
824                         if [ "`md5sum $PACKAGE.tar.gz | awk '{print $1}'`" = "`cat $PACKAGE.md5 | awk '{print $1}'`" ]; then
825                                 echo "`date -u '+%b %e %T'`: toolchain md5 ok" | tee -a $LOGFILE
826                         else
827                                 exiterror "$PACKAGE.md5 did not match, check downloaded package"
828                         fi
829                 fi
830         else
831                 echo "Toolchain is already downloaded. Exiting..."
832         fi
833         ;;
834 othersrc)
835         prepareenv
836         echo -ne "`date -u '+%b %e %T'`: Build sources iso for $MACHINE" | tee -a $LOGFILE
837         chroot $LFS /tools/bin/env -i   HOME=/root \
838         TERM=$TERM PS1='\u:\w\$ ' \
839         PATH=/usr/local/bin:/bin:/usr/bin:/sbin:/usr/sbin \
840         VERSION=$VERSION NAME="$NAME" SNAME="$SNAME" MACHINE=$MACHINE \
841         /bin/bash -x -c "cd /usr/src/lfs && make -f sources-iso LFS_BASEDIR=/usr/src install" >>$LOGFILE 2>&1
842         mv $LFS/install/images/ipfire-* $BASEDIR >> $LOGFILE 2>&1
843         if [ $? -eq "0" ]; then
844                 beautify message DONE
845         else
846                 beautify message FAIL
847         fi
848         stdumount
849         ;;
850 svn)
851         case "$2" in
852           update|up)
853                 # clear
854                 echo -ne "Loading the latest source files...\n"
855                 if [ $3 ]; then
856                         svn update -r $3 | tee -a $PWD/log/_build.svn.update.log
857                 else
858                         svn update | tee -a $PWD/log/_build.svn.update.log
859                 fi
860                 if [ $? -eq "0" ]; then
861                         beautify message DONE
862                 else
863                         beautify message FAIL
864                         exit 1
865                 fi
866                 echo -ne "Writing the svn-info to a file"
867                 svn info > $PWD/svn_status
868                 if [ $? -eq "0" ]; then
869                         beautify message DONE
870                 else
871                         beautify message FAIL
872                         exit 1
873                 fi
874                 chmod 755 $0
875                 exit 0
876           ;;
877           commit|ci)
878                 clear
879                 if [ -f /usr/bin/mcedit ]; then
880                         export EDITOR=/usr/bin/mcedit
881                 fi
882                 if [ -f /usr/bin/nano ]; then
883                         export EDITOR=/usr/bin/nano
884                 fi
885                 echo -ne "Selecting editor $EDITOR..."
886                 beautify message DONE
887                 if [ -e /sbin/yast ]; then
888                         if [ "`echo $SVN_REVISION | cut -c 3`" -eq "0" ]; then
889                                 $0 changelog
890                         fi
891                 fi
892                 update_langs
893                 svn commit
894                 $0 svn up
895                 if [ -n "$FTP_CACHE_URL" ]; then
896                         $0 uploadsrc
897                 fi
898           ;;
899           dist)
900                 if [ $3 ]; then
901                         SVN_REVISION=$3
902                 fi
903                 if [ -f ipfire-source-r$SVN_REVISION.tar.gz ]; then
904                         echo -ne "REV $SVN_REVISION: SKIPPED!\n"
905                         exit 0
906                 fi
907                 echo -en "REV $SVN_REVISION: Downloading..."
908                 svn export http://svn.ipfire.org/svn/ipfire/trunk ipfire-source/ --force > /dev/null
909                 svn log http://svn.ipfire.org/svn/ipfire/trunk -r 1:$SVN_REVISION > ipfire-source/Changelog
910                 #svn info http://svn.ipfire.org/svn/ipfire/trunk -r $SVN_REVISION > ipfire-source/svn_status
911                 evaluate 1
912
913                 echo -en "REV $SVN_REVISION: Compressing files..."
914                 if [ -e ipfire-source/trunk/make.sh ]; then
915                         chmod 755 ipfire-source/trunk/make.sh
916                 fi
917                 tar cfz ipfire-source-r$SVN_REVISION.tar.gz ipfire-source
918                 evaluate 1
919                 echo -en "REV $SVN_REVISION: Cleaning up..."
920                 rm ipfire-source/ -r
921                 evaluate 1
922           ;;
923           diff|di)
924           update_langs
925                 echo -ne "Make a local diff to last svn revision"
926                 svn diff > ipfire-diff-`date +'%Y-%m-%d-%H:%M'`-r`svn info | grep Revision | cut -c 11-`.diff
927                 evaluate 1
928                 echo "Diff was successfully saved to ipfire-diff-`date +'%Y-%m-%d-%H:%M'`-r`svn info | grep Revision | cut -c 11-`.diff"
929                 svn status
930           ;;
931         esac
932         ;;
933 uploadsrc)
934         PWD=`pwd`
935         cd $BASEDIR/cache/
936         echo -e "Uploading cache to ftp server:"
937         ncftpls -u $FTP_CACHE_USER -p $FTP_CACHE_PASS ftp://$FTP_CACHE_URL$FTP_CACHE_PATH/ > /tmp/ftplist
938         for i in *; do
939                 if [ "$i" == "toolchains" ]; then continue; fi
940                 grep -q $i /tmp/ftplist
941                 if [ "$?" -ne "0" ]; then
942                         echo -ne "$i"
943                         ncftpput -u $FTP_CACHE_USER -p $FTP_CACHE_PASS $FTP_CACHE_URL $FTP_CACHE_PATH/ $i
944                         if [ "$?" -ne "0" ]; then
945                                 beautify message FAIL
946                         fi
947                 fi
948         done
949         rm -f /tmp/ftplist
950         cd $PWD
951         exit 0
952         ;;
953 upload)
954         case "$2" in
955           iso)
956                 echo -e "Uploading the iso to $FTP_ISO_PATH/$SVN_REVISION."
957                 cat <<EOF > .ftp-commands
958 mkdir -p $FTP_ISO_PATH/$SVN_REVISION
959 ls -lah
960 quit
961 EOF
962                 ncftp -u $FTP_ISO_USER -p $FTP_ISO_PASS $FTP_ISO_URL < .ftp-commands
963                 rm -f .ftp-commands
964                 md5sum ipfire-$VERSION.$MACHINE-full.iso > ipfire-$VERSION.$MACHINE-full.iso.md5
965                 ncftpput -u $FTP_ISO_USER -p $FTP_ISO_PASS $FTP_ISO_URL $FTP_ISO_PATH$SVN_REVISION/ ipfire-$VERSION.$MACHINE-full.iso
966                 ncftpput -u $FTP_ISO_USER -p $FTP_ISO_PASS $FTP_ISO_URL $FTP_ISO_PATH$SVN_REVISION/ ipfire-$VERSION.$MACHINE-full.iso.md5
967                 if [ -e ipfire-$VERSION.$MACHINE-devel.iso ]; then
968                         md5sum ipfire-$VERSION.$MACHINE-devel.iso > ipfire-$VERSION.$MACHINE-devel.iso.md5
969                         ncftpput -u $FTP_ISO_USER -p $FTP_ISO_PASS $FTP_ISO_URL $FTP_ISO_PATH$SVN_REVISION/ ipfire-$VERSION.$MACHINE-devel.iso
970                         ncftpput -u $FTP_ISO_USER -p $FTP_ISO_PASS $FTP_ISO_URL $FTP_ISO_PATH$SVN_REVISION/ ipfire-$VERSION.$MACHINE-devel.iso.md5
971                 fi
972                 ncftpput -u $FTP_ISO_USER -p $FTP_ISO_PASS $FTP_ISO_URL $FTP_ISO_PATH$SVN_REVISION/ ipfire-source-r$SVN_REVISION.tar.gz
973                 ncftpput -u $FTP_ISO_USER -p $FTP_ISO_PASS $FTP_ISO_URL $FTP_ISO_PATH$SVN_REVISION/ svn_status
974                 if [ "$?" -eq "0" ]; then
975                         echo -e "The iso of Revision $SVN_REVISION was successfully uploaded to $FTP_ISO_URL$FTP_ISO_PATH$SVN_REVISION/."
976                 else
977                         echo -e "There was an error while uploading the iso to the ftp server."
978                         exit 1
979                 fi
980                 if [ "$3" = "--with-sources-cd" ]; then
981                         ncftpput -u $FTP_ISO_USER -p $FTP_ISO_PASS $FTP_ISO_URL $FTP_ISO_PATH/$SVN_REVISION/ ipfire-sources-cd-$VERSION.$MACHINE.iso
982                 fi
983                 ;;
984           paks)
985                 cat <<EOF > .ftp-commands
986 mkdir $IPFIRE_FTP_PATH_PAK
987 ls -lah
988 quit
989 EOF
990                 ncftp -u $IPFIRE_FTP_USER_PAK -p $IPFIRE_FTP_PASS_PAK $IPFIRE_FTP_URL_PAK < .ftp-commands
991                 rm -f .ftp-commands
992                 ncftpput -z -u $IPFIRE_FTP_USER_PAK -p $IPFIRE_FTP_PASS_PAK $IPFIRE_FTP_URL_PAK $IPFIRE_FTP_PATH_PAK/ packages/*
993                 if [ "$?" -eq "0" ]; then
994                         echo -e "The packages were successfully uploaded to $IPFIRE_FTP_URL_PAK$IPFIRE_FTP_PATH_PAK/."
995                 else
996                         echo -e "There was an error while uploading the packages to the ftp server."
997                         exit 1
998                 fi
999           ;;
1000         esac
1001         ;;
1002 batch)
1003         if [ "$2" = "--background" ]; then
1004                 batch_script
1005                 exit $?
1006         fi
1007         if [ `screen -ls | grep -q ipfire` ]; then
1008                 echo "Build is already running, sorry!"
1009                 exit 1
1010         else
1011                 if [ "$2" = "--rebuild" ]; then
1012                         export IPFIRE_REBUILD=1
1013                         echo "REBUILD!"
1014                 else
1015                         export IPFIRE_REBUILD=0
1016                 fi
1017                 echo -en "${BOLD}***IPFire-Batch-Build is starting...${NORMAL}"
1018                 screen -dmS ipfire $0 batch --background
1019                 evaluate 1
1020                 exit 0
1021         fi
1022         ;;
1023 watch)
1024         watch_screen
1025         ;;
1026 pxe)
1027         case "$2" in
1028           start)
1029                 start_tftpd
1030                 ;;
1031           stop)
1032                 stop_tftpd
1033                 ;;
1034           reload|restart)
1035                 reload_tftpd
1036                 ;;              
1037         esac
1038         exit 0
1039         ;;
1040 lang)
1041         update_langs
1042         ;;
1043 packages)
1044         case "$2" in
1045                 sign)
1046                         sign_packages
1047                         ;;
1048         esac
1049         ;;
1050 "")
1051         clear
1052         svn info
1053         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"
1054         do
1055         case $name in
1056         "IPFIRE: Downloadsrc")
1057                 $0 downloadsrc
1058                 ;;
1059         "IPFIRE: Build (silent)")
1060                 $0 build-silent
1061                 ;;
1062         "IPFIRE: Watch Build")
1063                 $0 watch
1064                 ;;
1065         "IPFIRE: Batch")
1066                 $0 batch
1067                 ;;
1068         "IPFIRE: Clean")
1069                 $0 clean
1070                 ;;
1071         "SVN: Update")
1072                 $0 svn update
1073                 ;;
1074         "Help")
1075                 echo "Usage: $0 {build|changelog|clean|gettoolchain|downloadsrc|shell|sync|toolchain}"
1076                 cat doc/make.sh-usage
1077                 ;;
1078         "LOG: Tail")
1079                 tail -f log/_*
1080                 ;;
1081         "Exit")
1082                 break
1083                 ;;
1084         esac
1085         done
1086         ;;
1087 config)
1088         make_config
1089         ;;
1090 *)
1091         echo "Usage: $0 {build|changelog|clean|gettoolchain|downloadsrc|shell|sync|toolchain}"
1092         cat doc/make.sh-usage
1093         ;;
1094 esac