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