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