Set Pakfire core version to 33.
[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="33"                                               # 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   ipfiremake watchdog
636   echo Build on $HOSTNAME > $BASEDIR/build/var/ipfire/firebuild
637   cat /proc/version >> $BASEDIR/build/var/ipfire/firebuild
638   echo >> $BASEDIR/build/var/ipfire/firebuild
639   git log -1 >> $BASEDIR/build/var/ipfire/firebuild
640   echo >> $BASEDIR/build/var/ipfire/firebuild
641   git status >> $BASEDIR/build/var/ipfire/firebuild
642   echo >> $BASEDIR/build/var/ipfire/firebuild
643   cat /proc/cpuinfo >> $BASEDIR/build/var/ipfire/firebuild
644   echo $PAKFIRE_CORE > $BASEDIR/build/opt/pakfire/db/core/mine
645   if [ "$GIT_BRANCH" = "master" ]; then
646         echo "$NAME $VERSION - (Development Build: $GIT_LASTCOMMIT)" > $BASEDIR/build/etc/system-release
647   else
648         echo "$NAME $VERSION - $GIT_BRANCH" > $BASEDIR/build/etc/system-release
649   fi
650 }
651
652 buildinstaller() {
653   # Run installer scripts one by one
654   LOGFILE="$BASEDIR/log/_build.installer.log"
655   export LOGFILE
656   ipfiremake as86
657   ipfiremake mbr
658   ipfiremake memtest
659   installmake linux-libc-header
660   installmake binutils
661   ipfiremake uClibc                     PASS=1
662   ipfiremake gcc                        INST=1
663   installmake uClibc                    PASS=2
664   installmake gcc                       INST=2
665   installmake uClibc                    PASS=3
666   installmake busybox
667   installmake udev
668   installmake slang
669   installmake newt
670   installmake gettext
671   installmake kbd
672   installmake popt
673   installmake sysvinit
674   installmake misc-progs
675   installmake libaal
676   installmake reiser4progs
677   installmake reiserfsprogs
678   installmake sysfsutils
679   installmake util-linux
680   installmake pciutils
681   installmake zlib
682   installmake mtd
683   installmake wget
684   installmake hwdata
685   installmake kudzu
686   installmake pcmciautils
687   installmake installer
688   installmake initrd
689 }
690
691 buildpackages() {
692   LOGFILE="$BASEDIR/log/_build.packages.log"
693   export LOGFILE
694   echo "... see detailed log in _build.*.log files" >> $LOGFILE
695
696   installmake strip
697   
698   # Generating list of packages used
699   echo -n "Generating packages list from logs" | tee -a $LOGFILE
700   rm -f $BASEDIR/doc/packages-list
701   for i in `ls -1tr $BASEDIR/log/[^_]*`; do
702         if [ "$i" != "$BASEDIR/log/FILES" -a -n $i ]; then
703                 echo "* `basename $i`" >>$BASEDIR/doc/packages-list
704         fi
705   done
706   echo "== List of softwares used to build $NAME Version: $VERSION ==" > $BASEDIR/doc/packages-list.txt
707   grep -v 'configroot$\|img$\|initrd$\|initscripts$\|installer$\|install$\|setup$\|pakfire$\|stage2$\|smp$\|tools$\|tools1$\|tools2$\|.tgz$\|-config$\|_missing_rootfile$\|install1$\|install2$\|pass1$\|pass2$\|pass3$' \
708         $BASEDIR/doc/packages-list | sort >> $BASEDIR/doc/packages-list.txt
709   rm -f $BASEDIR/doc/packages-list
710   # packages-list.txt is ready to be displayed for wiki page
711   beautify message DONE
712   
713   # Update changelog
714   cd $BASEDIR
715   $0 git log
716
717   # Create images for install
718         ipfiremake cdrom ED=$IPFVER
719
720   # Check if there is a loop device for building in virtual environments
721   if [ -e /dev/loop/0 ] || [ -e /dev/loop0 ]; then
722         ipfiremake usb-stick ED=$IPFVER
723         ipfiremake flash-images ED=$IPFVER
724   fi
725
726   mv $LFS/install/images/{*.iso,*.tgz,*.img.gz,*.bz2} $BASEDIR >> $LOGFILE 2>&1
727
728   ipfirepackages
729
730   # Check if there is a loop device for building in virtual environments
731   if [ -e /dev/loop/0 ] || [ -e /dev/loop0 ]; then
732         cp -f $BASEDIR/packages/linux-xen-*.ipfire $LFS/install/packages/
733         cp -f $BASEDIR/packages/meta-linux-xen $LFS/install/packages/
734         ipfiremake xen-image ED=$IPFVER
735         rm -rf $LFS/install/packages/linux-xen-*.ipfire
736         rm -rf $LFS/install/packages/meta-linux-xen
737   fi
738   mv $LFS/install/images/*.bz2 $BASEDIR >> $LOGFILE 2>&1
739
740   # Cleanup
741   stdumount
742   rm -rf $BASEDIR/build/tmp/*
743
744   # Generating total list of files
745   echo -n "Generating files list from logs" | tee -a $LOGFILE
746   rm -f $BASEDIR/log/FILES
747   for i in `ls -1tr $BASEDIR/log/[^_]*`; do
748         if [ "$i" != "$BASEDIR/log/FILES" -a -n $i ]; then
749                 echo "##" >>$BASEDIR/log/FILES
750                 echo "## `basename $i`" >>$BASEDIR/log/FILES
751                 echo "##" >>$BASEDIR/log/FILES
752                 cat $i | sed "s%^\./%#%" | sort >> $BASEDIR/log/FILES
753         fi
754   done
755   beautify message DONE
756
757   cd $PWD
758 }
759
760 ipfirepackages() {
761         ipfiremake core-updates
762         for i in $(ls -1 $BASEDIR/config/rootfiles/packages); do
763                 if [ -e $BASEDIR/lfs/$i ]; then
764                         ipfiredist $i
765                 else
766                         echo -n $i
767                         beautify message SKIP
768                 fi
769         done
770   test -d $BASEDIR/packages || mkdir $BASEDIR/packages
771   mv -f $LFS/install/packages/* $BASEDIR/packages >> $LOGFILE 2>&1
772   rm -rf  $BASEDIR/build/install/packages/*
773 }
774
775 # See what we're supposed to do
776 case "$1" in 
777 build)
778         clear
779         BUILDMACHINE=`uname -m`
780         PACKAGE=`ls -v -r $BASEDIR/cache/toolchains/$SNAME-$VERSION-toolchain-$TOOLCHAINVER-$BUILDMACHINE.tar.gz 2> /dev/null | head -n 1`
781         #only restore on a clean disk
782         if [ ! -f log/cleanup-toolchain-2-tools ]; then
783                 if [ ! -n "$PACKAGE" ]; then
784                         beautify build_stage "Full toolchain compilation - Native GCC: `gcc --version | grep GCC | awk {'print $3'}`"
785                         prepareenv
786                         buildtoolchain
787                 else
788                         PACKAGENAME=${PACKAGE%.tar.gz}
789                         beautify build_stage "Packaged toolchain compilation"
790                         if [ `md5sum $PACKAGE | awk '{print $1}'` == `cat $PACKAGENAME.md5 | awk '{print $1}'` ]; then
791                                 tar zxf $PACKAGE
792                                 prepareenv
793                         else
794                                 exiterror "$PACKAGENAME md5 did not match, check downloaded package"
795                         fi
796                 fi
797         else
798                 echo -n "Using installed toolchain" | tee -a $LOGFILE
799                 beautify message SKIP
800                 prepareenv
801         fi
802
803         beautify build_start
804         beautify build_stage "Building LFS"
805         buildbase
806
807         beautify build_stage "Building IPFire"
808         buildipfire
809
810         beautify build_stage "Building installer"
811         buildinstaller
812
813         beautify build_stage "Building packages"
814         buildpackages
815         
816         beautify build_stage "Checking Logfiles for new Files"
817         cd ..
818         tools/checknewlog.pl
819
820         beautify build_end
821         ;;
822 shell)
823         # enter a shell inside LFS chroot
824         # may be used to changed kernel settings
825         prepareenv
826         entershell
827         ;;
828 clean)
829         echo -en "${BOLD}Cleaning build directory...${NORMAL}"
830         for i in `mount | grep $BASEDIR | sed 's/^.*loop=\(.*\))/\1/'`; do
831                 $LOSETUP -d $i 2>/dev/null
832         done
833         for i in `mount | grep $BASEDIR | cut -d " " -f 1`; do
834                 umount $i
835         done
836         stdumount
837         for i in `seq 0 7`; do
838             if ( losetup /dev/loop${i} 2>/dev/null | grep -q "/install/images" ); then
839                 umount /dev/loop${i}     2>/dev/null;
840                 losetup -d /dev/loop${i} 2>/dev/null;
841             fi;
842         done
843         rm -rf $BASEDIR/build
844         rm -rf $BASEDIR/cdrom
845         rm -rf $BASEDIR/packages
846         rm -rf $BASEDIR/log
847         if [ -h /tools ]; then
848                 rm -f /tools
849         fi
850         beautify message DONE
851         ;;
852 downloadsrc)
853         if [ ! -d $BASEDIR/cache ]; then
854                 mkdir $BASEDIR/cache
855         fi
856         mkdir -p $BASEDIR/log
857         echo -e "${BOLD}Preload all source files${NORMAL}" | tee -a $LOGFILE
858         FINISHED=0
859         cd $BASEDIR/lfs
860         for c in `seq $MAX_RETRIES`; do
861                 if (( FINISHED==1 )); then 
862                         break
863                 fi
864                 FINISHED=1
865                 cd $BASEDIR/lfs
866                 for i in *; do
867                         if [ -f "$i" -a "$i" != "Config" ]; then
868                                 echo -ne "Loading $i"
869                                 make -s -f $i LFS_BASEDIR=$BASEDIR MESSAGE="$i\t ($c/$MAX_RETRIES)" download >> $LOGFILE 2>&1
870                                 if [ $? -ne 0 ]; then
871                                         beautify message FAIL
872                                         FINISHED=0
873                                 else
874                                         if [ $c -eq 1 ]; then
875                                         beautify message DONE
876                                         fi
877                                 fi
878                         fi
879                 done
880         done
881         echo -e "${BOLD}***Verifying md5sums${NORMAL}"
882         ERROR=0
883         for i in *; do
884                 if [ -f "$i" -a "$i" != "Config" ]; then
885                         make -s -f $i LFS_BASEDIR=$BASEDIR MESSAGE="$i\t " md5 >> $LOGFILE 2>&1
886                         if [ $? -ne 0 ]; then
887                                 echo -ne "MD5 difference in lfs/$i"
888                                 beautify message FAIL
889                                 ERROR=1
890                         fi
891                 fi
892         done
893         if [ $ERROR -eq 0 ]; then
894                 echo -ne "${BOLD}all files md5sum match${NORMAL}"
895                 beautify message DONE
896         else
897                 echo -ne "${BOLD}not all files were correctly download${NORMAL}"
898                 beautify message FAIL
899         fi
900         cd - >/dev/null 2>&1
901         ;;
902 toolchain)
903         clear
904         prepareenv
905         beautify build_stage "Toolchain compilation - Native GCC: `gcc --version | grep GCC | awk {'print $3'}`"
906         buildtoolchain
907         BUILDMACHINE=`uname -m`
908         echo "`date -u '+%b %e %T'`: Create toolchain tar.gz for $BUILDMACHINE" | tee -a $LOGFILE
909         test -d $BASEDIR/cache/toolchains || mkdir -p $BASEDIR/cache/toolchains
910         cd $BASEDIR && tar -zc --exclude='log/_build.*.log' -f cache/toolchains/$SNAME-$VERSION-toolchain-$TOOLCHAINVER-$BUILDMACHINE.tar.gz \
911                 build/{bin,etc,usr/bin,usr/local} \
912                 build/tools/{bin,etc,*-linux-gnu,include,lib,libexec,sbin,share,var} \
913                 log >> $LOGFILE
914         md5sum cache/toolchains/$SNAME-$VERSION-toolchain-$TOOLCHAINVER-$BUILDMACHINE.tar.gz \
915                 > cache/toolchains/$SNAME-$VERSION-toolchain-$TOOLCHAINVER-$BUILDMACHINE.md5
916         stdumount
917         ;;
918 gettoolchain)
919         BUILDMACHINE=`uname -m`
920         # arbitrary name to be updated in case of new toolchain package upload
921         PACKAGE=$SNAME-$VERSION-toolchain-$TOOLCHAINVER-$BUILDMACHINE
922         if [ ! -f $BASEDIR/cache/toolchains/$PACKAGE.tar.gz ]; then
923                 URL_TOOLCHAIN=`grep URL_TOOLCHAIN lfs/Config | awk '{ print $3 }'`
924                 test -d $BASEDIR/cache/toolchains || mkdir -p $BASEDIR/cache/toolchains
925                 echo "`date -u '+%b %e %T'`: Load toolchain tar.gz for $BUILDMACHINE" | tee -a $LOGFILE
926                 cd $BASEDIR/cache/toolchains
927                 wget -U "IPFireSourceGrabber/2.x" $URL_TOOLCHAIN/$PACKAGE.tar.gz $URL_TOOLCHAIN/$PACKAGE.md5 >& /dev/null
928                 if [ $? -ne 0 ]; then
929                         echo "`date -u '+%b %e %T'`: error downloading $PACKAGE toolchain for $BUILDMACHINE machine" | tee -a $LOGFILE
930                 else
931                         if [ "`md5sum $PACKAGE.tar.gz | awk '{print $1}'`" = "`cat $PACKAGE.md5 | awk '{print $1}'`" ]; then
932                                 echo "`date -u '+%b %e %T'`: toolchain md5 ok" | tee -a $LOGFILE
933                         else
934                                 exiterror "$PACKAGE.md5 did not match, check downloaded package"
935                         fi
936                 fi
937         else
938                 echo "Toolchain is already downloaded. Exiting..."
939         fi
940         ;;
941 othersrc)
942         prepareenv
943         echo -ne "`date -u '+%b %e %T'`: Build sources iso for $MACHINE" | tee -a $LOGFILE
944         chroot $LFS /tools/bin/env -i   HOME=/root \
945         TERM=$TERM PS1='\u:\w\$ ' \
946         PATH=/usr/local/bin:/bin:/usr/bin:/sbin:/usr/sbin \
947         VERSION=$VERSION NAME="$NAME" SNAME="$SNAME" MACHINE=$MACHINE \
948         /bin/bash -x -c "cd /usr/src/lfs && make -f sources-iso LFS_BASEDIR=/usr/src install" >>$LOGFILE 2>&1
949         mv $LFS/install/images/ipfire-* $BASEDIR >> $LOGFILE 2>&1
950         if [ $? -eq "0" ]; then
951                 beautify message DONE
952         else
953                 beautify message FAIL
954         fi
955         stdumount
956         ;;
957 git)
958         case "$2" in
959           update|up)
960                         ## REMOVES ALL UNCOMMITTED CHANGES!
961                         [ "$3" == "--force" ] && git checkout -f
962                         git pull
963                 ;;
964           commit|ci)
965                 shift 2
966                         git commit $*
967                         
968                         [ "$?" -eq "0" ] || exiterror "git commit $* failed."
969                         
970                         echo -e "${BOLD}Do you want to push, too? [y/N]${NORMAL}"
971                         read
972                         [ -z $REPLY ] && exit 0
973                         for i in y Y j J; do
974                                 if [ "$i" == "$REPLY" ]; then
975                                         $0 git push
976                                         exit $?
977                                 fi
978                         done
979                         exiterror "\"$REPLY\" is not a valid answer."
980                 ;;
981           dist)
982                         git archive HEAD | gzip -9 > ${SNAME}-${VERSION}.tar.gz
983                   ;;
984           diff|di)
985                         echo -ne "Make a local diff to last revision"
986                         git diff HEAD > ipfire-diff-$(date +'%Y-%m-%d-%H:%M').diff
987                         evaluate 1
988                         echo "Diff was successfully saved to ipfire-diff-$(date +'%Y-%m-%d-%H:%M').diff"
989                         git diff --stat
990                 ;;
991           push)
992                 [ -z $GIT_USER ] && exiterror "You have to setup GIT_USER first."
993                         GIT_URL="ssh://${GIT_USER}@git.ipfire.org/pub/git/ipfire-2.x"
994                         
995                 git push ${GIT_URL} $3
996                 ;;
997           log)
998                 [ -z $GIT_TAG ]  || LAST_TAG=$GIT_TAG
999                 [ -z $LAST_TAG ] || EXT="$LAST_TAG..HEAD"
1000
1001                 git log -n 500 --no-merges --pretty=medium --shortstat $EXT > $BASEDIR/doc/ChangeLog
1002         ;;
1003         esac
1004         ;;
1005 uploadsrc)
1006         PWD=`pwd`
1007         if [ -z $IPFIRE_USER ]; then
1008                 echo -n "You have to setup IPFIRE_USER first. See .config for details."
1009                 beautify message FAIL
1010                 exit 1
1011         fi
1012         URL_SOURCE=$(grep URL_SOURCE lfs/Config | awk '{ print $3 }')
1013         REMOTE_FILES=$(echo "ls -1" | sftp -C ${IPFIRE_USER}@${URL_SOURCE})
1014
1015         cd $BASEDIR/cache/
1016         for file in $(ls -1); do
1017                 grep -q "$file" <<<$REMOTE_FILES && continue
1018                 NEW_FILES="$NEW_FILES $file"
1019         done
1020         [ -n "$NEW_FILES" ] && scp -2 $NEW_FILES ${IPFIRE_USER}@${URL_SOURCE}
1021         cd $BASEDIR
1022         cd $PWD
1023         exit 0
1024         ;;
1025 batch)
1026         if [ "$2" = "--background" ]; then
1027                 batch_script
1028                 exit $?
1029         fi
1030         if [ `screen -ls | grep -q ipfire` ]; then
1031                 echo "Build is already running, sorry!"
1032                 exit 1
1033         else
1034                 if [ "$2" = "--rebuild" ]; then
1035                         export IPFIRE_REBUILD=1
1036                         echo "REBUILD!"
1037                 else
1038                         export IPFIRE_REBUILD=0
1039                 fi
1040                 echo -en "${BOLD}***IPFire-Batch-Build is starting...${NORMAL}"
1041                 screen -dmS ipfire $0 batch --background
1042                 evaluate 1
1043                 exit 0
1044         fi
1045         ;;
1046 watch)
1047         watch_screen
1048         ;;
1049 pxe)
1050         case "$2" in
1051           start)
1052                 start_tftpd
1053                 ;;
1054           stop)
1055                 stop_tftpd
1056                 ;;
1057           reload|restart)
1058                 reload_tftpd
1059                 ;;              
1060         esac
1061         exit 0
1062         ;;
1063 lang)
1064         update_langs
1065         ;;
1066 "")
1067         clear
1068         select name in "Exit" "IPFIRE: Downloadsrc" "IPFIRE: Build (silent)" "IPFIRE: Watch Build" "IPFIRE: Batch" "IPFIRE: Clean" "LOG: Tail" "Help"
1069         do
1070         case $name in
1071         "IPFIRE: Downloadsrc")
1072                 $0 downloadsrc
1073                 ;;
1074         "IPFIRE: Build (silent)")
1075                 $0 build-silent
1076                 ;;
1077         "IPFIRE: Watch Build")
1078                 $0 watch
1079                 ;;
1080         "IPFIRE: Batch")
1081                 $0 batch
1082                 ;;
1083         "IPFIRE: Clean")
1084                 $0 clean
1085                 ;;
1086         "Help")
1087                 echo "Usage: $0 {build|changelog|clean|gettoolchain|downloadsrc|shell|sync|toolchain}"
1088                 cat doc/make.sh-usage
1089                 ;;
1090         "LOG: Tail")
1091                 tail -f log/_*
1092                 ;;
1093         "Exit")
1094                 break
1095                 ;;
1096         esac
1097         done
1098         ;;
1099 config)
1100         make_config
1101         ;;
1102 *)
1103         echo "Usage: $0 {build|changelog|clean|gettoolchain|downloadsrc|shell|sync|toolchain}"
1104         cat doc/make.sh-usage
1105         ;;
1106 esac