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