Merge branch 'next' into thirteen
[people/pmueller/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="63"                                                       # Core Level (Filename)
29 PAKFIRE_CORE="62"                                               # 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=5
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 linux2                     TOOLS=1 HEADERS=1
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 linux2                     HEADERS=1
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 zd1211-firmware
376   ipfiremake rpi-firmware
377   ipfiremake u-boot
378
379   # The xen and PAE kernels are only available for x86
380   if [ "${MACHINE_TYPE}" != "arm" ]; then
381     ipfiremake linux2                   KCFG="-xen"
382     ipfiremake v4l-dvb                  KCFG="-xen"
383 #    ipfiremake mISDN                   KCFG="-xen"
384     ipfiremake cryptodev                KCFG="-xen"
385     ipfiremake compat-wireless          KCFG="-xen"
386 #    ipfiremake r8169                   KCFG="-xen"
387 #    ipfiremake r8168                   KCFG="-xen"
388 #    ipfiremake r8101                   KCFG="-xen"
389 #    ipfiremake e1000                   KCFG="-xen"
390 #    ipfiremake e1000e                  KCFG="-xen"
391 #    ipfiremake igb                     KCFG="-xen"
392
393     ipfiremake linux                    KCFG="-pae"
394 #    ipfiremake kvm-kmod                        KCFG="-pae"
395     ipfiremake v4l-dvb                  KCFG="-pae"
396     ipfiremake alsa                     KCFG="-pae" KMOD=1
397 #    ipfiremake mISDN                   KCFG="-pae"
398     ipfiremake cryptodev                KCFG="-pae"
399     ipfiremake compat-wireless          KCFG="-pae"
400 #    ipfiremake r8169                   KCFG="-pae"
401 #    ipfiremake r8168                   KCFG="-pae"
402 #    ipfiremake r8101                   KCFG="-pae"
403 #    ipfiremake e1000                   KCFG="-pae"
404 #    ipfiremake e1000e                  KCFG="-pae"
405 #    ipfiremake igb                     KCFG="-pae"
406
407     ipfiremake linux                    KCFG=""
408 #    ipfiremake kvm-kmod                        KCFG=""
409     ipfiremake v4l-dvb                  KCFG=""
410     ipfiremake alsa                     KCFG="" KMOD=1
411 #    ipfiremake mISDN                   KCFG=""
412     ipfiremake cryptodev                KCFG=""
413     ipfiremake compat-wireless          KCFG=""
414 #    ipfiremake r8169                   KCFG=""
415 #    ipfiremake r8168                   KCFG=""
416 #    ipfiremake r8101                   KCFG=""
417 #    ipfiremake e1000                   KCFG=""
418 #    ipfiremake e1000e                  KCFG=""
419 #    ipfiremake igb                     KCFG=""
420
421   else
422     # arm-omap kernel build
423     ipfiremake linux                    KCFG="-rpi"
424     ipfiremake v4l-dvb                  KCFG="-rpi"
425 #    ipfiremake kvm-kmod                        KCFG="-rpi"
426 #    ipfiremake mISDN                   KCFG="-rpi"
427     ipfiremake cryptodev                KCFG="-rpi"
428     ipfiremake compat-wireless          KCFG="-rpi"
429 #    ipfiremake r8169                   KCFG="-rpi"
430 #    ipfiremake r8168                   KCFG="-rpi"
431 #    ipfiremake r8101                   KCFG="-rpi"
432 #    ipfiremake e1000                   KCFG="-rpi"
433 #    ipfiremake e1000e                  KCFG="-rpi"
434 #    ipfiremake igb                     KCFG="-rpi"
435
436     ipfiremake linux                    KCFG="-omap"
437     ipfiremake v4l-dvb                  KCFG="-omap"
438 #    ipfiremake kvm-kmod                        KCFG="-omap"
439 #    ipfiremake mISDN                   KCFG="-omap"
440     ipfiremake cryptodev                KCFG="-omap"
441     ipfiremake compat-wireless          KCFG="-omap"
442 #    ipfiremake r8169                   KCFG="-omap"
443 #    ipfiremake r8168                   KCFG="-omap"
444 #    ipfiremake r8101                   KCFG="-omap"
445 #    ipfiremake e1000                   KCFG="-omap"
446 #    ipfiremake e1000e                  KCFG="-omap"
447 #    ipfiremake igb                     KCFG="-omap"
448
449     # arm-kirkwood kernel build
450     ipfiremake linux                    KCFG="-kirkwood"
451     ipfiremake v4l-dvb                  KCFG="-kirkwood"
452 #    ipfiremake kvm-kmod                        KCFG="-kirkwood"
453 #    ipfiremake mISDN                   KCFG="-kirkwood"
454     ipfiremake cryptodev                KCFG="-kirkwood"
455     ipfiremake compat-wireless          KCFG="-kirkwood"
456 #    ipfiremake r8169                   KCFG="-kirkwood"
457 #    ipfiremake r8168                   KCFG="-kirkwood"
458 #    ipfiremake r8101                   KCFG="-kirkwood"
459 #    ipfiremake e1000                   KCFG="-kirkwood"
460 #    ipfiremake e1000e                  KCFG="-kirkwood"
461 #    ipfiremake igb                     KCFG="-kirkwood"
462
463   fi
464   ipfiremake pkg-config
465   ipfiremake linux-atm
466   ipfiremake cpio
467   ipfiremake dracut
468   ipfiremake expat
469   ipfiremake gdbm
470   ipfiremake pam
471   ipfiremake openssl
472   ipfiremake curl
473   ipfiremake tcl
474   ipfiremake sqlite
475   ipfiremake python
476   ipfiremake fireinfo
477   ipfiremake libnet
478   ipfiremake libnl
479   ipfiremake libidn
480   ipfiremake libjpeg
481   ipfiremake libexif
482   ipfiremake libpng
483   ipfiremake libtiff
484   ipfiremake libart
485   ipfiremake freetype
486   ipfiremake gd
487   ipfiremake popt
488   ipfiremake pcre
489   ipfiremake slang
490   ipfiremake newt
491   ipfiremake attr
492   ipfiremake acl
493   ipfiremake libcap
494   ipfiremake pciutils
495   ipfiremake usbutils
496   ipfiremake libxml2
497   ipfiremake libxslt
498   ipfiremake BerkeleyDB
499   ipfiremake mysql
500   ipfiremake cyrus-sasl
501   ipfiremake openldap
502   ipfiremake apache2
503   ipfiremake php
504   ipfiremake apache2                    PASS=C
505   ipfiremake arping
506   ipfiremake beep
507   ipfiremake dvdrtools
508   ipfiremake dnsmasq
509   ipfiremake dosfstools
510   ipfiremake reiserfsprogs
511   ipfiremake xfsprogs
512   ipfiremake sysfsutils
513   ipfiremake fuse
514   ipfiremake ntfs-3g
515   ipfiremake ethtool
516   ipfiremake ez-ipupdate
517   ipfiremake fcron
518   ipfiremake perl-GD
519   ipfiremake GD-Graph
520   ipfiremake GD-TextUtil
521   ipfiremake gnupg
522   ipfiremake hdparm
523   ipfiremake sdparm
524   ipfiremake mtools
525   ipfiremake initscripts
526   ipfiremake whatmask
527   ipfiremake iptables
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 kudzu
536   ipfiremake logrotate
537   ipfiremake logwatch
538   ipfiremake misc-progs
539   ipfiremake nano
540   ipfiremake nasm
541   ipfiremake URI
542   ipfiremake HTML-Tagset
543   ipfiremake HTML-Parser
544   ipfiremake Compress-Zlib
545   ipfiremake Digest
546   ipfiremake Digest-SHA1
547   ipfiremake Digest-HMAC
548   ipfiremake libwww-perl
549   ipfiremake Net-DNS
550   ipfiremake Net-IPv4Addr
551   ipfiremake Net_SSLeay
552   ipfiremake IO-Stringy
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 cups
604   ipfiremake ghostscript
605   ipfiremake foomatic
606   ipfiremake hplip
607   ipfiremake samba
608   ipfiremake sudo
609   ipfiremake mc
610   ipfiremake wget
611   ipfiremake bridge-utils
612   ipfiremake screen
613   ipfiremake smartmontools
614   ipfiremake htop
615   ipfiremake postfix
616   ipfiremake fetchmail
617   ipfiremake cyrus-imapd
618   ipfiremake openmailadmin
619   ipfiremake clamav
620   ipfiremake spamassassin
621   ipfiremake amavisd
622   ipfiremake alsa
623   ipfiremake mpfire
624   ipfiremake guardian
625   ipfiremake libid3tag
626   ipfiremake libmad
627   ipfiremake libogg
628   ipfiremake libvorbis
629   ipfiremake libdvbpsi
630   ipfiremake flac
631   ipfiremake lame
632   ipfiremake sox
633   ipfiremake libshout
634   ipfiremake xvid
635   ipfiremake libmpeg2
636   ipfiremake cmake
637   ipfiremake gnump3d
638   ipfiremake libsigc++
639   ipfiremake libtorrent
640   ipfiremake rtorrent
641   ipfiremake ipfireseeder
642   ipfiremake rsync
643   ipfiremake tcpwrapper
644   ipfiremake libevent
645   ipfiremake libevent2
646   ipfiremake portmap
647   ipfiremake nfs
648   ipfiremake nmap
649   ipfiremake ncftp
650   ipfiremake etherwake
651   ipfiremake bwm-ng
652   ipfiremake tripwire
653   ipfiremake sysstat
654   ipfiremake vsftpd
655   ipfiremake strongswan
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 videolan
680   ipfiremake vdr
681   ipfiremake w_scan
682   ipfiremake icecast
683   ipfiremake icegenerator
684   ipfiremake mpd
685   ipfiremake libmpdclient
686   ipfiremake mpc
687   ipfiremake git
688   ipfiremake squidclamav
689   ipfiremake bc
690   ipfiremake vnstat
691   ipfiremake vnstati
692   ipfiremake iw
693   ipfiremake wpa_supplicant
694   ipfiremake hostapd
695   ipfiremake urlgrabber
696   ipfiremake syslinux
697   ipfiremake tftpd
698   ipfiremake cpufrequtils
699   ipfiremake dbus
700   ipfiremake bluetooth
701   ipfiremake gutenprint
702   ipfiremake apcupsd
703   ipfiremake iperf
704   ipfiremake netcat
705   ipfiremake 7zip
706   ipfiremake lynis
707   ipfiremake streamripper
708   ipfiremake sshfs
709   ipfiremake taglib
710   ipfiremake mediatomb
711   ipfiremake sslh
712   ipfiremake perl-gettext
713   ipfiremake vdradmin
714   ipfiremake miau
715   ipfiremake netsnmpd
716   ipfiremake perl-DBI
717   ipfiremake perl-DBD-mysql
718   ipfiremake cacti
719   ipfiremake icecc
720   ipfiremake openvmtools
721   ipfiremake nagiosql
722   ipfiremake iftop
723   ipfiremake motion
724   ipfiremake joe
725   ipfiremake nut
726   ipfiremake watchdog
727   ipfiremake libpri
728   ipfiremake asterisk
729   ipfiremake lcr
730   ipfiremake usb_modeswitch
731   ipfiremake usb_modeswitch_data
732   ipfiremake zerofree
733   ipfiremake mdadm
734   ipfiremake eject
735   ipfiremake pound
736   ipfiremake minicom
737   ipfiremake ddrescue
738   ipfiremake imspector
739   ipfiremake miniupnpd
740   ipfiremake client175
741   ipfiremake powertop
742   ipfiremake parted
743   ipfiremake swig
744   ipfiremake python-m2crypto
745   ipfiremake wireless-regdb
746   ipfiremake crda
747   ipfiremake libsolv
748   ipfiremake python-distutils-extra
749   ipfiremake python-lzma
750   ipfiremake python-progressbar
751   ipfiremake python-xattr
752   ipfiremake intltool
753   ipfiremake pakfire3-deps
754   ipfiremake transmission
755   ipfiremake dpfhack
756   ipfiremake lcd4linux
757   ipfiremake mtr
758   ipfiremake tcpick
759   ipfiremake minidlna
760   ipfiremake acpid
761   ipfiremake fping
762   ipfiremake telnet
763   echo Build on $HOSTNAME > $BASEDIR/build/var/ipfire/firebuild
764   cat /proc/version >> $BASEDIR/build/var/ipfire/firebuild
765   echo >> $BASEDIR/build/var/ipfire/firebuild
766   git log -1 >> $BASEDIR/build/var/ipfire/firebuild
767   echo >> $BASEDIR/build/var/ipfire/firebuild
768   git status >> $BASEDIR/build/var/ipfire/firebuild
769   echo >> $BASEDIR/build/var/ipfire/firebuild
770   cat /proc/cpuinfo >> $BASEDIR/build/var/ipfire/firebuild
771   echo $PAKFIRE_CORE > $BASEDIR/build/opt/pakfire/db/core/mine
772   if [ "$GIT_BRANCH" = "master" -o "$GIT_BRANCH" = "next" ]; then
773         echo "$NAME $VERSION ($MACHINE) - Development Build: $GIT_LASTCOMMIT" > $BASEDIR/build/etc/system-release
774   else
775         echo "$NAME $VERSION ($MACHINE) - $GIT_BRANCH" > $BASEDIR/build/etc/system-release
776   fi
777 }
778
779 buildinstaller() {
780   # Run installer scripts one by one
781   LOGFILE="$BASEDIR/log/_build.installer.log"
782   export LOGFILE
783   ipfiremake as86
784   ipfiremake mbr
785   ipfiremake memtest
786   ipfiremake installer
787   installmake strip
788   ipfiremake initrd
789 }
790
791 buildpackages() {
792   LOGFILE="$BASEDIR/log/_build.packages.log"
793   export LOGFILE
794   echo "... see detailed log in _build.*.log files" >> $LOGFILE
795
796   
797   # Generating list of packages used
798   echo -n "Generating packages list from logs" | tee -a $LOGFILE
799   rm -f $BASEDIR/doc/packages-list
800   for i in `ls -1tr $BASEDIR/log/[^_]*`; do
801         if [ "$i" != "$BASEDIR/log/FILES" -a -n $i ]; then
802                 echo "* `basename $i`" >>$BASEDIR/doc/packages-list
803         fi
804   done
805   echo "== List of softwares used to build $NAME Version: $VERSION ==" > $BASEDIR/doc/packages-list.txt
806   grep -v 'configroot$\|img$\|initrd$\|initscripts$\|installer$\|install$\|setup$\|pakfire$\|stage2$\|smp$\|tools$\|tools1$\|tools2$\|.tgz$\|-config$\|_missing_rootfile$\|install1$\|install2$\|pass1$\|pass2$\|pass3$' \
807         $BASEDIR/doc/packages-list | sort >> $BASEDIR/doc/packages-list.txt
808   rm -f $BASEDIR/doc/packages-list
809   # packages-list.txt is ready to be displayed for wiki page
810   beautify message DONE
811   
812   # Update changelog
813   cd $BASEDIR
814   [ -z $GIT_TAG ]  || LAST_TAG=$GIT_TAG
815   [ -z $LAST_TAG ] || EXT="$LAST_TAG..HEAD"
816   git log -n 500 --no-merges --pretty=medium --shortstat $EXT > $BASEDIR/doc/ChangeLog
817
818   # Create images for install
819   ipfiremake cdrom
820
821   # Check if there is a loop device for building in virtual environments
822   if [ $BUILD_IMAGES == 1 ] && ([ -e /dev/loop/0 ] || [ -e /dev/loop0 ]); then
823         if [ "${MACHINE_TYPE}" != "arm" ]; then
824                 ipfiremake usb-stick
825         fi
826         ipfiremake flash-images
827   fi
828
829   mv $LFS/install/images/{*.iso,*.tgz,*.img.gz,*.bz2} $BASEDIR >> $LOGFILE 2>&1
830
831   ipfirepackages
832
833   # Check if there is a loop device for building in virtual environments
834   if [ $BUILD_IMAGES == 1 ] && ([ -e /dev/loop/0 ] || [ -e /dev/loop0 ]) && [ "${MACHINE_TYPE}" != "arm" ]; then
835         cp -f $BASEDIR/packages/linux-xen-*.ipfire $LFS/install/packages/
836         cp -f $BASEDIR/packages/meta-linux-xen $LFS/install/packages/
837         ipfiremake xen-image
838         rm -rf $LFS/install/packages/linux-xen-*.ipfire
839         rm -rf $LFS/install/packages/meta-linux-xen
840   fi
841   mv $LFS/install/images/*.bz2 $BASEDIR >> $LOGFILE 2>&1
842
843   cd $BASEDIR
844   for i in `ls *.bz2 *.img.gz *.iso`; do
845         md5sum $i > $i.md5
846   done
847   cd $PWD
848
849   # Cleanup
850   stdumount
851   rm -rf $BASEDIR/build/tmp/*
852
853   # Generating total list of files
854   echo -n "Generating files list from logs" | tee -a $LOGFILE
855   rm -f $BASEDIR/log/FILES
856   for i in `ls -1tr $BASEDIR/log/[^_]*`; do
857         if [ "$i" != "$BASEDIR/log/FILES" -a -n $i ]; then
858                 echo "##" >>$BASEDIR/log/FILES
859                 echo "## `basename $i`" >>$BASEDIR/log/FILES
860                 echo "##" >>$BASEDIR/log/FILES
861                 cat $i | sed "s%^\./%#%" | sort >> $BASEDIR/log/FILES
862         fi
863   done
864   beautify message DONE
865
866   cd $PWD
867 }
868
869 ipfirepackages() {
870         ipfiremake core-updates
871
872         local i
873         for i in $(find $BASEDIR/config/rootfiles/packages{${machine},} -maxdepth 1 -type f); do
874                 i=$(basename ${i})
875                 if [ -e $BASEDIR/lfs/$i ]; then
876                         ipfiredist $i
877                 else
878                         echo -n $i
879                         beautify message SKIP
880                 fi
881         done
882   test -d $BASEDIR/packages || mkdir $BASEDIR/packages
883   mv -f $LFS/install/packages/* $BASEDIR/packages >> $LOGFILE 2>&1
884   rm -rf  $BASEDIR/build/install/packages/*
885 }
886
887 # See what we're supposed to do
888 case "$1" in 
889 build)
890         clear
891         PACKAGE=`ls -v -r $BASEDIR/cache/toolchains/$SNAME-$VERSION-toolchain-$TOOLCHAINVER-$MACHINE.tar.gz 2> /dev/null | head -n 1`
892         #only restore on a clean disk
893         if [ ! -f log/cleanup-toolchain-2-tools ]; then
894                 if [ ! -n "$PACKAGE" ]; then
895                         beautify build_stage "Full toolchain compilation - Native GCC: `gcc --version | grep GCC | awk {'print $3'}`"
896                         prepareenv
897                         buildtoolchain
898                 else
899                         PACKAGENAME=${PACKAGE%.tar.gz}
900                         beautify build_stage "Packaged toolchain compilation"
901                         if [ `md5sum $PACKAGE | awk '{print $1}'` == `cat $PACKAGENAME.md5 | awk '{print $1}'` ]; then
902                                 tar zxf $PACKAGE
903                                 prepareenv
904                         else
905                                 exiterror "$PACKAGENAME md5 did not match, check downloaded package"
906                         fi
907                 fi
908         else
909                 echo -n "Using installed toolchain" | tee -a $LOGFILE
910                 beautify message SKIP
911                 prepareenv
912         fi
913
914         beautify build_start
915         beautify build_stage "Building LFS"
916         buildbase
917
918         beautify build_stage "Building IPFire"
919         buildipfire
920
921         beautify build_stage "Building installer"
922         buildinstaller
923
924         beautify build_stage "Building packages"
925         buildpackages
926         
927         beautify build_stage "Checking Logfiles for new Files"
928
929         cd $BASEDIR
930         tools/checknewlog.pl
931         cd $PWD
932
933         beautify build_end
934         ;;
935 shell)
936         # enter a shell inside LFS chroot
937         # may be used to changed kernel settings
938         prepareenv
939         entershell
940         ;;
941 clean)
942         echo -en "${BOLD}Cleaning build directory...${NORMAL}"
943         for i in `mount | grep $BASEDIR | sed 's/^.*loop=\(.*\))/\1/'`; do
944                 $LOSETUP -d $i 2>/dev/null
945         done
946         for i in `mount | grep $BASEDIR | cut -d " " -f 1`; do
947                 umount $i
948         done
949         stdumount
950         for i in `seq 0 7`; do
951             if ( losetup /dev/loop${i} 2>/dev/null | grep -q "/install/images" ); then
952                 umount /dev/loop${i}     2>/dev/null;
953                 losetup -d /dev/loop${i} 2>/dev/null;
954             fi;
955         done
956         rm -rf $BASEDIR/build
957         rm -rf $BASEDIR/cdrom
958         rm -rf $BASEDIR/packages
959         rm -rf $BASEDIR/log
960         if [ -h /tools ]; then
961                 rm -f /tools
962         fi
963         rm -f $BASEDIR/ipfire-*
964         beautify message DONE
965         ;;
966 downloadsrc)
967         if [ ! -d $BASEDIR/cache ]; then
968                 mkdir $BASEDIR/cache
969         fi
970         mkdir -p $BASEDIR/log
971         echo -e "${BOLD}Preload all source files${NORMAL}" | tee -a $LOGFILE
972         FINISHED=0
973         cd $BASEDIR/lfs
974         for c in `seq $MAX_RETRIES`; do
975                 if (( FINISHED==1 )); then 
976                         break
977                 fi
978                 FINISHED=1
979                 cd $BASEDIR/lfs
980                 for i in *; do
981                         if [ -f "$i" -a "$i" != "Config" ]; then
982                                 lfsmakecommoncheck ${i} || continue
983
984                                 make -s -f $i LFS_BASEDIR=$BASEDIR MACHINE=$MACHINE \
985                                         MESSAGE="$i\t ($c/$MAX_RETRIES)" download >> $LOGFILE 2>&1
986                                 if [ $? -ne 0 ]; then
987                                         beautify message FAIL
988                                         FINISHED=0
989                                 else
990                                         if [ $c -eq 1 ]; then
991                                         beautify message DONE
992                                         fi
993                                 fi
994                         fi
995                 done
996         done
997         echo -e "${BOLD}***Verifying md5sums${NORMAL}"
998         ERROR=0
999         for i in *; do
1000                 if [ -f "$i" -a "$i" != "Config" ]; then
1001                         lfsmakecommoncheck ${i} > /dev/null || continue
1002                         make -s -f $i LFS_BASEDIR=$BASEDIR MACHINE=$MACHINE \
1003                                 MESSAGE="$i\t " md5 >> $LOGFILE 2>&1
1004                         if [ $? -ne 0 ]; then
1005                                 echo -ne "MD5 difference in lfs/$i"
1006                                 beautify message FAIL
1007                                 ERROR=1
1008                         fi
1009                 fi
1010         done
1011         if [ $ERROR -eq 0 ]; then
1012                 echo -ne "${BOLD}all files md5sum match${NORMAL}"
1013                 beautify message DONE
1014         else
1015                 echo -ne "${BOLD}not all files were correctly download${NORMAL}"
1016                 beautify message FAIL
1017         fi
1018         cd - >/dev/null 2>&1
1019         ;;
1020 toolchain)
1021         clear
1022         prepareenv
1023         beautify build_stage "Toolchain compilation - Native GCC: `gcc --version | grep GCC | awk {'print $3'}`"
1024         buildtoolchain
1025         echo "`date -u '+%b %e %T'`: Create toolchain tar.gz for $MACHINE" | tee -a $LOGFILE
1026         test -d $BASEDIR/cache/toolchains || mkdir -p $BASEDIR/cache/toolchains
1027         cd $BASEDIR && tar -zc --exclude='log/_build.*.log' -f cache/toolchains/$SNAME-$VERSION-toolchain-$TOOLCHAINVER-$MACHINE.tar.gz \
1028                 build/tools build/bin/sh log >> $LOGFILE
1029         md5sum cache/toolchains/$SNAME-$VERSION-toolchain-$TOOLCHAINVER-$MACHINE.tar.gz \
1030                 > cache/toolchains/$SNAME-$VERSION-toolchain-$TOOLCHAINVER-$MACHINE.md5
1031         stdumount
1032         ;;
1033 gettoolchain)
1034         # arbitrary name to be updated in case of new toolchain package upload
1035         PACKAGE=$SNAME-$VERSION-toolchain-$TOOLCHAINVER-$MACHINE
1036         if [ ! -f $BASEDIR/cache/toolchains/$PACKAGE.tar.gz ]; then
1037                 URL_TOOLCHAIN=`grep URL_TOOLCHAIN lfs/Config | awk '{ print $3 }'`
1038                 test -d $BASEDIR/cache/toolchains || mkdir -p $BASEDIR/cache/toolchains
1039                 echo "`date -u '+%b %e %T'`: Load toolchain tar.gz for $MACHINE" | tee -a $LOGFILE
1040                 cd $BASEDIR/cache/toolchains
1041                 wget -U "IPFireSourceGrabber/2.x" $URL_TOOLCHAIN/$PACKAGE.tar.gz $URL_TOOLCHAIN/$PACKAGE.md5 >& /dev/null
1042                 if [ $? -ne 0 ]; then
1043                         echo "`date -u '+%b %e %T'`: error downloading $PACKAGE toolchain for $MACHINE machine" | tee -a $LOGFILE
1044                 else
1045                         if [ "`md5sum $PACKAGE.tar.gz | awk '{print $1}'`" = "`cat $PACKAGE.md5 | awk '{print $1}'`" ]; then
1046                                 echo "`date -u '+%b %e %T'`: toolchain md5 ok" | tee -a $LOGFILE
1047                         else
1048                                 exiterror "$PACKAGE.md5 did not match, check downloaded package"
1049                         fi
1050                 fi
1051         else
1052                 echo "Toolchain is already downloaded. Exiting..."
1053         fi
1054         ;;
1055 othersrc)
1056         prepareenv
1057         echo -ne "`date -u '+%b %e %T'`: Build sources iso for $MACHINE" | tee -a $LOGFILE
1058         chroot $LFS /tools/bin/env -i   HOME=/root \
1059         TERM=$TERM PS1='\u:\w\$ ' \
1060         PATH=/usr/local/bin:/bin:/usr/bin:/sbin:/usr/sbin \
1061         VERSION=$VERSION NAME="$NAME" SNAME="$SNAME" MACHINE=$MACHINE \
1062         /bin/bash -x -c "cd /usr/src/lfs && make -f sources-iso LFS_BASEDIR=/usr/src install" >>$LOGFILE 2>&1
1063         mv $LFS/install/images/ipfire-* $BASEDIR >> $LOGFILE 2>&1
1064         if [ $? -eq "0" ]; then
1065                 beautify message DONE
1066         else
1067                 beautify message FAIL
1068         fi
1069         stdumount
1070         ;;
1071 uploadsrc)
1072         PWD=`pwd`
1073         if [ -z $IPFIRE_USER ]; then
1074                 echo -n "You have to setup IPFIRE_USER first. See .config for details."
1075                 beautify message FAIL
1076                 exit 1
1077         fi
1078
1079         URL_SOURCE=$(grep URL_SOURCE lfs/Config | awk '{ print $3 }')
1080         REMOTE_FILES=$(echo "ls -1 --ignore=toolchains" | sftp -C ${IPFIRE_USER}@${URL_SOURCE})
1081
1082         cd $BASEDIR/cache/
1083         for file in $(ls -1 --ignore=toolchains); do
1084                 grep -q "$file" <<<$REMOTE_FILES && continue
1085                 NEW_FILES="$NEW_FILES $file"
1086         done
1087         [ -n "$NEW_FILES" ] && scp -2 $NEW_FILES ${IPFIRE_USER}@${URL_SOURCE}
1088         cd $BASEDIR
1089         cd $PWD
1090         exit 0
1091         ;;
1092 lang)
1093         update_langs
1094         ;;
1095 *)
1096         echo "Usage: $0 {build|changelog|clean|gettoolchain|downloadsrc|shell|sync|toolchain}"
1097         cat doc/make.sh-usage
1098         ;;
1099 esac