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