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