d641bc0889f5cc481c5ec55219fb7075de671213
[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|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 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 GD-TextUtil
399   ipfiremake gnupg
400   ipfiremake hdparm
401   ipfiremake ibod
402   ipfiremake initscripts
403   ipfiremake whatmask
404   ipfiremake iptables
405   ipfiremake libupnp
406   ipfiremake ipp2p                      IPT=1
407   ipfiremake moblock
408   ipfiremake linux-igd
409   ipfiremake ipac-ng
410   ipfiremake ipaddr
411   ipfiremake iptstate
412   ipfiremake iputils
413   ipfiremake l7-protocols
414   ipfiremake isapnptools
415 #  ipfiremake isdn4k-utils # What about mISDN???
416   ipfiremake hwdata
417   ipfiremake kudzu
418   ipfiremake logrotate
419   ipfiremake logwatch
420   ipfiremake misc-progs
421   ipfiremake mtools
422   ipfiremake nano
423   ipfiremake nash
424   ipfiremake nasm
425   ipfiremake URI
426   ipfiremake HTML-Tagset
427   ipfiremake HTML-Parser
428   ipfiremake Compress-Zlib
429   ipfiremake Digest
430   ipfiremake Digest-SHA1
431   ipfiremake Digest-HMAC
432   ipfiremake libwww-perl
433   ipfiremake Net-DNS
434   ipfiremake Net-IPv4Addr
435   ipfiremake Net_SSLeay
436   ipfiremake IO-Stringy
437   ipfiremake Unix-Syslog
438   ipfiremake Mail-Tools
439   ipfiremake MIME-Tools
440   ipfiremake Net-Server
441   ipfiremake Convert-TNEF
442   ipfiremake Convert-UUlib
443   ipfiremake Archive-Tar
444   ipfiremake Archive-Zip
445   ipfiremake Text-Tabs+Wrap
446   ipfiremake Locale-Country
447   ipfiremake XML-Parser
448   ipfiremake glib
449   ipfiremake GeoIP
450   ipfiremake fwhits
451   ipfiremake noip_updater
452   ipfiremake ntp
453   ipfiremake oinkmaster
454   ipfiremake openssh
455   ipfiremake openswan
456   ipfiremake pptpclient
457   ipfiremake rrdtool
458   ipfiremake setserial
459   ipfiremake setup
460   ipfiremake snort
461   ipfiremake squid
462   ipfiremake squid-graph
463   ipfiremake squidguard
464   ipfiremake calamaris
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 bwm-ng
534   ipfiremake tripwire
535   ipfiremake sysstat
536 }
537
538 buildinstaller() {
539   # Run installer scripts one by one
540   LOGFILE="$BASEDIR/log/_build.installer.log"
541   export LOGFILE
542   ipfiremake syslinux
543   ipfiremake as86
544   ipfiremake mbr
545   ipfiremake memtest
546   installmake linux-libc-header
547   installmake binutils
548   ipfiremake uClibc                     PASS=1
549   ipfiremake gcc                        INST=1
550   installmake uClibc                    PASS=2
551   installmake gcc                       INST=2
552   installmake uClibc                    PASS=3
553   installmake busybox
554   installmake udev
555   installmake slang
556   installmake newt
557   installmake gettext
558   installmake kbd
559   installmake popt
560   installmake sysvinit
561   installmake misc-progs
562   installmake e2fsprogs
563   installmake libaal
564   installmake reiser4progs
565   installmake reiserfsprogs
566   installmake sysfsutils
567   installmake util-linux
568   installmake pciutils
569   installmake zlib
570   installmake wget
571   installmake hwdata
572   installmake kudzu
573   installmake installer
574   installmake initrd
575 }
576
577 buildpackages() {
578   LOGFILE="$BASEDIR/log/_build.packages.log"
579   export LOGFILE
580   echo "... see detailed log in _build.*.log files" >> $LOGFILE
581
582   installmake strip
583   
584   # Generating list of packages used
585   echo -n "Generating packages list from logs" | tee -a $LOGFILE
586   rm -f $BASEDIR/doc/packages-list
587   for i in `ls -1tr $BASEDIR/log/[^_]*`; do
588         if [ "$i" != "$BASEDIR/log/FILES" -a -n $i ]; then
589                 echo "* `basename $i`" >>$BASEDIR/doc/packages-list
590         fi
591   done
592   echo "== List of softwares used to build $NAME Version: $VERSION ==" > $BASEDIR/doc/packages-list.txt
593   grep -v 'configroot$\|img$\|initrd$\|initscripts$\|installer$\|install$\|setup$\|pakfire$\|stage2$\|smp$\|tools$\|tools1$\|tools2$\|.tgz$\|-config$\|_missing_rootfile$' \
594         $BASEDIR/doc/packages-list | sort >> $BASEDIR/doc/packages-list.txt
595   rm -f $BASEDIR/doc/packages-list
596   # packages-list.txt is ready to be displayed for wiki page
597   beautify message DONE
598
599   # Create images for install
600   if [ "$DEVEL" == "1" ]; then
601                 ipfiremake cdrom ED=devel
602         fi
603         ipfiremake cdrom ED=full
604         
605   # Check if there is a loop device for building in virtual environments
606   if [ -e /dev/loop0 ]; then
607         ipfiremake usb-stick
608   fi
609   ipfiremake pxe
610   mv $LFS/install/images/{*.iso,*.tgz,*.img.gz} $BASEDIR >> $LOGFILE 2>&1
611
612 #  ipfirepackages
613
614   # Cleanup
615   stdumount
616   rm -rf $BASEDIR/build/tmp/*
617
618   # Generating total list of files
619   echo "Generating files list from logs" | tee -a $LOGFILE
620   rm -f $BASEDIR/log/FILES
621   for i in `ls -1tr $BASEDIR/log/[^_]*`; do
622         if [ "$i" != "$BASEDIR/log/FILES" -a -n $i ]; then
623                 echo "##" >>$BASEDIR/log/FILES
624                 echo "## `basename $i`" >>$BASEDIR/log/FILES
625                 echo "##" >>$BASEDIR/log/FILES
626                 cat $i | sed "s%^\./%#%" | sort >> $BASEDIR/log/FILES
627         fi
628   done
629   cd $BASEDIR/packages; ls -w1 *.ipfire | awk -F ".ipfire" '{ print $1 }' > $BASEDIR/packages/packages_list.txt
630   echo -n "###EOF###" >> $BASEDIR/packages/packages_list.txt
631
632   cd $PWD
633 }
634
635 ipfirepackages() {
636   if [ -d "$BASEDIR/packages" ]; then
637           for i in `ls $BASEDIR/packages`; do
638                 touch $BASEDIR/build/install/packages/$i.empty
639           done
640   fi
641 #  ipfiredist amavisd
642   ipfiredist applejuice
643   ipfiredist asterisk
644   ipfiredist clamav
645   ipfiredist cups
646   ipfiredist cyrusimap
647   ipfiredist fetchmail
648   ipfiredist ffmpeg
649   ipfiredist gnump3d
650   ipfiredist iptraf
651   ipfiredist java
652   ipfiredist lame
653   ipfiredist libmad
654   ipfiredist libogg
655   ipfiredist libvorbis
656   ipfiredist mailx
657   ipfiredist mldonkey
658   ipfiredist mpeg2dec
659   ipfiredist nagios
660   ipfiredist nfs
661   ipfiredist nmap
662   ipfiredist ntop
663   ipfiredist portmap
664   ipfiredist postfix
665   ipfiredist procmail
666   ipfiredist samba
667   ipfiredist sox
668   ipfiredist spamassassin
669   ipfiredist subversion
670   ipfiredist videolan
671   ipfiredist webcyradm
672   ipfiredist xvid
673   ipfiredist yasuc
674   test -d $BASEDIR/packages || mkdir $BASEDIR/packages
675   mv -f $LFS/install/packages/*.{ipfire,md5} $BASEDIR/packages >> $LOGFILE 2>&1
676   rm -rf  $BASEDIR/build/install/packages/*
677 }
678
679 # See what we're supposed to do
680 case "$1" in 
681 build)
682         clear
683         BUILDMACHINE=`uname -m`
684         DEVEL=0
685         if [ "$2" == "--devel" ]; then
686           DEVEL=1
687         fi
688         PACKAGE=`ls -v -r $BASEDIR/cache/toolchains/$SNAME-$VERSION-toolchain-$BUILDMACHINE.tar.gz 2> /dev/null | head -n 1`
689         #only restore on a clean disk
690         if [ ! -f log/cleanup-toolchain-2-tools ]; then
691                 if [ ! -n "$PACKAGE" ]; then
692                         beautify build_stage "Full toolchain compilation - Native GCC: `gcc --version | grep GCC | awk {'print $3'}`"
693                         prepareenv
694                         buildtoolchain
695                 else
696                         PACKAGENAME=${PACKAGE%.tar.gz}
697                         beautify build_stage "Packaged toolchain compilation"
698                         if [ `md5sum $PACKAGE | awk '{print $1}'` == `cat $PACKAGENAME.md5 | awk '{print $1}'` ]; then
699                                 tar zxf $PACKAGE
700                                 prepareenv
701                         else
702                                 exiterror "$PACKAGENAME md5 did not match, check downloaded package"
703                         fi
704                 fi
705         else
706                 echo -n "Using installed toolchain" | tee -a $LOGFILE
707                 beautify message SKIP
708                 prepareenv
709         fi
710
711         beautify build_start
712         beautify build_stage "Building LFS"
713         buildbase
714
715         beautify build_stage "Building IPFire"
716         buildipfire
717
718         # Setzen des IPFire Builds
719         if [ "$FIREBUILD" ]; then
720                 echo "$FIREBUILD" > $BASEDIR/build/var/ipfire/firebuild
721         else
722                 echo "_(OvO)_" > $BASEDIR/build/var/ipfire/firebuild
723         fi
724
725         beautify build_stage "Building installer"
726         buildinstaller
727
728         beautify build_stage "Building packages"
729         buildpackages
730         beautify build_end
731         ;;
732 shell)
733         # enter a shell inside LFS chroot
734         # may be used to changed kernel settings
735         prepareenv
736         entershell
737         ;;
738 changelog)
739         echo -n "Loading new Changelog from SVN: "
740         svn log http://svn.ipfire.org/svn/ipfire > doc/ChangeLog
741         beautify message DONE
742         ;;
743 clean)
744         echo -en "${BOLD}Cleaning build directory...${NORMAL}"
745         for i in `mount | grep $BASEDIR | sed 's/^.*loop=\(.*\))/\1/'`; do
746                 $LOSETUP -d $i 2>/dev/null
747         done
748         for i in `mount | grep $BASEDIR | cut -d " " -f 1`; do
749                 umount $i
750         done
751         stdumount
752         for i in `seq 0 7`; do
753             if ( losetup /dev/loop${i} 2>/dev/null | grep -q "/install/images" ); then
754                 umount /dev/loop${i}     2>/dev/null;
755                 losetup -d /dev/loop${i} 2>/dev/null;
756             fi;
757         done
758         rm -rf $BASEDIR/build
759         rm -rf $BASEDIR/cdrom
760         rm -rf $BASEDIR/packages
761         rm -rf $BASEDIR/log
762         if [ -h /tools ]; then
763                 rm -f /tools
764         fi
765         beautify message DONE
766         ;;
767 downloadsrc)
768         if [ ! -d $BASEDIR/cache ]; then
769                 mkdir $BASEDIR/cache
770         fi
771         mkdir -p $BASEDIR/log
772         echo -e "${BOLD}Preload all source files${NORMAL}" | tee -a $LOGFILE
773         FINISHED=0
774         cd $BASEDIR/lfs
775         for c in `seq $MAX_RETRIES`; do
776                 if (( FINISHED==1 )); then 
777                         break
778                 fi
779                 FINISHED=1
780                 cd $BASEDIR/lfs
781                 for i in *; do
782                         if [ -f "$i" -a "$i" != "Config" ]; then
783                                 echo -ne "Loading $i"
784                                 make -s -f $i LFS_BASEDIR=$BASEDIR MESSAGE="$i\t ($c/$MAX_RETRIES)" download >> $LOGFILE 2>&1
785                                 if [ $? -ne 0 ]; then
786                                         beautify message FAIL
787                                         FINISHED=0
788                                 else
789                                         if [ $c -eq 1 ]; then
790                                         beautify message DONE
791                                         fi
792                                 fi
793                         fi
794                 done
795         done
796         echo -e "${BOLD}***Verifying md5sums${NORMAL}"
797         ERROR=0
798         for i in *; do
799                 if [ -f "$i" -a "$i" != "Config" ]; then
800                         make -s -f $i LFS_BASEDIR=$BASEDIR MESSAGE="$i\t " md5 >> $LOGFILE 2>&1
801                         if [ $? -ne 0 ]; then
802                                 echo -ne "MD5 difference in lfs/$i"
803                                 beautify message FAIL
804                                 ERROR=1
805                         fi
806                 fi
807         done
808         if [ $ERROR -eq 0 ]; then
809                 echo -ne "${BOLD}all files md5sum match${NORMAL}"
810                 beautify message DONE
811         else
812                 echo -ne "${BOLD}not all files were correctly download${NORMAL}"
813                 beautify message FAIL
814         fi
815         cd - >/dev/null 2>&1
816         ;;
817 toolchain)
818         clear
819         prepareenv
820         beautify build_stage "Toolchain compilation - Native GCC: `gcc --version | grep GCC | awk {'print $3'}`"
821         buildtoolchain
822         BUILDMACHINE=`uname -m`
823         echo "`date -u '+%b %e %T'`: Create toolchain tar.gz for $BUILDMACHINE" | tee -a $LOGFILE
824         test -d $BASEDIR/cache/toolchains || mkdir $BASEDIR/cache/toolchains
825         cd $BASEDIR && tar -zc --exclude='log/_build.*.log' -f cache/toolchains/$SNAME-$VERSION-toolchain-$BUILDMACHINE.tar.gz \
826                 build/{bin,etc,usr/bin,usr/local} \
827                 build/tools/{bin,etc,*-linux-gnu,include,lib,libexec,sbin,share,var} \
828                 log >> $LOGFILE
829         md5sum cache/toolchains/$SNAME-$VERSION-toolchain-$BUILDMACHINE.tar.gz \
830                 > cache/toolchains/$SNAME-$VERSION-toolchain-$BUILDMACHINE.md5
831         stdumount
832         ;;
833 gettoolchain)
834         BUILDMACHINE=`uname -m`
835         # arbitrary name to be updated in case of new toolchain package upload
836         PACKAGE=$SNAME-$VERSION-toolchain-$BUILDMACHINE
837         if [ ! -f $BASEDIR/cache/toolchains/$PACKAGE.tar.gz ]; then
838                 URL_TOOLCHAIN=`grep URL_TOOLCHAIN lfs/Config | awk '{ print $3 }'`
839                 test -d $BASEDIR/cache/toolchains || mkdir $BASEDIR/cache/toolchains
840                 echo "`date -u '+%b %e %T'`: Load toolchain tar.gz for $BUILDMACHINE" | tee -a $LOGFILE
841                 cd $BASEDIR/cache/toolchains
842                 wget $URL_TOOLCHAIN/$PACKAGE.tar.gz $URL_TOOLCHAIN/$PACKAGE.md5 >& /dev/null
843                 if [ $? -ne 0 ]; then
844                         echo "`date -u '+%b %e %T'`: error downloading toolchain for $BUILDMACHINE machine" | tee -a $LOGFILE
845                 else
846                         if [ "`md5sum $PACKAGE.tar.gz | awk '{print $1}'`" = "`cat $PACKAGE.md5 | awk '{print $1}'`" ]; then
847                                 echo "`date -u '+%b %e %T'`: toolchain md5 ok" | tee -a $LOGFILE
848                         else
849                                 exiterror "$PACKAGE.md5 did not match, check downloaded package"
850                         fi
851                 fi
852         else
853                 echo "Toolchain is already downloaded. Exiting..."
854         fi
855         ;;
856 othersrc)
857         prepareenv
858         echo -ne "`date -u '+%b %e %T'`: Build sources iso for $MACHINE" | tee -a $LOGFILE
859         chroot $LFS /tools/bin/env -i   HOME=/root \
860         TERM=$TERM PS1='\u:\w\$ ' \
861         PATH=/usr/local/bin:/bin:/usr/bin:/sbin:/usr/sbin \
862         VERSION=$VERSION NAME="$NAME" SNAME="$SNAME" MACHINE=$MACHINE \
863         /bin/bash -x -c "cd /usr/src/lfs && make -f sources-iso LFS_BASEDIR=/usr/src install" >>$LOGFILE 2>&1
864         mv $LFS/install/images/ipfire-* $BASEDIR >> $LOGFILE 2>&1
865         if [ $? -eq "0" ]; then
866                 beautify message DONE
867         else
868                 beautify message FAIL
869         fi
870         stdumount
871         ;;
872 svn)
873         case "$2" in
874           update|up)
875                 # clear
876                 echo -ne "Loading the latest source files...\n"
877                 if [ $3 ]; then
878                         svn update -r $3 | tee -a $PWD/log/_build.svn.update.log
879                 else
880                         svn update | tee -a $PWD/log/_build.svn.update.log
881                 fi
882                 if [ $? -eq "0" ]; then
883                         beautify message DONE
884                 else
885                         beautify message FAIL
886                         exit 1
887                 fi
888                 echo -ne "Writing the svn-info to a file"
889                 svn info > $PWD/svn_status
890                 if [ $? -eq "0" ]; then
891                         beautify message DONE
892                 else
893                         beautify message FAIL
894                         exit 1
895                 fi
896                 chmod 755 $0
897                 exit 0
898           ;;
899           commit|ci)
900                 clear
901                 if [ -f /usr/bin/mcedit ]; then
902                         export EDITOR=/usr/bin/mcedit
903                 fi
904                 if [ -f /usr/bin/nano ]; then
905                         export EDITOR=/usr/bin/nano
906                 fi
907                 echo -ne "Selecting editor $EDITOR..."
908                 beautify message DONE
909                 if [ -e /sbin/yast ]; then
910                         if [ "`echo $SVN_REVISION | cut -c 3`" -eq "0" ]; then
911                                 $0 changelog
912                         fi
913                 fi
914                 update_langs
915                 svn commit
916                 $0 svn up
917                 if [ -n "$FTP_CACHE_URL" ]; then
918                         $0 uploadsrc
919                 fi
920           ;;
921           dist)
922                 if [ $3 ]; then
923                         SVN_REVISION=$3
924                 fi
925                 if [ -f ipfire-source-r$SVN_REVISION.tar.gz ]; then
926                         echo -ne "REV $SVN_REVISION: SKIPPED!\n"
927                         exit 0
928                 fi
929                 echo -en "REV $SVN_REVISION: Downloading..."
930                 svn export http://svn.ipfire.org/svn/ipfire/trunk ipfire-source/ --force > /dev/null
931                 svn log http://svn.ipfire.org/svn/ipfire/trunk -r 1:$SVN_REVISION > ipfire-source/Changelog
932                 #svn info http://svn.ipfire.org/svn/ipfire/trunk -r $SVN_REVISION > ipfire-source/svn_status
933                 evaluate 1
934
935                 echo -en "REV $SVN_REVISION: Compressing files..."
936                 if [ -e ipfire-source/trunk/make.sh ]; then
937                         chmod 755 ipfire-source/trunk/make.sh
938                 fi
939                 tar cfz ipfire-source-r$SVN_REVISION.tar.gz ipfire-source
940                 evaluate 1
941                 echo -en "REV $SVN_REVISION: Cleaning up..."
942                 rm ipfire-source/ -r
943                 evaluate 1
944           ;;
945           diff|di)
946           update_langs
947                 echo -ne "Make a local diff to last svn revision"
948                 svn diff > ipfire-diff-`date +'%Y-%m-%d-%H:%M'`-r`svn info | grep Revision | cut -c 11-`.diff
949                 evaluate 1
950                 echo "Diff was successfully saved to ipfire-diff-`date +'%Y-%m-%d-%H:%M'`-r`svn info | grep Revision | cut -c 11-`.diff"
951                 svn status
952           ;;
953         esac
954         ;;
955 uploadsrc)
956         PWD=`pwd`
957         cd $BASEDIR/cache/
958         echo -e "Uploading cache to ftp server:"
959         ncftpls -u $FTP_CACHE_USER -p $FTP_CACHE_PASS ftp://$FTP_CACHE_URL$FTP_CACHE_PATH/ > /tmp/ftplist
960         for i in *; do
961                 if [ "$i" == "toolchains" ]; then continue; fi
962                 grep -q $i /tmp/ftplist
963                 if [ "$?" -ne "0" ]; then
964                         echo -ne "$i"
965                         ncftpput -u $FTP_CACHE_USER -p $FTP_CACHE_PASS $FTP_CACHE_URL $FTP_CACHE_PATH/ $i
966                         if [ "$?" -ne "0" ]; then
967                                 beautify message FAIL
968                         fi
969                 fi
970         done
971         rm -f /tmp/ftplist
972         cd $PWD
973         exit 0
974         ;;
975 upload)
976         case "$2" in
977           iso)
978                 echo -e "Uploading the iso to $FTP_ISO_PATH/$SVN_REVISION."
979                 cat <<EOF > .ftp-commands
980 mkdir -p $FTP_ISO_PATH/$SVN_REVISION
981 ls -lah
982 quit
983 EOF
984                 ncftp -u $FTP_ISO_USER -p $FTP_ISO_PASS $FTP_ISO_URL < .ftp-commands
985                 rm -f .ftp-commands
986                 md5sum ipfire-$VERSION.$MACHINE-full.iso > ipfire-$VERSION.$MACHINE-full.iso.md5
987                 ncftpput -u $FTP_ISO_USER -p $FTP_ISO_PASS $FTP_ISO_URL $FTP_ISO_PATH$SVN_REVISION/ ipfire-$VERSION.$MACHINE-full.iso
988                 ncftpput -u $FTP_ISO_USER -p $FTP_ISO_PASS $FTP_ISO_URL $FTP_ISO_PATH$SVN_REVISION/ ipfire-$VERSION.$MACHINE-full.iso.md5
989                 if [ -e ipfire-$VERSION.$MACHINE-devel.iso ]; then
990                         md5sum ipfire-$VERSION.$MACHINE-devel.iso > ipfire-$VERSION.$MACHINE-devel.iso.md5
991                         ncftpput -u $FTP_ISO_USER -p $FTP_ISO_PASS $FTP_ISO_URL $FTP_ISO_PATH$SVN_REVISION/ ipfire-$VERSION.$MACHINE-devel.iso
992                         ncftpput -u $FTP_ISO_USER -p $FTP_ISO_PASS $FTP_ISO_URL $FTP_ISO_PATH$SVN_REVISION/ ipfire-$VERSION.$MACHINE-devel.iso.md5
993                 fi
994                 ncftpput -u $FTP_ISO_USER -p $FTP_ISO_PASS $FTP_ISO_URL $FTP_ISO_PATH$SVN_REVISION/ ipfire-source-r$SVN_REVISION.tar.gz
995                 ncftpput -u $FTP_ISO_USER -p $FTP_ISO_PASS $FTP_ISO_URL $FTP_ISO_PATH$SVN_REVISION/ svn_status
996                 if [ "$?" -eq "0" ]; then
997                         echo -e "The iso of Revision $SVN_REVISION was successfully uploaded to $FTP_ISO_URL$FTP_ISO_PATH$SVN_REVISION/."
998                 else
999                         echo -e "There was an error while uploading the iso to the ftp server."
1000                         exit 1
1001                 fi
1002                 if [ "$3" = "--with-sources-cd" ]; then
1003                         ncftpput -u $FTP_ISO_USER -p $FTP_ISO_PASS $FTP_ISO_URL $FTP_ISO_PATH/$SVN_REVISION/ ipfire-sources-cd-$VERSION.$MACHINE.iso
1004                 fi
1005                 ;;
1006           paks)
1007                 cat <<EOF > .ftp-commands
1008 mkdir $IPFIRE_FTP_PATH_PAK
1009 ls -lah
1010 quit
1011 EOF
1012                 ncftp -u $IPFIRE_FTP_USER_PAK -p $IPFIRE_FTP_PASS_PAK $IPFIRE_FTP_URL_PAK < .ftp-commands
1013                 rm -f .ftp-commands
1014                 ncftpput -z -u $IPFIRE_FTP_USER_PAK -p $IPFIRE_FTP_PASS_PAK $IPFIRE_FTP_URL_PAK $IPFIRE_FTP_PATH_PAK/ packages/*
1015                 if [ "$?" -eq "0" ]; then
1016                         echo -e "The packages were successfully uploaded to $IPFIRE_FTP_URL_PAK$IPFIRE_FTP_PATH_PAK/."
1017                 else
1018                         echo -e "There was an error while uploading the packages to the ftp server."
1019                         exit 1
1020                 fi
1021           ;;
1022         esac
1023         ;;
1024 batch)
1025         if [ "$2" = "--background" ]; then
1026                 batch_script
1027                 exit $?
1028         fi
1029         if [ `screen -ls | grep -q ipfire` ]; then
1030                 echo "Build is already running, sorry!"
1031                 exit 1
1032         else
1033                 if [ "$2" = "--rebuild" ]; then
1034                         export IPFIRE_REBUILD=1
1035                         echo "REBUILD!"
1036                 else
1037                         export IPFIRE_REBUILD=0
1038                 fi
1039                 echo -en "${BOLD}***IPFire-Batch-Build is starting...${NORMAL}"
1040                 screen -dmS ipfire $0 batch --background
1041                 evaluate 1
1042                 exit 0
1043         fi
1044         ;;
1045 watch)
1046         watch_screen
1047         ;;
1048 pxe)
1049         case "$2" in
1050           start)
1051                 start_tftpd
1052                 ;;
1053           stop)
1054                 stop_tftpd
1055                 ;;
1056           reload|restart)
1057                 reload_tftpd
1058                 ;;              
1059         esac
1060         exit 0
1061         ;;
1062 lang)
1063         update_langs
1064         ;;
1065 "")
1066         clear
1067         svn info
1068         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"
1069         do
1070         case $name in
1071         "IPFIRE: Downloadsrc")
1072                 $0 downloadsrc
1073                 ;;
1074         "IPFIRE: Build (silent)")
1075                 $0 build-silent
1076                 ;;
1077         "IPFIRE: Watch Build")
1078                 $0 watch
1079                 ;;
1080         "IPFIRE: Batch")
1081                 $0 batch
1082                 ;;
1083         "IPFIRE: Clean")
1084                 $0 clean
1085                 ;;
1086         "SVN: Update")
1087                 $0 svn update
1088                 ;;
1089         "Help")
1090                 echo "Usage: $0 {build|changelog|clean|gettoolchain|downloadsrc|shell|sync|toolchain}"
1091                 cat doc/make.sh-usage
1092                 ;;
1093         "LOG: Tail")
1094                 tail -f log/_*
1095                 ;;
1096         "Exit")
1097                 break
1098                 ;;
1099         esac
1100         done
1101         ;;
1102 config)
1103         make_config
1104         ;;
1105 *)
1106         echo "Usage: $0 {build|changelog|clean|gettoolchain|downloadsrc|shell|sync|toolchain}"
1107         cat doc/make.sh-usage
1108         ;;
1109 esac