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