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