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