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