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