Merge commit 'origin/master' into next
[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.8test"                                               # Version number
28 CORE="41"                                                       # Core Level (Filename)
29 PAKFIRE_CORE="40"                                               # 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=1
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     PASS=1
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 ccache     PASS=2
247     lfsmake1 ncurses
248     lfsmake1 bash
249     lfsmake1 bzip2
250     lfsmake1 coreutils
251     lfsmake1 diffutils
252     lfsmake1 findutils
253     lfsmake1 gawk
254     lfsmake1 gettext
255     lfsmake1 grep
256     lfsmake1 gzip
257     lfsmake1 m4
258     lfsmake1 make
259     lfsmake1 patch
260     lfsmake1 perl
261     lfsmake1 sed
262     lfsmake1 tar
263     lfsmake1 texinfo
264     lfsmake1 util-linux
265     lfsmake1 cleanup-toolchain  PASS=2
266     export PATH=$ORG_PATH
267 }
268
269 buildbase() {
270     LOGFILE="$BASEDIR/log/_build.base.log"
271     export LOGFILE
272     lfsmake2 stage2
273     lfsmake2 linux-libc-header
274     lfsmake2 man-pages
275     lfsmake2 glibc
276     lfsmake2 cleanup-toolchain  PASS=3
277     lfsmake2 binutils
278     lfsmake2 gcc
279     lfsmake2 berkeley
280     lfsmake2 coreutils
281     lfsmake2 iana-etc
282     lfsmake2 m4
283     lfsmake2 bison
284     lfsmake2 ncurses
285     lfsmake2 procps
286     lfsmake2 sed
287     lfsmake2 libtool
288     lfsmake2 perl
289     lfsmake2 readline
290     lfsmake2 zlib
291     lfsmake2 autoconf
292     lfsmake2 automake
293     lfsmake2 bash
294     lfsmake2 bzip2
295     lfsmake2 diffutils
296     lfsmake2 e2fsprogs
297     lfsmake2 ed
298     lfsmake2 file
299     lfsmake2 findutils
300     lfsmake2 flex
301     lfsmake2 gawk
302     lfsmake2 gettext
303     lfsmake2 grep
304     lfsmake2 groff
305     lfsmake2 gzip
306     lfsmake2 inetutils
307     lfsmake2 iproute2
308     lfsmake2 kbd
309     lfsmake2 less
310     lfsmake2 libaal
311     lfsmake2 make
312     lfsmake2 man
313     lfsmake2 mktemp
314     lfsmake2 module-init-tools
315     lfsmake2 mtd
316     lfsmake2 net-tools
317     lfsmake2 patch
318     lfsmake2 psmisc
319     lfsmake2 reiser4progs
320     lfsmake2 shadow
321     lfsmake2 sysklogd
322     lfsmake2 sysvinit
323     lfsmake2 tar
324     lfsmake2 texinfo
325     lfsmake2 udev
326     lfsmake2 util-linux
327     lfsmake2 vim
328     lfsmake2 grub
329 }
330
331 buildipfire() {
332   LOGFILE="$BASEDIR/log/_build.ipfire.log"
333   export LOGFILE
334   ipfiremake configroot
335   ipfiremake backup
336   ipfiremake dhcp
337   ipfiremake dhcpcd
338   ipfiremake libusb
339   ipfiremake libpcap
340   ipfiremake ppp
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 mISDN                      XEN=1
351   ipfiremake dahdi                      XEN=1 KMOD=1
352   ipfiremake cryptodev                  XEN=1
353   ipfiremake compat-wireless            XEN=1
354   ipfiremake r8169                      XEN=1
355   ipfiremake r8168                      XEN=1
356   ipfiremake r8101                      XEN=1
357   ipfiremake e1000                      XEN=1
358   ipfiremake e1000e                     XEN=1
359   ipfiremake igb                        XEN=1
360   ipfiremake linux                      PAE=1
361   ipfiremake kqemu                      PAE=1
362   ipfiremake kvm-kmod                   PAE=1
363   ipfiremake v4l-dvb                    PAE=1
364   ipfiremake madwifi                    PAE=1
365   ipfiremake alsa                       PAE=1 KMOD=1
366   ipfiremake mISDN                      PAE=1
367   ipfiremake dahdi                      PAE=1 KMOD=1
368   ipfiremake cryptodev                  PAE=1
369   ipfiremake compat-wireless            PAE=1
370   ipfiremake r8169                      PAE=1
371   ipfiremake r8168                      PAE=1
372   ipfiremake r8101                      PAE=1
373   ipfiremake e1000                      PAE=1
374   ipfiremake e1000e                     PAE=1
375   ipfiremake igb                        PAE=1
376   ipfiremake linux
377   ipfiremake kqemu
378   ipfiremake kvm-kmod
379   ipfiremake v4l-dvb
380   ipfiremake madwifi
381   ipfiremake alsa                       KMOD=1
382   ipfiremake mISDN
383   ipfiremake dahdi                      KMOD=1
384   ipfiremake cryptodev
385   ipfiremake compat-wireless
386   ipfiremake r8169
387   ipfiremake r8168
388   ipfiremake r8101
389   ipfiremake e1000
390   ipfiremake e1000e
391   ipfiremake igb
392   ipfiremake pkg-config
393   ipfiremake linux-atm
394   ipfiremake cpio
395
396   installmake strip
397
398   ipfiremake dracut
399   ipfiremake expat
400   ipfiremake gdbm
401   ipfiremake gmp
402   ipfiremake pam
403   ipfiremake openssl
404   ipfiremake curl
405   ipfiremake python
406   ipfiremake libnet
407   ipfiremake libnl
408   ipfiremake libidn
409   ipfiremake libjpeg
410   ipfiremake libpng
411   ipfiremake libtiff
412   ipfiremake libart
413   ipfiremake freetype
414   ipfiremake gd
415   ipfiremake popt
416   ipfiremake pcre
417   ipfiremake slang
418   ipfiremake newt
419   ipfiremake attr
420   ipfiremake libcap
421   ipfiremake pciutils
422   ipfiremake usbutils
423   ipfiremake libxml2
424   ipfiremake libxslt
425   ipfiremake BerkeleyDB
426   ipfiremake mysql
427   ipfiremake cyrus-sasl
428   ipfiremake openldap
429   ipfiremake apache2
430   ipfiremake php
431   ipfiremake apache2                    PASS=C
432   ipfiremake arping
433   ipfiremake beep
434   ipfiremake bind
435   ipfiremake cdrtools
436   ipfiremake dnsmasq
437   ipfiremake dosfstools
438   ipfiremake reiserfsprogs
439   ipfiremake xfsprogs
440   ipfiremake sysfsutils
441   ipfiremake fuse
442   ipfiremake ntfs-3g
443   ipfiremake ethtool
444   ipfiremake ez-ipupdate
445   ipfiremake fcron
446   ipfiremake perl-GD
447   ipfiremake GD-Graph
448   ipfiremake GD-TextUtil
449   ipfiremake gnupg
450   ipfiremake hdparm
451   ipfiremake sdparm
452   ipfiremake mtools
453   ipfiremake initscripts
454   ipfiremake whatmask
455   ipfiremake iptables
456   ipfiremake libupnp
457   ipfiremake ipaddr
458   ipfiremake iptstate
459   ipfiremake iputils
460   ipfiremake l7-protocols
461   ipfiremake mISDNuser
462   ipfiremake capi4k-utils
463   ipfiremake hwdata
464   ipfiremake kudzu
465   ipfiremake logrotate
466   ipfiremake logwatch
467   ipfiremake misc-progs
468   ipfiremake nano
469   ipfiremake nasm
470   ipfiremake URI
471   ipfiremake HTML-Tagset
472   ipfiremake HTML-Parser
473   ipfiremake Compress-Zlib
474   ipfiremake Digest
475   ipfiremake Digest-SHA1
476   ipfiremake Digest-HMAC
477   ipfiremake libwww-perl
478   ipfiremake Net-DNS
479   ipfiremake Net-IPv4Addr
480   ipfiremake Net_SSLeay
481   ipfiremake IO-Stringy
482   ipfiremake Unix-Syslog
483   ipfiremake Mail-Tools
484   ipfiremake MIME-Tools
485   ipfiremake Net-Server
486   ipfiremake Convert-TNEF
487   ipfiremake Convert-UUlib
488   ipfiremake Archive-Tar
489   ipfiremake Archive-Zip
490   ipfiremake Text-Tabs+Wrap
491   ipfiremake Locale-Country
492   ipfiremake XML-Parser
493   ipfiremake python-setuptools
494   ipfiremake python-clientform
495   ipfiremake python-mechanize
496   ipfiremake python-feedparser
497   ipfiremake python-rssdler
498   ipfiremake glib
499   ipfiremake GeoIP
500   ipfiremake fwhits
501   ipfiremake noip_updater
502   ipfiremake ntp
503   ipfiremake openssh
504   ipfiremake rrdtool
505   ipfiremake setserial
506   ipfiremake setup
507   ipfiremake snort
508   ipfiremake oinkmaster
509   ipfiremake squid
510   ipfiremake squidguard
511   ipfiremake calamaris
512   ipfiremake tcpdump
513   ipfiremake traceroute
514   ipfiremake vlan
515   ipfiremake wireless
516   ipfiremake libsafe
517   ipfiremake pakfire
518   ipfiremake java
519   ipfiremake spandsp
520   ipfiremake lzo
521   ipfiremake openvpn
522   ipfiremake pammysql
523   ipfiremake cups
524   ipfiremake ghostscript
525   ipfiremake foomatic
526   ipfiremake hplip
527   ipfiremake samba
528   ipfiremake sudo
529   ipfiremake mc
530   ipfiremake wget
531   ipfiremake bridge-utils
532   ipfiremake screen
533   ipfiremake hddtemp
534   ipfiremake smartmontools
535   ipfiremake htop
536   ipfiremake postfix
537   ipfiremake fetchmail
538   ipfiremake cyrus-imapd
539   ipfiremake openmailadmin
540   ipfiremake clamav
541   ipfiremake spamassassin
542   ipfiremake amavisd
543   ipfiremake alsa
544   ipfiremake mpfire
545   ipfiremake guardian
546   ipfiremake libid3tag
547   ipfiremake libmad
548   ipfiremake libogg
549   ipfiremake libvorbis
550   ipfiremake libdvbpsi
551   ipfiremake lame
552   ipfiremake sox
553   ipfiremake libshout
554   ipfiremake xvid
555   ipfiremake libmpeg2
556   ipfiremake cmake
557   ipfiremake gnump3d
558   ipfiremake libsigc++
559   ipfiremake applejuice
560   ipfiremake ocaml
561   ipfiremake mldonkey
562   ipfiremake libtorrent
563   ipfiremake rtorrent
564   ipfiremake ipfireseeder
565   ipfiremake rsync
566   ipfiremake tcpwrapper
567   ipfiremake libevent
568   ipfiremake portmap
569   ipfiremake nfs
570   ipfiremake nmap
571   ipfiremake ncftp
572   ipfiremake etherwake
573   ipfiremake bwm-ng
574   ipfiremake tripwire
575   ipfiremake sysstat
576   ipfiremake vsftpd
577   ipfiremake strongswan
578   ipfiremake lsof
579   ipfiremake centerim
580   ipfiremake br2684ctl
581   ipfiremake pcmciautils
582   ipfiremake lm_sensors
583   ipfiremake liboping
584   ipfiremake collectd
585   ipfiremake lcd4linux
586   ipfiremake teamspeak
587   ipfiremake elinks
588   ipfiremake igmpproxy
589   ipfiremake fbset
590   ipfiremake sdl
591   ipfiremake qemu
592   ipfiremake qemu-kqemu
593   ipfiremake sane
594   ipfiremake netpbm
595   ipfiremake phpSANE
596   ipfiremake tunctl
597   ipfiremake nagios
598   ipfiremake ebtables
599   ipfiremake fontconfig
600   ipfiremake freefont
601   ipfiremake directfb
602   ipfiremake dfb++
603   ipfiremake faad2
604   ipfiremake ffmpeg
605   ipfiremake videolan
606   ipfiremake vdr
607   ipfiremake w_scan
608   ipfiremake icecast
609   ipfiremake icegenerator
610   ipfiremake mpd
611   ipfiremake libmpdclient
612   ipfiremake mpc
613   ipfiremake git
614   ipfiremake squidclamav
615   ipfiremake bc
616   ipfiremake vnstat
617   ipfiremake vnstati
618   ipfiremake iw
619   ipfiremake wpa_supplicant
620   ipfiremake hostapd
621   ipfiremake urlgrabber
622   ipfiremake syslinux
623   ipfiremake tftpd
624   ipfiremake cpufrequtils
625   ipfiremake dbus
626   ipfiremake bluetooth
627   ipfiremake gutenprint
628   ipfiremake apcupsd
629   ipfiremake iperf
630   ipfiremake netcat
631   ipfiremake 7zip
632   ipfiremake lynis
633   ipfiremake splix
634   ipfiremake streamripper
635   ipfiremake sshfs
636   ipfiremake sqlite
637   ipfiremake taglib
638   ipfiremake mediatomb
639   ipfiremake sslh
640   ipfiremake perl-gettext
641   ipfiremake vdradmin
642   ipfiremake miau
643   ipfiremake netsnmpd
644   ipfiremake perl-DBI
645   ipfiremake perl-DBD-mysql
646   ipfiremake cacti
647   ipfiremake icecc
648   ipfiremake openvmtools
649   ipfiremake nagiosql
650   ipfiremake iftop
651   ipfiremake motion
652   ipfiremake joe
653   ipfiremake nut
654   ipfiremake watchdog
655   ipfiremake libpri
656   ipfiremake dahdi
657   ipfiremake asterisk
658   ipfiremake lcr
659   ipfiremake usb_modeswitch
660   ipfiremake usb_modeswitch_data
661   ipfiremake zerofree
662   ipfiremake mdadm
663   ipfiremake eject
664   ipfiremake pound
665   ipfiremake minicom
666   ipfiremake ddrescue
667   ipfiremake tcl
668   ipfiremake imspector
669   echo Build on $HOSTNAME > $BASEDIR/build/var/ipfire/firebuild
670   cat /proc/version >> $BASEDIR/build/var/ipfire/firebuild
671   echo >> $BASEDIR/build/var/ipfire/firebuild
672   git log -1 >> $BASEDIR/build/var/ipfire/firebuild
673   echo >> $BASEDIR/build/var/ipfire/firebuild
674   git status >> $BASEDIR/build/var/ipfire/firebuild
675   echo >> $BASEDIR/build/var/ipfire/firebuild
676   cat /proc/cpuinfo >> $BASEDIR/build/var/ipfire/firebuild
677   echo $PAKFIRE_CORE > $BASEDIR/build/opt/pakfire/db/core/mine
678   if [ "$GIT_BRANCH" = "master" ]; then
679         echo "$NAME $VERSION - (Development Build: $GIT_LASTCOMMIT)" > $BASEDIR/build/etc/system-release
680   else
681         echo "$NAME $VERSION - $GIT_BRANCH" > $BASEDIR/build/etc/system-release
682   fi
683 }
684
685 buildinstaller() {
686   # Run installer scripts one by one
687   LOGFILE="$BASEDIR/log/_build.installer.log"
688   export LOGFILE
689   ipfiremake as86
690   ipfiremake mbr
691   ipfiremake memtest
692   ipfiremake installer
693   cp -f $BASEDIR/doc/COPYING $BASEDIR/build/install/initrd/
694   installmake strip
695   ipfiremake initrd
696 }
697
698 buildpackages() {
699   LOGFILE="$BASEDIR/log/_build.packages.log"
700   export LOGFILE
701   echo "... see detailed log in _build.*.log files" >> $LOGFILE
702
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
1019         URL_SOURCE=$(grep URL_SOURCE lfs/Config | awk '{ print $3 }')
1020         REMOTE_FILES=$(echo "ls -1 --ignore=toolchains" | sftp -C ${IPFIRE_USER}@${URL_SOURCE})
1021
1022         cd $BASEDIR/cache/
1023         for file in $(ls -1 --ignore=toolchains); do
1024                 grep -q "$file" <<<$REMOTE_FILES && continue
1025                 NEW_FILES="$NEW_FILES $file"
1026         done
1027         [ -n "$NEW_FILES" ] && scp -2 $NEW_FILES ${IPFIRE_USER}@${URL_SOURCE}
1028         cd $BASEDIR
1029         cd $PWD
1030         exit 0
1031         ;;
1032 batch)
1033         if [ "$2" = "--background" ]; then
1034                 batch_script
1035                 exit $?
1036         fi
1037         if [ `screen -ls | grep -q ipfire` ]; then
1038                 echo "Build is already running, sorry!"
1039                 exit 1
1040         else
1041                 if [ "$2" = "--rebuild" ]; then
1042                         export IPFIRE_REBUILD=1
1043                         echo "REBUILD!"
1044                 else
1045                         export IPFIRE_REBUILD=0
1046                 fi
1047                 echo -en "${BOLD}***IPFire-Batch-Build is starting...${NORMAL}"
1048                 screen -dmS ipfire $0 batch --background
1049                 evaluate 1
1050                 exit 0
1051         fi
1052         ;;
1053 watch)
1054         watch_screen
1055         ;;
1056 pxe)
1057         case "$2" in
1058           start)
1059                 start_tftpd
1060                 ;;
1061           stop)
1062                 stop_tftpd
1063                 ;;
1064           reload|restart)
1065                 reload_tftpd
1066                 ;;              
1067         esac
1068         exit 0
1069         ;;
1070 lang)
1071         update_langs
1072         ;;
1073 "")
1074         clear
1075         select name in "Exit" "IPFIRE: Downloadsrc" "IPFIRE: Build (silent)" "IPFIRE: Watch Build" "IPFIRE: Batch" "IPFIRE: Clean" "LOG: Tail" "Help"
1076         do
1077         case $name in
1078         "IPFIRE: Downloadsrc")
1079                 $0 downloadsrc
1080                 ;;
1081         "IPFIRE: Build (silent)")
1082                 $0 build-silent
1083                 ;;
1084         "IPFIRE: Watch Build")
1085                 $0 watch
1086                 ;;
1087         "IPFIRE: Batch")
1088                 $0 batch
1089                 ;;
1090         "IPFIRE: Clean")
1091                 $0 clean
1092                 ;;
1093         "Help")
1094                 echo "Usage: $0 {build|changelog|clean|gettoolchain|downloadsrc|shell|sync|toolchain}"
1095                 cat doc/make.sh-usage
1096                 ;;
1097         "LOG: Tail")
1098                 tail -f log/_*
1099                 ;;
1100         "Exit")
1101                 break
1102                 ;;
1103         esac
1104         done
1105         ;;
1106 config)
1107         make_config
1108         ;;
1109 *)
1110         echo "Usage: $0 {build|changelog|clean|gettoolchain|downloadsrc|shell|sync|toolchain}"
1111         cat doc/make.sh-usage
1112         ;;
1113 esac