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