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