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