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