libffi: New package needed by glib.
[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 rrdtool
585   ipfiremake setserial
586   ipfiremake setup
587   ipfiremake libdnet
588   ipfiremake daq
589   ipfiremake snort
590   ipfiremake oinkmaster
591   ipfiremake squid
592   ipfiremake squidguard
593   ipfiremake calamaris
594   ipfiremake tcpdump
595   ipfiremake traceroute
596   ipfiremake vlan
597   ipfiremake wireless
598   ipfiremake pakfire
599   ipfiremake spandsp
600   ipfiremake lzo
601   ipfiremake openvpn
602   ipfiremake pammysql
603   ipfiremake cups
604   ipfiremake ghostscript
605   ipfiremake foomatic
606   ipfiremake hplip
607   ipfiremake samba
608   ipfiremake sudo
609   ipfiremake mc
610   ipfiremake wget
611   ipfiremake bridge-utils
612   ipfiremake screen
613   ipfiremake smartmontools
614   ipfiremake htop
615   ipfiremake postfix
616   ipfiremake fetchmail
617   ipfiremake cyrus-imapd
618   ipfiremake openmailadmin
619   ipfiremake clamav
620   ipfiremake spamassassin
621   ipfiremake amavisd
622   ipfiremake alsa
623   ipfiremake mpfire
624   ipfiremake guardian
625   ipfiremake libid3tag
626   ipfiremake libmad
627   ipfiremake libogg
628   ipfiremake libvorbis
629   ipfiremake libdvbpsi
630   ipfiremake flac
631   ipfiremake lame
632   ipfiremake sox
633   ipfiremake libshout
634   ipfiremake xvid
635   ipfiremake libmpeg2
636   ipfiremake cmake
637   ipfiremake gnump3d
638   ipfiremake libsigc++
639   ipfiremake libtorrent
640   ipfiremake rtorrent
641   ipfiremake ipfireseeder
642   ipfiremake rsync
643   ipfiremake tcpwrapper
644   ipfiremake libevent
645   ipfiremake libevent2
646   ipfiremake portmap
647   ipfiremake nfs
648   ipfiremake nmap
649   ipfiremake ncftp
650   ipfiremake etherwake
651   ipfiremake bwm-ng
652   ipfiremake tripwire
653   ipfiremake sysstat
654   ipfiremake vsftpd
655   ipfiremake strongswan
656   ipfiremake lsof
657   ipfiremake br2684ctl
658   ipfiremake pcmciautils
659   ipfiremake lm_sensors
660   ipfiremake liboping
661   ipfiremake collectd
662   ipfiremake teamspeak
663   ipfiremake elinks
664   ipfiremake igmpproxy
665   ipfiremake fbset
666   ipfiremake sdl
667   ipfiremake qemu
668   ipfiremake sane
669   ipfiremake netpbm
670   ipfiremake phpSANE
671   ipfiremake tunctl
672   ipfiremake nagios
673   ipfiremake nagios_nrpe
674   ipfiremake ebtables
675   ipfiremake fontconfig
676   ipfiremake freefont
677   ipfiremake directfb
678   ipfiremake dfb++
679   ipfiremake faad2
680   ipfiremake ffmpeg
681   ipfiremake videolan
682   ipfiremake vdr
683   ipfiremake w_scan
684   ipfiremake icecast
685   ipfiremake icegenerator
686   ipfiremake mpd
687   ipfiremake libmpdclient
688   ipfiremake mpc
689   ipfiremake git
690   ipfiremake squidclamav
691   ipfiremake bc
692   ipfiremake vnstat
693   ipfiremake vnstati
694   ipfiremake iw
695   ipfiremake wpa_supplicant
696   ipfiremake hostapd
697   ipfiremake urlgrabber
698   ipfiremake syslinux
699   ipfiremake tftpd
700   ipfiremake cpufrequtils
701   ipfiremake dbus
702   ipfiremake bluetooth
703   ipfiremake gutenprint
704   ipfiremake apcupsd
705   ipfiremake iperf
706   ipfiremake netcat
707   ipfiremake 7zip
708   ipfiremake lynis
709   ipfiremake streamripper
710   ipfiremake sshfs
711   ipfiremake taglib
712   ipfiremake mediatomb
713   ipfiremake sslh
714   ipfiremake perl-gettext
715   ipfiremake vdradmin
716   ipfiremake miau
717   ipfiremake netsnmpd
718   ipfiremake perl-DBI
719   ipfiremake perl-DBD-mysql
720   ipfiremake cacti
721   ipfiremake icecc
722   ipfiremake openvmtools
723   ipfiremake nagiosql
724   ipfiremake iftop
725   ipfiremake motion
726   ipfiremake joe
727   ipfiremake nut
728   ipfiremake watchdog
729   ipfiremake libpri
730   ipfiremake dahdi
731   ipfiremake asterisk
732   ipfiremake lcr
733   ipfiremake usb_modeswitch
734   ipfiremake usb_modeswitch_data
735   ipfiremake zerofree
736   ipfiremake mdadm
737   ipfiremake eject
738   ipfiremake pound
739   ipfiremake minicom
740   ipfiremake ddrescue
741   ipfiremake imspector
742   ipfiremake miniupnpd
743   ipfiremake client175
744   ipfiremake powertop
745   ipfiremake parted
746   ipfiremake swig
747   ipfiremake python-m2crypto
748   ipfiremake wireless-regdb
749   ipfiremake crda
750   ipfiremake libsolv
751   ipfiremake python-distutils-extra
752   ipfiremake python-lzma
753   ipfiremake python-progressbar
754   ipfiremake python-xattr
755   ipfiremake intltool
756   ipfiremake pakfire3-deps
757   ipfiremake transmission
758   ipfiremake dpfhack
759   ipfiremake lcd4linux
760   ipfiremake mtr
761   ipfiremake tcpick
762   ipfiremake minidlna
763   ipfiremake acpid
764   echo Build on $HOSTNAME > $BASEDIR/build/var/ipfire/firebuild
765   cat /proc/version >> $BASEDIR/build/var/ipfire/firebuild
766   echo >> $BASEDIR/build/var/ipfire/firebuild
767   git log -1 >> $BASEDIR/build/var/ipfire/firebuild
768   echo >> $BASEDIR/build/var/ipfire/firebuild
769   git status >> $BASEDIR/build/var/ipfire/firebuild
770   echo >> $BASEDIR/build/var/ipfire/firebuild
771   cat /proc/cpuinfo >> $BASEDIR/build/var/ipfire/firebuild
772   echo $PAKFIRE_CORE > $BASEDIR/build/opt/pakfire/db/core/mine
773   if [ "$GIT_BRANCH" = "master" -o "$GIT_BRANCH" = "next" ]; then
774         echo "$NAME $VERSION ($MACHINE) - Development Build: $GIT_LASTCOMMIT" > $BASEDIR/build/etc/system-release
775   else
776         echo "$NAME $VERSION ($MACHINE) - $GIT_BRANCH" > $BASEDIR/build/etc/system-release
777   fi
778 }
779
780 buildinstaller() {
781   # Run installer scripts one by one
782   LOGFILE="$BASEDIR/log/_build.installer.log"
783   export LOGFILE
784   ipfiremake as86
785   ipfiremake mbr
786   ipfiremake memtest
787   ipfiremake installer
788   installmake strip
789   ipfiremake initrd
790 }
791
792 buildpackages() {
793   LOGFILE="$BASEDIR/log/_build.packages.log"
794   export LOGFILE
795   echo "... see detailed log in _build.*.log files" >> $LOGFILE
796
797   
798   # Generating list of packages used
799   echo -n "Generating packages list from logs" | tee -a $LOGFILE
800   rm -f $BASEDIR/doc/packages-list
801   for i in `ls -1tr $BASEDIR/log/[^_]*`; do
802         if [ "$i" != "$BASEDIR/log/FILES" -a -n $i ]; then
803                 echo "* `basename $i`" >>$BASEDIR/doc/packages-list
804         fi
805   done
806   echo "== List of softwares used to build $NAME Version: $VERSION ==" > $BASEDIR/doc/packages-list.txt
807   grep -v 'configroot$\|img$\|initrd$\|initscripts$\|installer$\|install$\|setup$\|pakfire$\|stage2$\|smp$\|tools$\|tools1$\|tools2$\|.tgz$\|-config$\|_missing_rootfile$\|install1$\|install2$\|pass1$\|pass2$\|pass3$' \
808         $BASEDIR/doc/packages-list | sort >> $BASEDIR/doc/packages-list.txt
809   rm -f $BASEDIR/doc/packages-list
810   # packages-list.txt is ready to be displayed for wiki page
811   beautify message DONE
812   
813   # Update changelog
814   cd $BASEDIR
815   [ -z $GIT_TAG ]  || LAST_TAG=$GIT_TAG
816   [ -z $LAST_TAG ] || EXT="$LAST_TAG..HEAD"
817   git log -n 500 --no-merges --pretty=medium --shortstat $EXT > $BASEDIR/doc/ChangeLog
818
819   # Create images for install
820   ipfiremake cdrom
821
822   # Check if there is a loop device for building in virtual environments
823   if [ $BUILD_IMAGES == 1 ] && ([ -e /dev/loop/0 ] || [ -e /dev/loop0 ]); then
824         if [ "${MACHINE_TYPE}" != "arm" ]; then
825                 ipfiremake usb-stick
826         fi
827         ipfiremake flash-images
828   fi
829
830   mv $LFS/install/images/{*.iso,*.tgz,*.img.gz,*.bz2} $BASEDIR >> $LOGFILE 2>&1
831
832   ipfirepackages
833
834   # Check if there is a loop device for building in virtual environments
835   if [ $BUILD_IMAGES == 1 ] && ([ -e /dev/loop/0 ] || [ -e /dev/loop0 ]) && [ "${MACHINE_TYPE}" != "arm" ]; then
836         cp -f $BASEDIR/packages/linux-xen-*.ipfire $LFS/install/packages/
837         cp -f $BASEDIR/packages/meta-linux-xen $LFS/install/packages/
838         ipfiremake xen-image
839         rm -rf $LFS/install/packages/linux-xen-*.ipfire
840         rm -rf $LFS/install/packages/meta-linux-xen
841   fi
842   mv $LFS/install/images/*.bz2 $BASEDIR >> $LOGFILE 2>&1
843
844   cd $BASEDIR
845   for i in `ls *.bz2 *.img.gz *.iso`; do
846         md5sum $i > $i.md5
847   done
848   cd $PWD
849
850   # Cleanup
851   stdumount
852   rm -rf $BASEDIR/build/tmp/*
853
854   # Generating total list of files
855   echo -n "Generating files list from logs" | tee -a $LOGFILE
856   rm -f $BASEDIR/log/FILES
857   for i in `ls -1tr $BASEDIR/log/[^_]*`; do
858         if [ "$i" != "$BASEDIR/log/FILES" -a -n $i ]; then
859                 echo "##" >>$BASEDIR/log/FILES
860                 echo "## `basename $i`" >>$BASEDIR/log/FILES
861                 echo "##" >>$BASEDIR/log/FILES
862                 cat $i | sed "s%^\./%#%" | sort >> $BASEDIR/log/FILES
863         fi
864   done
865   beautify message DONE
866
867   cd $PWD
868 }
869
870 ipfirepackages() {
871         ipfiremake core-updates
872
873         local i
874         for i in $(find $BASEDIR/config/rootfiles/packages{${machine},} -maxdepth 1 -type f); do
875                 i=$(basename ${i})
876                 if [ -e $BASEDIR/lfs/$i ]; then
877                         ipfiredist $i
878                 else
879                         echo -n $i
880                         beautify message SKIP
881                 fi
882         done
883   test -d $BASEDIR/packages || mkdir $BASEDIR/packages
884   mv -f $LFS/install/packages/* $BASEDIR/packages >> $LOGFILE 2>&1
885   rm -rf  $BASEDIR/build/install/packages/*
886 }
887
888 # See what we're supposed to do
889 case "$1" in 
890 build)
891         clear
892         PACKAGE=`ls -v -r $BASEDIR/cache/toolchains/$SNAME-$VERSION-toolchain-$TOOLCHAINVER-$MACHINE.tar.gz 2> /dev/null | head -n 1`
893         #only restore on a clean disk
894         if [ ! -f log/cleanup-toolchain-2-tools ]; then
895                 if [ ! -n "$PACKAGE" ]; then
896                         beautify build_stage "Full toolchain compilation - Native GCC: `gcc --version | grep GCC | awk {'print $3'}`"
897                         prepareenv
898                         buildtoolchain
899                 else
900                         PACKAGENAME=${PACKAGE%.tar.gz}
901                         beautify build_stage "Packaged toolchain compilation"
902                         if [ `md5sum $PACKAGE | awk '{print $1}'` == `cat $PACKAGENAME.md5 | awk '{print $1}'` ]; then
903                                 tar zxf $PACKAGE
904                                 prepareenv
905                         else
906                                 exiterror "$PACKAGENAME md5 did not match, check downloaded package"
907                         fi
908                 fi
909         else
910                 echo -n "Using installed toolchain" | tee -a $LOGFILE
911                 beautify message SKIP
912                 prepareenv
913         fi
914
915         beautify build_start
916         beautify build_stage "Building LFS"
917         buildbase
918
919         beautify build_stage "Building IPFire"
920         buildipfire
921
922         beautify build_stage "Building installer"
923         buildinstaller
924
925         beautify build_stage "Building packages"
926         buildpackages
927         
928         beautify build_stage "Checking Logfiles for new Files"
929
930         cd $BASEDIR
931         tools/checknewlog.pl
932         cd $PWD
933
934         beautify build_end
935         ;;
936 shell)
937         # enter a shell inside LFS chroot
938         # may be used to changed kernel settings
939         prepareenv
940         entershell
941         ;;
942 clean)
943         echo -en "${BOLD}Cleaning build directory...${NORMAL}"
944         for i in `mount | grep $BASEDIR | sed 's/^.*loop=\(.*\))/\1/'`; do
945                 $LOSETUP -d $i 2>/dev/null
946         done
947         for i in `mount | grep $BASEDIR | cut -d " " -f 1`; do
948                 umount $i
949         done
950         stdumount
951         for i in `seq 0 7`; do
952             if ( losetup /dev/loop${i} 2>/dev/null | grep -q "/install/images" ); then
953                 umount /dev/loop${i}     2>/dev/null;
954                 losetup -d /dev/loop${i} 2>/dev/null;
955             fi;
956         done
957         rm -rf $BASEDIR/build
958         rm -rf $BASEDIR/cdrom
959         rm -rf $BASEDIR/packages
960         rm -rf $BASEDIR/log
961         if [ -h /tools ]; then
962                 rm -f /tools
963         fi
964         rm -f $BASEDIR/ipfire-*
965         beautify message DONE
966         ;;
967 downloadsrc)
968         if [ ! -d $BASEDIR/cache ]; then
969                 mkdir $BASEDIR/cache
970         fi
971         mkdir -p $BASEDIR/log
972         echo -e "${BOLD}Preload all source files${NORMAL}" | tee -a $LOGFILE
973         FINISHED=0
974         cd $BASEDIR/lfs
975         for c in `seq $MAX_RETRIES`; do
976                 if (( FINISHED==1 )); then 
977                         break
978                 fi
979                 FINISHED=1
980                 cd $BASEDIR/lfs
981                 for i in *; do
982                         if [ -f "$i" -a "$i" != "Config" ]; then
983                                 lfsmakecommoncheck ${i} || continue
984
985                                 make -s -f $i LFS_BASEDIR=$BASEDIR MACHINE=$MACHINE \
986                                         MESSAGE="$i\t ($c/$MAX_RETRIES)" download >> $LOGFILE 2>&1
987                                 if [ $? -ne 0 ]; then
988                                         beautify message FAIL
989                                         FINISHED=0
990                                 else
991                                         if [ $c -eq 1 ]; then
992                                         beautify message DONE
993                                         fi
994                                 fi
995                         fi
996                 done
997         done
998         echo -e "${BOLD}***Verifying md5sums${NORMAL}"
999         ERROR=0
1000         for i in *; do
1001                 if [ -f "$i" -a "$i" != "Config" ]; then
1002                         lfsmakecommoncheck ${i} > /dev/null || continue
1003                         make -s -f $i LFS_BASEDIR=$BASEDIR MACHINE=$MACHINE \
1004                                 MESSAGE="$i\t " md5 >> $LOGFILE 2>&1
1005                         if [ $? -ne 0 ]; then
1006                                 echo -ne "MD5 difference in lfs/$i"
1007                                 beautify message FAIL
1008                                 ERROR=1
1009                         fi
1010                 fi
1011         done
1012         if [ $ERROR -eq 0 ]; then
1013                 echo -ne "${BOLD}all files md5sum match${NORMAL}"
1014                 beautify message DONE
1015         else
1016                 echo -ne "${BOLD}not all files were correctly download${NORMAL}"
1017                 beautify message FAIL
1018         fi
1019         cd - >/dev/null 2>&1
1020         ;;
1021 toolchain)
1022         clear
1023         prepareenv
1024         beautify build_stage "Toolchain compilation - Native GCC: `gcc --version | grep GCC | awk {'print $3'}`"
1025         buildtoolchain
1026         echo "`date -u '+%b %e %T'`: Create toolchain tar.gz for $MACHINE" | tee -a $LOGFILE
1027         test -d $BASEDIR/cache/toolchains || mkdir -p $BASEDIR/cache/toolchains
1028         cd $BASEDIR && tar -zc --exclude='log/_build.*.log' -f cache/toolchains/$SNAME-$VERSION-toolchain-$TOOLCHAINVER-$MACHINE.tar.gz \
1029                 build/tools build/bin/sh log >> $LOGFILE
1030         md5sum cache/toolchains/$SNAME-$VERSION-toolchain-$TOOLCHAINVER-$MACHINE.tar.gz \
1031                 > cache/toolchains/$SNAME-$VERSION-toolchain-$TOOLCHAINVER-$MACHINE.md5
1032         stdumount
1033         ;;
1034 gettoolchain)
1035         # arbitrary name to be updated in case of new toolchain package upload
1036         PACKAGE=$SNAME-$VERSION-toolchain-$TOOLCHAINVER-$MACHINE
1037         if [ ! -f $BASEDIR/cache/toolchains/$PACKAGE.tar.gz ]; then
1038                 URL_TOOLCHAIN=`grep URL_TOOLCHAIN lfs/Config | awk '{ print $3 }'`
1039                 test -d $BASEDIR/cache/toolchains || mkdir -p $BASEDIR/cache/toolchains
1040                 echo "`date -u '+%b %e %T'`: Load toolchain tar.gz for $MACHINE" | tee -a $LOGFILE
1041                 cd $BASEDIR/cache/toolchains
1042                 wget -U "IPFireSourceGrabber/2.x" $URL_TOOLCHAIN/$PACKAGE.tar.gz $URL_TOOLCHAIN/$PACKAGE.md5 >& /dev/null
1043                 if [ $? -ne 0 ]; then
1044                         echo "`date -u '+%b %e %T'`: error downloading $PACKAGE toolchain for $MACHINE machine" | tee -a $LOGFILE
1045                 else
1046                         if [ "`md5sum $PACKAGE.tar.gz | awk '{print $1}'`" = "`cat $PACKAGE.md5 | awk '{print $1}'`" ]; then
1047                                 echo "`date -u '+%b %e %T'`: toolchain md5 ok" | tee -a $LOGFILE
1048                         else
1049                                 exiterror "$PACKAGE.md5 did not match, check downloaded package"
1050                         fi
1051                 fi
1052         else
1053                 echo "Toolchain is already downloaded. Exiting..."
1054         fi
1055         ;;
1056 othersrc)
1057         prepareenv
1058         echo -ne "`date -u '+%b %e %T'`: Build sources iso for $MACHINE" | tee -a $LOGFILE
1059         chroot $LFS /tools/bin/env -i   HOME=/root \
1060         TERM=$TERM PS1='\u:\w\$ ' \
1061         PATH=/usr/local/bin:/bin:/usr/bin:/sbin:/usr/sbin \
1062         VERSION=$VERSION NAME="$NAME" SNAME="$SNAME" MACHINE=$MACHINE \
1063         /bin/bash -x -c "cd /usr/src/lfs && make -f sources-iso LFS_BASEDIR=/usr/src install" >>$LOGFILE 2>&1
1064         mv $LFS/install/images/ipfire-* $BASEDIR >> $LOGFILE 2>&1
1065         if [ $? -eq "0" ]; then
1066                 beautify message DONE
1067         else
1068                 beautify message FAIL
1069         fi
1070         stdumount
1071         ;;
1072 uploadsrc)
1073         PWD=`pwd`
1074         if [ -z $IPFIRE_USER ]; then
1075                 echo -n "You have to setup IPFIRE_USER first. See .config for details."
1076                 beautify message FAIL
1077                 exit 1
1078         fi
1079
1080         URL_SOURCE=$(grep URL_SOURCE lfs/Config | awk '{ print $3 }')
1081         REMOTE_FILES=$(echo "ls -1 --ignore=toolchains" | sftp -C ${IPFIRE_USER}@${URL_SOURCE})
1082
1083         cd $BASEDIR/cache/
1084         for file in $(ls -1 --ignore=toolchains); do
1085                 grep -q "$file" <<<$REMOTE_FILES && continue
1086                 NEW_FILES="$NEW_FILES $file"
1087         done
1088         [ -n "$NEW_FILES" ] && scp -2 $NEW_FILES ${IPFIRE_USER}@${URL_SOURCE}
1089         cd $BASEDIR
1090         cd $PWD
1091         exit 0
1092         ;;
1093 lang)
1094         update_langs
1095         ;;
1096 *)
1097         echo "Usage: $0 {build|changelog|clean|gettoolchain|downloadsrc|shell|sync|toolchain}"
1098         cat doc/make.sh-usage
1099         ;;
1100 esac