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