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