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