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