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