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