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