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