Lan Driver Attansic/Atheros L1 Gigabit (ASUS Pundit)
[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 ip1000a                    SMP=1
332   ipfiremake dm9601                     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 ip1000a 
341   ipfiremake dm9601
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   
544 }
545
546 buildinstaller() {
547   # Run installer scripts one by one
548   LOGFILE="$BASEDIR/log/_build.installer.log"
549   export LOGFILE
550   ipfiremake syslinux
551   ipfiremake as86
552   ipfiremake mbr
553   ipfiremake memtest
554   installmake linux-libc-header
555   installmake binutils
556   ipfiremake uClibc                     PASS=1
557   ipfiremake gcc                        INST=1
558   installmake uClibc                    PASS=2
559   installmake gcc                       INST=2
560   installmake uClibc                    PASS=3
561   installmake busybox
562   installmake udev
563   installmake slang
564   installmake newt
565   installmake gettext
566   installmake kbd
567   installmake popt
568   installmake sysvinit
569   installmake misc-progs
570   installmake libaal
571   installmake reiser4progs
572   installmake reiserfsprogs
573   installmake sysfsutils
574   installmake util-linux
575   installmake pciutils
576   installmake zlib
577   installmake mtd
578   installmake wget
579   installmake hwdata
580   installmake kudzu
581   installmake pcmciautils
582   installmake installer
583   installmake initrd
584 }
585
586 buildpackages() {
587   LOGFILE="$BASEDIR/log/_build.packages.log"
588   export LOGFILE
589   echo "... see detailed log in _build.*.log files" >> $LOGFILE
590
591   installmake strip
592   
593   # Generating list of packages used
594   echo -n "Generating packages list from logs" | tee -a $LOGFILE
595   rm -f $BASEDIR/doc/packages-list
596   for i in `ls -1tr $BASEDIR/log/[^_]*`; do
597         if [ "$i" != "$BASEDIR/log/FILES" -a -n $i ]; then
598                 echo "* `basename $i`" >>$BASEDIR/doc/packages-list
599         fi
600   done
601   echo "== List of softwares used to build $NAME Version: $VERSION ==" > $BASEDIR/doc/packages-list.txt
602   grep -v 'configroot$\|img$\|initrd$\|initscripts$\|installer$\|install$\|setup$\|pakfire$\|stage2$\|smp$\|tools$\|tools1$\|tools2$\|.tgz$\|-config$\|_missing_rootfile$\|install1$\|install2$\|pass1$\|pass2$\|pass3$' \
603         $BASEDIR/doc/packages-list | sort >> $BASEDIR/doc/packages-list.txt
604   rm -f $BASEDIR/doc/packages-list
605   # packages-list.txt is ready to be displayed for wiki page
606   beautify message DONE
607
608   # Create images for install
609         ipfiremake cdrom ED=full
610         
611   # Check if there is a loop device for building in virtual environments
612   if [ -e /dev/loop/0 ] || [ -e /dev/loop0 ]; then
613         ipfiremake usb-stick
614   fi
615   mv $LFS/install/images/{*.iso,*.tgz,*.img.gz} $BASEDIR >> $LOGFILE 2>&1
616
617   ipfirepackages
618
619   # Cleanup
620   stdumount
621   rm -rf $BASEDIR/build/tmp/*
622
623   # Generating total list of files
624   echo -n "Generating files list from logs" | tee -a $LOGFILE
625   rm -f $BASEDIR/log/FILES
626   for i in `ls -1tr $BASEDIR/log/[^_]*`; do
627         if [ "$i" != "$BASEDIR/log/FILES" -a -n $i ]; then
628                 echo "##" >>$BASEDIR/log/FILES
629                 echo "## `basename $i`" >>$BASEDIR/log/FILES
630                 echo "##" >>$BASEDIR/log/FILES
631                 cat $i | sed "s%^\./%#%" | sort >> $BASEDIR/log/FILES
632         fi
633   done
634   beautify message DONE
635
636   cd $PWD
637 }
638
639 ipfirepackages() {
640         ipfiremake core-updates
641         for i in $(ls -1 $BASEDIR/config/rootfiles/packages); do
642                 if [ -e $BASEDIR/lfs/$i ]; then
643                         ipfiredist $i
644                 else
645                         echo -n $i
646                         beautify message SKIP
647                 fi
648         done
649   test -d $BASEDIR/packages || mkdir $BASEDIR/packages
650   mv -f $LFS/install/packages/* $BASEDIR/packages >> $LOGFILE 2>&1
651   rm -rf  $BASEDIR/build/install/packages/*
652 }
653
654 # See what we're supposed to do
655 case "$1" in 
656 build)
657         clear
658         BUILDMACHINE=`uname -m`
659         PACKAGE=`ls -v -r $BASEDIR/cache/toolchains/$SNAME-$VERSION-toolchain-$BUILDMACHINE.tar.gz 2> /dev/null | head -n 1`
660         #only restore on a clean disk
661         if [ ! -f log/cleanup-toolchain-2-tools ]; then
662                 if [ ! -n "$PACKAGE" ]; then
663                         beautify build_stage "Full toolchain compilation - Native GCC: `gcc --version | grep GCC | awk {'print $3'}`"
664                         prepareenv
665                         buildtoolchain
666                 else
667                         PACKAGENAME=${PACKAGE%.tar.gz}
668                         beautify build_stage "Packaged toolchain compilation"
669                         if [ `md5sum $PACKAGE | awk '{print $1}'` == `cat $PACKAGENAME.md5 | awk '{print $1}'` ]; then
670                                 tar zxf $PACKAGE
671                                 prepareenv
672                         else
673                                 exiterror "$PACKAGENAME md5 did not match, check downloaded package"
674                         fi
675                 fi
676         else
677                 echo -n "Using installed toolchain" | tee -a $LOGFILE
678                 beautify message SKIP
679                 prepareenv
680         fi
681
682         beautify build_start
683         beautify build_stage "Building LFS"
684         buildbase
685
686         beautify build_stage "Building IPFire"
687         buildipfire
688
689         # Setzen des IPFire Builds
690         if [ "$SVN_REVISION" ]; then
691                 echo "$SVN_REVISION" > $BASEDIR/build/var/ipfire/firebuild
692         else
693                 echo "_(OvO)_" > $BASEDIR/build/var/ipfire/firebuild
694         fi
695
696         beautify build_stage "Building installer"
697         buildinstaller
698
699         beautify build_stage "Building packages"
700         buildpackages
701         beautify build_end
702         ;;
703 shell)
704         # enter a shell inside LFS chroot
705         # may be used to changed kernel settings
706         prepareenv
707         entershell
708         ;;
709 changelog)
710         echo -n "Loading new Changelog from SVN: "
711         svn log http://svn.ipfire.org/svn/ipfire > doc/ChangeLog
712         beautify message DONE
713         ;;
714 clean)
715         echo -en "${BOLD}Cleaning build directory...${NORMAL}"
716         for i in `mount | grep $BASEDIR | sed 's/^.*loop=\(.*\))/\1/'`; do
717                 $LOSETUP -d $i 2>/dev/null
718         done
719         for i in `mount | grep $BASEDIR | cut -d " " -f 1`; do
720                 umount $i
721         done
722         stdumount
723         for i in `seq 0 7`; do
724             if ( losetup /dev/loop${i} 2>/dev/null | grep -q "/install/images" ); then
725                 umount /dev/loop${i}     2>/dev/null;
726                 losetup -d /dev/loop${i} 2>/dev/null;
727             fi;
728         done
729         rm -rf $BASEDIR/build
730         rm -rf $BASEDIR/cdrom
731         rm -rf $BASEDIR/packages
732         rm -rf $BASEDIR/log
733         if [ -h /tools ]; then
734                 rm -f /tools
735         fi
736         beautify message DONE
737         ;;
738 downloadsrc)
739         if [ ! -d $BASEDIR/cache ]; then
740                 mkdir $BASEDIR/cache
741         fi
742         mkdir -p $BASEDIR/log
743         echo -e "${BOLD}Preload all source files${NORMAL}" | tee -a $LOGFILE
744         FINISHED=0
745         cd $BASEDIR/lfs
746         for c in `seq $MAX_RETRIES`; do
747                 if (( FINISHED==1 )); then 
748                         break
749                 fi
750                 FINISHED=1
751                 cd $BASEDIR/lfs
752                 for i in *; do
753                         if [ -f "$i" -a "$i" != "Config" ]; then
754                                 echo -ne "Loading $i"
755                                 make -s -f $i LFS_BASEDIR=$BASEDIR MESSAGE="$i\t ($c/$MAX_RETRIES)" download >> $LOGFILE 2>&1
756                                 if [ $? -ne 0 ]; then
757                                         beautify message FAIL
758                                         FINISHED=0
759                                 else
760                                         if [ $c -eq 1 ]; then
761                                         beautify message DONE
762                                         fi
763                                 fi
764                         fi
765                 done
766         done
767         echo -e "${BOLD}***Verifying md5sums${NORMAL}"
768         ERROR=0
769         for i in *; do
770                 if [ -f "$i" -a "$i" != "Config" ]; then
771                         make -s -f $i LFS_BASEDIR=$BASEDIR MESSAGE="$i\t " md5 >> $LOGFILE 2>&1
772                         if [ $? -ne 0 ]; then
773                                 echo -ne "MD5 difference in lfs/$i"
774                                 beautify message FAIL
775                                 ERROR=1
776                         fi
777                 fi
778         done
779         if [ $ERROR -eq 0 ]; then
780                 echo -ne "${BOLD}all files md5sum match${NORMAL}"
781                 beautify message DONE
782         else
783                 echo -ne "${BOLD}not all files were correctly download${NORMAL}"
784                 beautify message FAIL
785         fi
786         cd - >/dev/null 2>&1
787         ;;
788 toolchain)
789         clear
790         prepareenv
791         beautify build_stage "Toolchain compilation - Native GCC: `gcc --version | grep GCC | awk {'print $3'}`"
792         buildtoolchain
793         BUILDMACHINE=`uname -m`
794         echo "`date -u '+%b %e %T'`: Create toolchain tar.gz for $BUILDMACHINE" | tee -a $LOGFILE
795         test -d $BASEDIR/cache/toolchains || mkdir $BASEDIR/cache/toolchains
796         cd $BASEDIR && tar -zc --exclude='log/_build.*.log' -f cache/toolchains/$SNAME-$VERSION-toolchain-$BUILDMACHINE.tar.gz \
797                 build/{bin,etc,usr/bin,usr/local} \
798                 build/tools/{bin,etc,*-linux-gnu,include,lib,libexec,sbin,share,var} \
799                 log >> $LOGFILE
800         md5sum cache/toolchains/$SNAME-$VERSION-toolchain-$BUILDMACHINE.tar.gz \
801                 > cache/toolchains/$SNAME-$VERSION-toolchain-$BUILDMACHINE.md5
802         stdumount
803         ;;
804 gettoolchain)
805         BUILDMACHINE=`uname -m`
806         # arbitrary name to be updated in case of new toolchain package upload
807         PACKAGE=$SNAME-$VERSION-toolchain-$BUILDMACHINE
808         if [ ! -f $BASEDIR/cache/toolchains/$PACKAGE.tar.gz ]; then
809                 URL_TOOLCHAIN=`grep URL_TOOLCHAIN lfs/Config | awk '{ print $3 }'`
810                 test -d $BASEDIR/cache/toolchains || mkdir $BASEDIR/cache/toolchains
811                 echo "`date -u '+%b %e %T'`: Load toolchain tar.gz for $BUILDMACHINE" | tee -a $LOGFILE
812                 cd $BASEDIR/cache/toolchains
813                 wget $URL_TOOLCHAIN/$PACKAGE.tar.gz $URL_TOOLCHAIN/$PACKAGE.md5 >& /dev/null
814                 if [ $? -ne 0 ]; then
815                         echo "`date -u '+%b %e %T'`: error downloading toolchain for $BUILDMACHINE machine" | tee -a $LOGFILE
816                 else
817                         if [ "`md5sum $PACKAGE.tar.gz | awk '{print $1}'`" = "`cat $PACKAGE.md5 | awk '{print $1}'`" ]; then
818                                 echo "`date -u '+%b %e %T'`: toolchain md5 ok" | tee -a $LOGFILE
819                         else
820                                 exiterror "$PACKAGE.md5 did not match, check downloaded package"
821                         fi
822                 fi
823         else
824                 echo "Toolchain is already downloaded. Exiting..."
825         fi
826         ;;
827 othersrc)
828         prepareenv
829         echo -ne "`date -u '+%b %e %T'`: Build sources iso for $MACHINE" | tee -a $LOGFILE
830         chroot $LFS /tools/bin/env -i   HOME=/root \
831         TERM=$TERM PS1='\u:\w\$ ' \
832         PATH=/usr/local/bin:/bin:/usr/bin:/sbin:/usr/sbin \
833         VERSION=$VERSION NAME="$NAME" SNAME="$SNAME" MACHINE=$MACHINE \
834         /bin/bash -x -c "cd /usr/src/lfs && make -f sources-iso LFS_BASEDIR=/usr/src install" >>$LOGFILE 2>&1
835         mv $LFS/install/images/ipfire-* $BASEDIR >> $LOGFILE 2>&1
836         if [ $? -eq "0" ]; then
837                 beautify message DONE
838         else
839                 beautify message FAIL
840         fi
841         stdumount
842         ;;
843 svn)
844         case "$2" in
845           update|up)
846                 # clear
847                 echo -ne "Loading the latest source files...\n"
848                 if [ $3 ]; then
849                         svn update -r $3 | tee -a $PWD/log/_build.svn.update.log
850                 else
851                         svn update | tee -a $PWD/log/_build.svn.update.log
852                 fi
853                 if [ $? -eq "0" ]; then
854                         beautify message DONE
855                 else
856                         beautify message FAIL
857                         exit 1
858                 fi
859                 echo -ne "Writing the svn-info to a file"
860                 svn info > $PWD/svn_status
861                 if [ $? -eq "0" ]; then
862                         beautify message DONE
863                 else
864                         beautify message FAIL
865                         exit 1
866                 fi
867                 chmod 755 $0
868                 exit 0
869           ;;
870           commit|ci)
871                 clear
872                 if [ -f /usr/bin/mcedit ]; then
873                         export EDITOR=/usr/bin/mcedit
874                 fi
875                 if [ -f /usr/bin/nano ]; then
876                         export EDITOR=/usr/bin/nano
877                 fi
878                 echo -ne "Selecting editor $EDITOR..."
879                 beautify message DONE
880                 if [ -e /sbin/yast ]; then
881                         if [ "`echo $SVN_REVISION | cut -c 3`" -eq "0" ]; then
882                                 $0 changelog
883                         fi
884                 fi
885                 update_langs
886                 svn commit
887                 $0 svn up
888                 if [ -n "$FTP_CACHE_URL" ]; then
889                         $0 uploadsrc
890                 fi
891           ;;
892           dist)
893                 if [ $3 ]; then
894                         SVN_REVISION=$3
895                 fi
896                 if [ -f ipfire-source-r$SVN_REVISION.tar.gz ]; then
897                         echo -ne "REV $SVN_REVISION: SKIPPED!\n"
898                         exit 0
899                 fi
900                 echo -en "REV $SVN_REVISION: Downloading..."
901                 svn export http://svn.ipfire.org/svn/ipfire/trunk ipfire-source/ --force > /dev/null
902                 svn log http://svn.ipfire.org/svn/ipfire/trunk -r 1:$SVN_REVISION > ipfire-source/Changelog
903                 #svn info http://svn.ipfire.org/svn/ipfire/trunk -r $SVN_REVISION > ipfire-source/svn_status
904                 evaluate 1
905
906                 echo -en "REV $SVN_REVISION: Compressing files..."
907                 if [ -e ipfire-source/trunk/make.sh ]; then
908                         chmod 755 ipfire-source/trunk/make.sh
909                 fi
910                 tar cfz ipfire-source-r$SVN_REVISION.tar.gz ipfire-source
911                 evaluate 1
912                 echo -en "REV $SVN_REVISION: Cleaning up..."
913                 rm ipfire-source/ -r
914                 evaluate 1
915           ;;
916           diff|di)
917           update_langs
918                 echo -ne "Make a local diff to last svn revision"
919                 svn diff > ipfire-diff-`date +'%Y-%m-%d-%H:%M'`-r`svn info | grep Revision | cut -c 11-`.diff
920                 evaluate 1
921                 echo "Diff was successfully saved to ipfire-diff-`date +'%Y-%m-%d-%H:%M'`-r`svn info | grep Revision | cut -c 11-`.diff"
922                 svn status
923           ;;
924         esac
925         ;;
926 uploadsrc)
927         PWD=`pwd`
928         cd $BASEDIR/cache/
929         echo -e "Uploading cache to ftp server:"
930         ncftpls -u $FTP_CACHE_USER -p $FTP_CACHE_PASS ftp://$FTP_CACHE_URL/$FTP_CACHE_PATH/ > /tmp/ftplist
931         for i in *; do
932                 if [ "$(basename $i)" == "toolchains" ]; then continue; fi
933                 grep -q $(basename $i) /tmp/ftplist
934                 if [ "$?" -ne "0" ]; then
935                         echo -ne "$(basename $i)"
936                         ncftpput -u $FTP_CACHE_USER -p $FTP_CACHE_PASS $FTP_CACHE_URL $FTP_CACHE_PATH/ $(basename $i)
937                         if [ "$?" -ne "0" ]; then
938                                 beautify message FAIL
939                         fi
940                 fi
941         done
942         rm -f /tmp/ftplist
943         cd $PWD
944         exit 0
945         ;;
946 upload)
947         FTP_ISO_PORT=`echo "$FTP_ISO_URL" | awk -F: '{ print $2 }'`
948         FTP_ISO_URL=`echo "$FTP_ISO_URL" | awk -F: '{ print $1 }'`
949         if [ -z $FTP_ISO_PORT ]; then
950             FTP_ISO_PORT=21
951         fi
952         cat <<EOF > .ftp-commands
953 mkdir -p $FTP_ISO_PATH$SVN_REVISION
954 mkdir -p $FTP_ISO_PATH$SVN_REVISION/paks
955 quit
956 EOF
957         ncftp -u $FTP_ISO_USER -p $FTP_ISO_PASS -P $FTP_ISO_PORT $FTP_ISO_URL < .ftp-commands
958         rm -f .ftp-commands
959                 
960         case "$2" in
961           iso)
962                 echo -e "Uploading the iso to $FTP_ISO_PATH/$SVN_REVISION."
963
964                 md5sum ipfire-$VERSION.$MACHINE-full.iso > ipfire-$VERSION.$MACHINE-full.iso.md5
965                 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
966                                 if [ -e "$i" ]; then
967                             ncftpput -u $FTP_ISO_USER -p $FTP_ISO_PASS -P $FTP_ISO_PORT $FTP_ISO_URL $FTP_ISO_PATH$SVN_REVISION/ $i
968                                         if [ "$?" -eq "0" ]; then
969                                                 echo "The file with name $i was successfully uploaded to $FTP_ISO_URL$FTP_ISO_PATH$SVN_REVISION/."
970                                         else
971                                                 echo "There was an error while uploading the file $i to the ftp server."
972                                                 exit 1
973                                         fi
974                                 fi
975                 done
976                 rm -f ipfire-$VERSION.$MACHINE-full.iso.md5
977                 if [ "$3" = "--with-sources-cd" ]; then
978                         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
979                 fi
980                 ;;
981           paks)
982                 ncftpput -u $FTP_ISO_USER -p $FTP_ISO_PASS -P $FTP_ISO_PORT $FTP_ISO_URL $FTP_ISO_PATH$SVN_REVISION/paks packages/*
983                 if [ "$?" -eq "0" ]; then
984                         echo -e "The packages were successfully uploaded to $FTP_ISO_URL$FTP_ISO_PATH$SVN_REVISION/."
985                 else
986                         echo -e "There was an error while uploading the packages to the ftp server."
987                         exit 1
988                 fi
989           ;;
990         esac
991         ;;
992 batch)
993         if [ "$2" = "--background" ]; then
994                 batch_script
995                 exit $?
996         fi
997         if [ `screen -ls | grep -q ipfire` ]; then
998                 echo "Build is already running, sorry!"
999                 exit 1
1000         else
1001                 if [ "$2" = "--rebuild" ]; then
1002                         export IPFIRE_REBUILD=1
1003                         echo "REBUILD!"
1004                 else
1005                         export IPFIRE_REBUILD=0
1006                 fi
1007                 echo -en "${BOLD}***IPFire-Batch-Build is starting...${NORMAL}"
1008                 screen -dmS ipfire $0 batch --background
1009                 evaluate 1
1010                 exit 0
1011         fi
1012         ;;
1013 watch)
1014         watch_screen
1015         ;;
1016 pxe)
1017         case "$2" in
1018           start)
1019                 start_tftpd
1020                 ;;
1021           stop)
1022                 stop_tftpd
1023                 ;;
1024           reload|restart)
1025                 reload_tftpd
1026                 ;;              
1027         esac
1028         exit 0
1029         ;;
1030 lang)
1031         update_langs
1032         ;;
1033 "")
1034         clear
1035         svn info
1036         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"
1037         do
1038         case $name in
1039         "IPFIRE: Downloadsrc")
1040                 $0 downloadsrc
1041                 ;;
1042         "IPFIRE: Build (silent)")
1043                 $0 build-silent
1044                 ;;
1045         "IPFIRE: Watch Build")
1046                 $0 watch
1047                 ;;
1048         "IPFIRE: Batch")
1049                 $0 batch
1050                 ;;
1051         "IPFIRE: Clean")
1052                 $0 clean
1053                 ;;
1054         "SVN: Update")
1055                 $0 svn update
1056                 ;;
1057         "Help")
1058                 echo "Usage: $0 {build|changelog|clean|gettoolchain|downloadsrc|shell|sync|toolchain}"
1059                 cat doc/make.sh-usage
1060                 ;;
1061         "LOG: Tail")
1062                 tail -f log/_*
1063                 ;;
1064         "Exit")
1065                 break
1066                 ;;
1067         esac
1068         done
1069         ;;
1070 config)
1071         make_config
1072         ;;
1073 *)
1074         echo "Usage: $0 {build|changelog|clean|gettoolchain|downloadsrc|shell|sync|toolchain}"
1075         cat doc/make.sh-usage
1076         ;;
1077 esac