Ended core 5 and started core 6
[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) 2007 IPFire-Team <info@ipfire.org>.                        #
21 #                                                                          #
22 ############################################################################
23 #
24
25 NAME="IPFire"                                                                           # Software name
26 SNAME="ipfire"                                                                  # Short name
27 VERSION="2.1"                                                                           # Version number
28 SLOGAN="www.ipfire.org"                                 # Software slogan
29 CONFIG_ROOT=/var/ipfire                                 # Configuration rootdir
30 NICE=10                                                                                                 # Nice level
31 MAX_RETRIES=1                                                                           # prefetch/check loop
32 KVER=`grep --max-count=1 VER lfs/linux | awk '{ print $3 }'`
33 MACHINE=`uname -m`
34 SVN_REVISION=`svn info | grep Revision | cut -c 11-`
35
36 IPFVER="full"                           # Which versions should be compiled? (full|devel)
37
38 # 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 backup
322   ipfiremake dhcp
323   ipfiremake dhcpcd
324   ipfiremake libusb
325   ipfiremake libpcap
326   ipfiremake ppp
327   ipfiremake rp-pppoe
328   ipfiremake unzip
329   ipfiremake linux                      SMP=1
330   ipfiremake ipp2p                      SMP=1
331   ipfiremake zaptel                     SMP=1
332   ipfiremake linux
333   ipfiremake ipp2p
334   ipfiremake zaptel
335   ipfiremake pkg-config
336   ipfiremake linux-atm
337   ipfiremake cpio
338   ipfiremake klibc
339   ipfiremake mkinitcpio
340   ipfiremake udev                               KLIBC=1
341   ipfiremake expat
342   ipfiremake gdbm
343   ipfiremake gmp
344   ipfiremake pam
345   ipfiremake openssl
346   ipfiremake curl
347   ipfiremake python
348   ipfiremake libnet
349   ipfiremake libidn
350   ipfiremake libjpeg
351   ipfiremake libpng
352   ipfiremake libtiff
353   ipfiremake libart
354   ipfiremake freetype
355   ipfiremake gd
356   ipfiremake popt
357   ipfiremake pcre
358   ipfiremake slang
359   ipfiremake newt
360   ipfiremake libcap
361   ipfiremake pciutils
362   ipfiremake usbutils
363   ipfiremake libxml2
364   ipfiremake libxslt
365   ipfiremake BerkeleyDB
366   ipfiremake mysql
367   ipfiremake cyrus-sasl
368   ipfiremake openldap
369   ipfiremake apache2
370   ipfiremake php
371   ipfiremake apache2                    PASS=C
372   ipfiremake arping
373   ipfiremake beep
374   ipfiremake bind
375   ipfiremake cdrtools
376   ipfiremake dnsmasq
377   ipfiremake dosfstools
378   ipfiremake squashfstools
379   ipfiremake reiserfsprogs
380   ipfiremake sysfsutils
381   ipfiremake fuse
382   ipfiremake ntfs-3g
383   ipfiremake ethtool
384   ipfiremake ez-ipupdate
385   ipfiremake fcron
386   ipfiremake perl-GD
387   ipfiremake GD-Graph
388   ipfiremake GD-TextUtil
389   ipfiremake gnupg
390   ipfiremake hdparm
391   ipfiremake sdparm
392   ipfiremake mtools
393   ipfiremake initscripts
394   ipfiremake whatmask
395   ipfiremake iptables
396   ipfiremake libupnp
397   ipfiremake ipp2p                      IPT=1
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 hplip
466   ipfiremake samba
467   ipfiremake sudo
468   ipfiremake mc
469   ipfiremake wget
470   ipfiremake bridge-utils
471   ipfiremake screen
472   ipfiremake hddtemp
473   ipfiremake smartmontools
474   ipfiremake htop
475   ipfiremake postfix
476   ipfiremake fetchmail
477   ipfiremake cyrus-imapd
478   ipfiremake openmailadmin
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 videolan
500   ipfiremake libpri
501   ipfiremake asterisk
502   ipfiremake gnump3d
503   ipfiremake libsigc++
504   ipfiremake applejuice
505   ipfiremake ocaml
506   ipfiremake mldonkey
507   ipfiremake libtorrent
508   ipfiremake rtorrent
509   ipfiremake ipfireseeder
510   ipfiremake rsync
511   ipfiremake tcpwrapper
512   ipfiremake portmap
513   ipfiremake nfs
514   ipfiremake nmap
515   ipfiremake mbmon
516   ipfiremake ncftp
517   ipfiremake etherwake
518   ipfiremake bwm-ng
519   ipfiremake tripwire
520   ipfiremake sysstat
521   ipfiremake vsftpd
522   ipfiremake which
523   ipfiremake lsof
524   ipfiremake centerim
525   ipfiremake br2684ctl
526 }
527
528 buildinstaller() {
529   # Run installer scripts one by one
530   LOGFILE="$BASEDIR/log/_build.installer.log"
531   export LOGFILE
532   ipfiremake syslinux
533   ipfiremake as86
534   ipfiremake mbr
535   ipfiremake memtest
536   installmake linux-libc-header
537   installmake binutils
538   ipfiremake uClibc                     PASS=1
539   ipfiremake gcc                        INST=1
540   installmake uClibc                    PASS=2
541   installmake gcc                       INST=2
542   installmake uClibc                    PASS=3
543   installmake busybox
544   installmake udev
545   installmake slang
546   installmake newt
547   installmake gettext
548   installmake kbd
549   installmake popt
550   installmake sysvinit
551   installmake misc-progs
552   installmake libaal
553   installmake reiser4progs
554   installmake reiserfsprogs
555   installmake sysfsutils
556   installmake util-linux
557   installmake pciutils
558   installmake zlib
559   installmake mtd
560   installmake wget
561   installmake hwdata
562   installmake kudzu
563   installmake installer
564   installmake initrd
565 }
566
567 buildpackages() {
568   LOGFILE="$BASEDIR/log/_build.packages.log"
569   export LOGFILE
570   echo "... see detailed log in _build.*.log files" >> $LOGFILE
571
572   installmake strip
573   
574   # Generating list of packages used
575   echo -n "Generating packages list from logs" | tee -a $LOGFILE
576   rm -f $BASEDIR/doc/packages-list
577   for i in `ls -1tr $BASEDIR/log/[^_]*`; do
578         if [ "$i" != "$BASEDIR/log/FILES" -a -n $i ]; then
579                 echo "* `basename $i`" >>$BASEDIR/doc/packages-list
580         fi
581   done
582   echo "== List of softwares used to build $NAME Version: $VERSION ==" > $BASEDIR/doc/packages-list.txt
583   grep -v 'configroot$\|img$\|initrd$\|initscripts$\|installer$\|install$\|setup$\|pakfire$\|stage2$\|smp$\|tools$\|tools1$\|tools2$\|.tgz$\|-config$\|_missing_rootfile$\|install1$\|install2$\|pass1$\|pass2$\|pass3$' \
584         $BASEDIR/doc/packages-list | sort >> $BASEDIR/doc/packages-list.txt
585   rm -f $BASEDIR/doc/packages-list
586   # packages-list.txt is ready to be displayed for wiki page
587   beautify message DONE
588
589   # Create images for install
590         ipfiremake cdrom ED=full
591         
592   # Check if there is a loop device for building in virtual environments
593   if [ -e /dev/loop/0 ] || [ -e /dev/loop0 ]; then
594         ipfiremake usb-stick
595   fi
596   mv $LFS/install/images/{*.iso,*.tgz,*.img.gz} $BASEDIR >> $LOGFILE 2>&1
597
598   ipfirepackages
599
600   # Cleanup
601   stdumount
602   rm -rf $BASEDIR/build/tmp/*
603
604   # Generating total list of files
605   echo -n "Generating files list from logs" | tee -a $LOGFILE
606   rm -f $BASEDIR/log/FILES
607   for i in `ls -1tr $BASEDIR/log/[^_]*`; do
608         if [ "$i" != "$BASEDIR/log/FILES" -a -n $i ]; then
609                 echo "##" >>$BASEDIR/log/FILES
610                 echo "## `basename $i`" >>$BASEDIR/log/FILES
611                 echo "##" >>$BASEDIR/log/FILES
612                 cat $i | sed "s%^\./%#%" | sort >> $BASEDIR/log/FILES
613         fi
614   done
615   beautify message DONE
616
617   cd $PWD
618 }
619
620 ipfirepackages() {
621         ipfiremake core-updates
622         for i in $(ls -1 $BASEDIR/config/rootfiles/packages); do
623                 if [ -e $BASEDIR/lfs/$i ]; then
624                         ipfiredist $i
625                 else
626                         echo -n $i
627                         beautify message SKIP
628                 fi
629         done
630   test -d $BASEDIR/packages || mkdir $BASEDIR/packages
631   mv -f $LFS/install/packages/* $BASEDIR/packages >> $LOGFILE 2>&1
632   rm -rf  $BASEDIR/build/install/packages/*
633 }
634
635 # See what we're supposed to do
636 case "$1" in 
637 build)
638         clear
639         BUILDMACHINE=`uname -m`
640         PACKAGE=`ls -v -r $BASEDIR/cache/toolchains/$SNAME-$VERSION-toolchain-$BUILDMACHINE.tar.gz 2> /dev/null | head -n 1`
641         #only restore on a clean disk
642         if [ ! -f log/cleanup-toolchain-2-tools ]; then
643                 if [ ! -n "$PACKAGE" ]; then
644                         beautify build_stage "Full toolchain compilation - Native GCC: `gcc --version | grep GCC | awk {'print $3'}`"
645                         prepareenv
646                         buildtoolchain
647                 else
648                         PACKAGENAME=${PACKAGE%.tar.gz}
649                         beautify build_stage "Packaged toolchain compilation"
650                         if [ `md5sum $PACKAGE | awk '{print $1}'` == `cat $PACKAGENAME.md5 | awk '{print $1}'` ]; then
651                                 tar zxf $PACKAGE
652                                 prepareenv
653                         else
654                                 exiterror "$PACKAGENAME md5 did not match, check downloaded package"
655                         fi
656                 fi
657         else
658                 echo -n "Using installed toolchain" | tee -a $LOGFILE
659                 beautify message SKIP
660                 prepareenv
661         fi
662
663         beautify build_start
664         beautify build_stage "Building LFS"
665         buildbase
666
667         beautify build_stage "Building IPFire"
668         buildipfire
669
670         # Setzen des IPFire Builds
671         if [ "$FIREBUILD" ]; then
672                 echo "$FIREBUILD" > $BASEDIR/build/var/ipfire/firebuild
673         else
674                 echo "_(OvO)_" > $BASEDIR/build/var/ipfire/firebuild
675         fi
676
677         beautify build_stage "Building installer"
678         buildinstaller
679
680         beautify build_stage "Building packages"
681         buildpackages
682         beautify build_end
683         ;;
684 shell)
685         # enter a shell inside LFS chroot
686         # may be used to changed kernel settings
687         prepareenv
688         entershell
689         ;;
690 changelog)
691         echo -n "Loading new Changelog from SVN: "
692         svn log http://svn.ipfire.org/svn/ipfire > doc/ChangeLog
693         beautify message DONE
694         ;;
695 clean)
696         echo -en "${BOLD}Cleaning build directory...${NORMAL}"
697         for i in `mount | grep $BASEDIR | sed 's/^.*loop=\(.*\))/\1/'`; do
698                 $LOSETUP -d $i 2>/dev/null
699         done
700         for i in `mount | grep $BASEDIR | cut -d " " -f 1`; do
701                 umount $i
702         done
703         stdumount
704         for i in `seq 0 7`; do
705             if ( losetup /dev/loop${i} 2>/dev/null | grep -q "/install/images" ); then
706                 umount /dev/loop${i}     2>/dev/null;
707                 losetup -d /dev/loop${i} 2>/dev/null;
708             fi;
709         done
710         rm -rf $BASEDIR/build
711         rm -rf $BASEDIR/cdrom
712         rm -rf $BASEDIR/packages
713         rm -rf $BASEDIR/log
714         if [ -h /tools ]; then
715                 rm -f /tools
716         fi
717         beautify message DONE
718         ;;
719 downloadsrc)
720         if [ ! -d $BASEDIR/cache ]; then
721                 mkdir $BASEDIR/cache
722         fi
723         mkdir -p $BASEDIR/log
724         echo -e "${BOLD}Preload all source files${NORMAL}" | tee -a $LOGFILE
725         FINISHED=0
726         cd $BASEDIR/lfs
727         for c in `seq $MAX_RETRIES`; do
728                 if (( FINISHED==1 )); then 
729                         break
730                 fi
731                 FINISHED=1
732                 cd $BASEDIR/lfs
733                 for i in *; do
734                         if [ -f "$i" -a "$i" != "Config" ]; then
735                                 echo -ne "Loading $i"
736                                 make -s -f $i LFS_BASEDIR=$BASEDIR MESSAGE="$i\t ($c/$MAX_RETRIES)" download >> $LOGFILE 2>&1
737                                 if [ $? -ne 0 ]; then
738                                         beautify message FAIL
739                                         FINISHED=0
740                                 else
741                                         if [ $c -eq 1 ]; then
742                                         beautify message DONE
743                                         fi
744                                 fi
745                         fi
746                 done
747         done
748         echo -e "${BOLD}***Verifying md5sums${NORMAL}"
749         ERROR=0
750         for i in *; do
751                 if [ -f "$i" -a "$i" != "Config" ]; then
752                         make -s -f $i LFS_BASEDIR=$BASEDIR MESSAGE="$i\t " md5 >> $LOGFILE 2>&1
753                         if [ $? -ne 0 ]; then
754                                 echo -ne "MD5 difference in lfs/$i"
755                                 beautify message FAIL
756                                 ERROR=1
757                         fi
758                 fi
759         done
760         if [ $ERROR -eq 0 ]; then
761                 echo -ne "${BOLD}all files md5sum match${NORMAL}"
762                 beautify message DONE
763         else
764                 echo -ne "${BOLD}not all files were correctly download${NORMAL}"
765                 beautify message FAIL
766         fi
767         cd - >/dev/null 2>&1
768         ;;
769 toolchain)
770         clear
771         prepareenv
772         beautify build_stage "Toolchain compilation - Native GCC: `gcc --version | grep GCC | awk {'print $3'}`"
773         buildtoolchain
774         BUILDMACHINE=`uname -m`
775         echo "`date -u '+%b %e %T'`: Create toolchain tar.gz for $BUILDMACHINE" | tee -a $LOGFILE
776         test -d $BASEDIR/cache/toolchains || mkdir $BASEDIR/cache/toolchains
777         cd $BASEDIR && tar -zc --exclude='log/_build.*.log' -f cache/toolchains/$SNAME-$VERSION-toolchain-$BUILDMACHINE.tar.gz \
778                 build/{bin,etc,usr/bin,usr/local} \
779                 build/tools/{bin,etc,*-linux-gnu,include,lib,libexec,sbin,share,var} \
780                 log >> $LOGFILE
781         md5sum cache/toolchains/$SNAME-$VERSION-toolchain-$BUILDMACHINE.tar.gz \
782                 > cache/toolchains/$SNAME-$VERSION-toolchain-$BUILDMACHINE.md5
783         stdumount
784         ;;
785 gettoolchain)
786         BUILDMACHINE=`uname -m`
787         # arbitrary name to be updated in case of new toolchain package upload
788         PACKAGE=$SNAME-$VERSION-toolchain-$BUILDMACHINE
789         if [ ! -f $BASEDIR/cache/toolchains/$PACKAGE.tar.gz ]; then
790                 URL_TOOLCHAIN=`grep URL_TOOLCHAIN lfs/Config | awk '{ print $3 }'`
791                 test -d $BASEDIR/cache/toolchains || mkdir $BASEDIR/cache/toolchains
792                 echo "`date -u '+%b %e %T'`: Load toolchain tar.gz for $BUILDMACHINE" | tee -a $LOGFILE
793                 cd $BASEDIR/cache/toolchains
794                 wget $URL_TOOLCHAIN/$PACKAGE.tar.gz $URL_TOOLCHAIN/$PACKAGE.md5 >& /dev/null
795                 if [ $? -ne 0 ]; then
796                         echo "`date -u '+%b %e %T'`: error downloading toolchain for $BUILDMACHINE machine" | tee -a $LOGFILE
797                 else
798                         if [ "`md5sum $PACKAGE.tar.gz | awk '{print $1}'`" = "`cat $PACKAGE.md5 | awk '{print $1}'`" ]; then
799                                 echo "`date -u '+%b %e %T'`: toolchain md5 ok" | tee -a $LOGFILE
800                         else
801                                 exiterror "$PACKAGE.md5 did not match, check downloaded package"
802                         fi
803                 fi
804         else
805                 echo "Toolchain is already downloaded. Exiting..."
806         fi
807         ;;
808 othersrc)
809         prepareenv
810         echo -ne "`date -u '+%b %e %T'`: Build sources iso for $MACHINE" | tee -a $LOGFILE
811         chroot $LFS /tools/bin/env -i   HOME=/root \
812         TERM=$TERM PS1='\u:\w\$ ' \
813         PATH=/usr/local/bin:/bin:/usr/bin:/sbin:/usr/sbin \
814         VERSION=$VERSION NAME="$NAME" SNAME="$SNAME" MACHINE=$MACHINE \
815         /bin/bash -x -c "cd /usr/src/lfs && make -f sources-iso LFS_BASEDIR=/usr/src install" >>$LOGFILE 2>&1
816         mv $LFS/install/images/ipfire-* $BASEDIR >> $LOGFILE 2>&1
817         if [ $? -eq "0" ]; then
818                 beautify message DONE
819         else
820                 beautify message FAIL
821         fi
822         stdumount
823         ;;
824 svn)
825         case "$2" in
826           update|up)
827                 # clear
828                 echo -ne "Loading the latest source files...\n"
829                 if [ $3 ]; then
830                         svn update -r $3 | tee -a $PWD/log/_build.svn.update.log
831                 else
832                         svn update | tee -a $PWD/log/_build.svn.update.log
833                 fi
834                 if [ $? -eq "0" ]; then
835                         beautify message DONE
836                 else
837                         beautify message FAIL
838                         exit 1
839                 fi
840                 echo -ne "Writing the svn-info to a file"
841                 svn info > $PWD/svn_status
842                 if [ $? -eq "0" ]; then
843                         beautify message DONE
844                 else
845                         beautify message FAIL
846                         exit 1
847                 fi
848                 chmod 755 $0
849                 exit 0
850           ;;
851           commit|ci)
852                 clear
853                 if [ -f /usr/bin/mcedit ]; then
854                         export EDITOR=/usr/bin/mcedit
855                 fi
856                 if [ -f /usr/bin/nano ]; then
857                         export EDITOR=/usr/bin/nano
858                 fi
859                 echo -ne "Selecting editor $EDITOR..."
860                 beautify message DONE
861                 if [ -e /sbin/yast ]; then
862                         if [ "`echo $SVN_REVISION | cut -c 3`" -eq "0" ]; then
863                                 $0 changelog
864                         fi
865                 fi
866                 update_langs
867                 svn commit
868                 $0 svn up
869                 if [ -n "$FTP_CACHE_URL" ]; then
870                         $0 uploadsrc
871                 fi
872           ;;
873           dist)
874                 if [ $3 ]; then
875                         SVN_REVISION=$3
876                 fi
877                 if [ -f ipfire-source-r$SVN_REVISION.tar.gz ]; then
878                         echo -ne "REV $SVN_REVISION: SKIPPED!\n"
879                         exit 0
880                 fi
881                 echo -en "REV $SVN_REVISION: Downloading..."
882                 svn export http://svn.ipfire.org/svn/ipfire/trunk ipfire-source/ --force > /dev/null
883                 svn log http://svn.ipfire.org/svn/ipfire/trunk -r 1:$SVN_REVISION > ipfire-source/Changelog
884                 #svn info http://svn.ipfire.org/svn/ipfire/trunk -r $SVN_REVISION > ipfire-source/svn_status
885                 evaluate 1
886
887                 echo -en "REV $SVN_REVISION: Compressing files..."
888                 if [ -e ipfire-source/trunk/make.sh ]; then
889                         chmod 755 ipfire-source/trunk/make.sh
890                 fi
891                 tar cfz ipfire-source-r$SVN_REVISION.tar.gz ipfire-source
892                 evaluate 1
893                 echo -en "REV $SVN_REVISION: Cleaning up..."
894                 rm ipfire-source/ -r
895                 evaluate 1
896           ;;
897           diff|di)
898           update_langs
899                 echo -ne "Make a local diff to last svn revision"
900                 svn diff > ipfire-diff-`date +'%Y-%m-%d-%H:%M'`-r`svn info | grep Revision | cut -c 11-`.diff
901                 evaluate 1
902                 echo "Diff was successfully saved to ipfire-diff-`date +'%Y-%m-%d-%H:%M'`-r`svn info | grep Revision | cut -c 11-`.diff"
903                 svn status
904           ;;
905         esac
906         ;;
907 uploadsrc)
908         PWD=`pwd`
909         cd $BASEDIR/cache/
910         echo -e "Uploading cache to ftp server:"
911         ncftpls -u $FTP_CACHE_USER -p $FTP_CACHE_PASS ftp://$FTP_CACHE_URL/$FTP_CACHE_PATH/ > /tmp/ftplist
912         for i in *; do
913                 if [ "$(basename $i)" == "toolchains" ]; then continue; fi
914                 grep -q $(basename $i) /tmp/ftplist
915                 if [ "$?" -ne "0" ]; then
916                         echo -ne "$(basename $i)"
917                         ncftpput -u $FTP_CACHE_USER -p $FTP_CACHE_PASS $FTP_CACHE_URL $FTP_CACHE_PATH/ $(basename $i)
918                         if [ "$?" -ne "0" ]; then
919                                 beautify message FAIL
920                         fi
921                 fi
922         done
923         rm -f /tmp/ftplist
924         cd $PWD
925         exit 0
926         ;;
927 upload)
928         FTP_ISO_PORT=`echo "$FTP_ISO_URL" | awk -F: '{ print $2 }'`
929         FTP_ISO_URL=`echo "$FTP_ISO_URL" | awk -F: '{ print $1 }'`
930         if [ -z $FTP_ISO_PORT ]; then
931             FTP_ISO_PORT=21
932         fi
933         cat <<EOF > .ftp-commands
934 mkdir -p $FTP_ISO_PATH$SVN_REVISION
935 mkdir -p $FTP_ISO_PATH$SVN_REVISION/paks
936 quit
937 EOF
938         ncftp -u $FTP_ISO_USER -p $FTP_ISO_PASS -P $FTP_ISO_PORT $FTP_ISO_URL < .ftp-commands
939         rm -f .ftp-commands
940                 
941         case "$2" in
942           iso)
943                 echo -e "Uploading the iso to $FTP_ISO_PATH/$SVN_REVISION."
944
945                 md5sum ipfire-$VERSION.$MACHINE-full.iso > ipfire-$VERSION.$MACHINE-full.iso.md5
946                 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
947                                 if [ -e "$i" ]; then
948                             ncftpput -u $FTP_ISO_USER -p $FTP_ISO_PASS -P $FTP_ISO_PORT $FTP_ISO_URL $FTP_ISO_PATH$SVN_REVISION/ $i
949                                         if [ "$?" -eq "0" ]; then
950                                                 echo "The file with name $i was successfully uploaded to $FTP_ISO_URL$FTP_ISO_PATH$SVN_REVISION/."
951                                         else
952                                                 echo "There was an error while uploading the file $i to the ftp server."
953                                                 exit 1
954                                         fi
955                                 fi
956                 done
957                 rm -f ipfire-$VERSION.$MACHINE-full.iso.md5
958                 if [ "$3" = "--with-sources-cd" ]; then
959                         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
960                 fi
961                 ;;
962           paks)
963                 ncftpput -u $FTP_ISO_USER -p $FTP_ISO_PASS -P $FTP_ISO_PORT $FTP_ISO_URL $FTP_ISO_PATH$SVN_REVISION/paks packages/*
964                 if [ "$?" -eq "0" ]; then
965                         echo -e "The packages were successfully uploaded to $FTP_ISO_URL$FTP_ISO_PATH$SVN_REVISION/."
966                 else
967                         echo -e "There was an error while uploading the packages to the ftp server."
968                         exit 1
969                 fi
970           ;;
971         esac
972         ;;
973 batch)
974         if [ "$2" = "--background" ]; then
975                 batch_script
976                 exit $?
977         fi
978         if [ `screen -ls | grep -q ipfire` ]; then
979                 echo "Build is already running, sorry!"
980                 exit 1
981         else
982                 if [ "$2" = "--rebuild" ]; then
983                         export IPFIRE_REBUILD=1
984                         echo "REBUILD!"
985                 else
986                         export IPFIRE_REBUILD=0
987                 fi
988                 echo -en "${BOLD}***IPFire-Batch-Build is starting...${NORMAL}"
989                 screen -dmS ipfire $0 batch --background
990                 evaluate 1
991                 exit 0
992         fi
993         ;;
994 watch)
995         watch_screen
996         ;;
997 pxe)
998         case "$2" in
999           start)
1000                 start_tftpd
1001                 ;;
1002           stop)
1003                 stop_tftpd
1004                 ;;
1005           reload|restart)
1006                 reload_tftpd
1007                 ;;              
1008         esac
1009         exit 0
1010         ;;
1011 lang)
1012         update_langs
1013         ;;
1014 "")
1015         clear
1016         svn info
1017         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"
1018         do
1019         case $name in
1020         "IPFIRE: Downloadsrc")
1021                 $0 downloadsrc
1022                 ;;
1023         "IPFIRE: Build (silent)")
1024                 $0 build-silent
1025                 ;;
1026         "IPFIRE: Watch Build")
1027                 $0 watch
1028                 ;;
1029         "IPFIRE: Batch")
1030                 $0 batch
1031                 ;;
1032         "IPFIRE: Clean")
1033                 $0 clean
1034                 ;;
1035         "SVN: Update")
1036                 $0 svn update
1037                 ;;
1038         "Help")
1039                 echo "Usage: $0 {build|changelog|clean|gettoolchain|downloadsrc|shell|sync|toolchain}"
1040                 cat doc/make.sh-usage
1041                 ;;
1042         "LOG: Tail")
1043                 tail -f log/_*
1044                 ;;
1045         "Exit")
1046                 break
1047                 ;;
1048         esac
1049         done
1050         ;;
1051 config)
1052         make_config
1053         ;;
1054 *)
1055         echo "Usage: $0 {build|changelog|clean|gettoolchain|downloadsrc|shell|sync|toolchain}"
1056         cat doc/make.sh-usage
1057         ;;
1058 esac