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