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