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