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