f756033c6ac81c254dce15424208a933f98b8434
[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="80"                                                       # Core Level (Filename)
29 PAKFIRE_CORE="79"                                               # 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 hostname
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 libgpg-error
471   ipfiremake libgcrypt
472   ipfiremake libassuan
473   ipfiremake curl
474   ipfiremake tcl
475   ipfiremake sqlite
476   ipfiremake python
477   ipfiremake fireinfo
478   ipfiremake libnet
479   ipfiremake libnl
480   ipfiremake libidn
481   ipfiremake nasm
482   ipfiremake libjpeg
483   ipfiremake libexif
484   ipfiremake libpng
485   ipfiremake libtiff
486   ipfiremake libart
487   ipfiremake freetype
488   ipfiremake gd
489   ipfiremake popt
490   ipfiremake pcre
491   ipfiremake slang
492   ipfiremake newt
493   ipfiremake attr
494   ipfiremake acl
495   ipfiremake libcap
496   ipfiremake pciutils
497   ipfiremake usbutils
498   ipfiremake libxml2
499   ipfiremake libxslt
500   ipfiremake BerkeleyDB
501   ipfiremake mysql
502   ipfiremake cyrus-sasl
503   ipfiremake openldap
504   ipfiremake apache2
505   ipfiremake php
506   ipfiremake apache2                    PASS=C
507   ipfiremake jquery
508   ipfiremake arping
509   ipfiremake beep
510   ipfiremake dvdrtools
511   ipfiremake dnsmasq
512   ipfiremake dosfstools
513   ipfiremake reiserfsprogs
514   ipfiremake xfsprogs
515   ipfiremake sysfsutils
516   ipfiremake fuse
517   ipfiremake ntfs-3g
518   ipfiremake ethtool
519   ipfiremake ez-ipupdate
520   ipfiremake fcron
521   ipfiremake perl-GD
522   ipfiremake GD-Graph
523   ipfiremake GD-TextUtil
524   ipfiremake perl-Device-SerialPort
525   ipfiremake perl-Device-Modem
526   ipfiremake gnupg
527   ipfiremake hdparm
528   ipfiremake sdparm
529   ipfiremake mtools
530   ipfiremake initscripts
531   ipfiremake whatmask
532   ipfiremake libmnl
533   ipfiremake iptables
534   ipfiremake conntrack-tools
535   ipfiremake libupnp
536   ipfiremake ipaddr
537   ipfiremake iputils
538   ipfiremake l7-protocols
539   ipfiremake mISDNuser
540   ipfiremake capi4k-utils
541   ipfiremake hwdata
542   ipfiremake logrotate
543   ipfiremake logwatch
544   ipfiremake misc-progs
545   ipfiremake nano
546   ipfiremake URI
547   ipfiremake HTML-Tagset
548   ipfiremake HTML-Parser
549   ipfiremake HTML-Template
550   ipfiremake Compress-Zlib
551   ipfiremake Digest
552   ipfiremake Digest-SHA1
553   ipfiremake Digest-HMAC
554   ipfiremake libwww-perl
555   ipfiremake Net-DNS
556   ipfiremake Net-IPv4Addr
557   ipfiremake Net_SSLeay
558   ipfiremake IO-Stringy
559   ipfiremake IO-Socket-SSL
560   ipfiremake Unix-Syslog
561   ipfiremake Mail-Tools
562   ipfiremake MIME-Tools
563   ipfiremake Net-Server
564   ipfiremake Convert-TNEF
565   ipfiremake Convert-UUlib
566   ipfiremake Archive-Tar
567   ipfiremake Archive-Zip
568   ipfiremake Text-Tabs+Wrap
569   ipfiremake Locale-Country
570   ipfiremake XML-Parser
571   ipfiremake Crypt-PasswdMD5
572   ipfiremake Net-Telnet
573   ipfiremake python-setuptools
574   ipfiremake python-clientform
575   ipfiremake python-mechanize
576   ipfiremake python-feedparser
577   ipfiremake python-rssdler
578   ipfiremake libffi
579   ipfiremake glib
580   ipfiremake GeoIP
581   ipfiremake fwhits
582   ipfiremake noip_updater
583   ipfiremake ntp
584   ipfiremake openssh
585   ipfiremake fontconfig
586   ipfiremake dejavu-fonts-ttf
587   ipfiremake freefont
588   ipfiremake pixman
589   ipfiremake cairo
590   ipfiremake pango
591   ipfiremake rrdtool
592   ipfiremake setserial
593   ipfiremake setup
594   ipfiremake libdnet
595   ipfiremake daq
596   ipfiremake snort
597   ipfiremake oinkmaster
598   ipfiremake squid
599   ipfiremake squidguard
600   ipfiremake calamaris
601   ipfiremake tcpdump
602   ipfiremake traceroute
603   ipfiremake vlan
604   ipfiremake wireless
605   ipfiremake pakfire
606   ipfiremake spandsp
607   ipfiremake lzo
608   ipfiremake openvpn
609   ipfiremake pammysql
610   ipfiremake mpage
611   ipfiremake dbus
612   ipfiremake cups
613   ipfiremake ghostscript
614   ipfiremake foomatic
615   ipfiremake hplip
616   ipfiremake cifs-utils
617   ipfiremake samba
618   ipfiremake sudo
619   ipfiremake mc
620   ipfiremake wget
621   ipfiremake bridge-utils
622   ipfiremake screen
623   ipfiremake smartmontools
624   ipfiremake htop
625   ipfiremake postfix
626   ipfiremake fetchmail
627   ipfiremake cyrus-imapd
628   ipfiremake openmailadmin
629   ipfiremake clamav
630   ipfiremake spamassassin
631   ipfiremake amavisd
632   ipfiremake alsa
633   ipfiremake mpfire
634   ipfiremake guardian
635   ipfiremake libid3tag
636   ipfiremake libmad
637   ipfiremake libogg
638   ipfiremake libvorbis
639   ipfiremake libdvbpsi
640   ipfiremake flac
641   ipfiremake lame
642   ipfiremake sox
643   ipfiremake libshout
644   ipfiremake xvid
645   ipfiremake libmpeg2
646   ipfiremake cmake
647   ipfiremake gnump3d
648   ipfiremake rsync
649   ipfiremake tcpwrapper
650   ipfiremake libevent
651   ipfiremake libevent2
652   ipfiremake portmap
653   ipfiremake nfs
654   ipfiremake nmap
655   ipfiremake ncftp
656   ipfiremake etherwake
657   ipfiremake bwm-ng
658   ipfiremake tripwire
659   ipfiremake sysstat
660   ipfiremake vsftpd
661   ipfiremake strongswan
662   ipfiremake rng-tools
663   ipfiremake lsof
664   ipfiremake br2684ctl
665   ipfiremake pcmciautils
666   ipfiremake lm_sensors
667   ipfiremake liboping
668   ipfiremake collectd
669   ipfiremake teamspeak
670   ipfiremake elinks
671   ipfiremake igmpproxy
672   ipfiremake fbset
673   ipfiremake sdl
674   ipfiremake qemu
675   ipfiremake sane
676   ipfiremake netpbm
677   ipfiremake phpSANE
678   ipfiremake tunctl
679   ipfiremake netsnmpd
680   ipfiremake nagios
681   ipfiremake nagios_nrpe
682   ipfiremake icinga
683   ipfiremake ebtables
684   ipfiremake directfb
685   ipfiremake dfb++
686   ipfiremake faad2
687   ipfiremake ffmpeg
688   ipfiremake vdr
689   ipfiremake vdr_streamdev
690   ipfiremake vdr_vnsiserver5
691   ipfiremake vdr_vnsiserver3
692   ipfiremake vdr_epgsearch
693   ipfiremake vdr_dvbapi
694   ipfiremake vdr_eepg
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 vnstat
704   ipfiremake iw
705   ipfiremake wpa_supplicant
706   ipfiremake hostapd
707   ipfiremake pycurl
708   ipfiremake urlgrabber
709   ipfiremake syslinux
710   ipfiremake tftpd
711   ipfiremake cpufrequtils
712   ipfiremake bluetooth
713   ipfiremake gutenprint
714   ipfiremake apcupsd
715   ipfiremake iperf
716   ipfiremake netcat
717   ipfiremake 7zip
718   ipfiremake lynis
719   ipfiremake streamripper
720   ipfiremake sshfs
721   ipfiremake taglib
722   ipfiremake mediatomb
723   ipfiremake sslh
724   ipfiremake perl-gettext
725   ipfiremake perl-Sort-Naturally
726   ipfiremake vdradmin
727   ipfiremake miau
728   ipfiremake perl-DBI
729   ipfiremake perl-DBD-mysql
730   ipfiremake perl-DBD-SQLite
731   ipfiremake perl-File-ReadBackwards
732   ipfiremake cacti
733   ipfiremake openvmtools
734   ipfiremake nagiosql
735   ipfiremake iftop
736   ipfiremake motion
737   ipfiremake joe
738   ipfiremake nut
739   ipfiremake watchdog
740   ipfiremake libpri
741   ipfiremake asterisk
742   ipfiremake lcr
743   ipfiremake usb_modeswitch
744   ipfiremake usb_modeswitch_data
745   ipfiremake zerofree
746   ipfiremake mdadm
747   ipfiremake pound
748   ipfiremake minicom
749   ipfiremake ddrescue
750   ipfiremake imspector
751   ipfiremake miniupnpd
752   ipfiremake client175
753   ipfiremake powertop
754   ipfiremake parted
755   ipfiremake swig
756   ipfiremake python-m2crypto
757   ipfiremake wireless-regdb
758   ipfiremake crda
759   ipfiremake libsolv
760   ipfiremake python-distutils-extra
761   ipfiremake python-lzma
762   ipfiremake python-progressbar
763   ipfiremake python-xattr
764   ipfiremake intltool
765   ipfiremake transmission
766   ipfiremake dpfhack
767   ipfiremake lcd4linux
768   ipfiremake mtr
769   ipfiremake tcpick
770   ipfiremake minidlna
771   ipfiremake acpid
772   ipfiremake fping
773   ipfiremake telnet
774   ipfiremake xinetd
775   ipfiremake gpgme
776   ipfiremake pygpgme
777   ipfiremake pakfire3
778   ipfiremake stress
779   ipfiremake libstatgrab
780   ipfiremake sarg
781   ipfiremake check_mk_agent
782   ipfiremake libdaemon
783   ipfiremake avahi
784   ipfiremake nginx
785   ipfiremake sendEmail
786   ipfiremake sysbench
787   ipfiremake strace
788   ipfiremake ipfire-netboot
789   ipfiremake lcdproc
790   ipfiremake bitstream
791   ipfiremake multicat
792   ipfiremake keepalived
793   ipfiremake ipvsadm
794   ipfiremake perl-Carp-Clan
795   ipfiremake perl-Date-Calc
796   ipfiremake perl-Date-Manip
797   ipfiremake perl-File-Tail
798   ipfiremake perl-TimeDate
799   ipfiremake swatch
800   ipfiremake tor
801   ipfiremake arm
802   ipfiremake wavemon
803   ipfiremake iptraf-ng
804   ipfiremake iotop
805   ipfiremake stunnel
806   ipfiremake sslscan
807 }
808
809 buildinstaller() {
810   # Run installer scripts one by one
811   LOGFILE="$BASEDIR/log/_build.installer.log"
812   export LOGFILE
813   ipfiremake memtest
814   ipfiremake installer
815   installmake strip
816   ipfiremake initrd
817 }
818
819 buildpackages() {
820   LOGFILE="$BASEDIR/log/_build.packages.log"
821   export LOGFILE
822   echo "... see detailed log in _build.*.log files" >> $LOGFILE
823
824   
825   # Generating list of packages used
826   echo -n "Generating packages list from logs" | tee -a $LOGFILE
827   rm -f $BASEDIR/doc/packages-list
828   for i in `ls -1tr $BASEDIR/log/[^_]*`; do
829         if [ "$i" != "$BASEDIR/log/FILES" -a -n $i ]; then
830                 echo "* `basename $i`" >>$BASEDIR/doc/packages-list
831         fi
832   done
833   echo "== List of softwares used to build $NAME Version: $VERSION ==" > $BASEDIR/doc/packages-list.txt
834   grep -v 'configroot$\|img$\|initrd$\|initscripts$\|installer$\|install$\|setup$\|pakfire$\|stage2$\|smp$\|tools$\|tools1$\|tools2$\|.tgz$\|-config$\|_missing_rootfile$\|install1$\|install2$\|pass1$\|pass2$\|pass3$' \
835         $BASEDIR/doc/packages-list | sort >> $BASEDIR/doc/packages-list.txt
836   rm -f $BASEDIR/doc/packages-list
837   # packages-list.txt is ready to be displayed for wiki page
838   beautify message DONE
839   
840   # Update changelog
841   cd $BASEDIR
842   [ -z $GIT_TAG ]  || LAST_TAG=$GIT_TAG
843   [ -z $LAST_TAG ] || EXT="$LAST_TAG..HEAD"
844   git log -n 500 --no-merges --pretty=medium --shortstat $EXT > $BASEDIR/doc/ChangeLog
845
846   # Create images for install
847   ipfiremake cdrom
848
849   # Check if there is a loop device for building in virtual environments
850   modprobe loop 2>/dev/null
851   if [ $BUILD_IMAGES == 1 ] && ([ -e /dev/loop/0 ] || [ -e /dev/loop0 ] || [ -e "/dev/loop-control" ]); then
852         ipfiremake flash-images
853   fi
854
855   mv $LFS/install/images/{*.iso,*.tgz,*.img.gz,*.bz2} $BASEDIR >> $LOGFILE 2>&1
856
857   ipfirepackages
858
859   ipfiremake xen-image
860   mv $LFS/install/images/*.bz2 $BASEDIR >> $LOGFILE 2>&1
861
862   cd $BASEDIR
863   for i in `ls *.bz2 *.img.gz *.iso`; do
864         md5sum $i > $i.md5
865   done
866   cd $PWD
867
868   # Cleanup
869   stdumount
870   rm -rf $BASEDIR/build/tmp/*
871
872   # Generating total list of files
873   echo -n "Generating files list from logs" | tee -a $LOGFILE
874   rm -f $BASEDIR/log/FILES
875   for i in `ls -1tr $BASEDIR/log/[^_]*`; do
876         if [ "$i" != "$BASEDIR/log/FILES" -a -n $i ]; then
877                 echo "##" >>$BASEDIR/log/FILES
878                 echo "## `basename $i`" >>$BASEDIR/log/FILES
879                 echo "##" >>$BASEDIR/log/FILES
880                 cat $i | sed "s%^\./%#%" | sort >> $BASEDIR/log/FILES
881         fi
882   done
883   beautify message DONE
884
885   cd $PWD
886 }
887
888 ipfirepackages() {
889         ipfiremake core-updates
890
891         local i
892         for i in $(find $BASEDIR/config/rootfiles/packages{/${MACHINE},} -maxdepth 1 -type f); do
893                 i=$(basename ${i})
894                 if [ -e $BASEDIR/lfs/$i ]; then
895                         ipfiredist $i
896                 else
897                         echo -n $i
898                         beautify message SKIP
899                 fi
900         done
901   test -d $BASEDIR/packages || mkdir $BASEDIR/packages
902   mv -f $LFS/install/packages/* $BASEDIR/packages >> $LOGFILE 2>&1
903   rm -rf  $BASEDIR/build/install/packages/*
904 }
905
906 while [ $# -gt 0 ]; do
907         case "${1}" in
908                 --target=*)
909                         configure_target "${1#--target=}"
910                         ;;
911                 -*)
912                         exiterror "Unknown configuration option: ${1}"
913                         ;;
914                 *)
915                         # Found a command, so exit options parsing.
916                         break
917                         ;;
918         esac
919         shift
920 done
921
922 # See what we're supposed to do
923 case "$1" in 
924 build)
925         clear
926         PACKAGE=`ls -v -r $BASEDIR/cache/toolchains/$SNAME-$VERSION-toolchain-$TOOLCHAINVER-$MACHINE.tar.gz 2> /dev/null | head -n 1`
927         #only restore on a clean disk
928         if [ ! -f log/cleanup-toolchain-2-tools ]; then
929                 if [ ! -n "$PACKAGE" ]; then
930                         beautify build_stage "Full toolchain compilation - Native GCC: `gcc --version | grep GCC | awk {'print $3'}`"
931                         prepareenv
932                         buildtoolchain
933                 else
934                         PACKAGENAME=${PACKAGE%.tar.gz}
935                         beautify build_stage "Packaged toolchain compilation"
936                         if [ `md5sum $PACKAGE | awk '{print $1}'` == `cat $PACKAGENAME.md5 | awk '{print $1}'` ]; then
937                                 tar zxf $PACKAGE
938                                 prepareenv
939                         else
940                                 exiterror "$PACKAGENAME md5 did not match, check downloaded package"
941                         fi
942                 fi
943         else
944                 echo -n "Using installed toolchain" | tee -a $LOGFILE
945                 beautify message SKIP
946                 prepareenv
947         fi
948
949         beautify build_start
950         beautify build_stage "Building LFS"
951         buildbase
952
953         beautify build_stage "Building IPFire"
954         buildipfire
955
956         beautify build_stage "Building installer"
957         buildinstaller
958
959         beautify build_stage "Building packages"
960         buildpackages
961         
962         beautify build_stage "Checking Logfiles for new Files"
963
964         cd $BASEDIR
965         tools/checknewlog.pl
966         tools/checkwronginitlinks
967         cd $PWD
968
969         beautify build_end
970         ;;
971 shell)
972         # enter a shell inside LFS chroot
973         # may be used to changed kernel settings
974         prepareenv
975         entershell
976         ;;
977 clean)
978         echo -en "${BOLD}Cleaning build directory...${NORMAL}"
979         for i in `mount | grep $BASEDIR | sed 's/^.*loop=\(.*\))/\1/'`; do
980                 $LOSETUP -d $i 2>/dev/null
981         done
982         for i in `mount | grep $BASEDIR | cut -d " " -f 1`; do
983                 umount $i
984         done
985         stdumount
986         for i in `seq 0 7`; do
987             if ( losetup /dev/loop${i} 2>/dev/null | grep -q "/install/images" ); then
988                 umount /dev/loop${i}     2>/dev/null;
989                 losetup -d /dev/loop${i} 2>/dev/null;
990             fi;
991         done
992         rm -rf $BASEDIR/build
993         rm -rf $BASEDIR/cdrom
994         rm -rf $BASEDIR/packages
995         rm -rf $BASEDIR/log
996         if [ -h /tools ]; then
997                 rm -f /tools
998         fi
999         rm -f $BASEDIR/ipfire-*
1000         beautify message DONE
1001         ;;
1002 downloadsrc)
1003         if [ ! -d $BASEDIR/cache ]; then
1004                 mkdir $BASEDIR/cache
1005         fi
1006         mkdir -p $BASEDIR/log
1007         echo -e "${BOLD}Preload all source files${NORMAL}" | tee -a $LOGFILE
1008         FINISHED=0
1009         cd $BASEDIR/lfs
1010         for c in `seq $MAX_RETRIES`; do
1011                 if (( FINISHED==1 )); then 
1012                         break
1013                 fi
1014                 FINISHED=1
1015                 cd $BASEDIR/lfs
1016                 for i in *; do
1017                         if [ -f "$i" -a "$i" != "Config" ]; then
1018                                 lfsmakecommoncheck ${i} || continue
1019
1020                                 make -s -f $i LFS_BASEDIR=$BASEDIR MACHINE=$MACHINE \
1021                                         MESSAGE="$i\t ($c/$MAX_RETRIES)" download >> $LOGFILE 2>&1
1022                                 if [ $? -ne 0 ]; then
1023                                         beautify message FAIL
1024                                         FINISHED=0
1025                                 else
1026                                         if [ $c -eq 1 ]; then
1027                                         beautify message DONE
1028                                         fi
1029                                 fi
1030                         fi
1031                 done
1032         done
1033         echo -e "${BOLD}***Verifying md5sums${NORMAL}"
1034         ERROR=0
1035         for i in *; do
1036                 if [ -f "$i" -a "$i" != "Config" ]; then
1037                         lfsmakecommoncheck ${i} > /dev/null || continue
1038                         make -s -f $i LFS_BASEDIR=$BASEDIR MACHINE=$MACHINE \
1039                                 MESSAGE="$i\t " md5 >> $LOGFILE 2>&1
1040                         if [ $? -ne 0 ]; then
1041                                 echo -ne "MD5 difference in lfs/$i"
1042                                 beautify message FAIL
1043                                 ERROR=1
1044                         fi
1045                 fi
1046         done
1047         if [ $ERROR -eq 0 ]; then
1048                 echo -ne "${BOLD}all files md5sum match${NORMAL}"
1049                 beautify message DONE
1050         else
1051                 echo -ne "${BOLD}not all files were correctly download${NORMAL}"
1052                 beautify message FAIL
1053         fi
1054         cd - >/dev/null 2>&1
1055         ;;
1056 toolchain)
1057         clear
1058         prepareenv
1059         beautify build_stage "Toolchain compilation - Native GCC: `gcc --version | grep GCC | awk {'print $3'}`"
1060         buildtoolchain
1061         echo "`date -u '+%b %e %T'`: Create toolchain tar.gz for $MACHINE" | tee -a $LOGFILE
1062         test -d $BASEDIR/cache/toolchains || mkdir -p $BASEDIR/cache/toolchains
1063         cd $BASEDIR && tar -zc --exclude='log/_build.*.log' -f cache/toolchains/$SNAME-$VERSION-toolchain-$TOOLCHAINVER-$MACHINE.tar.gz \
1064                 build/tools build/bin/sh log >> $LOGFILE
1065         md5sum cache/toolchains/$SNAME-$VERSION-toolchain-$TOOLCHAINVER-$MACHINE.tar.gz \
1066                 > cache/toolchains/$SNAME-$VERSION-toolchain-$TOOLCHAINVER-$MACHINE.md5
1067         stdumount
1068         ;;
1069 gettoolchain)
1070         # arbitrary name to be updated in case of new toolchain package upload
1071         PACKAGE=$SNAME-$VERSION-toolchain-$TOOLCHAINVER-$MACHINE
1072         if [ ! -f $BASEDIR/cache/toolchains/$PACKAGE.tar.gz ]; then
1073                 URL_TOOLCHAIN=`grep URL_TOOLCHAIN lfs/Config | awk '{ print $3 }'`
1074                 test -d $BASEDIR/cache/toolchains || mkdir -p $BASEDIR/cache/toolchains
1075                 echo "`date -u '+%b %e %T'`: Load toolchain tar.gz for $MACHINE" | tee -a $LOGFILE
1076                 cd $BASEDIR/cache/toolchains
1077                 wget -U "IPFireSourceGrabber/2.x" $URL_TOOLCHAIN/$PACKAGE.tar.gz $URL_TOOLCHAIN/$PACKAGE.md5 >& /dev/null
1078                 if [ $? -ne 0 ]; then
1079                         echo "`date -u '+%b %e %T'`: error downloading $PACKAGE toolchain for $MACHINE machine" | tee -a $LOGFILE
1080                 else
1081                         if [ "`md5sum $PACKAGE.tar.gz | awk '{print $1}'`" = "`cat $PACKAGE.md5 | awk '{print $1}'`" ]; then
1082                                 echo "`date -u '+%b %e %T'`: toolchain md5 ok" | tee -a $LOGFILE
1083                         else
1084                                 exiterror "$PACKAGE.md5 did not match, check downloaded package"
1085                         fi
1086                 fi
1087         else
1088                 echo "Toolchain is already downloaded. Exiting..."
1089         fi
1090         ;;
1091 othersrc)
1092         prepareenv
1093         echo -ne "`date -u '+%b %e %T'`: Build sources iso for $MACHINE" | tee -a $LOGFILE
1094         chroot $LFS /tools/bin/env -i   HOME=/root \
1095         TERM=$TERM PS1='\u:\w\$ ' \
1096         PATH=/usr/local/bin:/bin:/usr/bin:/sbin:/usr/sbin \
1097         VERSION=$VERSION NAME="$NAME" SNAME="$SNAME" MACHINE=$MACHINE \
1098         /bin/bash -x -c "cd /usr/src/lfs && make -f sources-iso LFS_BASEDIR=/usr/src install" >>$LOGFILE 2>&1
1099         mv $LFS/install/images/ipfire-* $BASEDIR >> $LOGFILE 2>&1
1100         if [ $? -eq "0" ]; then
1101                 beautify message DONE
1102         else
1103                 beautify message FAIL
1104         fi
1105         stdumount
1106         ;;
1107 uploadsrc)
1108         PWD=`pwd`
1109         if [ -z $IPFIRE_USER ]; then
1110                 echo -n "You have to setup IPFIRE_USER first. See .config for details."
1111                 beautify message FAIL
1112                 exit 1
1113         fi
1114
1115         URL_SOURCE=$(grep URL_SOURCE lfs/Config | awk '{ print $3 }')
1116         REMOTE_FILES=$(echo "ls -1" | sftp -C ${IPFIRE_USER}@${URL_SOURCE})
1117
1118         for file in ${BASEDIR}/cache/*; do
1119                 [ -d "${file}" ] && continue
1120                 grep -q "$(basename ${file})" <<<$REMOTE_FILES && continue
1121                 NEW_FILES="$NEW_FILES $file"
1122         done
1123         [ -n "$NEW_FILES" ] && scp -2 $NEW_FILES ${IPFIRE_USER}@${URL_SOURCE}
1124         cd $BASEDIR
1125         cd $PWD
1126         exit 0
1127         ;;
1128 lang)
1129         update_langs
1130         ;;
1131 *)
1132         echo "Usage: $0 {build|changelog|clean|gettoolchain|downloadsrc|shell|sync|toolchain}"
1133         cat doc/make.sh-usage
1134         ;;
1135 esac