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