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