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