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