Fix detection weather a toolchain can be built on host.
[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-2011 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="55"                                                       # Core Level (Filename)
29 PAKFIRE_CORE="54"                                               # 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=2
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)
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     export PATH=$BASEDIR/build/usr/local/bin:$BASEDIR/build/tools/bin:$PATH
264     lfsmake1 fake-environ       PASS=1
265     lfsmake1 ccache     PASS=1
266     lfsmake1 make       PASS=1
267     lfsmake1 binutils   PASS=1
268     lfsmake1 gcc                PASS=1
269     if [ "${MACHINE_TYPE}" = "arm" ]; then
270         lfsmake1 linux TOOLS=1 HEADERS=1
271     else
272         lfsmake1 linux-libc-header
273     fi
274     lfsmake1 glibc
275     lfsmake1 cleanup-toolchain PASS=1
276     lfsmake1 fake-environ       PASS=2
277     lfsmake1 tcl
278     lfsmake1 expect
279     lfsmake1 dejagnu
280     lfsmake1 gcc                PASS=2
281     lfsmake1 binutils   PASS=2
282     lfsmake1 ccache     PASS=2
283     lfsmake1 ncurses
284     lfsmake1 bash
285     lfsmake1 bzip2
286     lfsmake1 coreutils
287     lfsmake1 diffutils
288     lfsmake1 findutils
289     lfsmake1 gawk
290     lfsmake1 gettext
291     lfsmake1 grep
292     lfsmake1 gzip
293     lfsmake1 m4
294     lfsmake1 make       PASS=2
295     lfsmake1 patch
296     lfsmake1 perl
297     lfsmake1 sed
298     lfsmake1 tar
299     lfsmake1 texinfo
300     lfsmake1 util-linux
301     lfsmake1 strip
302     lfsmake1 cleanup-toolchain  PASS=2
303     export PATH=$ORG_PATH
304 }
305
306 buildbase() {
307     LOGFILE="$BASEDIR/log/_build.base.log"
308     export LOGFILE
309     lfsmake2 stage2
310     if [ "${MACHINE_TYPE}" = "arm" ]; then
311         lfsmake2 linux HEADERS=1
312     else
313         lfsmake2 linux-libc-header
314     fi
315     lfsmake2 man-pages
316     lfsmake2 glibc
317     lfsmake2 tzdata
318     lfsmake2 cleanup-toolchain  PASS=3
319     lfsmake2 binutils
320     lfsmake2 gcc
321     lfsmake2 berkeley
322     lfsmake2 coreutils
323     lfsmake2 iana-etc
324     lfsmake2 m4
325     lfsmake2 bison
326     lfsmake2 ncurses
327     lfsmake2 procps
328     lfsmake2 sed
329     lfsmake2 libtool
330     lfsmake2 perl
331     lfsmake2 readline
332     lfsmake2 zlib
333     lfsmake2 autoconf
334     lfsmake2 automake
335     lfsmake2 bash
336     lfsmake2 bzip2
337     lfsmake2 diffutils
338     lfsmake2 e2fsprogs
339     lfsmake2 ed
340     lfsmake2 file
341     lfsmake2 findutils
342     lfsmake2 flex
343     lfsmake2 gawk
344     lfsmake2 gettext
345     lfsmake2 grep
346     lfsmake2 groff
347     lfsmake2 gzip
348     lfsmake2 inetutils
349     lfsmake2 iproute2
350     lfsmake2 kbd
351     lfsmake2 less
352     lfsmake2 libaal
353     lfsmake2 make
354     lfsmake2 man
355     lfsmake2 mktemp
356     lfsmake2 module-init-tools
357     lfsmake2 net-tools
358     lfsmake2 patch
359     lfsmake2 psmisc
360     lfsmake2 reiser4progs
361     lfsmake2 shadow
362     lfsmake2 sysklogd
363     lfsmake2 sysvinit
364     lfsmake2 tar
365     lfsmake2 texinfo
366     lfsmake2 udev
367     lfsmake2 util-linux
368     lfsmake2 vim
369     lfsmake2 grub
370 }
371
372 buildipfire() {
373   LOGFILE="$BASEDIR/log/_build.ipfire.log"
374   export LOGFILE
375   ipfiremake configroot
376   ipfiremake backup
377   ipfiremake dhcp
378   ipfiremake dhcpcd
379   ipfiremake libusb
380   ipfiremake libpcap
381   ipfiremake ppp
382   ipfiremake pptp
383   ipfiremake unzip
384   ipfiremake which
385   ipfiremake xz
386   ipfiremake linux-firmware
387   ipfiremake zd1211-firmware
388   ipfiremake fw_ath9k_htc
389   ipfiremake u-boot
390
391   # The xen and PAE kernels are only available for x86
392   if [ "${MACHINE_TYPE}" != "arm" ]; then
393     ipfiremake linux                    KCFG="-xen"
394     ipfiremake kqemu                    KCFG="-xen"
395     ipfiremake v4l-dvb                  KCFG="-xen"
396     ipfiremake madwifi                  KCFG="-xen"
397     ipfiremake mISDN                    KCFG="-xen"
398     ipfiremake dahdi                    KCFG="-xen" KMOD=1
399     ipfiremake cryptodev                KCFG="-xen"
400     ipfiremake compat-wireless          KCFG="-xen"
401     ipfiremake r8169                    KCFG="-xen"
402     ipfiremake r8168                    KCFG="-xen"
403     ipfiremake r8101                    KCFG="-xen"
404     ipfiremake e1000                    KCFG="-xen"
405     ipfiremake e1000e                   KCFG="-xen"
406     ipfiremake igb                      KCFG="-xen"
407     ipfiremake linux                    KCFG="-pae"
408     ipfiremake kqemu                    KCFG="-pae"
409     ipfiremake kvm-kmod                 KCFG="-pae"
410     ipfiremake v4l-dvb                  KCFG="-pae"
411     ipfiremake madwifi                  KCFG="-pae"
412     ipfiremake alsa                     KCFG="-pae" KMOD=1
413     ipfiremake mISDN                    KCFG="-pae"
414     ipfiremake dahdi                    KCFG="-pae" KMOD=1
415     ipfiremake cryptodev                KCFG="-pae"
416     ipfiremake compat-wireless          KCFG="-pae"
417 #    ipfiremake r8169                   KCFG="-pae"
418 #    ipfiremake r8168                   KCFG="-pae"
419 #    ipfiremake r8101                   KCFG="-pae"
420     ipfiremake e1000                    KCFG="-pae"
421     ipfiremake e1000e                   KCFG="-pae"
422     ipfiremake igb                      KCFG="-pae"
423     ipfiremake linux                    KCFG=""
424     ipfiremake v4l-dvb                  KCFG=""
425     ipfiremake kqemu                    KCFG=""
426     ipfiremake kvm-kmod                 KCFG=""
427     ipfiremake madwifi                  KCFG=""
428     ipfiremake alsa                     KCFG="" KMOD=1
429     ipfiremake mISDN                    KCFG=""
430     ipfiremake dahdi                    KCFG="" KMOD=1
431     ipfiremake cryptodev                KCFG=""
432     ipfiremake compat-wireless          KCFG=""
433 #    ipfiremake r8169                   KCFG=""
434 #    ipfiremake r8168                   KCFG=""
435 #    ipfiremake r8101                   KCFG=""
436     ipfiremake e1000                    KCFG=""
437     ipfiremake e1000e                   KCFG=""
438     ipfiremake igb                      KCFG=""
439   else
440     # arm-versatile kernel build
441     ipfiremake linux                    KCFG="-versatile"
442     ipfiremake v4l-dvb                  KCFG="-versatile"
443     ipfiremake kqemu                    KCFG="-versatile"
444     ipfiremake kvm-kmod                 KCFG="-versatile"
445     ipfiremake madwifi                  KCFG="-versatile"
446     ipfiremake mISDN                    KCFG="-versatile"
447     ipfiremake dahdi                    KCFG="-versatile" KMOD=1
448     ipfiremake cryptodev                KCFG="-versatile"
449     ipfiremake compat-wireless          KCFG="-versatile"
450 #  ipfiremake r8169                     KCFG="-versatile"
451 #  ipfiremake r8168                     KCFG="-versatile"
452 #  ipfiremake r8101                     KCFG="-versatile"
453     ipfiremake e1000                    KCFG="-versatile"
454     ipfiremake e1000e                   KCFG="-versatile"
455     ipfiremake igb                      KCFG="-versatile"
456     # arm-kirkwood kernel build
457     ipfiremake linux                    KCFG="-kirkwood"
458     ipfiremake v4l-dvb                  KCFG="-kirkwood"
459     ipfiremake kqemu                    KCFG="-kirkwood"
460     ipfiremake kvm-kmod                 KCFG="-kirkwood"
461     ipfiremake madwifi                  KCFG="-kirkwood"
462     ipfiremake mISDN                    KCFG="-kirkwood"
463     ipfiremake dahdi                    KCFG="-kirkwood" KMOD=1
464     ipfiremake cryptodev                KCFG="-kirkwood"
465     ipfiremake compat-wireless          KCFG="-kirkwood"
466 #  ipfiremake r8169                     KCFG="-kirkwood"
467 #  ipfiremake r8168                     KCFG="-kirkwood"
468 #  ipfiremake r8101                     KCFG="-kirkwood"
469     ipfiremake e1000                    KCFG="-kirkwood"
470     ipfiremake e1000e                   KCFG="-kirkwood"
471     ipfiremake igb                      KCFG="-kirkwood"
472   fi
473   ipfiremake pkg-config
474   ipfiremake linux-atm
475   ipfiremake cpio
476   ipfiremake dracut
477   ipfiremake expat
478   ipfiremake gdbm
479   ipfiremake gmp
480   ipfiremake pam
481   ipfiremake openssl
482   ipfiremake curl
483   ipfiremake tcl
484   ipfiremake sqlite
485   ipfiremake python
486   ipfiremake fireinfo
487   ipfiremake libnet
488   ipfiremake libnl
489   ipfiremake libidn
490   ipfiremake libjpeg
491   ipfiremake libpng
492   ipfiremake libtiff
493   ipfiremake libart
494   ipfiremake freetype
495   ipfiremake gd
496   ipfiremake popt
497   ipfiremake pcre
498   ipfiremake slang
499   ipfiremake newt
500   ipfiremake attr
501   ipfiremake acl
502   ipfiremake libcap
503   ipfiremake pciutils
504   ipfiremake usbutils
505   ipfiremake libxml2
506   ipfiremake libxslt
507   ipfiremake BerkeleyDB
508   ipfiremake mysql
509   ipfiremake cyrus-sasl
510   ipfiremake openldap
511   ipfiremake apache2
512   ipfiremake php
513   ipfiremake apache2                    PASS=C
514   ipfiremake arping
515   ipfiremake beep
516   ipfiremake bind
517   ipfiremake dvdrtools
518   ipfiremake dnsmasq
519   ipfiremake dosfstools
520   ipfiremake reiserfsprogs
521   ipfiremake xfsprogs
522   ipfiremake sysfsutils
523   ipfiremake fuse
524   ipfiremake ntfs-3g
525   ipfiremake ethtool
526   ipfiremake ez-ipupdate
527   ipfiremake fcron
528   ipfiremake perl-GD
529   ipfiremake GD-Graph
530   ipfiremake GD-TextUtil
531   ipfiremake gnupg
532   ipfiremake hdparm
533   ipfiremake sdparm
534   ipfiremake mtools
535   ipfiremake initscripts
536   ipfiremake whatmask
537   ipfiremake iptables
538   ipfiremake libupnp
539   ipfiremake ipaddr
540   ipfiremake iptstate
541   ipfiremake iputils
542   ipfiremake l7-protocols
543   ipfiremake mISDNuser
544   ipfiremake capi4k-utils
545   ipfiremake hwdata
546   ipfiremake kudzu
547   ipfiremake logrotate
548   ipfiremake logwatch
549   ipfiremake misc-progs
550   ipfiremake nano
551   ipfiremake nasm
552   ipfiremake URI
553   ipfiremake HTML-Tagset
554   ipfiremake HTML-Parser
555   ipfiremake Compress-Zlib
556   ipfiremake Digest
557   ipfiremake Digest-SHA1
558   ipfiremake Digest-HMAC
559   ipfiremake libwww-perl
560   ipfiremake Net-DNS
561   ipfiremake Net-IPv4Addr
562   ipfiremake Net_SSLeay
563   ipfiremake IO-Stringy
564   ipfiremake Unix-Syslog
565   ipfiremake Mail-Tools
566   ipfiremake MIME-Tools
567   ipfiremake Net-Server
568   ipfiremake Convert-TNEF
569   ipfiremake Convert-UUlib
570   ipfiremake Archive-Tar
571   ipfiremake Archive-Zip
572   ipfiremake Text-Tabs+Wrap
573   ipfiremake Locale-Country
574   ipfiremake XML-Parser
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                         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/{bin,etc,usr/bin,usr/local} \
1033                 build/tools/{bin,etc,*-linux-gnu*,include,lib,libexec,sbin,share,var} \
1034                 log >> $LOGFILE
1035         md5sum cache/toolchains/$SNAME-$VERSION-toolchain-$TOOLCHAINVER-$MACHINE.tar.gz \
1036                 > cache/toolchains/$SNAME-$VERSION-toolchain-$TOOLCHAINVER-$MACHINE.md5
1037         stdumount
1038         ;;
1039 gettoolchain)
1040         # arbitrary name to be updated in case of new toolchain package upload
1041         PACKAGE=$SNAME-$VERSION-toolchain-$TOOLCHAINVER-$MACHINE
1042         if [ ! -f $BASEDIR/cache/toolchains/$PACKAGE.tar.gz ]; then
1043                 URL_TOOLCHAIN=`grep URL_TOOLCHAIN lfs/Config | awk '{ print $3 }'`
1044                 test -d $BASEDIR/cache/toolchains || mkdir -p $BASEDIR/cache/toolchains
1045                 echo "`date -u '+%b %e %T'`: Load toolchain tar.gz for $MACHINE" | tee -a $LOGFILE
1046                 cd $BASEDIR/cache/toolchains
1047                 wget -U "IPFireSourceGrabber/2.x" $URL_TOOLCHAIN/$PACKAGE.tar.gz $URL_TOOLCHAIN/$PACKAGE.md5 >& /dev/null
1048                 if [ $? -ne 0 ]; then
1049                         echo "`date -u '+%b %e %T'`: error downloading $PACKAGE toolchain for $MACHINE machine" | tee -a $LOGFILE
1050                 else
1051                         if [ "`md5sum $PACKAGE.tar.gz | awk '{print $1}'`" = "`cat $PACKAGE.md5 | awk '{print $1}'`" ]; then
1052                                 echo "`date -u '+%b %e %T'`: toolchain md5 ok" | tee -a $LOGFILE
1053                         else
1054                                 exiterror "$PACKAGE.md5 did not match, check downloaded package"
1055                         fi
1056                 fi
1057         else
1058                 echo "Toolchain is already downloaded. Exiting..."
1059         fi
1060         ;;
1061 othersrc)
1062         prepareenv
1063         echo -ne "`date -u '+%b %e %T'`: Build sources iso for $MACHINE" | tee -a $LOGFILE
1064         chroot $LFS /tools/bin/env -i   HOME=/root \
1065         TERM=$TERM PS1='\u:\w\$ ' \
1066         PATH=/usr/local/bin:/bin:/usr/bin:/sbin:/usr/sbin \
1067         VERSION=$VERSION NAME="$NAME" SNAME="$SNAME" MACHINE=$MACHINE \
1068         /bin/bash -x -c "cd /usr/src/lfs && make -f sources-iso LFS_BASEDIR=/usr/src install" >>$LOGFILE 2>&1
1069         mv $LFS/install/images/ipfire-* $BASEDIR >> $LOGFILE 2>&1
1070         if [ $? -eq "0" ]; then
1071                 beautify message DONE
1072         else
1073                 beautify message FAIL
1074         fi
1075         stdumount
1076         ;;
1077 uploadsrc)
1078         PWD=`pwd`
1079         if [ -z $IPFIRE_USER ]; then
1080                 echo -n "You have to setup IPFIRE_USER first. See .config for details."
1081                 beautify message FAIL
1082                 exit 1
1083         fi
1084
1085         URL_SOURCE=$(grep URL_SOURCE lfs/Config | awk '{ print $3 }')
1086         REMOTE_FILES=$(echo "ls -1 --ignore=toolchains" | sftp -C ${IPFIRE_USER}@${URL_SOURCE})
1087
1088         cd $BASEDIR/cache/
1089         for file in $(ls -1 --ignore=toolchains); do
1090                 grep -q "$file" <<<$REMOTE_FILES && continue
1091                 NEW_FILES="$NEW_FILES $file"
1092         done
1093         [ -n "$NEW_FILES" ] && scp -2 $NEW_FILES ${IPFIRE_USER}@${URL_SOURCE}
1094         cd $BASEDIR
1095         cd $PWD
1096         exit 0
1097         ;;
1098 lang)
1099         update_langs
1100         ;;
1101 *)
1102         echo "Usage: $0 {build|changelog|clean|gettoolchain|downloadsrc|shell|sync|toolchain}"
1103         cat doc/make.sh-usage
1104         ;;
1105 esac