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