]> git.ipfire.org Git - people/teissler/ipfire-2.x.git/blob - make.sh
Added kqemu to give the qemu more speed.
[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 atl1 SMP=1
331 ipfiremake kqemu SMP=1
332 ipfiremake linux
333 ipfiremake ipp2p
334 ipfiremake zaptel
335 ipfiremake r8169
336 ipfiremake r8168
337 ipfiremake mcs7830
338 ipfiremake atl1
339 ipfiremake kqemu
340 ipfiremake pkg-config
341 ipfiremake linux-atm
342 ipfiremake cpio
343 ipfiremake klibc
344 ipfiremake mkinitcpio
345 ipfiremake udev KLIBC=1
346 ipfiremake expat
347 ipfiremake gdbm
348 ipfiremake gmp
349 ipfiremake pam
350 ipfiremake openssl
351 ipfiremake curl
352 ipfiremake python
353 ipfiremake libnet
354 ipfiremake libidn
355 ipfiremake libjpeg
356 ipfiremake libpng
357 ipfiremake libtiff
358 ipfiremake libart
359 ipfiremake freetype
360 ipfiremake gd
361 ipfiremake popt
362 ipfiremake pcre
363 ipfiremake slang
364 ipfiremake newt
365 ipfiremake libcap
366 ipfiremake pciutils
367 ipfiremake usbutils
368 ipfiremake libxml2
369 ipfiremake libxslt
370 ipfiremake BerkeleyDB
371 ipfiremake mysql
372 ipfiremake cyrus-sasl
373 ipfiremake openldap
374 ipfiremake apache2
375 ipfiremake php
376 ipfiremake apache2 PASS=C
377 ipfiremake arping
378 ipfiremake beep
379 ipfiremake bind
380 ipfiremake cdrtools
381 ipfiremake dnsmasq
382 ipfiremake dosfstools
383 ipfiremake squashfstools
384 ipfiremake reiserfsprogs
385 ipfiremake xfsprogs
386 ipfiremake sysfsutils
387 ipfiremake fuse
388 ipfiremake ntfs-3g
389 ipfiremake ethtool
390 ipfiremake ez-ipupdate
391 ipfiremake fcron
392 ipfiremake perl-GD
393 ipfiremake GD-Graph
394 ipfiremake GD-TextUtil
395 ipfiremake gnupg
396 ipfiremake hdparm
397 ipfiremake sdparm
398 ipfiremake mtools
399 ipfiremake initscripts
400 ipfiremake whatmask
401 ipfiremake iptables
402 ipfiremake libupnp
403 ipfiremake ipp2p IPT=1
404 ipfiremake linux-igd
405 ipfiremake ipac-ng
406 ipfiremake ipaddr
407 ipfiremake iptstate
408 ipfiremake iputils
409 ipfiremake l7-protocols
410 ipfiremake mISDN
411 ipfiremake capi4k-utils
412 ipfiremake hwdata
413 ipfiremake kudzu
414 ipfiremake logrotate
415 ipfiremake logwatch
416 ipfiremake misc-progs
417 ipfiremake nano
418 ipfiremake nasm
419 ipfiremake URI
420 ipfiremake HTML-Tagset
421 ipfiremake HTML-Parser
422 ipfiremake Compress-Zlib
423 ipfiremake Digest
424 ipfiremake Digest-SHA1
425 ipfiremake Digest-HMAC
426 ipfiremake libwww-perl
427 ipfiremake Net-DNS
428 ipfiremake Net-IPv4Addr
429 ipfiremake Net_SSLeay
430 ipfiremake IO-Stringy
431 ipfiremake Unix-Syslog
432 ipfiremake Mail-Tools
433 ipfiremake MIME-Tools
434 ipfiremake Net-Server
435 ipfiremake Convert-TNEF
436 ipfiremake Convert-UUlib
437 ipfiremake Archive-Tar
438 ipfiremake Archive-Zip
439 ipfiremake Text-Tabs+Wrap
440 ipfiremake Locale-Country
441 ipfiremake XML-Parser
442 ipfiremake glib
443 ipfiremake GeoIP
444 ipfiremake fwhits
445 ipfiremake noip_updater
446 ipfiremake ntp
447 ipfiremake openssh
448 ipfiremake openswan
449 ipfiremake rrdtool
450 ipfiremake setserial
451 ipfiremake setup
452 ipfiremake snort
453 ipfiremake oinkmaster
454 ipfiremake squid
455 ipfiremake squid-graph
456 ipfiremake squidguard
457 ipfiremake calamaris
458 ipfiremake tcpdump
459 ipfiremake traceroute
460 ipfiremake vlan
461 ipfiremake wireless
462 ipfiremake libsafe
463 ipfiremake pakfire
464 ipfiremake java
465 ipfiremake spandsp
466 ipfiremake lzo
467 ipfiremake openvpn
468 ipfiremake pammysql
469 ipfiremake cups
470 ipfiremake ghostscript
471 ipfiremake foomatic
472 ipfiremake hplip
473 ipfiremake samba
474 ipfiremake sudo
475 ipfiremake mc
476 ipfiremake wget
477 ipfiremake bridge-utils
478 ipfiremake screen
479 ipfiremake hddtemp
480 ipfiremake smartmontools
481 ipfiremake htop
482 ipfiremake postfix
483 ipfiremake fetchmail
484 ipfiremake cyrus-imapd
485 ipfiremake openmailadmin
486 ipfiremake clamav
487 ipfiremake spamassassin
488 ipfiremake amavisd
489 ipfiremake alsa
490 ipfiremake mpg123
491 ipfiremake mpfire
492 ipfiremake guardian
493 ipfiremake libid3tag
494 ipfiremake libmad
495 ipfiremake libogg
496 ipfiremake libvorbis
497 ipfiremake lame
498 ipfiremake sox
499 ipfiremake libshout
500 ipfiremake icecast
501 ipfiremake icegenerator
502 ipfiremake mpd
503 ipfiremake mpc
504 ipfiremake xvid
505 ipfiremake libmpeg2
506 ipfiremake videolan
507 ipfiremake libpri
508 ipfiremake asterisk
509 ipfiremake gnump3d
510 ipfiremake libsigc++
511 ipfiremake applejuice
512 ipfiremake ocaml
513 ipfiremake mldonkey
514 ipfiremake libtorrent
515 ipfiremake rtorrent
516 ipfiremake ipfireseeder
517 ipfiremake rsync
518 ipfiremake tcpwrapper
519 ipfiremake portmap
520 ipfiremake nfs
521 ipfiremake nmap
522 ipfiremake mbmon
523 ipfiremake ncftp
524 ipfiremake etherwake
525 ipfiremake bwm-ng
526 ipfiremake tripwire
527 ipfiremake sysstat
528 ipfiremake vsftpd
529 ipfiremake which
530 ipfiremake lsof
531 ipfiremake centerim
532 ipfiremake br2684ctl
533 ipfiremake pcmciautils
534 ipfiremake collectd
535 ipfiremake lcd4linux
536 ipfiremake neon
537 ipfiremake subversion
538 ipfiremake tcptrack
539 ipfiremake teamspeak
540 ipfiremake elinks
541 ipfiremake igmpproxy
542 ipfiremake sdl
543 ipfiremake qemu
544 }
545
546 buildinstaller() {
547 # Run installer scripts one by one
548 LOGFILE="$BASEDIR/log/_build.installer.log"
549 export LOGFILE
550 ipfiremake syslinux
551 ipfiremake as86
552 ipfiremake mbr
553 ipfiremake memtest
554 installmake linux-libc-header
555 installmake binutils
556 ipfiremake uClibc PASS=1
557 ipfiremake gcc INST=1
558 installmake uClibc PASS=2
559 installmake gcc INST=2
560 installmake uClibc PASS=3
561 installmake busybox
562 installmake udev
563 installmake slang
564 installmake newt
565 installmake gettext
566 installmake kbd
567 installmake popt
568 installmake sysvinit
569 installmake misc-progs
570 installmake libaal
571 installmake reiser4progs
572 installmake reiserfsprogs
573 installmake sysfsutils
574 installmake util-linux
575 installmake pciutils
576 installmake zlib
577 installmake mtd
578 installmake wget
579 installmake hwdata
580 installmake kudzu
581 installmake pcmciautils
582 installmake installer
583 installmake initrd
584 }
585
586 buildpackages() {
587 LOGFILE="$BASEDIR/log/_build.packages.log"
588 export LOGFILE
589 echo "... see detailed log in _build.*.log files" >> $LOGFILE
590
591 installmake strip
592
593 # Generating list of packages used
594 echo -n "Generating packages list from logs" | tee -a $LOGFILE
595 rm -f $BASEDIR/doc/packages-list
596 for i in `ls -1tr $BASEDIR/log/[^_]*`; do
597 if [ "$i" != "$BASEDIR/log/FILES" -a -n $i ]; then
598 echo "* `basename $i`" >>$BASEDIR/doc/packages-list
599 fi
600 done
601 echo "== List of softwares used to build $NAME Version: $VERSION ==" > $BASEDIR/doc/packages-list.txt
602 grep -v 'configroot$\|img$\|initrd$\|initscripts$\|installer$\|install$\|setup$\|pakfire$\|stage2$\|smp$\|tools$\|tools1$\|tools2$\|.tgz$\|-config$\|_missing_rootfile$\|install1$\|install2$\|pass1$\|pass2$\|pass3$' \
603 $BASEDIR/doc/packages-list | sort >> $BASEDIR/doc/packages-list.txt
604 rm -f $BASEDIR/doc/packages-list
605 # packages-list.txt is ready to be displayed for wiki page
606 beautify message DONE
607
608 # Create images for install
609 ipfiremake cdrom ED=full
610
611 # Check if there is a loop device for building in virtual environments
612 if [ -e /dev/loop/0 ] || [ -e /dev/loop0 ]; then
613 ipfiremake usb-stick
614 fi
615 mv $LFS/install/images/{*.iso,*.tgz,*.img.gz} $BASEDIR >> $LOGFILE 2>&1
616
617 ipfirepackages
618
619 # Cleanup
620 stdumount
621 rm -rf $BASEDIR/build/tmp/*
622
623 # Generating total list of files
624 echo -n "Generating files list from logs" | tee -a $LOGFILE
625 rm -f $BASEDIR/log/FILES
626 for i in `ls -1tr $BASEDIR/log/[^_]*`; do
627 if [ "$i" != "$BASEDIR/log/FILES" -a -n $i ]; then
628 echo "##" >>$BASEDIR/log/FILES
629 echo "## `basename $i`" >>$BASEDIR/log/FILES
630 echo "##" >>$BASEDIR/log/FILES
631 cat $i | sed "s%^\./%#%" | sort >> $BASEDIR/log/FILES
632 fi
633 done
634 beautify message DONE
635
636 cd $PWD
637 }
638
639 ipfirepackages() {
640 ipfiremake core-updates
641 for i in $(ls -1 $BASEDIR/config/rootfiles/packages); do
642 if [ -e $BASEDIR/lfs/$i ]; then
643 ipfiredist $i
644 else
645 echo -n $i
646 beautify message SKIP
647 fi
648 done
649 test -d $BASEDIR/packages || mkdir $BASEDIR/packages
650 mv -f $LFS/install/packages/* $BASEDIR/packages >> $LOGFILE 2>&1
651 rm -rf $BASEDIR/build/install/packages/*
652 }
653
654 # See what we're supposed to do
655 case "$1" in
656 build)
657 clear
658 BUILDMACHINE=`uname -m`
659 PACKAGE=`ls -v -r $BASEDIR/cache/toolchains/$SNAME-$VERSION-toolchain-$BUILDMACHINE.tar.gz 2> /dev/null | head -n 1`
660 #only restore on a clean disk
661 if [ ! -f log/cleanup-toolchain-2-tools ]; then
662 if [ ! -n "$PACKAGE" ]; then
663 beautify build_stage "Full toolchain compilation - Native GCC: `gcc --version | grep GCC | awk {'print $3'}`"
664 prepareenv
665 buildtoolchain
666 else
667 PACKAGENAME=${PACKAGE%.tar.gz}
668 beautify build_stage "Packaged toolchain compilation"
669 if [ `md5sum $PACKAGE | awk '{print $1}'` == `cat $PACKAGENAME.md5 | awk '{print $1}'` ]; then
670 tar zxf $PACKAGE
671 prepareenv
672 else
673 exiterror "$PACKAGENAME md5 did not match, check downloaded package"
674 fi
675 fi
676 else
677 echo -n "Using installed toolchain" | tee -a $LOGFILE
678 beautify message SKIP
679 prepareenv
680 fi
681
682 beautify build_start
683 beautify build_stage "Building LFS"
684 buildbase
685
686 beautify build_stage "Building IPFire"
687 buildipfire
688
689 # Setzen des IPFire Builds
690 if [ "$SVN_REVISION" ]; then
691 echo "$SVN_REVISION" > $BASEDIR/build/var/ipfire/firebuild
692 else
693 echo "_(OvO)_" > $BASEDIR/build/var/ipfire/firebuild
694 fi
695
696 beautify build_stage "Building installer"
697 buildinstaller
698
699 beautify build_stage "Building packages"
700 buildpackages
701 beautify build_end
702 ;;
703 shell)
704 # enter a shell inside LFS chroot
705 # may be used to changed kernel settings
706 prepareenv
707 entershell
708 ;;
709 changelog)
710 echo -n "Loading new Changelog from SVN: "
711 svn log http://svn.ipfire.org/svn/ipfire > doc/ChangeLog
712 beautify message DONE
713 ;;
714 clean)
715 echo -en "${BOLD}Cleaning build directory...${NORMAL}"
716 for i in `mount | grep $BASEDIR | sed 's/^.*loop=\(.*\))/\1/'`; do
717 $LOSETUP -d $i 2>/dev/null
718 done
719 for i in `mount | grep $BASEDIR | cut -d " " -f 1`; do
720 umount $i
721 done
722 stdumount
723 for i in `seq 0 7`; do
724 if ( losetup /dev/loop${i} 2>/dev/null | grep -q "/install/images" ); then
725 umount /dev/loop${i} 2>/dev/null;
726 losetup -d /dev/loop${i} 2>/dev/null;
727 fi;
728 done
729 rm -rf $BASEDIR/build
730 rm -rf $BASEDIR/cdrom
731 rm -rf $BASEDIR/packages
732 rm -rf $BASEDIR/log
733 if [ -h /tools ]; then
734 rm -f /tools
735 fi
736 beautify message DONE
737 ;;
738 downloadsrc)
739 if [ ! -d $BASEDIR/cache ]; then
740 mkdir $BASEDIR/cache
741 fi
742 mkdir -p $BASEDIR/log
743 echo -e "${BOLD}Preload all source files${NORMAL}" | tee -a $LOGFILE
744 FINISHED=0
745 cd $BASEDIR/lfs
746 for c in `seq $MAX_RETRIES`; do
747 if (( FINISHED==1 )); then
748 break
749 fi
750 FINISHED=1
751 cd $BASEDIR/lfs
752 for i in *; do
753 if [ -f "$i" -a "$i" != "Config" ]; then
754 echo -ne "Loading $i"
755 make -s -f $i LFS_BASEDIR=$BASEDIR MESSAGE="$i\t ($c/$MAX_RETRIES)" download >> $LOGFILE 2>&1
756 if [ $? -ne 0 ]; then
757 beautify message FAIL
758 FINISHED=0
759 else
760 if [ $c -eq 1 ]; then
761 beautify message DONE
762 fi
763 fi
764 fi
765 done
766 done
767 echo -e "${BOLD}***Verifying md5sums${NORMAL}"
768 ERROR=0
769 for i in *; do
770 if [ -f "$i" -a "$i" != "Config" ]; then
771 make -s -f $i LFS_BASEDIR=$BASEDIR MESSAGE="$i\t " md5 >> $LOGFILE 2>&1
772 if [ $? -ne 0 ]; then
773 echo -ne "MD5 difference in lfs/$i"
774 beautify message FAIL
775 ERROR=1
776 fi
777 fi
778 done
779 if [ $ERROR -eq 0 ]; then
780 echo -ne "${BOLD}all files md5sum match${NORMAL}"
781 beautify message DONE
782 else
783 echo -ne "${BOLD}not all files were correctly download${NORMAL}"
784 beautify message FAIL
785 fi
786 cd - >/dev/null 2>&1
787 ;;
788 toolchain)
789 clear
790 prepareenv
791 beautify build_stage "Toolchain compilation - Native GCC: `gcc --version | grep GCC | awk {'print $3'}`"
792 buildtoolchain
793 BUILDMACHINE=`uname -m`
794 echo "`date -u '+%b %e %T'`: Create toolchain tar.gz for $BUILDMACHINE" | tee -a $LOGFILE
795 test -d $BASEDIR/cache/toolchains || mkdir $BASEDIR/cache/toolchains
796 cd $BASEDIR && tar -zc --exclude='log/_build.*.log' -f cache/toolchains/$SNAME-$VERSION-toolchain-$BUILDMACHINE.tar.gz \
797 build/{bin,etc,usr/bin,usr/local} \
798 build/tools/{bin,etc,*-linux-gnu,include,lib,libexec,sbin,share,var} \
799 log >> $LOGFILE
800 md5sum cache/toolchains/$SNAME-$VERSION-toolchain-$BUILDMACHINE.tar.gz \
801 > cache/toolchains/$SNAME-$VERSION-toolchain-$BUILDMACHINE.md5
802 stdumount
803 ;;
804 gettoolchain)
805 BUILDMACHINE=`uname -m`
806 # arbitrary name to be updated in case of new toolchain package upload
807 PACKAGE=$SNAME-$VERSION-toolchain-$BUILDMACHINE
808 if [ ! -f $BASEDIR/cache/toolchains/$PACKAGE.tar.gz ]; then
809 URL_TOOLCHAIN=`grep URL_TOOLCHAIN lfs/Config | awk '{ print $3 }'`
810 test -d $BASEDIR/cache/toolchains || mkdir $BASEDIR/cache/toolchains
811 echo "`date -u '+%b %e %T'`: Load toolchain tar.gz for $BUILDMACHINE" | tee -a $LOGFILE
812 cd $BASEDIR/cache/toolchains
813 wget $URL_TOOLCHAIN/$PACKAGE.tar.gz $URL_TOOLCHAIN/$PACKAGE.md5 >& /dev/null
814 if [ $? -ne 0 ]; then
815 echo "`date -u '+%b %e %T'`: error downloading toolchain for $BUILDMACHINE machine" | tee -a $LOGFILE
816 else
817 if [ "`md5sum $PACKAGE.tar.gz | awk '{print $1}'`" = "`cat $PACKAGE.md5 | awk '{print $1}'`" ]; then
818 echo "`date -u '+%b %e %T'`: toolchain md5 ok" | tee -a $LOGFILE
819 else
820 exiterror "$PACKAGE.md5 did not match, check downloaded package"
821 fi
822 fi
823 else
824 echo "Toolchain is already downloaded. Exiting..."
825 fi
826 ;;
827 othersrc)
828 prepareenv
829 echo -ne "`date -u '+%b %e %T'`: Build sources iso for $MACHINE" | tee -a $LOGFILE
830 chroot $LFS /tools/bin/env -i HOME=/root \
831 TERM=$TERM PS1='\u:\w\$ ' \
832 PATH=/usr/local/bin:/bin:/usr/bin:/sbin:/usr/sbin \
833 VERSION=$VERSION NAME="$NAME" SNAME="$SNAME" MACHINE=$MACHINE \
834 /bin/bash -x -c "cd /usr/src/lfs && make -f sources-iso LFS_BASEDIR=/usr/src install" >>$LOGFILE 2>&1
835 mv $LFS/install/images/ipfire-* $BASEDIR >> $LOGFILE 2>&1
836 if [ $? -eq "0" ]; then
837 beautify message DONE
838 else
839 beautify message FAIL
840 fi
841 stdumount
842 ;;
843 svn)
844 case "$2" in
845 update|up)
846 # clear
847 echo -ne "Loading the latest source files...\n"
848 if [ $3 ]; then
849 svn update -r $3 | tee -a $PWD/log/_build.svn.update.log
850 else
851 svn update | tee -a $PWD/log/_build.svn.update.log
852 fi
853 if [ $? -eq "0" ]; then
854 beautify message DONE
855 else
856 beautify message FAIL
857 exit 1
858 fi
859 echo -ne "Writing the svn-info to a file"
860 svn info > $PWD/svn_status
861 if [ $? -eq "0" ]; then
862 beautify message DONE
863 else
864 beautify message FAIL
865 exit 1
866 fi
867 chmod 755 $0
868 exit 0
869 ;;
870 commit|ci)
871 clear
872 if [ -f /usr/bin/mcedit ]; then
873 export EDITOR=/usr/bin/mcedit
874 fi
875 if [ -f /usr/bin/nano ]; then
876 export EDITOR=/usr/bin/nano
877 fi
878 echo -ne "Selecting editor $EDITOR..."
879 beautify message DONE
880 if [ -e /sbin/yast ]; then
881 if [ "`echo $SVN_REVISION | cut -c 3`" -eq "0" ]; then
882 $0 changelog
883 fi
884 fi
885 update_langs
886 svn commit
887 $0 svn up
888 if [ -n "$FTP_CACHE_URL" ]; then
889 $0 uploadsrc
890 fi
891 ;;
892 dist)
893 if [ $3 ]; then
894 SVN_REVISION=$3
895 fi
896 if [ -f ipfire-source-r$SVN_REVISION.tar.gz ]; then
897 echo -ne "REV $SVN_REVISION: SKIPPED!\n"
898 exit 0
899 fi
900 echo -en "REV $SVN_REVISION: Downloading..."
901 svn export http://svn.ipfire.org/svn/ipfire/trunk ipfire-source/ --force > /dev/null
902 svn log http://svn.ipfire.org/svn/ipfire/trunk -r 1:$SVN_REVISION > ipfire-source/Changelog
903 #svn info http://svn.ipfire.org/svn/ipfire/trunk -r $SVN_REVISION > ipfire-source/svn_status
904 evaluate 1
905
906 echo -en "REV $SVN_REVISION: Compressing files..."
907 if [ -e ipfire-source/trunk/make.sh ]; then
908 chmod 755 ipfire-source/trunk/make.sh
909 fi
910 tar cfz ipfire-source-r$SVN_REVISION.tar.gz ipfire-source
911 evaluate 1
912 echo -en "REV $SVN_REVISION: Cleaning up..."
913 rm ipfire-source/ -r
914 evaluate 1
915 ;;
916 diff|di)
917 update_langs
918 echo -ne "Make a local diff to last svn revision"
919 svn diff > ipfire-diff-`date +'%Y-%m-%d-%H:%M'`-r`svn info | grep Revision | cut -c 11-`.diff
920 evaluate 1
921 echo "Diff was successfully saved to ipfire-diff-`date +'%Y-%m-%d-%H:%M'`-r`svn info | grep Revision | cut -c 11-`.diff"
922 svn status
923 ;;
924 esac
925 ;;
926 uploadsrc)
927 PWD=`pwd`
928 cd $BASEDIR/cache/
929 echo -e "Uploading cache to ftp server:"
930 ncftpls -u $FTP_CACHE_USER -p $FTP_CACHE_PASS ftp://$FTP_CACHE_URL/$FTP_CACHE_PATH/ > /tmp/ftplist
931 for i in *; do
932 if [ "$(basename $i)" == "toolchains" ]; then continue; fi
933 grep -q $(basename $i) /tmp/ftplist
934 if [ "$?" -ne "0" ]; then
935 echo -ne "$(basename $i)"
936 ncftpput -u $FTP_CACHE_USER -p $FTP_CACHE_PASS $FTP_CACHE_URL $FTP_CACHE_PATH/ $(basename $i)
937 if [ "$?" -ne "0" ]; then
938 beautify message FAIL
939 fi
940 fi
941 done
942 rm -f /tmp/ftplist
943 cd $PWD
944 exit 0
945 ;;
946 upload)
947 FTP_ISO_PORT=`echo "$FTP_ISO_URL" | awk -F: '{ print $2 }'`
948 FTP_ISO_URL=`echo "$FTP_ISO_URL" | awk -F: '{ print $1 }'`
949 if [ -z $FTP_ISO_PORT ]; then
950 FTP_ISO_PORT=21
951 fi
952 cat <<EOF > .ftp-commands
953 mkdir -p $FTP_ISO_PATH$SVN_REVISION
954 mkdir -p $FTP_ISO_PATH$SVN_REVISION/paks
955 quit
956 EOF
957 ncftp -u $FTP_ISO_USER -p $FTP_ISO_PASS -P $FTP_ISO_PORT $FTP_ISO_URL < .ftp-commands
958 rm -f .ftp-commands
959
960 case "$2" in
961 iso)
962 echo -e "Uploading the iso to $FTP_ISO_PATH/$SVN_REVISION."
963
964 md5sum ipfire-$VERSION.$MACHINE-full.iso > ipfire-$VERSION.$MACHINE-full.iso.md5
965 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
966 if [ -e "$i" ]; then
967 ncftpput -u $FTP_ISO_USER -p $FTP_ISO_PASS -P $FTP_ISO_PORT $FTP_ISO_URL $FTP_ISO_PATH$SVN_REVISION/ $i
968 if [ "$?" -eq "0" ]; then
969 echo "The file with name $i was successfully uploaded to $FTP_ISO_URL$FTP_ISO_PATH$SVN_REVISION/."
970 else
971 echo "There was an error while uploading the file $i to the ftp server."
972 exit 1
973 fi
974 fi
975 done
976 rm -f ipfire-$VERSION.$MACHINE-full.iso.md5
977 if [ "$3" = "--with-sources-cd" ]; then
978 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
979 fi
980 ;;
981 paks)
982 ncftpput -u $FTP_ISO_USER -p $FTP_ISO_PASS -P $FTP_ISO_PORT $FTP_ISO_URL $FTP_ISO_PATH$SVN_REVISION/paks packages/*
983 if [ "$?" -eq "0" ]; then
984 echo -e "The packages were successfully uploaded to $FTP_ISO_URL$FTP_ISO_PATH$SVN_REVISION/."
985 else
986 echo -e "There was an error while uploading the packages to the ftp server."
987 exit 1
988 fi
989 ;;
990 esac
991 ;;
992 batch)
993 if [ "$2" = "--background" ]; then
994 batch_script
995 exit $?
996 fi
997 if [ `screen -ls | grep -q ipfire` ]; then
998 echo "Build is already running, sorry!"
999 exit 1
1000 else
1001 if [ "$2" = "--rebuild" ]; then
1002 export IPFIRE_REBUILD=1
1003 echo "REBUILD!"
1004 else
1005 export IPFIRE_REBUILD=0
1006 fi
1007 echo -en "${BOLD}***IPFire-Batch-Build is starting...${NORMAL}"
1008 screen -dmS ipfire $0 batch --background
1009 evaluate 1
1010 exit 0
1011 fi
1012 ;;
1013 watch)
1014 watch_screen
1015 ;;
1016 pxe)
1017 case "$2" in
1018 start)
1019 start_tftpd
1020 ;;
1021 stop)
1022 stop_tftpd
1023 ;;
1024 reload|restart)
1025 reload_tftpd
1026 ;;
1027 esac
1028 exit 0
1029 ;;
1030 lang)
1031 update_langs
1032 ;;
1033 "")
1034 clear
1035 svn info
1036 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"
1037 do
1038 case $name in
1039 "IPFIRE: Downloadsrc")
1040 $0 downloadsrc
1041 ;;
1042 "IPFIRE: Build (silent)")
1043 $0 build-silent
1044 ;;
1045 "IPFIRE: Watch Build")
1046 $0 watch
1047 ;;
1048 "IPFIRE: Batch")
1049 $0 batch
1050 ;;
1051 "IPFIRE: Clean")
1052 $0 clean
1053 ;;
1054 "SVN: Update")
1055 $0 svn update
1056 ;;
1057 "Help")
1058 echo "Usage: $0 {build|changelog|clean|gettoolchain|downloadsrc|shell|sync|toolchain}"
1059 cat doc/make.sh-usage
1060 ;;
1061 "LOG: Tail")
1062 tail -f log/_*
1063 ;;
1064 "Exit")
1065 break
1066 ;;
1067 esac
1068 done
1069 ;;
1070 config)
1071 make_config
1072 ;;
1073 *)
1074 echo "Usage: $0 {build|changelog|clean|gettoolchain|downloadsrc|shell|sync|toolchain}"
1075 cat doc/make.sh-usage
1076 ;;
1077 esac