45185ba5d09a0aff21020847cc3892b2e9eee6c0
[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="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 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 libsatsolver
697   ipfiremake python-satsolver
698   ipfiremake python-distutils-extra
699   ipfiremake python-lzma
700   ipfiremake python-progressbar
701   ipfiremake python-xattr
702   ipfiremake intltool
703   ipfiremake pakfire3-deps
704   echo Build on $HOSTNAME > $BASEDIR/build/var/ipfire/firebuild
705   cat /proc/version >> $BASEDIR/build/var/ipfire/firebuild
706   echo >> $BASEDIR/build/var/ipfire/firebuild
707   git log -1 >> $BASEDIR/build/var/ipfire/firebuild
708   echo >> $BASEDIR/build/var/ipfire/firebuild
709   git status >> $BASEDIR/build/var/ipfire/firebuild
710   echo >> $BASEDIR/build/var/ipfire/firebuild
711   cat /proc/cpuinfo >> $BASEDIR/build/var/ipfire/firebuild
712   echo $PAKFIRE_CORE > $BASEDIR/build/opt/pakfire/db/core/mine
713   if [ "$GIT_BRANCH" = "master" ]; then
714         echo "$NAME $VERSION - (Development Build: $GIT_LASTCOMMIT)" > $BASEDIR/build/etc/system-release
715   else
716         echo "$NAME $VERSION - $GIT_BRANCH" > $BASEDIR/build/etc/system-release
717   fi
718 }
719
720 buildinstaller() {
721   # Run installer scripts one by one
722   LOGFILE="$BASEDIR/log/_build.installer.log"
723   export LOGFILE
724   ipfiremake as86
725   ipfiremake mbr
726   ipfiremake memtest
727   ipfiremake installer
728   cp -f $BASEDIR/doc/COPYING $BASEDIR/build/install/initrd/
729   installmake strip
730   ipfiremake initrd
731 }
732
733 buildpackages() {
734   LOGFILE="$BASEDIR/log/_build.packages.log"
735   export LOGFILE
736   echo "... see detailed log in _build.*.log files" >> $LOGFILE
737
738   
739   # Generating list of packages used
740   echo -n "Generating packages list from logs" | tee -a $LOGFILE
741   rm -f $BASEDIR/doc/packages-list
742   for i in `ls -1tr $BASEDIR/log/[^_]*`; do
743         if [ "$i" != "$BASEDIR/log/FILES" -a -n $i ]; then
744                 echo "* `basename $i`" >>$BASEDIR/doc/packages-list
745         fi
746   done
747   echo "== List of softwares used to build $NAME Version: $VERSION ==" > $BASEDIR/doc/packages-list.txt
748   grep -v 'configroot$\|img$\|initrd$\|initscripts$\|installer$\|install$\|setup$\|pakfire$\|stage2$\|smp$\|tools$\|tools1$\|tools2$\|.tgz$\|-config$\|_missing_rootfile$\|install1$\|install2$\|pass1$\|pass2$\|pass3$' \
749         $BASEDIR/doc/packages-list | sort >> $BASEDIR/doc/packages-list.txt
750   rm -f $BASEDIR/doc/packages-list
751   # packages-list.txt is ready to be displayed for wiki page
752   beautify message DONE
753   
754   # Update changelog
755   cd $BASEDIR
756   $0 git log
757
758   # Create images for install
759         ipfiremake cdrom ED=$IPFVER
760
761   # Check if there is a loop device for building in virtual environments
762   if [ $BUILD_IMAGES == 1 ] &&  ([ -e /dev/loop/0 ] || [ -e /dev/loop0 ]); then
763         ipfiremake usb-stick ED=$IPFVER
764         ipfiremake flash-images ED=$IPFVER
765   fi
766
767   mv $LFS/install/images/{*.iso,*.tgz,*.img.gz,*.bz2} $BASEDIR >> $LOGFILE 2>&1
768
769   ipfirepackages
770
771   # Check if there is a loop device for building in virtual environments
772   if [ $BUILD_IMAGES == 1 ] && ([ -e /dev/loop/0 ] || [ -e /dev/loop0 ]); then
773         cp -f $BASEDIR/packages/linux-xen-*.ipfire $LFS/install/packages/
774         cp -f $BASEDIR/packages/meta-linux-xen $LFS/install/packages/
775         ipfiremake xen-image ED=$IPFVER
776         rm -rf $LFS/install/packages/linux-xen-*.ipfire
777         rm -rf $LFS/install/packages/meta-linux-xen
778   fi
779   mv $LFS/install/images/*.bz2 $BASEDIR >> $LOGFILE 2>&1
780
781   cd $BASEDIR
782   for i in `ls *.bz2 *.img.gz *.iso`; do
783         md5sum $i > $i.md5
784   done
785   cd $PWD
786
787   # Cleanup
788   stdumount
789   rm -rf $BASEDIR/build/tmp/*
790
791   # Generating total list of files
792   echo -n "Generating files list from logs" | tee -a $LOGFILE
793   rm -f $BASEDIR/log/FILES
794   for i in `ls -1tr $BASEDIR/log/[^_]*`; do
795         if [ "$i" != "$BASEDIR/log/FILES" -a -n $i ]; then
796                 echo "##" >>$BASEDIR/log/FILES
797                 echo "## `basename $i`" >>$BASEDIR/log/FILES
798                 echo "##" >>$BASEDIR/log/FILES
799                 cat $i | sed "s%^\./%#%" | sort >> $BASEDIR/log/FILES
800         fi
801   done
802   beautify message DONE
803
804   cd $PWD
805 }
806
807 ipfirepackages() {
808         ipfiremake core-updates
809         for i in $(ls -1 $BASEDIR/config/rootfiles/packages); do
810                 if [ -e $BASEDIR/lfs/$i ]; then
811                         ipfiredist $i
812                 else
813                         echo -n $i
814                         beautify message SKIP
815                 fi
816         done
817   test -d $BASEDIR/packages || mkdir $BASEDIR/packages
818   mv -f $LFS/install/packages/* $BASEDIR/packages >> $LOGFILE 2>&1
819   rm -rf  $BASEDIR/build/install/packages/*
820 }
821
822 # See what we're supposed to do
823 case "$1" in 
824 build)
825         clear
826         PACKAGE=`ls -v -r $BASEDIR/cache/toolchains/$SNAME-$VERSION-toolchain-$TOOLCHAINVER-$BUILDMACHINE.tar.gz 2> /dev/null | head -n 1`
827         #only restore on a clean disk
828         if [ ! -f log/cleanup-toolchain-2-tools ]; then
829                 if [ ! -n "$PACKAGE" ]; then
830                         beautify build_stage "Full toolchain compilation - Native GCC: `gcc --version | grep GCC | awk {'print $3'}`"
831                         prepareenv
832                         buildtoolchain
833                 else
834                         PACKAGENAME=${PACKAGE%.tar.gz}
835                         beautify build_stage "Packaged toolchain compilation"
836                         if [ `md5sum $PACKAGE | awk '{print $1}'` == `cat $PACKAGENAME.md5 | awk '{print $1}'` ]; then
837                                 tar zxf $PACKAGE
838                                 prepareenv
839                         else
840                                 exiterror "$PACKAGENAME md5 did not match, check downloaded package"
841                         fi
842                 fi
843         else
844                 echo -n "Using installed toolchain" | tee -a $LOGFILE
845                 beautify message SKIP
846                 prepareenv
847         fi
848
849         beautify build_start
850         beautify build_stage "Building LFS"
851         buildbase
852
853         beautify build_stage "Building IPFire"
854         buildipfire
855
856         beautify build_stage "Building installer"
857         buildinstaller
858
859         beautify build_stage "Building packages"
860         buildpackages
861         
862         beautify build_stage "Checking Logfiles for new Files"
863
864         cd $BASEDIR
865         tools/checknewlog.pl
866         cd $PWD
867
868         beautify build_end
869         ;;
870 shell)
871         # enter a shell inside LFS chroot
872         # may be used to changed kernel settings
873         prepareenv
874         entershell
875         ;;
876 clean)
877         echo -en "${BOLD}Cleaning build directory...${NORMAL}"
878         for i in `mount | grep $BASEDIR | sed 's/^.*loop=\(.*\))/\1/'`; do
879                 $LOSETUP -d $i 2>/dev/null
880         done
881         for i in `mount | grep $BASEDIR | cut -d " " -f 1`; do
882                 umount $i
883         done
884         stdumount
885         for i in `seq 0 7`; do
886             if ( losetup /dev/loop${i} 2>/dev/null | grep -q "/install/images" ); then
887                 umount /dev/loop${i}     2>/dev/null;
888                 losetup -d /dev/loop${i} 2>/dev/null;
889             fi;
890         done
891         rm -rf $BASEDIR/build
892         rm -rf $BASEDIR/cdrom
893         rm -rf $BASEDIR/packages
894         rm -rf $BASEDIR/log
895         if [ -h /tools ]; then
896                 rm -f /tools
897         fi
898         rm -f $BASEDIR/ipfire-*
899         beautify message DONE
900         ;;
901 downloadsrc)
902         if [ ! -d $BASEDIR/cache ]; then
903                 mkdir $BASEDIR/cache
904         fi
905         mkdir -p $BASEDIR/log
906         echo -e "${BOLD}Preload all source files${NORMAL}" | tee -a $LOGFILE
907         FINISHED=0
908         cd $BASEDIR/lfs
909         for c in `seq $MAX_RETRIES`; do
910                 if (( FINISHED==1 )); then 
911                         break
912                 fi
913                 FINISHED=1
914                 cd $BASEDIR/lfs
915                 for i in *; do
916                         if [ -f "$i" -a "$i" != "Config" ]; then
917                                 echo -ne "Loading $i"
918                                 make -s -f $i LFS_BASEDIR=$BASEDIR MESSAGE="$i\t ($c/$MAX_RETRIES)" download >> $LOGFILE 2>&1
919                                 if [ $? -ne 0 ]; then
920                                         beautify message FAIL
921                                         FINISHED=0
922                                 else
923                                         if [ $c -eq 1 ]; then
924                                         beautify message DONE
925                                         fi
926                                 fi
927                         fi
928                 done
929         done
930         echo -e "${BOLD}***Verifying md5sums${NORMAL}"
931         ERROR=0
932         for i in *; do
933                 if [ -f "$i" -a "$i" != "Config" ]; then
934                         make -s -f $i LFS_BASEDIR=$BASEDIR MESSAGE="$i\t " md5 >> $LOGFILE 2>&1
935                         if [ $? -ne 0 ]; then
936                                 echo -ne "MD5 difference in lfs/$i"
937                                 beautify message FAIL
938                                 ERROR=1
939                         fi
940                 fi
941         done
942         if [ $ERROR -eq 0 ]; then
943                 echo -ne "${BOLD}all files md5sum match${NORMAL}"
944                 beautify message DONE
945         else
946                 echo -ne "${BOLD}not all files were correctly download${NORMAL}"
947                 beautify message FAIL
948         fi
949         cd - >/dev/null 2>&1
950         ;;
951 toolchain)
952         clear
953         prepareenv
954         beautify build_stage "Toolchain compilation - Native GCC: `gcc --version | grep GCC | awk {'print $3'}`"
955         buildtoolchain
956         echo "`date -u '+%b %e %T'`: Create toolchain tar.gz for $BUILDMACHINE" | tee -a $LOGFILE
957         test -d $BASEDIR/cache/toolchains || mkdir -p $BASEDIR/cache/toolchains
958         cd $BASEDIR && tar -zc --exclude='log/_build.*.log' -f cache/toolchains/$SNAME-$VERSION-toolchain-$TOOLCHAINVER-$BUILDMACHINE.tar.gz \
959                 build/{bin,etc,usr/bin,usr/local} \
960                 build/tools/{bin,etc,*-linux-gnu,include,lib,libexec,sbin,share,var} \
961                 log >> $LOGFILE
962         md5sum cache/toolchains/$SNAME-$VERSION-toolchain-$TOOLCHAINVER-$BUILDMACHINE.tar.gz \
963                 > cache/toolchains/$SNAME-$VERSION-toolchain-$TOOLCHAINVER-$BUILDMACHINE.md5
964         stdumount
965         ;;
966 gettoolchain)
967         # arbitrary name to be updated in case of new toolchain package upload
968         PACKAGE=$SNAME-$VERSION-toolchain-$TOOLCHAINVER-$BUILDMACHINE
969         if [ ! -f $BASEDIR/cache/toolchains/$PACKAGE.tar.gz ]; then
970                 URL_TOOLCHAIN=`grep URL_TOOLCHAIN lfs/Config | awk '{ print $3 }'`
971                 test -d $BASEDIR/cache/toolchains || mkdir -p $BASEDIR/cache/toolchains
972                 echo "`date -u '+%b %e %T'`: Load toolchain tar.gz for $BUILDMACHINE" | tee -a $LOGFILE
973                 cd $BASEDIR/cache/toolchains
974                 wget -U "IPFireSourceGrabber/2.x" $URL_TOOLCHAIN/$PACKAGE.tar.gz $URL_TOOLCHAIN/$PACKAGE.md5 >& /dev/null
975                 if [ $? -ne 0 ]; then
976                         echo "`date -u '+%b %e %T'`: error downloading $PACKAGE toolchain for $BUILDMACHINE machine" | tee -a $LOGFILE
977                 else
978                         if [ "`md5sum $PACKAGE.tar.gz | awk '{print $1}'`" = "`cat $PACKAGE.md5 | awk '{print $1}'`" ]; then
979                                 echo "`date -u '+%b %e %T'`: toolchain md5 ok" | tee -a $LOGFILE
980                         else
981                                 exiterror "$PACKAGE.md5 did not match, check downloaded package"
982                         fi
983                 fi
984         else
985                 echo "Toolchain is already downloaded. Exiting..."
986         fi
987         ;;
988 othersrc)
989         prepareenv
990         echo -ne "`date -u '+%b %e %T'`: Build sources iso for $MACHINE" | tee -a $LOGFILE
991         chroot $LFS /tools/bin/env -i   HOME=/root \
992         TERM=$TERM PS1='\u:\w\$ ' \
993         PATH=/usr/local/bin:/bin:/usr/bin:/sbin:/usr/sbin \
994         VERSION=$VERSION NAME="$NAME" SNAME="$SNAME" MACHINE=$MACHINE \
995         /bin/bash -x -c "cd /usr/src/lfs && make -f sources-iso LFS_BASEDIR=/usr/src install" >>$LOGFILE 2>&1
996         mv $LFS/install/images/ipfire-* $BASEDIR >> $LOGFILE 2>&1
997         if [ $? -eq "0" ]; then
998                 beautify message DONE
999         else
1000                 beautify message FAIL
1001         fi
1002         stdumount
1003         ;;
1004 git)
1005         case "$2" in
1006           update|up)
1007                         ## REMOVES ALL UNCOMMITTED CHANGES!
1008                         [ "$3" == "--force" ] && git checkout -f
1009                         git pull
1010                 ;;
1011           commit|ci)
1012                 shift 2
1013                         git commit $*
1014                         
1015                         [ "$?" -eq "0" ] || exiterror "git commit $* failed."
1016                         
1017                         echo -e "${BOLD}Do you want to push, too? [y/N]${NORMAL}"
1018                         read
1019                         [ -z $REPLY ] && exit 0
1020                         for i in y Y j J; do
1021                                 if [ "$i" == "$REPLY" ]; then
1022                                         $0 git push
1023                                         exit $?
1024                                 fi
1025                         done
1026                         exiterror "\"$REPLY\" is not a valid answer."
1027                 ;;
1028           dist)
1029                         git archive HEAD | gzip -9 > ${SNAME}-${VERSION}.tar.gz
1030                   ;;
1031           diff|di)
1032                         echo -ne "Make a local diff to last revision"
1033                         git diff HEAD > ipfire-diff-$(date +'%Y-%m-%d-%H:%M').diff
1034                         evaluate 1
1035                         echo "Diff was successfully saved to ipfire-diff-$(date +'%Y-%m-%d-%H:%M').diff"
1036                         git diff --stat
1037                 ;;
1038           push)
1039                 [ -z $GIT_USER ] && exiterror "You have to setup GIT_USER first."
1040                         GIT_URL="ssh://${GIT_USER}@git.ipfire.org/pub/git/ipfire-2.x"
1041                         
1042                 git push ${GIT_URL} $3
1043                 ;;
1044           log)
1045                 [ -z $GIT_TAG ]  || LAST_TAG=$GIT_TAG
1046                 [ -z $LAST_TAG ] || EXT="$LAST_TAG..HEAD"
1047
1048                 git log -n 500 --no-merges --pretty=medium --shortstat $EXT > $BASEDIR/doc/ChangeLog
1049         ;;
1050         esac
1051         ;;
1052 uploadsrc)
1053         PWD=`pwd`
1054         if [ -z $IPFIRE_USER ]; then
1055                 echo -n "You have to setup IPFIRE_USER first. See .config for details."
1056                 beautify message FAIL
1057                 exit 1
1058         fi
1059
1060         URL_SOURCE=$(grep URL_SOURCE lfs/Config | awk '{ print $3 }')
1061         REMOTE_FILES=$(echo "ls -1 --ignore=toolchains" | sftp -C ${IPFIRE_USER}@${URL_SOURCE})
1062
1063         cd $BASEDIR/cache/
1064         for file in $(ls -1 --ignore=toolchains); do
1065                 grep -q "$file" <<<$REMOTE_FILES && continue
1066                 NEW_FILES="$NEW_FILES $file"
1067         done
1068         [ -n "$NEW_FILES" ] && scp -2 $NEW_FILES ${IPFIRE_USER}@${URL_SOURCE}
1069         cd $BASEDIR
1070         cd $PWD
1071         exit 0
1072         ;;
1073 batch)
1074         if [ "$2" = "--background" ]; then
1075                 batch_script
1076                 exit $?
1077         fi
1078         if [ `screen -ls | grep -q ipfire` ]; then
1079                 echo "Build is already running, sorry!"
1080                 exit 1
1081         else
1082                 if [ "$2" = "--rebuild" ]; then
1083                         export IPFIRE_REBUILD=1
1084                         echo "REBUILD!"
1085                 else
1086                         export IPFIRE_REBUILD=0
1087                 fi
1088                 echo -en "${BOLD}***IPFire-Batch-Build is starting...${NORMAL}"
1089                 screen -dmS ipfire $0 batch --background
1090                 evaluate 1
1091                 exit 0
1092         fi
1093         ;;
1094 watch)
1095         watch_screen
1096         ;;
1097 pxe)
1098         case "$2" in
1099           start)
1100                 start_tftpd
1101                 ;;
1102           stop)
1103                 stop_tftpd
1104                 ;;
1105           reload|restart)
1106                 reload_tftpd
1107                 ;;              
1108         esac
1109         exit 0
1110         ;;
1111 lang)
1112         update_langs
1113         ;;
1114 "")
1115         clear
1116         select name in "Exit" "IPFIRE: Downloadsrc" "IPFIRE: Build (silent)" "IPFIRE: Watch Build" "IPFIRE: Batch" "IPFIRE: Clean" "LOG: Tail" "Help"
1117         do
1118         case $name in
1119         "IPFIRE: Downloadsrc")
1120                 $0 downloadsrc
1121                 ;;
1122         "IPFIRE: Build (silent)")
1123                 $0 build-silent
1124                 ;;
1125         "IPFIRE: Watch Build")
1126                 $0 watch
1127                 ;;
1128         "IPFIRE: Batch")
1129                 $0 batch
1130                 ;;
1131         "IPFIRE: Clean")
1132                 $0 clean
1133                 ;;
1134         "Help")
1135                 echo "Usage: $0 {build|changelog|clean|gettoolchain|downloadsrc|shell|sync|toolchain}"
1136                 cat doc/make.sh-usage
1137                 ;;
1138         "LOG: Tail")
1139                 tail -f log/_*
1140                 ;;
1141         "Exit")
1142                 break
1143                 ;;
1144         esac
1145         done
1146         ;;
1147 config)
1148         make_config
1149         ;;
1150 *)
1151         echo "Usage: $0 {build|changelog|clean|gettoolchain|downloadsrc|shell|sync|toolchain}"
1152         cat doc/make.sh-usage
1153         ;;
1154 esac