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