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