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