Merge remote-tracking branch 'origin/kernel-update' into glibc-update2
[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="62"                                                       # Core Level (Filename)
29 PAKFIRE_CORE="61"                                               # 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=4
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_COMPILERCHECK="none"
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:armv6l|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     if [ ! -e /usr/include/asm -o ! -e /usr/include/bits -o ! -e /usr/include/gnu -o ! -e /usr/include/sys ]; then
259         exiterror "Cannot build toolchain without (asm, bits, gnu or sys includes). Please fix or use the download."
260     fi
261
262     if [ ! -e /usr/lib/libc.so ]; then
263         exiterror "Cannot build toolchain without (/usr/lib/libc.so). Please fix or use the download."
264     fi
265
266     LOGFILE="$BASEDIR/log/_build.toolchain.log"
267     export LOGFILE
268
269     local ORG_PATH=$PATH
270     export PATH="/tools/ccache/bin:/tools/bin:$PATH"
271     lfsmake1 fake-environ               PASS=1
272     lfsmake1 ccache                     PASS=1
273     lfsmake1 binutils                   PASS=1
274     lfsmake1 gcc                        PASS=1
275     lfsmake1 linux2                     TOOLS=1 HEADERS=1
276     lfsmake1 glibc
277     lfsmake1 cleanup-toolchain          PASS=1
278     lfsmake1 binutils                   PASS=2
279     lfsmake1 gcc                        PASS=2
280     lfsmake1 fake-environ               PASS=2
281     lfsmake1 ccache                     PASS=2
282     lfsmake1 tcl
283     lfsmake1 expect
284     lfsmake1 dejagnu
285     lfsmake1 ncurses
286     lfsmake1 bash
287     lfsmake1 bzip2
288     lfsmake1 coreutils
289     lfsmake1 diffutils
290     lfsmake1 findutils
291     lfsmake1 gawk
292     lfsmake1 gettext
293     lfsmake1 grep
294     lfsmake1 gzip
295     lfsmake1 m4
296     lfsmake1 make
297     lfsmake1 patch
298     lfsmake1 perl
299     lfsmake1 sed
300     lfsmake1 tar
301     lfsmake1 texinfo
302     lfsmake1 cleanup-toolchain          PASS=2
303     export PATH=$ORG_PATH
304 }
305
306 buildbase() {
307     LOGFILE="$BASEDIR/log/_build.base.log"
308     export LOGFILE
309     lfsmake2 stage2
310     lfsmake2 linux2                     HEADERS=1
311     lfsmake2 man-pages
312     lfsmake2 glibc
313     lfsmake2 tzdata
314     lfsmake2 cleanup-toolchain          PASS=3
315     lfsmake2 zlib
316     lfsmake2 binutils
317     lfsmake2 gmp
318     lfsmake2 gmp-compat
319     lfsmake2 mpfr
320     lfsmake2 file
321     lfsmake2 gcc
322     lfsmake2 sed
323     lfsmake2 berkeley
324     lfsmake2 coreutils
325     lfsmake2 iana-etc
326     lfsmake2 m4
327     lfsmake2 bison
328     lfsmake2 ncurses
329     lfsmake2 procps
330     lfsmake2 libtool
331     lfsmake2 perl
332     lfsmake2 readline
333     lfsmake2 autoconf
334     lfsmake2 automake
335     lfsmake2 bash
336     lfsmake2 bzip2
337     lfsmake2 diffutils
338     lfsmake2 e2fsprogs
339     lfsmake2 ed
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 linux2                   KCFG="-xen"
394 #    ipfiremake v4l-dvb                 KCFG="-xen"
395 #    ipfiremake mISDN                   KCFG="-xen"
396 #    ipfiremake dahdi                   KCFG="-xen" KMOD=1
397     ipfiremake cryptodev                KCFG="-xen"
398     ipfiremake compat-wireless          KCFG="-xen"
399 #    ipfiremake r8169                   KCFG="-xen"
400 #    ipfiremake r8168                   KCFG="-xen"
401 #    ipfiremake r8101                   KCFG="-xen"
402 #    ipfiremake e1000                   KCFG="-xen"
403 #    ipfiremake e1000e                  KCFG="-xen"
404 #    ipfiremake igb                     KCFG="-xen"
405
406     ipfiremake linux                    KCFG="-pae"
407 #    ipfiremake kvm-kmod                        KCFG="-pae"
408 #    ipfiremake v4l-dvb                 KCFG="-pae"
409     ipfiremake alsa                     KCFG="-pae" KMOD=1
410 #    ipfiremake mISDN                   KCFG="-pae"
411 #    ipfiremake dahdi                   KCFG="-pae" KMOD=1
412     ipfiremake cryptodev                KCFG="-pae"
413     ipfiremake compat-wireless          KCFG="-pae"
414 #    ipfiremake r8169                   KCFG="-pae"
415 #    ipfiremake r8168                   KCFG="-pae"
416 #    ipfiremake r8101                   KCFG="-pae"
417 #    ipfiremake e1000                   KCFG="-pae"
418 #    ipfiremake e1000e                  KCFG="-pae"
419 #    ipfiremake igb                     KCFG="-pae"
420
421     ipfiremake linux                    KCFG=""
422 #    ipfiremake kvm-kmod                        KCFG=""
423 #    ipfiremake v4l-dvb                 KCFG=""
424     ipfiremake alsa                     KCFG="" KMOD=1
425 #    ipfiremake mISDN                   KCFG=""
426 #    ipfiremake dahdi                   KCFG="" KMOD=1
427     ipfiremake cryptodev                KCFG=""
428     ipfiremake compat-wireless          KCFG=""
429 #    ipfiremake r8169                   KCFG=""
430 #    ipfiremake r8168                   KCFG=""
431 #    ipfiremake r8101                   KCFG=""
432 #    ipfiremake e1000                   KCFG=""
433 #    ipfiremake e1000e                  KCFG=""
434 #    ipfiremake igb                     KCFG=""
435
436   else
437     # arm-omap kernel build
438     ipfiremake linux                    KCFG="-rpi"
439 #    ipfiremake v4l-dvb                 KCFG="-rpi"
440 #    ipfiremake kvm-kmod                        KCFG="-rpi"
441 #    ipfiremake mISDN                   KCFG="-rpi"
442 #    ipfiremake dahdi                   KCFG="-rpi" KMOD=1
443     ipfiremake cryptodev                KCFG="-rpi"
444 #    ipfiremake compat-wireless         KCFG="-rpi"
445 #    ipfiremake r8169                   KCFG="-rpi"
446 #    ipfiremake r8168                   KCFG="-rpi"
447 #    ipfiremake r8101                   KCFG="-rpi"
448 #    ipfiremake e1000                   KCFG="-rpi"
449 #    ipfiremake e1000e                  KCFG="-rpi"
450 #    ipfiremake igb                     KCFG="-rpi"
451
452     ipfiremake linux                    KCFG="-omap"
453 #    ipfiremake v4l-dvb                 KCFG="-omap"
454 #    ipfiremake kvm-kmod                        KCFG="-omap"
455 #    ipfiremake mISDN                   KCFG="-omap"
456 #    ipfiremake dahdi                   KCFG="-omap" KMOD=1
457     ipfiremake cryptodev                KCFG="-omap"
458 #    ipfiremake compat-wireless         KCFG="-omap"
459 #    ipfiremake r8169                   KCFG="-omap"
460 #    ipfiremake r8168                   KCFG="-omap"
461 #    ipfiremake r8101                   KCFG="-omap"
462 #    ipfiremake e1000                   KCFG="-omap"
463 #    ipfiremake e1000e                  KCFG="-omap"
464 #    ipfiremake igb                     KCFG="-omap"
465
466     # arm-kirkwood kernel build
467     ipfiremake linux                    KCFG="-kirkwood"
468 #    ipfiremake v4l-dvb                 KCFG="-kirkwood"
469 #    ipfiremake kvm-kmod                        KCFG="-kirkwood"
470 #    ipfiremake mISDN                   KCFG="-kirkwood"
471 #    ipfiremake dahdi                   KCFG="-kirkwood" KMOD=1
472     ipfiremake cryptodev                KCFG="-kirkwood"
473     ipfiremake compat-wireless          KCFG="-kirkwood"
474 #    ipfiremake r8169                   KCFG="-kirkwood"
475 #    ipfiremake r8168                   KCFG="-kirkwood"
476 #    ipfiremake r8101                   KCFG="-kirkwood"
477 #    ipfiremake e1000                   KCFG="-kirkwood"
478 #    ipfiremake e1000e                  KCFG="-kirkwood"
479 #    ipfiremake igb                     KCFG="-kirkwood"
480   fi
481   ipfiremake pkg-config
482   ipfiremake linux-atm
483   ipfiremake cpio
484   ipfiremake dracut
485   ipfiremake expat
486   ipfiremake gdbm
487   ipfiremake pam
488   ipfiremake openssl
489   ipfiremake curl
490   ipfiremake tcl
491   ipfiremake sqlite
492   ipfiremake python
493   ipfiremake fireinfo
494   ipfiremake libnet
495   ipfiremake libnl
496   ipfiremake libidn
497   ipfiremake libjpeg
498   ipfiremake libpng
499   ipfiremake libtiff
500   ipfiremake libart
501   ipfiremake freetype
502   ipfiremake gd
503   ipfiremake popt
504   ipfiremake pcre
505   ipfiremake slang
506   ipfiremake newt
507   ipfiremake attr
508   ipfiremake acl
509   ipfiremake libcap
510   ipfiremake pciutils
511   ipfiremake usbutils
512   ipfiremake libxml2
513   ipfiremake libxslt
514   ipfiremake BerkeleyDB
515   ipfiremake mysql
516   ipfiremake cyrus-sasl
517   ipfiremake openldap
518   ipfiremake apache2
519   ipfiremake php
520   ipfiremake apache2                    PASS=C
521   ipfiremake arping
522   ipfiremake beep
523   ipfiremake bind
524   ipfiremake dvdrtools
525   ipfiremake dnsmasq
526   ipfiremake dosfstools
527   ipfiremake reiserfsprogs
528   ipfiremake xfsprogs
529   ipfiremake sysfsutils
530   ipfiremake fuse
531   ipfiremake ntfs-3g
532   ipfiremake ethtool
533   ipfiremake ez-ipupdate
534   ipfiremake fcron
535   ipfiremake perl-GD
536   ipfiremake GD-Graph
537   ipfiremake GD-TextUtil
538   ipfiremake gnupg
539   ipfiremake hdparm
540   ipfiremake sdparm
541   ipfiremake mtools
542   ipfiremake initscripts
543   ipfiremake whatmask
544   ipfiremake iptables
545   ipfiremake libupnp
546   ipfiremake ipaddr
547   ipfiremake iptstate
548   ipfiremake iputils
549   ipfiremake l7-protocols
550   ipfiremake mISDNuser
551   ipfiremake capi4k-utils
552   ipfiremake hwdata
553   ipfiremake kudzu
554   ipfiremake logrotate
555   ipfiremake logwatch
556   ipfiremake misc-progs
557   ipfiremake nano
558   ipfiremake nasm
559   ipfiremake URI
560   ipfiremake HTML-Tagset
561   ipfiremake HTML-Parser
562   ipfiremake Compress-Zlib
563   ipfiremake Digest
564   ipfiremake Digest-SHA1
565   ipfiremake Digest-HMAC
566   ipfiremake libwww-perl
567   ipfiremake Net-DNS
568   ipfiremake Net-IPv4Addr
569   ipfiremake Net_SSLeay
570   ipfiremake IO-Stringy
571   ipfiremake Unix-Syslog
572   ipfiremake Mail-Tools
573   ipfiremake MIME-Tools
574   ipfiremake Net-Server
575   ipfiremake Convert-TNEF
576   ipfiremake Convert-UUlib
577   ipfiremake Archive-Tar
578   ipfiremake Archive-Zip
579   ipfiremake Text-Tabs+Wrap
580   ipfiremake Locale-Country
581   ipfiremake XML-Parser
582   ipfiremake Crypt-PasswdMD5
583   ipfiremake Net-Telnet
584   ipfiremake python-setuptools
585   ipfiremake python-clientform
586   ipfiremake python-mechanize
587   ipfiremake python-feedparser
588   ipfiremake python-rssdler
589   ipfiremake glib
590   ipfiremake GeoIP
591   ipfiremake fwhits
592   ipfiremake noip_updater
593   ipfiremake ntp
594   ipfiremake openssh
595   ipfiremake rrdtool
596   ipfiremake setserial
597   ipfiremake setup
598   ipfiremake libdnet
599   ipfiremake daq
600   ipfiremake snort
601   ipfiremake oinkmaster
602   ipfiremake squid
603   ipfiremake squidguard
604   ipfiremake calamaris
605   ipfiremake tcpdump
606   ipfiremake traceroute
607   ipfiremake vlan
608   ipfiremake wireless
609   ipfiremake pakfire
610   ipfiremake spandsp
611   ipfiremake lzo
612   ipfiremake openvpn
613   ipfiremake pammysql
614   ipfiremake cups
615   ipfiremake ghostscript
616   ipfiremake foomatic
617   ipfiremake hplip
618   ipfiremake samba
619   ipfiremake sudo
620   ipfiremake mc
621   ipfiremake wget
622   ipfiremake bridge-utils
623   ipfiremake screen
624   ipfiremake smartmontools
625   ipfiremake htop
626 #  ipfiremake postfix               # unknown system type linux 3.2.x
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 sane
681   ipfiremake netpbm
682   ipfiremake phpSANE
683   ipfiremake tunctl
684   ipfiremake nagios
685   ipfiremake nagios_nrpe
686   ipfiremake ebtables
687   ipfiremake fontconfig
688   ipfiremake freefont
689   ipfiremake directfb
690   ipfiremake dfb++
691   ipfiremake faad2
692   ipfiremake ffmpeg
693   ipfiremake videolan
694   ipfiremake vdr
695   ipfiremake w_scan
696   ipfiremake icecast
697   ipfiremake icegenerator
698   ipfiremake mpd
699   ipfiremake libmpdclient
700   ipfiremake mpc
701   ipfiremake git
702   ipfiremake squidclamav
703   ipfiremake bc
704   ipfiremake vnstat
705   ipfiremake vnstati
706   ipfiremake iw
707   ipfiremake wpa_supplicant
708   ipfiremake hostapd
709   ipfiremake urlgrabber
710   ipfiremake syslinux
711   ipfiremake tftpd
712   ipfiremake cpufrequtils
713   ipfiremake dbus
714   ipfiremake bluetooth
715   ipfiremake gutenprint
716   ipfiremake apcupsd
717   ipfiremake iperf
718   ipfiremake netcat
719   ipfiremake 7zip
720   ipfiremake lynis
721   ipfiremake splix
722   ipfiremake streamripper
723   ipfiremake sshfs
724   ipfiremake taglib
725   ipfiremake mediatomb
726   ipfiremake sslh
727   ipfiremake perl-gettext
728   ipfiremake vdradmin
729   ipfiremake miau
730   ipfiremake netsnmpd
731   ipfiremake perl-DBI
732   ipfiremake perl-DBD-mysql
733   ipfiremake cacti
734   ipfiremake icecc
735   ipfiremake openvmtools
736   ipfiremake nagiosql
737   ipfiremake iftop
738   ipfiremake motion
739   ipfiremake joe
740   ipfiremake nut
741   ipfiremake watchdog
742   ipfiremake libpri
743 #  ipfiremake dahdi               # update needed for 3.2.x
744 #  ipfiremake asterisk
745 #  ipfiremake lcr
746   ipfiremake usb_modeswitch
747   ipfiremake usb_modeswitch_data
748   ipfiremake zerofree
749   ipfiremake mdadm
750   ipfiremake eject
751   ipfiremake pound
752   ipfiremake minicom
753   ipfiremake ddrescue
754   ipfiremake imspector
755 #  ipfiremake miniupnpd              # will not build
756   ipfiremake client175
757   ipfiremake powertop
758   ipfiremake parted
759   ipfiremake swig
760   ipfiremake python-m2crypto
761   ipfiremake wireless-regdb
762   ipfiremake crda
763   ipfiremake libsolv
764   ipfiremake python-distutils-extra
765   ipfiremake python-lzma
766   ipfiremake python-progressbar
767   ipfiremake python-xattr
768   ipfiremake intltool
769   ipfiremake pakfire3-deps
770   ipfiremake transmission
771   ipfiremake dpfhack
772   ipfiremake lcd4linux
773   ipfiremake mtr
774   ipfiremake tcpick
775   echo Build on $HOSTNAME > $BASEDIR/build/var/ipfire/firebuild
776   cat /proc/version >> $BASEDIR/build/var/ipfire/firebuild
777   echo >> $BASEDIR/build/var/ipfire/firebuild
778   git log -1 >> $BASEDIR/build/var/ipfire/firebuild
779   echo >> $BASEDIR/build/var/ipfire/firebuild
780   git status >> $BASEDIR/build/var/ipfire/firebuild
781   echo >> $BASEDIR/build/var/ipfire/firebuild
782   cat /proc/cpuinfo >> $BASEDIR/build/var/ipfire/firebuild
783   echo $PAKFIRE_CORE > $BASEDIR/build/opt/pakfire/db/core/mine
784   if [ "$GIT_BRANCH" = "master" -o "$GIT_BRANCH" = "next" ]; then
785         echo "$NAME $VERSION ($MACHINE) - Development Build: $GIT_LASTCOMMIT" > $BASEDIR/build/etc/system-release
786   else
787         echo "$NAME $VERSION ($MACHINE) - $GIT_BRANCH" > $BASEDIR/build/etc/system-release
788   fi
789 }
790
791 buildinstaller() {
792   # Run installer scripts one by one
793   LOGFILE="$BASEDIR/log/_build.installer.log"
794   export LOGFILE
795   ipfiremake as86
796   ipfiremake mbr
797   ipfiremake memtest
798   ipfiremake installer
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/tools log >> $LOGFILE
1041         md5sum cache/toolchains/$SNAME-$VERSION-toolchain-$TOOLCHAINVER-$MACHINE.tar.gz \
1042                 > cache/toolchains/$SNAME-$VERSION-toolchain-$TOOLCHAINVER-$MACHINE.md5
1043         stdumount
1044         ;;
1045 gettoolchain)
1046         # arbitrary name to be updated in case of new toolchain package upload
1047         PACKAGE=$SNAME-$VERSION-toolchain-$TOOLCHAINVER-$MACHINE
1048         if [ ! -f $BASEDIR/cache/toolchains/$PACKAGE.tar.gz ]; then
1049                 URL_TOOLCHAIN=`grep URL_TOOLCHAIN lfs/Config | awk '{ print $3 }'`
1050                 test -d $BASEDIR/cache/toolchains || mkdir -p $BASEDIR/cache/toolchains
1051                 echo "`date -u '+%b %e %T'`: Load toolchain tar.gz for $MACHINE" | tee -a $LOGFILE
1052                 cd $BASEDIR/cache/toolchains
1053                 wget -U "IPFireSourceGrabber/2.x" $URL_TOOLCHAIN/$PACKAGE.tar.gz $URL_TOOLCHAIN/$PACKAGE.md5 >& /dev/null
1054                 if [ $? -ne 0 ]; then
1055                         echo "`date -u '+%b %e %T'`: error downloading $PACKAGE toolchain for $MACHINE machine" | tee -a $LOGFILE
1056                 else
1057                         if [ "`md5sum $PACKAGE.tar.gz | awk '{print $1}'`" = "`cat $PACKAGE.md5 | awk '{print $1}'`" ]; then
1058                                 echo "`date -u '+%b %e %T'`: toolchain md5 ok" | tee -a $LOGFILE
1059                         else
1060                                 exiterror "$PACKAGE.md5 did not match, check downloaded package"
1061                         fi
1062                 fi
1063         else
1064                 echo "Toolchain is already downloaded. Exiting..."
1065         fi
1066         ;;
1067 othersrc)
1068         prepareenv
1069         echo -ne "`date -u '+%b %e %T'`: Build sources iso for $MACHINE" | tee -a $LOGFILE
1070         chroot $LFS /tools/bin/env -i   HOME=/root \
1071         TERM=$TERM PS1='\u:\w\$ ' \
1072         PATH=/usr/local/bin:/bin:/usr/bin:/sbin:/usr/sbin \
1073         VERSION=$VERSION NAME="$NAME" SNAME="$SNAME" MACHINE=$MACHINE \
1074         /bin/bash -x -c "cd /usr/src/lfs && make -f sources-iso LFS_BASEDIR=/usr/src install" >>$LOGFILE 2>&1
1075         mv $LFS/install/images/ipfire-* $BASEDIR >> $LOGFILE 2>&1
1076         if [ $? -eq "0" ]; then
1077                 beautify message DONE
1078         else
1079                 beautify message FAIL
1080         fi
1081         stdumount
1082         ;;
1083 uploadsrc)
1084         PWD=`pwd`
1085         if [ -z $IPFIRE_USER ]; then
1086                 echo -n "You have to setup IPFIRE_USER first. See .config for details."
1087                 beautify message FAIL
1088                 exit 1
1089         fi
1090
1091         URL_SOURCE=$(grep URL_SOURCE lfs/Config | awk '{ print $3 }')
1092         REMOTE_FILES=$(echo "ls -1 --ignore=toolchains" | sftp -C ${IPFIRE_USER}@${URL_SOURCE})
1093
1094         cd $BASEDIR/cache/
1095         for file in $(ls -1 --ignore=toolchains); do
1096                 grep -q "$file" <<<$REMOTE_FILES && continue
1097                 NEW_FILES="$NEW_FILES $file"
1098         done
1099         [ -n "$NEW_FILES" ] && scp -2 $NEW_FILES ${IPFIRE_USER}@${URL_SOURCE}
1100         cd $BASEDIR
1101         cd $PWD
1102         exit 0
1103         ;;
1104 lang)
1105         update_langs
1106         ;;
1107 *)
1108         echo "Usage: $0 {build|changelog|clean|gettoolchain|downloadsrc|shell|sync|toolchain}"
1109         cat doc/make.sh-usage
1110         ;;
1111 esac