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