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