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