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