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