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