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