d454a6cc5daa8f23b2c9b9a37549e4c718d3757e
[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.3"
28 CORE="28"
29 GIT_BRANCH=master:master                                                                                # Version number
30 SLOGAN="www.ipfire.org"                                 # Software slogan
31 CONFIG_ROOT=/var/ipfire                                 # Configuration rootdir
32 NICE=10                                                                                                 # Nice level
33 MAX_RETRIES=1                                                                           # prefetch/check loop
34 KVER=`grep --max-count=1 VER lfs/linux | awk '{ print $3 }'`
35 MACHINE=`uname -m`
36 GIT_TAG=$(git tag | tail -1)
37
38 IPFVER="full"                           # Which versions should be compiled? (full|devel)
39
40 # Debian specific settings
41 if [ ! -e /etc/debian_version ]; then
42         FULLPATH=`which $0`
43 else
44         if [ -x /usr/bin/realpath ]; then
45                 FULLPATH=`/usr/bin/realpath $0`
46         else
47                 echo "ERROR: Need to do apt-get install realpath"
48                 exit 1
49         fi
50 fi
51
52 PWD=`pwd`
53 BASENAME=`basename $0`
54 BASEDIR=`echo $FULLPATH | sed "s/\/$BASENAME//g"`
55 LOGFILE=$BASEDIR/log/_build.preparation.log
56 export BASEDIR LOGFILE
57 DIR_CHK=$BASEDIR/cache/check
58 mkdir $BASEDIR/log/ 2>/dev/null
59
60 # Include funtions
61 . tools/make-functions
62
63 if [ -f .config ]; then
64         . .config
65 else
66         echo -e  "${BOLD}No configuration found!${NORMAL}"
67         echo -ne "Do you want to create one (y/N)?"
68         read CREATE_CONFIG
69         echo ""
70         if [ "$CREATE_CONFIG" == "y" ]; then
71                 make_config
72         fi
73 fi
74
75 if [ -z $EDITOR ]; then
76         for i in nano emacs vi; do
77                 EDITOR=$(which $i 2>/dev/null)
78                 if ! [ -z $EDITOR ]; then
79                         export EDITOR=$EDITOR
80                         break
81                 fi
82         done
83         [ -z $EDITOR ] && exiterror "You should have installed an editor."
84 fi
85
86 prepareenv() {
87     ############################################################################
88     #                                                                          #
89     # Are we running the right shell?                                          #
90     #                                                                          #
91     ############################################################################
92     if [ ! "$BASH" ]; then
93                         exiterror "BASH environment variable is not set.  You're probably running the wrong shell."
94     fi
95
96     if [ -z "${BASH_VERSION}" ]; then
97                         exiterror "Not running BASH shell."
98     fi
99
100
101     ############################################################################
102     #                                                                          #
103     # Trap on emergency exit                                                   #
104     #                                                                          #
105     ############################################################################
106     trap "exiterror 'Build process interrupted'" SIGINT SIGTERM SIGKILL SIGSTOP SIGQUIT
107
108
109     ############################################################################
110     #                                                                          #
111     # Resetting our nice level                                                 #
112     #                                                                          #
113     ############################################################################
114     echo -ne "Resetting our nice level to $NICE" | tee -a $LOGFILE
115     renice $NICE $$ > /dev/null
116     if [ `nice` != "$NICE" ]; then
117                         beautify message FAIL
118                         exiterror "Failed to set correct nice level"
119     else
120                         beautify message DONE
121     fi
122
123
124     ############################################################################
125     #                                                                          #
126     # Checking if running as root user                                         #
127     #                                                                          #
128     ############################################################################
129     echo -ne "Checking if we're running as root user" | tee -a $LOGFILE
130     if [ `id -u` != 0 ]; then
131                         beautify message FAIL
132                         exiterror "Not building as root"
133     else
134                         beautify message DONE
135     fi
136
137
138     ############################################################################
139     #                                                                          #
140     # Checking for necessary temporary space                                   #
141     #                                                                          #
142     ############################################################################
143     echo -ne "Checking for necessary space on disk $BASE_DEV" | tee -a $LOGFILE
144     BASE_DEV=`df -P -k $BASEDIR | tail -n 1 | awk '{ print $1 }'`
145     BASE_ASPACE=`df -P -k $BASEDIR | tail -n 1 | awk '{ print $4 }'`
146     if (( 2048000 > $BASE_ASPACE )); then
147                         BASE_USPACE=`du -skx $BASEDIR | awk '{print $1}'`
148                         if (( 2048000 - $BASE_USPACE > $BASE_ASPACE )); then
149                                 beautify message FAIL
150                                 exiterror "Not enough temporary space available, need at least 2GB on $BASE_DEV"
151                         fi
152     else
153                         beautify message DONE
154     fi
155
156     ############################################################################
157     #                                                                          #
158     # Building Linux From Scratch system                                       #
159     #                                                                          #
160     ############################################################################
161     # Set umask
162     umask 022
163
164     # Set LFS Directory
165     LFS=$BASEDIR/build
166
167     # Check /tools symlink
168     if [ -h /tools ]; then
169         rm -f /tools
170     fi
171     if [ ! -a /tools ]; then
172                         ln -s $BASEDIR/build/tools /
173     fi
174     if [ ! -h /tools ]; then
175                         exiterror "Could not create /tools symbolic link."
176     fi
177
178     # Setup environment
179     set +h
180     LC_ALL=POSIX
181     if [ -z $MAKETUNING ]; then
182        MAKETUNING="-j6"
183     fi
184     export LFS LC_ALL CFLAGS CXXFLAGS MAKETUNING
185     unset CC CXX CPP LD_LIBRARY_PATH LD_PRELOAD
186
187     # Make some extra directories
188     mkdir -p $BASEDIR/build/{tools,etc,usr/src} 2>/dev/null
189     mkdir -p $BASEDIR/build/{dev/{shm,pts},proc,sys}
190     mkdir -p $BASEDIR/{cache,ccache} 2>/dev/null
191     mkdir -p $BASEDIR/build/usr/src/{cache,config,doc,html,langs,lfs,log,src,ccache}
192
193     mknod -m 600 $BASEDIR/build/dev/console c 5 1 2>/dev/null
194     mknod -m 666 $BASEDIR/build/dev/null c 1 3 2>/dev/null
195
196     # Make all sources and proc available under lfs build
197     mount --bind /dev            $BASEDIR/build/dev
198     mount --bind /dev/pts        $BASEDIR/build/dev/pts
199     mount --bind /dev/shm        $BASEDIR/build/dev/shm
200     mount --bind /proc           $BASEDIR/build/proc
201     mount --bind /sys            $BASEDIR/build/sys
202     mount --bind $BASEDIR/cache  $BASEDIR/build/usr/src/cache
203     mount --bind $BASEDIR/ccache $BASEDIR/build/usr/src/ccache
204     mount --bind $BASEDIR/config $BASEDIR/build/usr/src/config
205     mount --bind $BASEDIR/doc    $BASEDIR/build/usr/src/doc
206     mount --bind $BASEDIR/html   $BASEDIR/build/usr/src/html
207     mount --bind $BASEDIR/langs  $BASEDIR/build/usr/src/langs
208     mount --bind $BASEDIR/lfs    $BASEDIR/build/usr/src/lfs
209     mount --bind $BASEDIR/log    $BASEDIR/build/usr/src/log
210     mount --bind $BASEDIR/src    $BASEDIR/build/usr/src/src
211
212     # This is a temporary hack!!!
213     if [ ! -f /tools/bin/hostname ]; then
214       cp -f /bin/hostname /tools/bin/hostname 2>/dev/null
215     fi
216
217     # Run LFS static binary creation scripts one by one
218     export CCACHE_DIR=$BASEDIR/ccache
219     export CCACHE_HASHDIR=1
220
221     # Remove pre-install list of installed files in case user erase some files before rebuild
222     rm -f $BASEDIR/build/usr/src/lsalr 2>/dev/null
223 }
224
225 buildtoolchain() {
226     LOGFILE="$BASEDIR/log/_build.toolchain.log"
227     export LOGFILE
228     ORG_PATH=$PATH
229     NATIVEGCC=`gcc --version | grep GCC | awk {'print $3'}`
230     export NATIVEGCC GCCmajor=${NATIVEGCC:0:1} GCCminor=${NATIVEGCC:2:1} GCCrelease=${NATIVEGCC:4:1}
231     lfsmake1 ccache
232     lfsmake1 binutils   PASS=1
233     lfsmake1 gcc                PASS=1
234     export PATH=$BASEDIR/build/usr/local/bin:$BASEDIR/build/tools/bin:$PATH
235     lfsmake1 linux-libc-header
236     lfsmake1 glibc
237     lfsmake1 cleanup-toolchain PASS=1
238     lfsmake1 tcl
239     lfsmake1 expect
240     lfsmake1 dejagnu
241     lfsmake1 gcc                PASS=2
242     lfsmake1 binutils   PASS=2
243     lfsmake1 ncurses
244     lfsmake1 bash
245     lfsmake1 bzip2
246     lfsmake1 coreutils
247     lfsmake1 diffutils
248     lfsmake1 findutils
249     lfsmake1 gawk
250     lfsmake1 gettext
251     lfsmake1 grep
252     lfsmake1 gzip
253     lfsmake1 m4
254     lfsmake1 make
255     lfsmake1 patch
256     lfsmake1 perl
257     lfsmake1 sed
258     lfsmake1 tar
259     lfsmake1 texinfo
260     lfsmake1 util-linux
261     lfsmake1 cleanup-toolchain  PASS=2
262     export PATH=$ORG_PATH
263 }
264
265 buildbase() {
266     LOGFILE="$BASEDIR/log/_build.base.log"
267     export LOGFILE
268     lfsmake2 stage2
269     lfsmake2 linux-libc-header
270     lfsmake2 man-pages
271     lfsmake2 glibc
272     lfsmake2 cleanup-toolchain  PASS=3
273     lfsmake2 binutils
274     lfsmake2 gcc
275     lfsmake2 berkeley
276     lfsmake2 coreutils
277     lfsmake2 iana-etc
278     lfsmake2 m4
279     lfsmake2 bison
280     lfsmake2 ncurses
281     lfsmake2 procps
282     lfsmake2 sed
283     lfsmake2 libtool
284     lfsmake2 perl
285     lfsmake2 readline
286     lfsmake2 zlib
287     lfsmake2 autoconf
288     lfsmake2 automake
289     lfsmake2 bash
290     lfsmake2 bzip2
291     lfsmake2 diffutils
292     lfsmake2 e2fsprogs
293     lfsmake2 ed
294     lfsmake2 file
295     lfsmake2 findutils
296     lfsmake2 flex
297     lfsmake2 gawk
298     lfsmake2 gettext
299     lfsmake2 grep
300     lfsmake2 groff
301     lfsmake2 gzip
302     lfsmake2 inetutils
303     lfsmake2 iproute2
304     lfsmake2 kbd
305     lfsmake2 less
306     lfsmake2 libaal
307     lfsmake2 make
308     lfsmake2 man
309     lfsmake2 mktemp
310     lfsmake2 module-init-tools
311     lfsmake2 mtd
312     lfsmake2 net-tools
313     lfsmake2 patch
314     lfsmake2 psmisc
315     lfsmake2 reiser4progs
316     lfsmake2 shadow
317     lfsmake2 sysklogd
318     lfsmake2 sysvinit
319     lfsmake2 tar
320     lfsmake2 texinfo
321     lfsmake2 udev
322     lfsmake2 util-linux
323     lfsmake2 vim
324     lfsmake2 grub
325 }
326
327 buildipfire() {
328   LOGFILE="$BASEDIR/log/_build.ipfire.log"
329   export LOGFILE
330   ipfiremake configroot
331   ipfiremake backup
332   ipfiremake dhcp
333   ipfiremake dhcpcd
334   ipfiremake libusb
335   ipfiremake libpcap
336   ipfiremake ppp
337   ipfiremake rp-pppoe
338   ipfiremake pptp
339   ipfiremake unzip
340   ipfiremake linux
341   ipfiremake atl2
342   ipfiremake kqemu
343   ipfiremake v4l-dvb
344   ipfiremake madwifi
345   ipfiremake alsa                       KMOD=1
346   ipfiremake openswan                   KMOD=1
347   ipfiremake pkg-config
348   ipfiremake linux-atm
349   ipfiremake cpio
350   ipfiremake klibc
351   ipfiremake mkinitcpio
352   ipfiremake udev                       KLIBC=1
353   ipfiremake expat
354   ipfiremake gdbm
355   ipfiremake gmp
356   ipfiremake pam
357   ipfiremake openssl
358   ipfiremake curl
359   ipfiremake python
360   ipfiremake libnet
361   ipfiremake libidn
362   ipfiremake libjpeg
363   ipfiremake libpng
364   ipfiremake libtiff
365   ipfiremake libart
366   ipfiremake freetype
367   ipfiremake gd
368   ipfiremake popt
369   ipfiremake pcre
370   ipfiremake slang
371   ipfiremake newt
372   ipfiremake libcap
373   ipfiremake pciutils
374   ipfiremake usbutils
375   ipfiremake libxml2
376   ipfiremake libxslt
377   ipfiremake BerkeleyDB
378   ipfiremake mysql
379   ipfiremake cyrus-sasl
380   ipfiremake openldap
381   ipfiremake apache2
382   ipfiremake php
383   ipfiremake apache2                    PASS=C
384   ipfiremake arping
385   ipfiremake beep
386   ipfiremake bind
387   ipfiremake cdrtools
388   ipfiremake dnsmasq
389   ipfiremake dosfstools
390   ipfiremake squashfstools
391   ipfiremake reiserfsprogs
392   ipfiremake xfsprogs
393   ipfiremake sysfsutils
394   ipfiremake fuse
395   ipfiremake ntfs-3g
396   ipfiremake ethtool
397   ipfiremake ez-ipupdate
398   ipfiremake fcron
399   ipfiremake perl-GD
400   ipfiremake GD-Graph
401   ipfiremake GD-TextUtil
402   ipfiremake gnupg
403   ipfiremake hdparm
404   ipfiremake sdparm
405   ipfiremake mtools
406   ipfiremake initscripts
407   ipfiremake whatmask
408   ipfiremake iptables
409   ipfiremake libupnp
410   ipfiremake ipaddr
411   ipfiremake iptstate
412   ipfiremake iputils
413   ipfiremake l7-protocols
414   ipfiremake mISDN
415   ipfiremake capi4k-utils
416   ipfiremake hwdata
417   ipfiremake kudzu
418   ipfiremake logrotate
419   ipfiremake logwatch
420   ipfiremake misc-progs
421   ipfiremake nano
422   ipfiremake nasm
423   ipfiremake URI
424   ipfiremake HTML-Tagset
425   ipfiremake HTML-Parser
426   ipfiremake Compress-Zlib
427   ipfiremake Digest
428   ipfiremake Digest-SHA1
429   ipfiremake Digest-HMAC
430   ipfiremake libwww-perl
431   ipfiremake Net-DNS
432   ipfiremake Net-IPv4Addr
433   ipfiremake Net_SSLeay
434   ipfiremake IO-Stringy
435   ipfiremake Unix-Syslog
436   ipfiremake Mail-Tools
437   ipfiremake MIME-Tools
438   ipfiremake Net-Server
439   ipfiremake Convert-TNEF
440   ipfiremake Convert-UUlib
441   ipfiremake Archive-Tar
442   ipfiremake Archive-Zip
443   ipfiremake Text-Tabs+Wrap
444   ipfiremake Locale-Country
445   ipfiremake XML-Parser
446   ipfiremake python-setuptools
447   ipfiremake python-clientform
448   ipfiremake python-mechanize
449   ipfiremake python-feedparser
450   ipfiremake python-rssdler
451   ipfiremake glib
452   ipfiremake GeoIP
453   ipfiremake fwhits
454   ipfiremake noip_updater
455   ipfiremake ntp
456   ipfiremake openssh
457   ipfiremake rrdtool
458   ipfiremake setserial
459   ipfiremake setup
460   ipfiremake snort
461   ipfiremake oinkmaster
462   ipfiremake squid
463   ipfiremake squidguard
464   ipfiremake calamaris
465   ipfiremake tcpdump
466   ipfiremake traceroute
467   ipfiremake vlan
468   ipfiremake wireless
469   ipfiremake libsafe
470   ipfiremake pakfire
471   ipfiremake java
472   ipfiremake spandsp
473   ipfiremake lzo
474   ipfiremake openvpn
475   ipfiremake pammysql
476   ipfiremake cups
477   ipfiremake ghostscript
478   ipfiremake foomatic
479   ipfiremake hplip
480   ipfiremake samba
481   ipfiremake sudo
482   ipfiremake mc
483   ipfiremake wget
484   ipfiremake bridge-utils
485   ipfiremake screen
486   ipfiremake hddtemp
487   ipfiremake smartmontools
488   ipfiremake htop
489   ipfiremake postfix
490   ipfiremake fetchmail
491   ipfiremake cyrus-imapd
492   ipfiremake openmailadmin
493   ipfiremake clamav
494   ipfiremake spamassassin
495   ipfiremake amavisd
496   ipfiremake alsa
497   ipfiremake mpfire
498   ipfiremake guardian
499   ipfiremake libid3tag
500   ipfiremake libmad
501   ipfiremake libogg
502   ipfiremake libvorbis
503   ipfiremake libdvbpsi
504   ipfiremake lame
505   ipfiremake sox
506   ipfiremake libshout
507   ipfiremake xvid
508   ipfiremake libmpeg2
509   ipfiremake cmake
510   ipfiremake libpri
511   ipfiremake asterisk
512   ipfiremake gnump3d
513   ipfiremake libsigc++
514   ipfiremake applejuice
515   ipfiremake ocaml
516   ipfiremake mldonkey
517   ipfiremake libtorrent
518   ipfiremake rtorrent
519   ipfiremake ipfireseeder
520   ipfiremake rsync
521   ipfiremake tcpwrapper
522   ipfiremake portmap
523   ipfiremake nfs
524   ipfiremake nmap
525   ipfiremake ncftp
526   ipfiremake etherwake
527   ipfiremake bwm-ng
528   ipfiremake tripwire
529   ipfiremake sysstat
530   ipfiremake vsftpd
531   ipfiremake which
532   ipfiremake openswan
533   ipfiremake lsof
534   ipfiremake centerim
535   ipfiremake br2684ctl
536   ipfiremake pcmciautils
537   ipfiremake lm_sensors
538   ipfiremake collectd
539   ipfiremake lcd4linux
540   ipfiremake tcptrack
541   ipfiremake teamspeak
542   ipfiremake elinks
543   ipfiremake igmpproxy
544   ipfiremake fbset
545   ipfiremake sdl
546   ipfiremake qemu
547   ipfiremake sane
548   ipfiremake netpbm
549   ipfiremake phpSANE
550   ipfiremake tunctl
551   ipfiremake nagios
552   ipfiremake ebtables
553   ipfiremake fontconfig
554   ipfiremake freefont
555   ipfiremake directfb
556   ipfiremake dfb++
557   ipfiremake ffmpeg
558   ipfiremake videolan
559   ipfiremake vdr
560   ipfiremake w_scan
561   ipfiremake icecast
562   ipfiremake icegenerator
563   ipfiremake mpd
564   ipfiremake mpc
565   ipfiremake git
566   ipfiremake squidclamav
567   ipfiremake bc
568   ipfiremake esniper
569   ipfiremake vnstat
570   ipfiremake vnstati
571   ipfiremake wpa_supplicant
572   ipfiremake hostapd
573   ipfiremake urlgrabber
574   ipfiremake syslinux
575   ipfiremake tftpd
576   ipfiremake cpufrequtils
577   ipfiremake dbus
578   ipfiremake bluetooth
579   ipfiremake gutenprint
580   ipfiremake apcupsd
581   ipfiremake iperf
582   ipfiremake netcat
583   ipfiremake 7zip
584   ipfiremake lynis
585   ipfiremake cryptsetup
586   ipfiremake splix
587   ipfiremake streamripper
588   ipfiremake sshfs
589   ipfiremake sqlite
590   ipfiremake taglib
591 #  ipfiremake mediatomb
592   ipfiremake sslh
593   ipfiremake perl-gettext
594   ipfiremake vdradmin
595   ipfiremake miau
596   echo Build on $HOSTNAME > $BASEDIR/build/var/ipfire/firebuild
597   cat /proc/version >> $BASEDIR/build/var/ipfire/firebuild
598   echo >> $BASEDIR/build/var/ipfire/firebuild
599   git log -1 >> $BASEDIR/build/var/ipfire/firebuild
600   echo >> $BASEDIR/build/var/ipfire/firebuild
601   git status >> $BASEDIR/build/var/ipfire/firebuild
602   echo >> $BASEDIR/build/var/ipfire/firebuild
603   cat /proc/cpuinfo >> $BASEDIR/build/var/ipfire/firebuild
604   echo $CORE > $BASEDIR/build/opt/pakfire/db/core/mine
605 }
606
607 buildinstaller() {
608   # Run installer scripts one by one
609   LOGFILE="$BASEDIR/log/_build.installer.log"
610   export LOGFILE
611   ipfiremake as86
612   ipfiremake mbr
613   ipfiremake memtest
614   installmake linux-libc-header
615   installmake binutils
616   ipfiremake uClibc                     PASS=1
617   ipfiremake gcc                        INST=1
618   installmake uClibc                    PASS=2
619   installmake gcc                       INST=2
620   installmake uClibc                    PASS=3
621   installmake busybox
622   installmake udev
623   installmake slang
624   installmake newt
625   installmake gettext
626   installmake kbd
627   installmake popt
628   installmake sysvinit
629   installmake misc-progs
630   installmake libaal
631   installmake reiser4progs
632   installmake reiserfsprogs
633   installmake sysfsutils
634   installmake util-linux
635   installmake pciutils
636   installmake zlib
637   installmake mtd
638   installmake wget
639   installmake hwdata
640   installmake kudzu
641   installmake pcmciautils
642   installmake installer
643   installmake initrd
644 }
645
646 buildpackages() {
647   LOGFILE="$BASEDIR/log/_build.packages.log"
648   export LOGFILE
649   echo "... see detailed log in _build.*.log files" >> $LOGFILE
650
651   installmake strip
652   
653   # Generating list of packages used
654   echo -n "Generating packages list from logs" | tee -a $LOGFILE
655   rm -f $BASEDIR/doc/packages-list
656   for i in `ls -1tr $BASEDIR/log/[^_]*`; do
657         if [ "$i" != "$BASEDIR/log/FILES" -a -n $i ]; then
658                 echo "* `basename $i`" >>$BASEDIR/doc/packages-list
659         fi
660   done
661   echo "== List of softwares used to build $NAME Version: $VERSION ==" > $BASEDIR/doc/packages-list.txt
662   grep -v 'configroot$\|img$\|initrd$\|initscripts$\|installer$\|install$\|setup$\|pakfire$\|stage2$\|smp$\|tools$\|tools1$\|tools2$\|.tgz$\|-config$\|_missing_rootfile$\|install1$\|install2$\|pass1$\|pass2$\|pass3$' \
663         $BASEDIR/doc/packages-list | sort >> $BASEDIR/doc/packages-list.txt
664   rm -f $BASEDIR/doc/packages-list
665   # packages-list.txt is ready to be displayed for wiki page
666   beautify message DONE
667   
668   # Update changelog
669   cd $BASEDIR
670   $0 git log
671
672   # Create images for install
673         ipfiremake cdrom ED=$IPFVER
674         
675   # Check if there is a loop device for building in virtual environments
676   if [ -e /dev/loop/0 ] || [ -e /dev/loop0 ]; then
677         ipfiremake usb-stick ED=$IPFVER
678   fi
679
680   # Create updater package
681   #ipfiremake updater
682   mv $LFS/install/images/{*.iso,*.tgz,*.img.gz,*.bz2} $BASEDIR >> $LOGFILE 2>&1
683
684   ipfirepackages
685
686   # Cleanup
687   stdumount
688   rm -rf $BASEDIR/build/tmp/*
689
690   # Generating total list of files
691   echo -n "Generating files list from logs" | tee -a $LOGFILE
692   rm -f $BASEDIR/log/FILES
693   for i in `ls -1tr $BASEDIR/log/[^_]*`; do
694         if [ "$i" != "$BASEDIR/log/FILES" -a -n $i ]; then
695                 echo "##" >>$BASEDIR/log/FILES
696                 echo "## `basename $i`" >>$BASEDIR/log/FILES
697                 echo "##" >>$BASEDIR/log/FILES
698                 cat $i | sed "s%^\./%#%" | sort >> $BASEDIR/log/FILES
699         fi
700   done
701   beautify message DONE
702
703   cd $PWD
704 }
705
706 ipfirepackages() {
707         ipfiremake core-updates
708         for i in $(ls -1 $BASEDIR/config/rootfiles/packages); do
709                 if [ -e $BASEDIR/lfs/$i ]; then
710                         ipfiredist $i
711                 else
712                         echo -n $i
713                         beautify message SKIP
714                 fi
715         done
716   test -d $BASEDIR/packages || mkdir $BASEDIR/packages
717   mv -f $LFS/install/packages/* $BASEDIR/packages >> $LOGFILE 2>&1
718   rm -rf  $BASEDIR/build/install/packages/*
719 }
720
721 # See what we're supposed to do
722 case "$1" in 
723 build)
724         clear
725         BUILDMACHINE=`uname -m`
726         PACKAGE=`ls -v -r $BASEDIR/cache/toolchains/$SNAME-$VERSION-toolchain-$BUILDMACHINE.tar.gz 2> /dev/null | head -n 1`
727         #only restore on a clean disk
728         if [ ! -f log/cleanup-toolchain-2-tools ]; then
729                 if [ ! -n "$PACKAGE" ]; then
730                         beautify build_stage "Full toolchain compilation - Native GCC: `gcc --version | grep GCC | awk {'print $3'}`"
731                         prepareenv
732                         buildtoolchain
733                 else
734                         PACKAGENAME=${PACKAGE%.tar.gz}
735                         beautify build_stage "Packaged toolchain compilation"
736                         if [ `md5sum $PACKAGE | awk '{print $1}'` == `cat $PACKAGENAME.md5 | awk '{print $1}'` ]; then
737                                 tar zxf $PACKAGE
738                                 prepareenv
739                         else
740                                 exiterror "$PACKAGENAME md5 did not match, check downloaded package"
741                         fi
742                 fi
743         else
744                 echo -n "Using installed toolchain" | tee -a $LOGFILE
745                 beautify message SKIP
746                 prepareenv
747         fi
748
749         beautify build_start
750         beautify build_stage "Building LFS"
751         buildbase
752
753         beautify build_stage "Building IPFire"
754         buildipfire
755
756         beautify build_stage "Building installer"
757         buildinstaller
758
759         beautify build_stage "Building packages"
760         buildpackages
761         
762         beautify build_stage "Checking Logfiles for new Files"
763         cd ..
764         tools/checknewlog.pl
765
766         beautify build_end
767         ;;
768 shell)
769         # enter a shell inside LFS chroot
770         # may be used to changed kernel settings
771         prepareenv
772         entershell
773         ;;
774 clean)
775         echo -en "${BOLD}Cleaning build directory...${NORMAL}"
776         for i in `mount | grep $BASEDIR | sed 's/^.*loop=\(.*\))/\1/'`; do
777                 $LOSETUP -d $i 2>/dev/null
778         done
779         for i in `mount | grep $BASEDIR | cut -d " " -f 1`; do
780                 umount $i
781         done
782         stdumount
783         for i in `seq 0 7`; do
784             if ( losetup /dev/loop${i} 2>/dev/null | grep -q "/install/images" ); then
785                 umount /dev/loop${i}     2>/dev/null;
786                 losetup -d /dev/loop${i} 2>/dev/null;
787             fi;
788         done
789         rm -rf $BASEDIR/build
790         rm -rf $BASEDIR/cdrom
791         rm -rf $BASEDIR/packages
792         rm -rf $BASEDIR/log
793         if [ -h /tools ]; then
794                 rm -f /tools
795         fi
796         beautify message DONE
797         ;;
798 downloadsrc)
799         if [ ! -d $BASEDIR/cache ]; then
800                 mkdir $BASEDIR/cache
801         fi
802         mkdir -p $BASEDIR/log
803         echo -e "${BOLD}Preload all source files${NORMAL}" | tee -a $LOGFILE
804         FINISHED=0
805         cd $BASEDIR/lfs
806         for c in `seq $MAX_RETRIES`; do
807                 if (( FINISHED==1 )); then 
808                         break
809                 fi
810                 FINISHED=1
811                 cd $BASEDIR/lfs
812                 for i in *; do
813                         if [ -f "$i" -a "$i" != "Config" ]; then
814                                 echo -ne "Loading $i"
815                                 make -s -f $i LFS_BASEDIR=$BASEDIR MESSAGE="$i\t ($c/$MAX_RETRIES)" download >> $LOGFILE 2>&1
816                                 if [ $? -ne 0 ]; then
817                                         beautify message FAIL
818                                         FINISHED=0
819                                 else
820                                         if [ $c -eq 1 ]; then
821                                         beautify message DONE
822                                         fi
823                                 fi
824                         fi
825                 done
826         done
827         echo -e "${BOLD}***Verifying md5sums${NORMAL}"
828         ERROR=0
829         for i in *; do
830                 if [ -f "$i" -a "$i" != "Config" ]; then
831                         make -s -f $i LFS_BASEDIR=$BASEDIR MESSAGE="$i\t " md5 >> $LOGFILE 2>&1
832                         if [ $? -ne 0 ]; then
833                                 echo -ne "MD5 difference in lfs/$i"
834                                 beautify message FAIL
835                                 ERROR=1
836                         fi
837                 fi
838         done
839         if [ $ERROR -eq 0 ]; then
840                 echo -ne "${BOLD}all files md5sum match${NORMAL}"
841                 beautify message DONE
842         else
843                 echo -ne "${BOLD}not all files were correctly download${NORMAL}"
844                 beautify message FAIL
845         fi
846         cd - >/dev/null 2>&1
847         ;;
848 toolchain)
849         clear
850         prepareenv
851         beautify build_stage "Toolchain compilation - Native GCC: `gcc --version | grep GCC | awk {'print $3'}`"
852         buildtoolchain
853         BUILDMACHINE=`uname -m`
854         echo "`date -u '+%b %e %T'`: Create toolchain tar.gz for $BUILDMACHINE" | tee -a $LOGFILE
855         test -d $BASEDIR/cache/toolchains || mkdir $BASEDIR/cache/toolchains
856         cd $BASEDIR && tar -zc --exclude='log/_build.*.log' -f cache/toolchains/$SNAME-$VERSION-toolchain-$BUILDMACHINE.tar.gz \
857                 build/{bin,etc,usr/bin,usr/local} \
858                 build/tools/{bin,etc,*-linux-gnu,include,lib,libexec,sbin,share,var} \
859                 log >> $LOGFILE
860         md5sum cache/toolchains/$SNAME-$VERSION-toolchain-$BUILDMACHINE.tar.gz \
861                 > cache/toolchains/$SNAME-$VERSION-toolchain-$BUILDMACHINE.md5
862         stdumount
863         ;;
864 gettoolchain)
865         BUILDMACHINE=`uname -m`
866         # arbitrary name to be updated in case of new toolchain package upload
867         PACKAGE=$SNAME-$VERSION-toolchain-$BUILDMACHINE
868         if [ ! -f $BASEDIR/cache/toolchains/$PACKAGE.tar.gz ]; then
869                 URL_TOOLCHAIN=`grep URL_TOOLCHAIN lfs/Config | awk '{ print $3 }'`
870                 test -d $BASEDIR/cache/toolchains || mkdir $BASEDIR/cache/toolchains
871                 echo "`date -u '+%b %e %T'`: Load toolchain tar.gz for $BUILDMACHINE" | tee -a $LOGFILE
872                 cd $BASEDIR/cache/toolchains
873                 wget -U "IPFireSourceGrabber/2.x" $URL_TOOLCHAIN/$PACKAGE.tar.gz $URL_TOOLCHAIN/$PACKAGE.md5 >& /dev/null
874                 if [ $? -ne 0 ]; then
875                         echo "`date -u '+%b %e %T'`: error downloading $PACKAGE toolchain for $BUILDMACHINE machine" | tee -a $LOGFILE
876                 else
877                         if [ "`md5sum $PACKAGE.tar.gz | awk '{print $1}'`" = "`cat $PACKAGE.md5 | awk '{print $1}'`" ]; then
878                                 echo "`date -u '+%b %e %T'`: toolchain md5 ok" | tee -a $LOGFILE
879                         else
880                                 exiterror "$PACKAGE.md5 did not match, check downloaded package"
881                         fi
882                 fi
883         else
884                 echo "Toolchain is already downloaded. Exiting..."
885         fi
886         ;;
887 othersrc)
888         prepareenv
889         echo -ne "`date -u '+%b %e %T'`: Build sources iso for $MACHINE" | tee -a $LOGFILE
890         chroot $LFS /tools/bin/env -i   HOME=/root \
891         TERM=$TERM PS1='\u:\w\$ ' \
892         PATH=/usr/local/bin:/bin:/usr/bin:/sbin:/usr/sbin \
893         VERSION=$VERSION NAME="$NAME" SNAME="$SNAME" MACHINE=$MACHINE \
894         /bin/bash -x -c "cd /usr/src/lfs && make -f sources-iso LFS_BASEDIR=/usr/src install" >>$LOGFILE 2>&1
895         mv $LFS/install/images/ipfire-* $BASEDIR >> $LOGFILE 2>&1
896         if [ $? -eq "0" ]; then
897                 beautify message DONE
898         else
899                 beautify message FAIL
900         fi
901         stdumount
902         ;;
903 git)
904         case "$2" in
905           update|up)
906                         ## REMOVES ALL UNCOMMITTED CHANGES!
907                         [ "$3" == "--force" ] && git checkout -f
908                         git pull
909                 ;;
910           commit|ci)
911                 shift 2
912                         git commit $*
913                         
914                         [ "$?" -eq "0" ] || exiterror "git commit $* failed."
915                         
916                         echo -e "${BOLD}Do you want to push, too? [y/N]${NORMAL}"
917                         read
918                         [ -z $REPLY ] && exit 0
919                         for i in y Y j J; do
920                                 if [ "$i" == "$REPLY" ]; then
921                                         $0 git push
922                                         exit $?
923                                 fi
924                         done
925                         exiterror "\"$REPLY\" is not a valid answer."
926                 ;;
927           dist)
928                         git archive HEAD | gzip -9 > ${SNAME}-${VERSION}.tar.gz
929                   ;;
930           diff|di)
931                         echo -ne "Make a local diff to last revision"
932                         git diff HEAD > ipfire-diff-$(date +'%Y-%m-%d-%H:%M').diff
933                         evaluate 1
934                         echo "Diff was successfully saved to ipfire-diff-$(date +'%Y-%m-%d-%H:%M').diff"
935                         git diff --stat
936                 ;;
937           push)
938                 [ -z $GIT_USER ] && exiterror "You have to setup GIT_USER first."
939                         GIT_URL="ssh://${GIT_USER}@git.ipfire.org/pub/git/ipfire-2.x"
940                         
941                 git push ${GIT_URL} ${GIT_BRANCH} $3
942                 ;;
943           log)
944                 [ -z $GIT_TAG ]  || LAST_TAG=$GIT_TAG
945                 [ -z $LAST_TAG ] || EXT="$LAST_TAG..HEAD"
946
947                 git log -n 500 --no-merges --pretty=medium --shortstat $EXT > $BASEDIR/doc/ChangeLog
948         ;;
949         esac
950         ;;
951 uploadsrc)
952         PWD=`pwd`
953         if [ -z $IPFIRE_USER ]; then
954                 echo -n "You have to setup IPFIRE_USER first. See .config for details."
955                 beautify message FAIL
956                 exit 1
957         fi
958         URL_SOURCE=$(grep URL_SOURCE lfs/Config | awk '{ print $3 }')
959         REMOTE_FILES=$(echo "ls -1" | sftp -C ${IPFIRE_USER}@${URL_SOURCE})
960
961         cd $BASEDIR/cache/
962         for file in $(ls -1); do
963                 grep -q "$file" <<<$REMOTE_FILES && continue
964                 NEW_FILES="$NEW_FILES $file"
965         done
966         [ -n "$NEW_FILES" ] && scp -2 $NEW_FILES ${IPFIRE_USER}@${URL_SOURCE}
967         cd $BASEDIR
968         cd $PWD
969         exit 0
970         ;;
971 upload)
972         FTP_ISO_PORT=`echo "$FTP_ISO_URL" | awk -F: '{ print $2 }'`
973         FTP_ISO_URL=`echo "$FTP_ISO_URL" | awk -F: '{ print $1 }'`
974         if [ -z $FTP_ISO_PORT ]; then
975             FTP_ISO_PORT=21
976         fi
977         cat <<EOF > .ftp-commands
978 mkdir -p $FTP_ISO_PATH$SVN_REVISION
979 mkdir -p $FTP_ISO_PATH$SVN_REVISION/paks
980 quit
981 EOF
982         ncftp -u $FTP_ISO_USER -p $FTP_ISO_PASS -P $FTP_ISO_PORT $FTP_ISO_URL < .ftp-commands
983         rm -f .ftp-commands
984                 
985         case "$2" in
986           iso)
987                 echo -e "Uploading the iso to $FTP_ISO_PATH/$SVN_REVISION."
988
989                 md5sum ipfire-$VERSION.$MACHINE-full.iso > ipfire-$VERSION.$MACHINE-full.iso.md5
990                 for i in svn_status ipfire-source-r$SVN_REVISION.tar.gz ipfire-$VERSION.$MACHINE-full.iso ipfire-$VERSION.$MACHINE-full.iso.md5 ipfire-$VERSION.$MACHINE-devel.iso ipfire-$VERSION.$MACHINE-devel.iso.md5; do
991                                 if [ -e "$i" ]; then
992                             ncftpput -u $FTP_ISO_USER -p $FTP_ISO_PASS -P $FTP_ISO_PORT $FTP_ISO_URL $FTP_ISO_PATH$SVN_REVISION/ $i
993                                         if [ "$?" -eq "0" ]; then
994                                                 echo "The file with name $i was successfully uploaded to $FTP_ISO_URL$FTP_ISO_PATH$SVN_REVISION/."
995                                         else
996                                                 echo "There was an error while uploading the file $i to the ftp server."
997                                                 exit 1
998                                         fi
999                                 fi
1000                 done
1001                 rm -f ipfire-$VERSION.$MACHINE-full.iso.md5
1002                 if [ "$3" = "--with-sources-cd" ]; then
1003                         ncftpput -u $FTP_ISO_USER -p $FTP_ISO_PASS -P $FTP_ISO_PORT $FTP_ISO_URL $FTP_ISO_PATH/$SVN_REVISION/ ipfire-sources-cd-$VERSION.$MACHINE.iso
1004                 fi
1005                 ;;
1006           paks)
1007                 ncftpput -u $FTP_ISO_USER -p $FTP_ISO_PASS -P $FTP_ISO_PORT $FTP_ISO_URL $FTP_ISO_PATH$SVN_REVISION/paks packages/*
1008                 if [ "$?" -eq "0" ]; then
1009                         echo -e "The packages were successfully uploaded to $FTP_ISO_URL$FTP_ISO_PATH$SVN_REVISION/."
1010                 else
1011                         echo -e "There was an error while uploading the packages to the ftp server."
1012                         exit 1
1013                 fi
1014           ;;
1015         esac
1016         ;;
1017 batch)
1018         if [ "$2" = "--background" ]; then
1019                 batch_script
1020                 exit $?
1021         fi
1022         if [ `screen -ls | grep -q ipfire` ]; then
1023                 echo "Build is already running, sorry!"
1024                 exit 1
1025         else
1026                 if [ "$2" = "--rebuild" ]; then
1027                         export IPFIRE_REBUILD=1
1028                         echo "REBUILD!"
1029                 else
1030                         export IPFIRE_REBUILD=0
1031                 fi
1032                 echo -en "${BOLD}***IPFire-Batch-Build is starting...${NORMAL}"
1033                 screen -dmS ipfire $0 batch --background
1034                 evaluate 1
1035                 exit 0
1036         fi
1037         ;;
1038 watch)
1039         watch_screen
1040         ;;
1041 pxe)
1042         case "$2" in
1043           start)
1044                 start_tftpd
1045                 ;;
1046           stop)
1047                 stop_tftpd
1048                 ;;
1049           reload|restart)
1050                 reload_tftpd
1051                 ;;              
1052         esac
1053         exit 0
1054         ;;
1055 lang)
1056         update_langs
1057         ;;
1058 "")
1059         clear
1060         select name in "Exit" "IPFIRE: Downloadsrc" "IPFIRE: Build (silent)" "IPFIRE: Watch Build" "IPFIRE: Batch" "IPFIRE: Clean" "LOG: Tail" "Help"
1061         do
1062         case $name in
1063         "IPFIRE: Downloadsrc")
1064                 $0 downloadsrc
1065                 ;;
1066         "IPFIRE: Build (silent)")
1067                 $0 build-silent
1068                 ;;
1069         "IPFIRE: Watch Build")
1070                 $0 watch
1071                 ;;
1072         "IPFIRE: Batch")
1073                 $0 batch
1074                 ;;
1075         "IPFIRE: Clean")
1076                 $0 clean
1077                 ;;
1078         "Help")
1079                 echo "Usage: $0 {build|changelog|clean|gettoolchain|downloadsrc|shell|sync|toolchain}"
1080                 cat doc/make.sh-usage
1081                 ;;
1082         "LOG: Tail")
1083                 tail -f log/_*
1084                 ;;
1085         "Exit")
1086                 break
1087                 ;;
1088         esac
1089         done
1090         ;;
1091 config)
1092         make_config
1093         ;;
1094 *)
1095         echo "Usage: $0 {build|changelog|clean|gettoolchain|downloadsrc|shell|sync|toolchain}"
1096         cat doc/make.sh-usage
1097         ;;
1098 esac