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