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