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