Updated mISDN,mISDNuser (25.5.2010) and lcr (1.7).
[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="38"                                                       # 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 open-vm-tools
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   echo Build on $HOSTNAME > $BASEDIR/build/var/ipfire/firebuild
645   cat /proc/version >> $BASEDIR/build/var/ipfire/firebuild
646   echo >> $BASEDIR/build/var/ipfire/firebuild
647   git log -1 >> $BASEDIR/build/var/ipfire/firebuild
648   echo >> $BASEDIR/build/var/ipfire/firebuild
649   git status >> $BASEDIR/build/var/ipfire/firebuild
650   echo >> $BASEDIR/build/var/ipfire/firebuild
651   cat /proc/cpuinfo >> $BASEDIR/build/var/ipfire/firebuild
652   echo $PAKFIRE_CORE > $BASEDIR/build/opt/pakfire/db/core/mine
653   if [ "$GIT_BRANCH" = "master" ]; then
654         echo "$NAME $VERSION - (Development Build: $GIT_LASTCOMMIT)" > $BASEDIR/build/etc/system-release
655   else
656         echo "$NAME $VERSION - $GIT_BRANCH" > $BASEDIR/build/etc/system-release
657   fi
658 }
659
660 buildinstaller() {
661   # Run installer scripts one by one
662   LOGFILE="$BASEDIR/log/_build.installer.log"
663   export LOGFILE
664   ipfiremake as86
665   ipfiremake mbr
666   ipfiremake memtest
667   installmake linux-libc-header
668   installmake binutils
669   ipfiremake uClibc                     PASS=1
670   ipfiremake gcc                        INST=1
671   installmake uClibc                    PASS=2
672   installmake gcc                       INST=2
673   installmake uClibc                    PASS=3
674   installmake busybox
675   installmake udev
676   installmake slang
677   installmake newt
678   installmake gettext
679   installmake kbd
680   installmake popt
681   installmake sysvinit
682   installmake misc-progs
683   installmake libaal
684   installmake reiser4progs
685   installmake reiserfsprogs
686   installmake sysfsutils
687   installmake util-linux
688   installmake pciutils
689   installmake zlib
690   installmake mtd
691   installmake wget
692   installmake hwdata
693   installmake kudzu
694   installmake pcmciautils
695   installmake installer
696   installmake initrd
697 }
698
699 buildpackages() {
700   LOGFILE="$BASEDIR/log/_build.packages.log"
701   export LOGFILE
702   echo "... see detailed log in _build.*.log files" >> $LOGFILE
703
704   installmake strip
705   
706   # Generating list of packages used
707   echo -n "Generating packages list from logs" | tee -a $LOGFILE
708   rm -f $BASEDIR/doc/packages-list
709   for i in `ls -1tr $BASEDIR/log/[^_]*`; do
710         if [ "$i" != "$BASEDIR/log/FILES" -a -n $i ]; then
711                 echo "* `basename $i`" >>$BASEDIR/doc/packages-list
712         fi
713   done
714   echo "== List of softwares used to build $NAME Version: $VERSION ==" > $BASEDIR/doc/packages-list.txt
715   grep -v 'configroot$\|img$\|initrd$\|initscripts$\|installer$\|install$\|setup$\|pakfire$\|stage2$\|smp$\|tools$\|tools1$\|tools2$\|.tgz$\|-config$\|_missing_rootfile$\|install1$\|install2$\|pass1$\|pass2$\|pass3$' \
716         $BASEDIR/doc/packages-list | sort >> $BASEDIR/doc/packages-list.txt
717   rm -f $BASEDIR/doc/packages-list
718   # packages-list.txt is ready to be displayed for wiki page
719   beautify message DONE
720   
721   # Update changelog
722   cd $BASEDIR
723   $0 git log
724
725   # Create images for install
726         ipfiremake cdrom ED=$IPFVER
727
728   # Check if there is a loop device for building in virtual environments
729   if [ $BUILD_IMAGES == 1 ] &&  ([ -e /dev/loop/0 ] || [ -e /dev/loop0 ]); then
730         ipfiremake usb-stick ED=$IPFVER
731         ipfiremake flash-images ED=$IPFVER
732   fi
733
734   mv $LFS/install/images/{*.iso,*.tgz,*.img.gz,*.bz2} $BASEDIR >> $LOGFILE 2>&1
735
736   ipfirepackages
737
738   # Check if there is a loop device for building in virtual environments
739   if [ $BUILD_IMAGES == 1 ] && ([ -e /dev/loop/0 ] || [ -e /dev/loop0 ]); then
740         cp -f $BASEDIR/packages/linux-xen-*.ipfire $LFS/install/packages/
741         cp -f $BASEDIR/packages/meta-linux-xen $LFS/install/packages/
742         ipfiremake xen-image ED=$IPFVER
743         rm -rf $LFS/install/packages/linux-xen-*.ipfire
744         rm -rf $LFS/install/packages/meta-linux-xen
745   fi
746   mv $LFS/install/images/*.bz2 $BASEDIR >> $LOGFILE 2>&1
747
748   # Cleanup
749   stdumount
750   rm -rf $BASEDIR/build/tmp/*
751
752   # Generating total list of files
753   echo -n "Generating files list from logs" | tee -a $LOGFILE
754   rm -f $BASEDIR/log/FILES
755   for i in `ls -1tr $BASEDIR/log/[^_]*`; do
756         if [ "$i" != "$BASEDIR/log/FILES" -a -n $i ]; then
757                 echo "##" >>$BASEDIR/log/FILES
758                 echo "## `basename $i`" >>$BASEDIR/log/FILES
759                 echo "##" >>$BASEDIR/log/FILES
760                 cat $i | sed "s%^\./%#%" | sort >> $BASEDIR/log/FILES
761         fi
762   done
763   beautify message DONE
764
765   cd $PWD
766 }
767
768 ipfirepackages() {
769         ipfiremake core-updates
770         for i in $(ls -1 $BASEDIR/config/rootfiles/packages); do
771                 if [ -e $BASEDIR/lfs/$i ]; then
772                         ipfiredist $i
773                 else
774                         echo -n $i
775                         beautify message SKIP
776                 fi
777         done
778   test -d $BASEDIR/packages || mkdir $BASEDIR/packages
779   mv -f $LFS/install/packages/* $BASEDIR/packages >> $LOGFILE 2>&1
780   rm -rf  $BASEDIR/build/install/packages/*
781 }
782
783 # See what we're supposed to do
784 case "$1" in 
785 build)
786         clear
787         BUILDMACHINE=`uname -m`
788         PACKAGE=`ls -v -r $BASEDIR/cache/toolchains/$SNAME-$VERSION-toolchain-$TOOLCHAINVER-$BUILDMACHINE.tar.gz 2> /dev/null | head -n 1`
789         #only restore on a clean disk
790         if [ ! -f log/cleanup-toolchain-2-tools ]; then
791                 if [ ! -n "$PACKAGE" ]; then
792                         beautify build_stage "Full toolchain compilation - Native GCC: `gcc --version | grep GCC | awk {'print $3'}`"
793                         prepareenv
794                         buildtoolchain
795                 else
796                         PACKAGENAME=${PACKAGE%.tar.gz}
797                         beautify build_stage "Packaged toolchain compilation"
798                         if [ `md5sum $PACKAGE | awk '{print $1}'` == `cat $PACKAGENAME.md5 | awk '{print $1}'` ]; then
799                                 tar zxf $PACKAGE
800                                 prepareenv
801                         else
802                                 exiterror "$PACKAGENAME md5 did not match, check downloaded package"
803                         fi
804                 fi
805         else
806                 echo -n "Using installed toolchain" | tee -a $LOGFILE
807                 beautify message SKIP
808                 prepareenv
809         fi
810
811         beautify build_start
812         beautify build_stage "Building LFS"
813         buildbase
814
815         beautify build_stage "Building IPFire"
816         buildipfire
817
818         beautify build_stage "Building installer"
819         buildinstaller
820
821         beautify build_stage "Building packages"
822         buildpackages
823         
824         beautify build_stage "Checking Logfiles for new Files"
825         cd ..
826         tools/checknewlog.pl
827
828         beautify build_end
829         ;;
830 shell)
831         # enter a shell inside LFS chroot
832         # may be used to changed kernel settings
833         prepareenv
834         entershell
835         ;;
836 clean)
837         echo -en "${BOLD}Cleaning build directory...${NORMAL}"
838         for i in `mount | grep $BASEDIR | sed 's/^.*loop=\(.*\))/\1/'`; do
839                 $LOSETUP -d $i 2>/dev/null
840         done
841         for i in `mount | grep $BASEDIR | cut -d " " -f 1`; do
842                 umount $i
843         done
844         stdumount
845         for i in `seq 0 7`; do
846             if ( losetup /dev/loop${i} 2>/dev/null | grep -q "/install/images" ); then
847                 umount /dev/loop${i}     2>/dev/null;
848                 losetup -d /dev/loop${i} 2>/dev/null;
849             fi;
850         done
851         rm -rf $BASEDIR/build
852         rm -rf $BASEDIR/cdrom
853         rm -rf $BASEDIR/packages
854         rm -rf $BASEDIR/log
855         if [ -h /tools ]; then
856                 rm -f /tools
857         fi
858         beautify message DONE
859         ;;
860 downloadsrc)
861         if [ ! -d $BASEDIR/cache ]; then
862                 mkdir $BASEDIR/cache
863         fi
864         mkdir -p $BASEDIR/log
865         echo -e "${BOLD}Preload all source files${NORMAL}" | tee -a $LOGFILE
866         FINISHED=0
867         cd $BASEDIR/lfs
868         for c in `seq $MAX_RETRIES`; do
869                 if (( FINISHED==1 )); then 
870                         break
871                 fi
872                 FINISHED=1
873                 cd $BASEDIR/lfs
874                 for i in *; do
875                         if [ -f "$i" -a "$i" != "Config" ]; then
876                                 echo -ne "Loading $i"
877                                 make -s -f $i LFS_BASEDIR=$BASEDIR MESSAGE="$i\t ($c/$MAX_RETRIES)" download >> $LOGFILE 2>&1
878                                 if [ $? -ne 0 ]; then
879                                         beautify message FAIL
880                                         FINISHED=0
881                                 else
882                                         if [ $c -eq 1 ]; then
883                                         beautify message DONE
884                                         fi
885                                 fi
886                         fi
887                 done
888         done
889         echo -e "${BOLD}***Verifying md5sums${NORMAL}"
890         ERROR=0
891         for i in *; do
892                 if [ -f "$i" -a "$i" != "Config" ]; then
893                         make -s -f $i LFS_BASEDIR=$BASEDIR MESSAGE="$i\t " md5 >> $LOGFILE 2>&1
894                         if [ $? -ne 0 ]; then
895                                 echo -ne "MD5 difference in lfs/$i"
896                                 beautify message FAIL
897                                 ERROR=1
898                         fi
899                 fi
900         done
901         if [ $ERROR -eq 0 ]; then
902                 echo -ne "${BOLD}all files md5sum match${NORMAL}"
903                 beautify message DONE
904         else
905                 echo -ne "${BOLD}not all files were correctly download${NORMAL}"
906                 beautify message FAIL
907         fi
908         cd - >/dev/null 2>&1
909         ;;
910 toolchain)
911         clear
912         prepareenv
913         beautify build_stage "Toolchain compilation - Native GCC: `gcc --version | grep GCC | awk {'print $3'}`"
914         buildtoolchain
915         BUILDMACHINE=`uname -m`
916         echo "`date -u '+%b %e %T'`: Create toolchain tar.gz for $BUILDMACHINE" | tee -a $LOGFILE
917         test -d $BASEDIR/cache/toolchains || mkdir -p $BASEDIR/cache/toolchains
918         cd $BASEDIR && tar -zc --exclude='log/_build.*.log' -f cache/toolchains/$SNAME-$VERSION-toolchain-$TOOLCHAINVER-$BUILDMACHINE.tar.gz \
919                 build/{bin,etc,usr/bin,usr/local} \
920                 build/tools/{bin,etc,*-linux-gnu,include,lib,libexec,sbin,share,var} \
921                 log >> $LOGFILE
922         md5sum cache/toolchains/$SNAME-$VERSION-toolchain-$TOOLCHAINVER-$BUILDMACHINE.tar.gz \
923                 > cache/toolchains/$SNAME-$VERSION-toolchain-$TOOLCHAINVER-$BUILDMACHINE.md5
924         stdumount
925         ;;
926 gettoolchain)
927         BUILDMACHINE=`uname -m`
928         # arbitrary name to be updated in case of new toolchain package upload
929         PACKAGE=$SNAME-$VERSION-toolchain-$TOOLCHAINVER-$BUILDMACHINE
930         if [ ! -f $BASEDIR/cache/toolchains/$PACKAGE.tar.gz ]; then
931                 URL_TOOLCHAIN=`grep URL_TOOLCHAIN lfs/Config | awk '{ print $3 }'`
932                 test -d $BASEDIR/cache/toolchains || mkdir -p $BASEDIR/cache/toolchains
933                 echo "`date -u '+%b %e %T'`: Load toolchain tar.gz for $BUILDMACHINE" | tee -a $LOGFILE
934                 cd $BASEDIR/cache/toolchains
935                 wget -U "IPFireSourceGrabber/2.x" $URL_TOOLCHAIN/$PACKAGE.tar.gz $URL_TOOLCHAIN/$PACKAGE.md5 >& /dev/null
936                 if [ $? -ne 0 ]; then
937                         echo "`date -u '+%b %e %T'`: error downloading $PACKAGE toolchain for $BUILDMACHINE machine" | tee -a $LOGFILE
938                 else
939                         if [ "`md5sum $PACKAGE.tar.gz | awk '{print $1}'`" = "`cat $PACKAGE.md5 | awk '{print $1}'`" ]; then
940                                 echo "`date -u '+%b %e %T'`: toolchain md5 ok" | tee -a $LOGFILE
941                         else
942                                 exiterror "$PACKAGE.md5 did not match, check downloaded package"
943                         fi
944                 fi
945         else
946                 echo "Toolchain is already downloaded. Exiting..."
947         fi
948         ;;
949 othersrc)
950         prepareenv
951         echo -ne "`date -u '+%b %e %T'`: Build sources iso for $MACHINE" | tee -a $LOGFILE
952         chroot $LFS /tools/bin/env -i   HOME=/root \
953         TERM=$TERM PS1='\u:\w\$ ' \
954         PATH=/usr/local/bin:/bin:/usr/bin:/sbin:/usr/sbin \
955         VERSION=$VERSION NAME="$NAME" SNAME="$SNAME" MACHINE=$MACHINE \
956         /bin/bash -x -c "cd /usr/src/lfs && make -f sources-iso LFS_BASEDIR=/usr/src install" >>$LOGFILE 2>&1
957         mv $LFS/install/images/ipfire-* $BASEDIR >> $LOGFILE 2>&1
958         if [ $? -eq "0" ]; then
959                 beautify message DONE
960         else
961                 beautify message FAIL
962         fi
963         stdumount
964         ;;
965 git)
966         case "$2" in
967           update|up)
968                         ## REMOVES ALL UNCOMMITTED CHANGES!
969                         [ "$3" == "--force" ] && git checkout -f
970                         git pull
971                 ;;
972           commit|ci)
973                 shift 2
974                         git commit $*
975                         
976                         [ "$?" -eq "0" ] || exiterror "git commit $* failed."
977                         
978                         echo -e "${BOLD}Do you want to push, too? [y/N]${NORMAL}"
979                         read
980                         [ -z $REPLY ] && exit 0
981                         for i in y Y j J; do
982                                 if [ "$i" == "$REPLY" ]; then
983                                         $0 git push
984                                         exit $?
985                                 fi
986                         done
987                         exiterror "\"$REPLY\" is not a valid answer."
988                 ;;
989           dist)
990                         git archive HEAD | gzip -9 > ${SNAME}-${VERSION}.tar.gz
991                   ;;
992           diff|di)
993                         echo -ne "Make a local diff to last revision"
994                         git diff HEAD > ipfire-diff-$(date +'%Y-%m-%d-%H:%M').diff
995                         evaluate 1
996                         echo "Diff was successfully saved to ipfire-diff-$(date +'%Y-%m-%d-%H:%M').diff"
997                         git diff --stat
998                 ;;
999           push)
1000                 [ -z $GIT_USER ] && exiterror "You have to setup GIT_USER first."
1001                         GIT_URL="ssh://${GIT_USER}@git.ipfire.org/pub/git/ipfire-2.x"
1002                         
1003                 git push ${GIT_URL} $3
1004                 ;;
1005           log)
1006                 [ -z $GIT_TAG ]  || LAST_TAG=$GIT_TAG
1007                 [ -z $LAST_TAG ] || EXT="$LAST_TAG..HEAD"
1008
1009                 git log -n 500 --no-merges --pretty=medium --shortstat $EXT > $BASEDIR/doc/ChangeLog
1010         ;;
1011         esac
1012         ;;
1013 uploadsrc)
1014         PWD=`pwd`
1015         if [ -z $IPFIRE_USER ]; then
1016                 echo -n "You have to setup IPFIRE_USER first. See .config for details."
1017                 beautify message FAIL
1018                 exit 1
1019         fi
1020         URL_SOURCE=$(grep URL_SOURCE lfs/Config | awk '{ print $3 }')
1021         REMOTE_FILES=$(echo "ls -1" | sftp -C ${IPFIRE_USER}@${URL_SOURCE})
1022
1023         cd $BASEDIR/cache/
1024         for file in $(ls -1); do
1025                 grep -q "$file" <<<$REMOTE_FILES && continue
1026                 NEW_FILES="$NEW_FILES $file"
1027         done
1028         [ -n "$NEW_FILES" ] && scp -2 $NEW_FILES ${IPFIRE_USER}@${URL_SOURCE}
1029         cd $BASEDIR
1030         cd $PWD
1031         exit 0
1032         ;;
1033 batch)
1034         if [ "$2" = "--background" ]; then
1035                 batch_script
1036                 exit $?
1037         fi
1038         if [ `screen -ls | grep -q ipfire` ]; then
1039                 echo "Build is already running, sorry!"
1040                 exit 1
1041         else
1042                 if [ "$2" = "--rebuild" ]; then
1043                         export IPFIRE_REBUILD=1
1044                         echo "REBUILD!"
1045                 else
1046                         export IPFIRE_REBUILD=0
1047                 fi
1048                 echo -en "${BOLD}***IPFire-Batch-Build is starting...${NORMAL}"
1049                 screen -dmS ipfire $0 batch --background
1050                 evaluate 1
1051                 exit 0
1052         fi
1053         ;;
1054 watch)
1055         watch_screen
1056         ;;
1057 pxe)
1058         case "$2" in
1059           start)
1060                 start_tftpd
1061                 ;;
1062           stop)
1063                 stop_tftpd
1064                 ;;
1065           reload|restart)
1066                 reload_tftpd
1067                 ;;              
1068         esac
1069         exit 0
1070         ;;
1071 lang)
1072         update_langs
1073         ;;
1074 "")
1075         clear
1076         select name in "Exit" "IPFIRE: Downloadsrc" "IPFIRE: Build (silent)" "IPFIRE: Watch Build" "IPFIRE: Batch" "IPFIRE: Clean" "LOG: Tail" "Help"
1077         do
1078         case $name in
1079         "IPFIRE: Downloadsrc")
1080                 $0 downloadsrc
1081                 ;;
1082         "IPFIRE: Build (silent)")
1083                 $0 build-silent
1084                 ;;
1085         "IPFIRE: Watch Build")
1086                 $0 watch
1087                 ;;
1088         "IPFIRE: Batch")
1089                 $0 batch
1090                 ;;
1091         "IPFIRE: Clean")
1092                 $0 clean
1093                 ;;
1094         "Help")
1095                 echo "Usage: $0 {build|changelog|clean|gettoolchain|downloadsrc|shell|sync|toolchain}"
1096                 cat doc/make.sh-usage
1097                 ;;
1098         "LOG: Tail")
1099                 tail -f log/_*
1100                 ;;
1101         "Exit")
1102                 break
1103                 ;;
1104         esac
1105         done
1106         ;;
1107 config)
1108         make_config
1109         ;;
1110 *)
1111         echo "Usage: $0 {build|changelog|clean|gettoolchain|downloadsrc|shell|sync|toolchain}"
1112         cat doc/make.sh-usage
1113         ;;
1114 esac