Merge commit 'ms/minicom'
[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 rp-pppoe
341   ipfiremake pptp
342   ipfiremake unzip
343   ipfiremake which
344   ipfiremake xz
345   ipfiremake linux-firmware
346   ipfiremake linux                      XEN=1
347   ipfiremake kqemu                      XEN=1
348   ipfiremake v4l-dvb                    XEN=1
349   ipfiremake madwifi                    XEN=1
350   ipfiremake mISDN                      XEN=1
351   ipfiremake dahdi                      XEN=1 KMOD=1
352   ipfiremake cryptodev                  XEN=1
353   ipfiremake compat-wireless            XEN=1
354   ipfiremake r8169                      XEN=1
355   ipfiremake r8168                      XEN=1
356   ipfiremake r8101                      XEN=1
357   ipfiremake e1000                      XEN=1
358   ipfiremake e1000e                     XEN=1
359   ipfiremake linux
360   ipfiremake kqemu
361   ipfiremake kvm-kmod
362   ipfiremake v4l-dvb
363   ipfiremake madwifi
364   ipfiremake alsa                       KMOD=1
365   ipfiremake mISDN
366   ipfiremake dahdi                      KMOD=1
367   ipfiremake cryptodev
368   ipfiremake compat-wireless
369   ipfiremake r8169
370   ipfiremake r8168
371   ipfiremake r8101
372   ipfiremake e1000
373   ipfiremake e1000e
374   ipfiremake pkg-config
375   ipfiremake linux-atm
376   ipfiremake cpio
377   ipfiremake klibc
378   ipfiremake mkinitcpio
379   ipfiremake udev                       KLIBC=1
380   ipfiremake expat
381   ipfiremake gdbm
382   ipfiremake gmp
383   ipfiremake pam
384   ipfiremake openssl
385   ipfiremake curl
386   ipfiremake python
387   ipfiremake libnet
388   ipfiremake libnl
389   ipfiremake libidn
390   ipfiremake libjpeg
391   ipfiremake libpng
392   ipfiremake libtiff
393   ipfiremake libart
394   ipfiremake freetype
395   ipfiremake gd
396   ipfiremake popt
397   ipfiremake pcre
398   ipfiremake slang
399   ipfiremake newt
400   ipfiremake libcap
401   ipfiremake pciutils
402   ipfiremake usbutils
403   ipfiremake libxml2
404   ipfiremake libxslt
405   ipfiremake BerkeleyDB
406   ipfiremake mysql
407   ipfiremake cyrus-sasl
408   ipfiremake openldap
409   ipfiremake apache2
410   ipfiremake php
411   ipfiremake apache2                    PASS=C
412   ipfiremake arping
413   ipfiremake beep
414   ipfiremake bind
415   ipfiremake cdrtools
416   ipfiremake dnsmasq
417   ipfiremake dosfstools
418   ipfiremake squashfstools
419   ipfiremake reiserfsprogs
420   ipfiremake xfsprogs
421   ipfiremake sysfsutils
422   ipfiremake fuse
423   ipfiremake ntfs-3g
424   ipfiremake ethtool
425   ipfiremake ez-ipupdate
426   ipfiremake fcron
427   ipfiremake perl-GD
428   ipfiremake GD-Graph
429   ipfiremake GD-TextUtil
430   ipfiremake gnupg
431   ipfiremake hdparm
432   ipfiremake sdparm
433   ipfiremake mtools
434   ipfiremake initscripts
435   ipfiremake whatmask
436   ipfiremake iptables
437   ipfiremake libupnp
438   ipfiremake ipaddr
439   ipfiremake iptstate
440   ipfiremake iputils
441   ipfiremake l7-protocols
442   ipfiremake mISDNuser
443   ipfiremake capi4k-utils
444   ipfiremake hwdata
445   ipfiremake kudzu
446   ipfiremake logrotate
447   ipfiremake logwatch
448   ipfiremake misc-progs
449   ipfiremake nano
450   ipfiremake nasm
451   ipfiremake URI
452   ipfiremake HTML-Tagset
453   ipfiremake HTML-Parser
454   ipfiremake Compress-Zlib
455   ipfiremake Digest
456   ipfiremake Digest-SHA1
457   ipfiremake Digest-HMAC
458   ipfiremake libwww-perl
459   ipfiremake Net-DNS
460   ipfiremake Net-IPv4Addr
461   ipfiremake Net_SSLeay
462   ipfiremake IO-Stringy
463   ipfiremake Unix-Syslog
464   ipfiremake Mail-Tools
465   ipfiremake MIME-Tools
466   ipfiremake Net-Server
467   ipfiremake Convert-TNEF
468   ipfiremake Convert-UUlib
469   ipfiremake Archive-Tar
470   ipfiremake Archive-Zip
471   ipfiremake Text-Tabs+Wrap
472   ipfiremake Locale-Country
473   ipfiremake XML-Parser
474   ipfiremake python-setuptools
475   ipfiremake python-clientform
476   ipfiremake python-mechanize
477   ipfiremake python-feedparser
478   ipfiremake python-rssdler
479   ipfiremake glib
480   ipfiremake GeoIP
481   ipfiremake fwhits
482   ipfiremake noip_updater
483   ipfiremake ntp
484   ipfiremake openssh
485   ipfiremake rrdtool
486   ipfiremake setserial
487   ipfiremake setup
488   ipfiremake snort
489   ipfiremake oinkmaster
490   ipfiremake squid
491   ipfiremake squidguard
492   ipfiremake calamaris
493   ipfiremake tcpdump
494   ipfiremake traceroute
495   ipfiremake vlan
496   ipfiremake wireless
497   ipfiremake libsafe
498   ipfiremake pakfire
499   ipfiremake java
500   ipfiremake spandsp
501   ipfiremake lzo
502   ipfiremake openvpn
503   ipfiremake pammysql
504   ipfiremake cups
505   ipfiremake ghostscript
506   ipfiremake foomatic
507   ipfiremake hplip
508   ipfiremake samba
509   ipfiremake sudo
510   ipfiremake mc
511   ipfiremake wget
512   ipfiremake bridge-utils
513   ipfiremake screen
514   ipfiremake hddtemp
515   ipfiremake smartmontools
516   ipfiremake htop
517   ipfiremake postfix
518   ipfiremake fetchmail
519   ipfiremake cyrus-imapd
520   ipfiremake openmailadmin
521   ipfiremake clamav
522   ipfiremake spamassassin
523   ipfiremake amavisd
524   ipfiremake alsa
525   ipfiremake mpfire
526   ipfiremake guardian
527   ipfiremake libid3tag
528   ipfiremake libmad
529   ipfiremake libogg
530   ipfiremake libvorbis
531   ipfiremake libdvbpsi
532   ipfiremake lame
533   ipfiremake sox
534   ipfiremake libshout
535   ipfiremake xvid
536   ipfiremake libmpeg2
537   ipfiremake cmake
538   ipfiremake gnump3d
539   ipfiremake libsigc++
540   ipfiremake applejuice
541   ipfiremake ocaml
542   ipfiremake mldonkey
543   ipfiremake libtorrent
544   ipfiremake rtorrent
545   ipfiremake ipfireseeder
546   ipfiremake rsync
547   ipfiremake tcpwrapper
548   ipfiremake portmap
549   ipfiremake nfs
550   ipfiremake nmap
551   ipfiremake ncftp
552   ipfiremake etherwake
553   ipfiremake bwm-ng
554   ipfiremake tripwire
555   ipfiremake sysstat
556   ipfiremake vsftpd
557   ipfiremake strongswan
558   ipfiremake lsof
559   ipfiremake centerim
560   ipfiremake br2684ctl
561   ipfiremake pcmciautils
562   ipfiremake lm_sensors
563   ipfiremake liboping
564   ipfiremake collectd
565   ipfiremake lcd4linux
566   ipfiremake teamspeak
567   ipfiremake elinks
568   ipfiremake igmpproxy
569   ipfiremake fbset
570   ipfiremake sdl
571   ipfiremake qemu
572   ipfiremake qemu-kqemu
573   ipfiremake sane
574   ipfiremake netpbm
575   ipfiremake phpSANE
576   ipfiremake tunctl
577   ipfiremake nagios
578   ipfiremake ebtables
579   ipfiremake fontconfig
580   ipfiremake freefont
581   ipfiremake directfb
582   ipfiremake dfb++
583   ipfiremake faad2
584   ipfiremake ffmpeg
585   ipfiremake videolan
586   ipfiremake vdr
587   ipfiremake w_scan
588   ipfiremake icecast
589   ipfiremake icegenerator
590   ipfiremake mpd
591   ipfiremake libmpdclient
592   ipfiremake mpc
593   ipfiremake git
594   ipfiremake squidclamav
595   ipfiremake bc
596   ipfiremake vnstat
597   ipfiremake vnstati
598   ipfiremake iw
599   ipfiremake wpa_supplicant
600   ipfiremake hostapd
601   ipfiremake urlgrabber
602   ipfiremake syslinux
603   ipfiremake tftpd
604   ipfiremake cpufrequtils
605   ipfiremake dbus
606   ipfiremake bluetooth
607   ipfiremake gutenprint
608   ipfiremake apcupsd
609   ipfiremake iperf
610   ipfiremake netcat
611   ipfiremake 7zip
612   ipfiremake lynis
613   ipfiremake splix
614   ipfiremake streamripper
615   ipfiremake sshfs
616   ipfiremake sqlite
617   ipfiremake taglib
618   ipfiremake mediatomb
619   ipfiremake sslh
620   ipfiremake perl-gettext
621   ipfiremake vdradmin
622   ipfiremake miau
623   ipfiremake netsnmpd
624   ipfiremake perl-DBI
625   ipfiremake perl-DBD-mysql
626   ipfiremake cacti
627   ipfiremake icecc
628   ipfiremake openvmtools
629   ipfiremake nagiosql
630   ipfiremake iftop
631   ipfiremake motion
632   ipfiremake joe
633   ipfiremake nut
634   ipfiremake watchdog
635   ipfiremake libpri
636   ipfiremake dahdi
637   ipfiremake asterisk
638   ipfiremake lcr
639   ipfiremake usb_modeswitch
640   ipfiremake zerofree
641   ipfiremake mdadm
642   ipfiremake eject
643   ipfiremake pound
644   ipfiremake minicom
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