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