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