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