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