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