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