Merge branch 'sudo-without-pam' 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="78"                                               # Core Level (PAKFIRE)
30 GIT_BRANCH=`git rev-parse --abbrev-ref HEAD`                    # Git Branch
31 SLOGAN="www.ipfire.org"                                         # Software slogan
32 CONFIG_ROOT=/var/ipfire                                         # Configuration rootdir
33 NICE=10                                                         # Nice level
34 MAX_RETRIES=1                                                   # prefetch/check loop
35 BUILD_IMAGES=1                                                  # Flash and Xen Downloader
36 KVER=`grep --max-count=1 VER lfs/linux | awk '{ print $3 }'`
37 GIT_TAG=$(git tag | tail -1)                                    # Git Tag
38 GIT_LASTCOMMIT=$(git log | head -n1 | cut -d" " -f2 |head -c8)  # Last commit
39 TOOLCHAINVER=7
40
41 # New architecture variables
42 BUILD_ARCH="$(uname -m)"
43 BUILDMACHINE="${BUILD_ARCH}"
44
45 # Debian specific settings
46 if [ ! -e /etc/debian_version ]; then
47         FULLPATH=`which $0`
48 else
49         if [ -x /usr/bin/realpath ]; then
50                 FULLPATH=`/usr/bin/realpath $0`
51         else
52                 echo "ERROR: Need to do apt-get install realpath"
53                 exit 1
54         fi
55 fi
56
57 PWD=`pwd`
58 BASENAME=`basename $0`
59 BASEDIR=`echo $FULLPATH | sed "s/\/$BASENAME//g"`
60 LOGFILE=$BASEDIR/log/_build.preparation.log
61 export BASEDIR LOGFILE
62 DIR_CHK=$BASEDIR/cache/check
63 mkdir $BASEDIR/log/ 2>/dev/null
64
65 # Include funtions
66 . tools/make-functions
67
68 configure_target "default"
69
70 if [ -f .config ]; then
71         . .config
72 fi
73
74 if [ -z $EDITOR ]; then
75         for i in nano emacs vi; do
76                 EDITOR=$(which $i 2>/dev/null)
77                 if ! [ -z $EDITOR ]; then
78                         export EDITOR=$EDITOR
79                         break
80                 fi
81         done
82         [ -z $EDITOR ] && exiterror "You should have installed an editor."
83 fi
84
85 # Prepare string for /etc/system-release.
86 SYSTEM_RELEASE="${NAME} ${VERSION} (${MACHINE})"
87 if [ "$(git status -s | wc -l)" == "0" ]; then
88         GIT_STATUS=""
89 else
90         GIT_STATUS="-dirty"
91 fi
92 case "$GIT_BRANCH" in
93         core*|beta?|rc?)
94                 SYSTEM_RELEASE="${SYSTEM_RELEASE} - $GIT_BRANCH$GIT_STATUS"
95                 ;;
96         *)
97                 SYSTEM_RELEASE="${SYSTEM_RELEASE} - Development Build: $GIT_BRANCH/$GIT_LASTCOMMIT$GIT_STATUS"
98                 ;;
99 esac
100
101 prepareenv() {
102     ############################################################################
103     #                                                                          #
104     # Are we running the right shell?                                          #
105     #                                                                          #
106     ############################################################################
107     if [ ! "$BASH" ]; then
108                         exiterror "BASH environment variable is not set.  You're probably running the wrong shell."
109     fi
110
111     if [ -z "${BASH_VERSION}" ]; then
112                         exiterror "Not running BASH shell."
113     fi
114
115
116     ############################################################################
117     #                                                                          #
118     # Trap on emergency exit                                                   #
119     #                                                                          #
120     ############################################################################
121     trap "exiterror 'Build process interrupted'" SIGINT SIGTERM SIGKILL SIGSTOP SIGQUIT
122
123
124     ############################################################################
125     #                                                                          #
126     # Resetting our nice level                                                 #
127     #                                                                          #
128     ############################################################################
129     echo -ne "Resetting our nice level to $NICE" | tee -a $LOGFILE
130     renice $NICE $$ > /dev/null
131     if [ `nice` != "$NICE" ]; then
132                         beautify message FAIL
133                         exiterror "Failed to set correct nice level"
134     else
135                         beautify message DONE
136     fi
137
138
139     ############################################################################
140     #                                                                          #
141     # Checking if running as root user                                         #
142     #                                                                          #
143     ############################################################################
144     echo -ne "Checking if we're running as root user" | tee -a $LOGFILE
145     if [ `id -u` != 0 ]; then
146                         beautify message FAIL
147                         exiterror "Not building as root"
148     else
149                         beautify message DONE
150     fi
151
152
153     ############################################################################
154     #                                                                          #
155     # Checking for necessary temporary space                                   #
156     #                                                                          #
157     ############################################################################
158     echo -ne "Checking for necessary space on disk $BASE_DEV" | tee -a $LOGFILE
159     BASE_DEV=`df -P -k $BASEDIR | tail -n 1 | awk '{ print $1 }'`
160     BASE_ASPACE=`df -P -k $BASEDIR | tail -n 1 | awk '{ print $4 }'`
161     if (( 2048000 > $BASE_ASPACE )); then
162                         BASE_USPACE=`du -skx $BASEDIR | awk '{print $1}'`
163                         if (( 2048000 - $BASE_USPACE > $BASE_ASPACE )); then
164                                 beautify message FAIL
165                                 exiterror "Not enough temporary space available, need at least 2GB on $BASE_DEV"
166                         fi
167     else
168                         beautify message DONE
169     fi
170
171     ############################################################################
172     #                                                                          #
173     # Building Linux From Scratch system                                       #
174     #                                                                          #
175     ############################################################################
176     # Set umask
177     umask 022
178
179     # Set LFS Directory
180     LFS=$BASEDIR/build
181
182     # Check /tools symlink
183     if [ -h /tools ]; then
184         rm -f /tools
185     fi
186     if [ ! -a /tools ]; then
187                         ln -s $BASEDIR/build/tools /
188     fi
189     if [ ! -h /tools ]; then
190                         exiterror "Could not create /tools symbolic link."
191     fi
192
193     # Setup environment
194     set +h
195     LC_ALL=POSIX
196     if [ -z $MAKETUNING ]; then
197         CPU_COUNT="$(getconf _NPROCESSORS_ONLN 2>/dev/null)"
198         if [ -z "${CPU_COUNT}" ]; then
199                 CPU_COUNT=1
200         fi
201
202         MAKETUNING="-j$(( ${CPU_COUNT} * 2 + 1 ))"
203     fi
204     export LFS LC_ALL CFLAGS CXXFLAGS MAKETUNING
205     unset CC CXX CPP LD_LIBRARY_PATH LD_PRELOAD
206
207     # Make some extra directories
208     mkdir -p $BASEDIR/build/{tools,etc,usr/src} 2>/dev/null
209     mkdir -p $BASEDIR/build/{dev/{shm,pts},proc,sys}
210     mkdir -p $BASEDIR/{cache,ccache} 2>/dev/null
211     mkdir -p $BASEDIR/build/usr/src/{cache,config,doc,html,langs,lfs,log,src,ccache}
212
213     mknod -m 600 $BASEDIR/build/dev/console c 5 1 2>/dev/null
214     mknod -m 666 $BASEDIR/build/dev/null c 1 3 2>/dev/null
215
216     # Make all sources and proc available under lfs build
217     mount --bind /dev            $BASEDIR/build/dev
218     mount --bind /dev/pts        $BASEDIR/build/dev/pts
219     mount --bind /dev/shm        $BASEDIR/build/dev/shm
220     mount --bind /proc           $BASEDIR/build/proc
221     mount --bind /sys            $BASEDIR/build/sys
222     mount --bind $BASEDIR/cache  $BASEDIR/build/usr/src/cache
223     mount --bind $BASEDIR/ccache $BASEDIR/build/usr/src/ccache
224     mount --bind $BASEDIR/config $BASEDIR/build/usr/src/config
225     mount --bind $BASEDIR/doc    $BASEDIR/build/usr/src/doc
226     mount --bind $BASEDIR/html   $BASEDIR/build/usr/src/html
227     mount --bind $BASEDIR/langs  $BASEDIR/build/usr/src/langs
228     mount --bind $BASEDIR/lfs    $BASEDIR/build/usr/src/lfs
229     mount --bind $BASEDIR/log    $BASEDIR/build/usr/src/log
230     mount --bind $BASEDIR/src    $BASEDIR/build/usr/src/src
231
232     # Run LFS static binary creation scripts one by one
233     export CCACHE_DIR=$BASEDIR/ccache
234     export CCACHE_COMPRESS=1
235     export CCACHE_COMPILERCHECK="none"
236
237     # Remove pre-install list of installed files in case user erase some files before rebuild
238     rm -f $BASEDIR/build/usr/src/lsalr 2>/dev/null
239 }
240
241 buildtoolchain() {
242     local error=false
243     case "${TARGET_ARCH}:${BUILD_ARCH}" in
244         # x86
245         i586:i586|i586:i686|i586:x86_64)
246             # These are working.
247             ;;
248         i586:*)
249             error=true
250             ;;
251
252         # ARM
253         armv5tel:armv5tel|armv5tel:armv5tejl|armv5tel:armv6l|armv5tel:armv7l)
254             # These are working.
255             ;;
256         armv5tel:*)
257             error=true
258             ;;
259     esac
260
261     ${error} && \
262         exiterror "Cannot build ${MACHINE} toolchain on $(uname -m). Please use the download if any."
263
264     local gcc=$(type -p gcc)
265     if [ -z "${gcc}" ]; then
266         exiterror "Could not find GCC. You will need a working build enviroment in order to build the toolchain."
267     fi
268
269     LOGFILE="$BASEDIR/log/_build.toolchain.log"
270     export LOGFILE
271
272     local ORG_PATH=$PATH
273     export PATH="/tools/ccache/bin:/tools/bin:$PATH"
274     lfsmake1 ccache                     PASS=1
275     lfsmake1 binutils                   PASS=1
276     lfsmake1 gcc                        PASS=1
277     lfsmake1 linux                      TOOLS=1 KCFG="-headers"
278     lfsmake1 glibc
279     lfsmake1 cleanup-toolchain          PASS=1
280     lfsmake1 binutils                   PASS=2
281     lfsmake1 gcc                        PASS=2
282     lfsmake1 ccache                     PASS=2
283     lfsmake1 tcl
284     lfsmake1 expect
285     lfsmake1 dejagnu
286     lfsmake1 ncurses
287     lfsmake1 bash
288     lfsmake1 bzip2
289     lfsmake1 coreutils
290     lfsmake1 diffutils
291     lfsmake1 findutils
292     lfsmake1 gawk
293     lfsmake1 gettext
294     lfsmake1 grep
295     lfsmake1 gzip
296     lfsmake1 m4
297     lfsmake1 make
298     lfsmake1 patch
299     lfsmake1 perl
300     lfsmake1 sed
301     lfsmake1 tar
302     lfsmake1 texinfo
303     lfsmake1 xz
304     lfsmake1 fake-environ
305     lfsmake1 cleanup-toolchain          PASS=2
306     export PATH=$ORG_PATH
307 }
308
309 buildbase() {
310     LOGFILE="$BASEDIR/log/_build.base.log"
311     export LOGFILE
312     lfsmake2 stage2
313     lfsmake2 linux                      KCFG="-headers"
314     lfsmake2 man-pages
315     lfsmake2 glibc
316     lfsmake2 tzdata
317     lfsmake2 cleanup-toolchain          PASS=3
318     lfsmake2 zlib
319     lfsmake2 binutils
320     lfsmake2 gmp
321     lfsmake2 gmp-compat
322     lfsmake2 mpfr
323     lfsmake2 file
324     lfsmake2 gcc
325     lfsmake2 sed
326     lfsmake2 berkeley
327     lfsmake2 coreutils
328     lfsmake2 iana-etc
329     lfsmake2 m4
330     lfsmake2 bison
331     lfsmake2 ncurses
332     lfsmake2 procps
333     lfsmake2 libtool
334     lfsmake2 perl
335     lfsmake2 readline
336     lfsmake2 readline-compat
337     lfsmake2 pcre
338     lfsmake2 pcre-compat
339     lfsmake2 autoconf
340     lfsmake2 automake
341     lfsmake2 bash
342     lfsmake2 bzip2
343     lfsmake2 diffutils
344     lfsmake2 e2fsprogs
345     lfsmake2 ed
346     lfsmake2 findutils
347     lfsmake2 flex
348     lfsmake2 gawk
349     lfsmake2 gettext
350     lfsmake2 grep
351     lfsmake2 groff
352     lfsmake2 gperf
353     lfsmake2 gzip
354     lfsmake2 inetutils
355     lfsmake2 iproute2
356     lfsmake2 jwhois
357     lfsmake2 kbd
358     lfsmake2 less
359     lfsmake2 make
360     lfsmake2 man
361     lfsmake2 mktemp
362     lfsmake2 kmod
363     lfsmake2 net-tools
364     lfsmake2 patch
365     lfsmake2 psmisc
366     lfsmake2 shadow
367     lfsmake2 sysklogd
368     lfsmake2 sysvinit
369     lfsmake2 tar
370     lfsmake2 texinfo
371     lfsmake2 util-linux
372     lfsmake2 udev
373     lfsmake2 vim
374     lfsmake2 xz
375     lfsmake2 paxctl
376     lfsmake2 grub
377 }
378
379 buildipfire() {
380   LOGFILE="$BASEDIR/log/_build.ipfire.log"
381   export LOGFILE
382   ipfiremake configroot
383   ipfiremake backup
384   ipfiremake bind
385   ipfiremake dhcp
386   ipfiremake dhcpcd
387   ipfiremake libusb
388   ipfiremake libusbx
389   ipfiremake libpcap
390   ipfiremake ppp
391   ipfiremake pptp
392   ipfiremake unzip
393   ipfiremake which
394   ipfiremake linux-firmware
395   ipfiremake dvb-firmwares
396   ipfiremake zd1211-firmware
397   ipfiremake rpi-firmware
398   ipfiremake bc
399   ipfiremake u-boot
400
401   case "${TARGET_ARCH}" in
402         i586)
403                 # x86-pae (Native and new XEN) kernel build
404                 ipfiremake linux                        KCFG="-pae"
405 #               ipfiremake kvm-kmod                     KCFG="-pae"
406 #               ipfiremake v4l-dvb                      KCFG="-pae"
407 #               ipfiremake mISDN                        KCFG="-pae"
408                 ipfiremake cryptodev                    KCFG="-pae"
409 #               ipfiremake compat-drivers               KCFG="-pae"
410 #               ipfiremake r8169                        KCFG="-pae"
411 #               ipfiremake r8168                        KCFG="-pae"
412 #               ipfiremake r8101                        KCFG="-pae"
413                 ipfiremake e1000e                       KCFG="-pae"
414                 ipfiremake igb                          KCFG="-pae"
415
416                 # x86 kernel build
417                 ipfiremake linux                        KCFG=""
418 #               ipfiremake kvm-kmod                     KCFG=""
419 #               ipfiremake v4l-dvb                      KCFG=""
420 #               ipfiremake mISDN                        KCFG=""
421                 ipfiremake cryptodev                    KCFG=""
422 #               ipfiremake compat-drivers               KCFG=""
423 #               ipfiremake r8169                        KCFG=""
424 #               ipfiremake r8168                        KCFG=""
425 #               ipfiremake r8101                        KCFG=""
426                 ipfiremake e1000e                       KCFG=""
427                 ipfiremake igb                          KCFG=""
428                 ;;
429
430         armv5tel)
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   esac
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 while [ $# -gt 0 ]; do
901         case "${1}" in
902                 --target=*)
903                         configure_target "${1#--target=}"
904                         ;;
905                 -*)
906                         exiterror "Unknown configuration option: ${1}"
907                         ;;
908                 *)
909                         # Found a command, so exit options parsing.
910                         break
911                         ;;
912         esac
913         shift
914 done
915
916 # See what we're supposed to do
917 case "$1" in 
918 build)
919         clear
920         PACKAGE=`ls -v -r $BASEDIR/cache/toolchains/$SNAME-$VERSION-toolchain-$TOOLCHAINVER-$MACHINE.tar.gz 2> /dev/null | head -n 1`
921         #only restore on a clean disk
922         if [ ! -f log/cleanup-toolchain-2-tools ]; then
923                 if [ ! -n "$PACKAGE" ]; then
924                         beautify build_stage "Full toolchain compilation - Native GCC: `gcc --version | grep GCC | awk {'print $3'}`"
925                         prepareenv
926                         buildtoolchain
927                 else
928                         PACKAGENAME=${PACKAGE%.tar.gz}
929                         beautify build_stage "Packaged toolchain compilation"
930                         if [ `md5sum $PACKAGE | awk '{print $1}'` == `cat $PACKAGENAME.md5 | awk '{print $1}'` ]; then
931                                 tar zxf $PACKAGE
932                                 prepareenv
933                         else
934                                 exiterror "$PACKAGENAME md5 did not match, check downloaded package"
935                         fi
936                 fi
937         else
938                 echo -n "Using installed toolchain" | tee -a $LOGFILE
939                 beautify message SKIP
940                 prepareenv
941         fi
942
943         beautify build_start
944         beautify build_stage "Building LFS"
945         buildbase
946
947         beautify build_stage "Building IPFire"
948         buildipfire
949
950         beautify build_stage "Building installer"
951         buildinstaller
952
953         beautify build_stage "Building packages"
954         buildpackages
955         
956         beautify build_stage "Checking Logfiles for new Files"
957
958         cd $BASEDIR
959         tools/checknewlog.pl
960         tools/checkwronginitlinks
961         cd $PWD
962
963         beautify build_end
964         ;;
965 shell)
966         # enter a shell inside LFS chroot
967         # may be used to changed kernel settings
968         prepareenv
969         entershell
970         ;;
971 clean)
972         echo -en "${BOLD}Cleaning build directory...${NORMAL}"
973         for i in `mount | grep $BASEDIR | sed 's/^.*loop=\(.*\))/\1/'`; do
974                 $LOSETUP -d $i 2>/dev/null
975         done
976         for i in `mount | grep $BASEDIR | cut -d " " -f 1`; do
977                 umount $i
978         done
979         stdumount
980         for i in `seq 0 7`; do
981             if ( losetup /dev/loop${i} 2>/dev/null | grep -q "/install/images" ); then
982                 umount /dev/loop${i}     2>/dev/null;
983                 losetup -d /dev/loop${i} 2>/dev/null;
984             fi;
985         done
986         rm -rf $BASEDIR/build
987         rm -rf $BASEDIR/cdrom
988         rm -rf $BASEDIR/packages
989         rm -rf $BASEDIR/log
990         if [ -h /tools ]; then
991                 rm -f /tools
992         fi
993         rm -f $BASEDIR/ipfire-*
994         beautify message DONE
995         ;;
996 downloadsrc)
997         if [ ! -d $BASEDIR/cache ]; then
998                 mkdir $BASEDIR/cache
999         fi
1000         mkdir -p $BASEDIR/log
1001         echo -e "${BOLD}Preload all source files${NORMAL}" | tee -a $LOGFILE
1002         FINISHED=0
1003         cd $BASEDIR/lfs
1004         for c in `seq $MAX_RETRIES`; do
1005                 if (( FINISHED==1 )); then 
1006                         break
1007                 fi
1008                 FINISHED=1
1009                 cd $BASEDIR/lfs
1010                 for i in *; do
1011                         if [ -f "$i" -a "$i" != "Config" ]; then
1012                                 lfsmakecommoncheck ${i} || continue
1013
1014                                 make -s -f $i LFS_BASEDIR=$BASEDIR MACHINE=$MACHINE \
1015                                         MESSAGE="$i\t ($c/$MAX_RETRIES)" download >> $LOGFILE 2>&1
1016                                 if [ $? -ne 0 ]; then
1017                                         beautify message FAIL
1018                                         FINISHED=0
1019                                 else
1020                                         if [ $c -eq 1 ]; then
1021                                         beautify message DONE
1022                                         fi
1023                                 fi
1024                         fi
1025                 done
1026         done
1027         echo -e "${BOLD}***Verifying md5sums${NORMAL}"
1028         ERROR=0
1029         for i in *; do
1030                 if [ -f "$i" -a "$i" != "Config" ]; then
1031                         lfsmakecommoncheck ${i} > /dev/null || continue
1032                         make -s -f $i LFS_BASEDIR=$BASEDIR MACHINE=$MACHINE \
1033                                 MESSAGE="$i\t " md5 >> $LOGFILE 2>&1
1034                         if [ $? -ne 0 ]; then
1035                                 echo -ne "MD5 difference in lfs/$i"
1036                                 beautify message FAIL
1037                                 ERROR=1
1038                         fi
1039                 fi
1040         done
1041         if [ $ERROR -eq 0 ]; then
1042                 echo -ne "${BOLD}all files md5sum match${NORMAL}"
1043                 beautify message DONE
1044         else
1045                 echo -ne "${BOLD}not all files were correctly download${NORMAL}"
1046                 beautify message FAIL
1047         fi
1048         cd - >/dev/null 2>&1
1049         ;;
1050 toolchain)
1051         clear
1052         prepareenv
1053         beautify build_stage "Toolchain compilation - Native GCC: `gcc --version | grep GCC | awk {'print $3'}`"
1054         buildtoolchain
1055         echo "`date -u '+%b %e %T'`: Create toolchain tar.gz for $MACHINE" | tee -a $LOGFILE
1056         test -d $BASEDIR/cache/toolchains || mkdir -p $BASEDIR/cache/toolchains
1057         cd $BASEDIR && tar -zc --exclude='log/_build.*.log' -f cache/toolchains/$SNAME-$VERSION-toolchain-$TOOLCHAINVER-$MACHINE.tar.gz \
1058                 build/tools build/bin/sh log >> $LOGFILE
1059         md5sum cache/toolchains/$SNAME-$VERSION-toolchain-$TOOLCHAINVER-$MACHINE.tar.gz \
1060                 > cache/toolchains/$SNAME-$VERSION-toolchain-$TOOLCHAINVER-$MACHINE.md5
1061         stdumount
1062         ;;
1063 gettoolchain)
1064         # arbitrary name to be updated in case of new toolchain package upload
1065         PACKAGE=$SNAME-$VERSION-toolchain-$TOOLCHAINVER-$MACHINE
1066         if [ ! -f $BASEDIR/cache/toolchains/$PACKAGE.tar.gz ]; then
1067                 URL_TOOLCHAIN=`grep URL_TOOLCHAIN lfs/Config | awk '{ print $3 }'`
1068                 test -d $BASEDIR/cache/toolchains || mkdir -p $BASEDIR/cache/toolchains
1069                 echo "`date -u '+%b %e %T'`: Load toolchain tar.gz for $MACHINE" | tee -a $LOGFILE
1070                 cd $BASEDIR/cache/toolchains
1071                 wget -U "IPFireSourceGrabber/2.x" $URL_TOOLCHAIN/$PACKAGE.tar.gz $URL_TOOLCHAIN/$PACKAGE.md5 >& /dev/null
1072                 if [ $? -ne 0 ]; then
1073                         echo "`date -u '+%b %e %T'`: error downloading $PACKAGE toolchain for $MACHINE machine" | tee -a $LOGFILE
1074                 else
1075                         if [ "`md5sum $PACKAGE.tar.gz | awk '{print $1}'`" = "`cat $PACKAGE.md5 | awk '{print $1}'`" ]; then
1076                                 echo "`date -u '+%b %e %T'`: toolchain md5 ok" | tee -a $LOGFILE
1077                         else
1078                                 exiterror "$PACKAGE.md5 did not match, check downloaded package"
1079                         fi
1080                 fi
1081         else
1082                 echo "Toolchain is already downloaded. Exiting..."
1083         fi
1084         ;;
1085 othersrc)
1086         prepareenv
1087         echo -ne "`date -u '+%b %e %T'`: Build sources iso for $MACHINE" | tee -a $LOGFILE
1088         chroot $LFS /tools/bin/env -i   HOME=/root \
1089         TERM=$TERM PS1='\u:\w\$ ' \
1090         PATH=/usr/local/bin:/bin:/usr/bin:/sbin:/usr/sbin \
1091         VERSION=$VERSION NAME="$NAME" SNAME="$SNAME" MACHINE=$MACHINE \
1092         /bin/bash -x -c "cd /usr/src/lfs && make -f sources-iso LFS_BASEDIR=/usr/src install" >>$LOGFILE 2>&1
1093         mv $LFS/install/images/ipfire-* $BASEDIR >> $LOGFILE 2>&1
1094         if [ $? -eq "0" ]; then
1095                 beautify message DONE
1096         else
1097                 beautify message FAIL
1098         fi
1099         stdumount
1100         ;;
1101 uploadsrc)
1102         PWD=`pwd`
1103         if [ -z $IPFIRE_USER ]; then
1104                 echo -n "You have to setup IPFIRE_USER first. See .config for details."
1105                 beautify message FAIL
1106                 exit 1
1107         fi
1108
1109         URL_SOURCE=$(grep URL_SOURCE lfs/Config | awk '{ print $3 }')
1110         REMOTE_FILES=$(echo "ls -1" | sftp -C ${IPFIRE_USER}@${URL_SOURCE})
1111
1112         for file in ${BASEDIR}/cache/*; do
1113                 [ -d "${file}" ] && continue
1114                 grep -q "$(basename ${file})" <<<$REMOTE_FILES && continue
1115                 NEW_FILES="$NEW_FILES $file"
1116         done
1117         [ -n "$NEW_FILES" ] && scp -2 $NEW_FILES ${IPFIRE_USER}@${URL_SOURCE}
1118         cd $BASEDIR
1119         cd $PWD
1120         exit 0
1121         ;;
1122 lang)
1123         update_langs
1124         ;;
1125 *)
1126         echo "Usage: $0 {build|changelog|clean|gettoolchain|downloadsrc|shell|sync|toolchain}"
1127         cat doc/make.sh-usage
1128         ;;
1129 esac