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