]> git.ipfire.org Git - people/pmueller/ipfire-2.x.git/blob - make.sh
System ist mittels LFS Bootscripte startbar.
[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) 2006 IPFire-Team <info@ipfire.eu>. #
21 # #
22 ############################################################################
23 #
24
25 NAME="IPFire" # Software name
26 SNAME="ipfire" # Short name
27 VERSION="2.0b" # Version number
28 SLOGAN="www.ipfire.org" # Software slogan
29 CONFIG_ROOT=/var/ipfire # Configuration rootdir
30 NICE=10 # Nice level
31 MAX_RETRIES=1 # prefetch/check loop
32 KVER=`grep --max-count=1 VER lfs/linux | awk '{ print $3 }'`
33 MACHINE=`uname -m`
34 SVN_REVISION=`svn info | grep Revision | cut -c 11-`
35
36 IPFVER="full" # Which version should be compiled? (full|light|voice)
37
38 # Set an information about the build number
39 if [ -e ./.svn ]; then
40 FIREBUILD=`cat .svn/entries |sed -n 's/^[ \t]*revision=\"// p' | sed -n 's/\".*$// p'`
41 fi
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 prepareenv() {
79 ############################################################################
80 # #
81 # Are we running the right shell? #
82 # #
83 ############################################################################
84 if [ ! "$BASH" ]; then
85 exiterror "BASH environment variable is not set. You're probably running the wrong shell."
86 fi
87
88 if [ -z "${BASH_VERSION}" ]; then
89 exiterror "Not running BASH shell."
90 fi
91
92
93 ############################################################################
94 # #
95 # Trap on emergency exit #
96 # #
97 ############################################################################
98 trap "exiterror 'Build process interrupted'" SIGINT SIGTERM SIGKILL SIGSTOP SIGQUIT
99
100
101 ############################################################################
102 # #
103 # Resetting our nice level #
104 # #
105 ############################################################################
106 echo -ne "Resetting our nice level to $NICE" | tee -a $LOGFILE
107 renice $NICE $$ > /dev/null
108 if [ `nice` != "$NICE" ]; then
109 beautify message FAIL
110 exiterror "Failed to set correct nice level"
111 else
112 beautify message DONE
113 fi
114
115
116 ############################################################################
117 # #
118 # Checking if running as root user #
119 # #
120 ############################################################################
121 echo -ne "Checking if we're running as root user" | tee -a $LOGFILE
122 if [ `id -u` != 0 ]; then
123 beautify message FAIL
124 exiterror "Not building as root"
125 else
126 beautify message DONE
127 fi
128
129
130 ############################################################################
131 # #
132 # Checking for necessary temporary space #
133 # #
134 ############################################################################
135 echo -ne "Checking for necessary space on disk $BASE_DEV" | tee -a $LOGFILE
136 BASE_DEV=`df -P -k $BASEDIR | tail -n 1 | awk '{ print $1 }'`
137 BASE_ASPACE=`df -P -k $BASEDIR | tail -n 1 | awk '{ print $4 }'`
138 if (( 2048000 > $BASE_ASPACE )); then
139 BASE_USPACE=`du -skx $BASEDIR | awk '{print $1}'`
140 if (( 2048000 - $BASE_USPACE > $BASE_ASPACE )); then
141 beautify message FAIL
142 exiterror "Not enough temporary space available, need at least 2GB on $BASE_DEV"
143 fi
144 else
145 beautify message DONE
146 fi
147
148 ############################################################################
149 # #
150 # Building Linux From Scratch system #
151 # #
152 ############################################################################
153 # Set umask
154 umask 022
155
156 # Set LFS Directory
157 LFS=$BASEDIR/build
158
159 # Check /tools symlink
160 if [ -h /tools ]; then
161 rm -f /tools
162 fi
163 if [ ! -a /tools ]; then
164 ln -s $BASEDIR/build/tools /
165 fi
166 if [ ! -h /tools ]; then
167 exiterror "Could not create /tools symbolic link."
168 fi
169
170 # Setup environment
171 set +h
172 LC_ALL=POSIX
173 MAKETUNING="-j8"
174 export LFS LC_ALL CFLAGS CXXFLAGS MAKETUNING
175 unset CC CXX CPP LD_LIBRARY_PATH LD_PRELOAD
176
177 # Make some extra directories
178 mkdir -p $BASEDIR/build/{tools,etc,usr/src} 2>/dev/null
179 mkdir -p $BASEDIR/build/{dev/{shm,pts},proc,sys}
180 mkdir -p $BASEDIR/{cache,ccache} 2>/dev/null
181 mkdir -p $BASEDIR/build/usr/src/{cache,config,doc,html,langs,lfs,log,src,ccache}
182
183 mknod -m 600 $BASEDIR/build/dev/console c 5 1 2>/dev/null
184 mknod -m 666 $BASEDIR/build/dev/null c 1 3 2>/dev/null
185
186 # Make all sources and proc available under lfs build
187 mount --bind /dev $BASEDIR/build/dev
188 mount --bind /dev/pts $BASEDIR/build/dev/pts
189 mount --bind /dev/shm $BASEDIR/build/dev/shm
190 mount --bind /proc $BASEDIR/build/proc
191 mount --bind /sys $BASEDIR/build/sys
192 mount --bind $BASEDIR/cache $BASEDIR/build/usr/src/cache
193 mount --bind $BASEDIR/ccache $BASEDIR/build/usr/src/ccache
194 mount --bind $BASEDIR/config $BASEDIR/build/usr/src/config
195 mount --bind $BASEDIR/doc $BASEDIR/build/usr/src/doc
196 mount --bind $BASEDIR/html $BASEDIR/build/usr/src/html
197 mount --bind $BASEDIR/langs $BASEDIR/build/usr/src/langs
198 mount --bind $BASEDIR/lfs $BASEDIR/build/usr/src/lfs
199 mount --bind $BASEDIR/log $BASEDIR/build/usr/src/log
200 mount --bind $BASEDIR/src $BASEDIR/build/usr/src/src
201
202 # This is a temporary hack!!!
203 if [ ! -f /tools/bin/hostname ]; then
204 cp -f /bin/hostname /tools/bin/hostname 2>/dev/null
205 fi
206
207 # Run LFS static binary creation scripts one by one
208 export CCACHE_DIR=$BASEDIR/ccache
209 export CCACHE_HASHDIR=1
210
211 # Remove pre-install list of installed files in case user erase some files before rebuild
212 rm -f $BASEDIR/build/usr/src/lsalr 2>/dev/null
213 }
214
215 buildtoolchain() {
216 LOGFILE="$BASEDIR/log/_build.toolchain.log"
217 export LOGFILE
218 ORG_PATH=$PATH
219 NATIVEGCC=`gcc --version | grep GCC | awk {'print $3'}`
220 export NATIVEGCC GCCmajor=${NATIVEGCC:0:1} GCCminor=${NATIVEGCC:2:1} GCCrelease=${NATIVEGCC:4:1}
221 lfsmake1 ccache
222 lfsmake1 binutils PASS=1
223 lfsmake1 gcc PASS=1
224 export PATH=$BASEDIR/build/usr/local/bin:$BASEDIR/build/tools/bin:$PATH
225 lfsmake1 linux-libc-header
226 lfsmake1 glibc
227 lfsmake1 cleanup-toolchain PASS=1
228 lfsmake1 tcl
229 lfsmake1 expect
230 lfsmake1 dejagnu
231 lfsmake1 gcc PASS=2
232 lfsmake1 binutils PASS=2
233 lfsmake1 ncurses
234 lfsmake1 bash
235 lfsmake1 bzip2
236 lfsmake1 coreutils
237 lfsmake1 diffutils
238 lfsmake1 findutils
239 lfsmake1 gawk
240 lfsmake1 gettext
241 lfsmake1 grep
242 lfsmake1 gzip
243 lfsmake1 m4
244 lfsmake1 make
245 lfsmake1 patch
246 lfsmake1 perl
247 lfsmake1 sed
248 lfsmake1 tar
249 lfsmake1 texinfo
250 lfsmake1 util-linux
251 lfsmake1 cleanup-toolchain PASS=2
252 export PATH=$ORG_PATH
253 }
254
255 buildbase() {
256 LOGFILE="$BASEDIR/log/_build.base.log"
257 export LOGFILE
258 lfsmake2 stage2
259 lfsmake2 linux-libc-header
260 lfsmake2 man-pages
261 lfsmake2 glibc
262 lfsmake2 cleanup-toolchain PASS=3
263 lfsmake2 binutils
264 lfsmake2 gcc
265 lfsmake2 berkeley
266 lfsmake2 coreutils
267 lfsmake2 iana-etc
268 lfsmake2 m4
269 lfsmake2 bison
270 lfsmake2 ncurses
271 lfsmake2 procps
272 lfsmake2 sed
273 lfsmake2 libtool
274 lfsmake2 perl
275 lfsmake2 readline
276 lfsmake2 zlib
277 lfsmake2 autoconf
278 lfsmake2 automake
279 lfsmake2 bash
280 lfsmake2 bzip2
281 lfsmake2 diffutils
282 lfsmake2 e2fsprogs
283 lfsmake2 file
284 lfsmake2 findutils
285 lfsmake2 flex
286 lfsmake2 grub
287 lfsmake2 gawk
288 lfsmake2 gettext
289 lfsmake2 grep
290 lfsmake2 groff
291 lfsmake2 gzip
292 lfsmake2 inetutils
293 lfsmake2 iproute2
294 lfsmake2 kbd
295 lfsmake2 less
296 lfsmake2 make
297 lfsmake2 man
298 lfsmake2 mktemp
299 lfsmake2 modutils
300 lfsmake2 patch
301 lfsmake2 psmisc
302 lfsmake2 shadow
303 lfsmake2 sysklogd
304 lfsmake2 sysvinit
305 lfsmake2 tar
306 lfsmake2 texinfo
307 lfsmake2 udev
308 lfsmake2 util-linux
309 lfsmake2 vim
310 }
311
312 buildipfire() {
313 LOGFILE="$BASEDIR/log/_build.ipfire.log"
314 export LOGFILE
315 ipfiremake inetutils
316 ipfiremake net-tools
317 ipfiremake ed
318 ipfiremake configroot
319 ipfiremake dhcp
320 ipfiremake dhcpcd
321 ipfiremake libusb
322 ipfiremake libpcap
323 # Temporary disabled.
324 # ipfiremake linux-atm
325 ipfiremake ppp
326 ipfiremake rp-pppoe
327 ipfiremake unzip
328 # ipfiremake linux PASS=I # Can we remove the installer kernel?
329 ipfiremake linux PASS=S
330 # ipfiremake 3cp4218 PASS=SMP
331 # ipfiremake amedyn PASS=SMP
332 # ipfiremake cxacru PASS=SMP
333 # ipfiremake eagle PASS=SMP
334 # ipfiremake cnx_pci PASS=SMP
335 # ipfiremake fcdsl PASS=SMP
336 # ipfiremake fcdsl2 PASS=SMP
337 # ipfiremake fcdslsl PASS=SMP
338 # ipfiremake fcdslusb PASS=SMP
339 # ipfiremake fcdslslusb PASS=SMP
340 # ipfiremake fcpci PASS=SMP
341 # ipfiremake fcclassic PASS=SMP
342 # ipfiremake pulsar PASS=SMP
343 # ipfiremake unicorn PASS=SMP
344 # ipfiremake promise-sata-300-tx PASS=SMP
345 ipfiremake zaptel PASS=S
346 ipfiremake linux
347 # ipfiremake 3cp4218
348 # ipfiremake amedyn
349 # ipfiremake cxacru
350 # ipfiremake eciadsl
351 # ipfiremake eagle
352 # ipfiremake speedtouch
353 # ipfiremake cnx_pci
354 # ipfiremake fcdsl
355 # ipfiremake fcdsl2
356 # ipfiremake fcdslsl
357 # ipfiremake fcdslusb
358 # ipfiremake fcdslslusb
359 # ipfiremake fcpci
360 # ipfiremake fcclassic
361 # ipfiremake pulsar
362 # ipfiremake unicorn
363 # ipfiremake promise-sata-300-tx
364 ipfiremake zaptel
365 # ipfiremake pcmciautils
366 ipfiremake expat
367 ipfiremake gdbm
368 ipfiremake gmp
369 ipfiremake pam
370 ipfiremake openssl
371 ipfiremake python
372 ipfiremake libnet
373 ipfiremake libjpeg
374 ipfiremake libpng
375 ipfiremake libtiff
376 ipfiremake lcms
377 ipfiremake libmng
378 ipfiremake freetype
379 ipfiremake libart
380 ipfiremake gd
381 ipfiremake popt
382 ipfiremake pcre
383 ipfiremake slang
384 ipfiremake newt
385 ipfiremake libcap
386 ipfiremake pciutils
387 ipfiremake libxml2
388 ipfiremake BerkeleyDB
389 ipfiremake mysql
390 ipfiremake cyrus-sasl
391 ipfiremake openldap
392 # ipfiremake cyrus-sasl PASS=L # Doesn't work yet. Thereby there's the question: Do we really need this?
393 ipfiremake apache2
394 ipfiremake php
395 ipfiremake subversion
396 ipfiremake apache2 PASS=C
397 ipfiremake arping
398 ipfiremake beep
399 ipfiremake bind
400 ipfiremake capi4k-utils
401 ipfiremake cdrtools
402 ipfiremake dnsmasq
403 ipfiremake dosfstools
404 ipfiremake reiserfsprogs
405 ipfiremake ethtool
406 ipfiremake ez-ipupdate
407 ipfiremake fcron
408 ipfiremake GD
409 ipfiremake gnupg
410 ipfiremake hdparm
411 ipfiremake ibod
412 ipfiremake initscripts
413 ipfiremake iptables
414 ipfiremake ipac-ng
415 ipfiremake ipaddr
416 ipfiremake iptstate
417 ipfiremake iputils
418 ipfiremake l7-protocols
419 # ipfiremake isapnptools # ERROR :(
420 # ipfiremake isdn4k-utils # What about mISDN???
421 ipfiremake kudzu
422 ipfiremake logrotate
423 ipfiremake logwatch
424 ipfiremake mingetty
425 ipfiremake misc-progs
426 ipfiremake mtools
427 ipfiremake nano
428 ipfiremake nash
429 ipfiremake nasm
430 ### The Perl Modules have to be updated! I will skip this now!
431 ipfiremake URI
432 ipfiremake HTML-Tagset
433 ipfiremake HTML-Parser
434 ipfiremake Compress-Zlib
435 ipfiremake Digest
436 ipfiremake Digest-SHA1
437 ipfiremake Digest-HMAC
438 ipfiremake libwww-perl
439 ipfiremake Net-DNS
440 ipfiremake Net-IPv4Addr
441 ipfiremake Net_SSLeay
442 ipfiremake IO-Stringy
443 ipfiremake Unix-Syslog
444 ipfiremake Mail-Tools
445 ipfiremake MIME-Tools
446 ipfiremake Net-Server
447 ipfiremake Convert-TNEF
448 ipfiremake Convert-UUlib
449 ipfiremake Archive-Tar
450 ipfiremake Archive-Zip
451 ipfiremake Text-Tabs+Wrap
452 ipfiremake Locale-Country
453 ipfiremake GeoIP
454 ###
455 ipfiremake fwhits
456 ipfiremake noip_updater
457 ipfiremake ntp
458 ipfiremake oinkmaster
459 ipfiremake openssh
460 ipfiremake openswan
461 ipfiremake pptpclient
462 ipfiremake rrdtool
463 ipfiremake setserial
464 ipfiremake setup
465 ipfiremake snort
466 ipfiremake squid
467 ipfiremake squid-graph
468 ipfiremake squidguard
469 # ipfiremake tcpdump
470 ipfiremake traceroute
471 ipfiremake vlan
472 ipfiremake wireless
473 ipfiremake libsafe
474 ipfiremake 3c5x9setup
475 ipfiremake pakfire
476 ipfiremake startscripts
477 ipfiremake java
478 ipfiremake bootsplash
479 ipfiremake spandsp
480 ipfiremake lzo
481 ipfiremake openvpn
482 ipfiremake pkg-config
483 ipfiremake glib
484 ipfiremake pammysql
485 ipfiremake xinetd
486 ipfiremake ghostscript
487 ipfiremake cups
488 ipfiremake samba
489 ipfiremake sudo
490 ipfiremake mc
491 ipfiremake wget
492 ipfiremake wput
493 ipfiremake bridge-utils
494 ipfiremake screen
495 ipfiremake hddtemp
496 ipfiremake smartmontools
497 ipfiremake htop
498 ipfiremake lynx
499 ipfiremake postfix
500 ipfiremake procmail
501 ipfiremake fetchmail
502 ipfiremake cyrusimap
503 ipfiremake webcyradm
504 ipfiremake mailx
505 ipfiremake clamav
506 ipfiremake razor
507 ipfiremake spamassassin
508 ipfiremake amavisd
509 ipfiremake stund
510 ipfiremake libpri
511 # ipfiremake bristuff
512 ipfiremake asterisk
513 ipfiremake mpg123
514 ipfiremake libmad
515 ipfiremake libogg
516 ipfiremake libvorbis
517 ipfiremake lame
518 ipfiremake xvid
519 ipfiremake mpeg2dec
520 ipfiremake ffmpeg
521 ipfiremake sox
522 ipfiremake gnump3d
523 ipfiremake videolan
524 ipfiremake applejuice
525 ipfiremake ocaml
526 ipfiremake mldonkey
527 ipfiremake ntop
528 ipfiremake rsync
529 ipfiremake tcpwrapper
530 ipfiremake portmap
531 ipfiremake nfs
532 ipfiremake nmap
533 ipfiremake mbmon
534 ipfiremake iftop
535 ipfiremake ncftp
536 ipfiremake cftp
537 ipfiremake etherwake
538 ipfiremake ethereal
539 ipfiremake tftp-hpa
540 ipfiremake iptraf
541 ipfiremake nagios
542 ipfiremake yasuc
543 }
544
545 buildinstaller() {
546 # Run installer scripts one by one
547 LOGFILE="$BASEDIR/log/_build.installer.log"
548 export LOGFILE
549 ipfiremake syslinux
550 ipfiremake uClibc
551 installmake busybox
552 installmake udev
553 installmake slang
554 installmake newt
555 installmake gettext
556 installmake kbd
557 installmake popt
558 installmake kudzu
559 installmake sysvinit
560 installmake misc-progs
561 installmake e2fsprogs
562 installmake reiserfsprogs
563 installmake sysfsutils
564 installmake util-linux
565 installmake pciutils
566 installmake pcmciautils
567 installmake installer
568 installmake scsi.img # this is to be deleted
569 installmake driver.img # this is to be deleted
570 installmake initrd
571 installmake boot.img # this is to be deleted
572 # ipfiremake as86 # this is to be deleted
573 # ipfiremake mbr # this is to be deleted
574 }
575
576 buildpackages() {
577 LOGFILE="$BASEDIR/log/_build.packages.log"
578 export LOGFILE
579 echo "... see detailed log in _build.*.log files" >> $LOGFILE
580
581 installmake strip
582
583 # Generating list of packages used
584 echo -n "Generating packages list from logs" | tee -a $LOGFILE
585 rm -f $BASEDIR/doc/packages-list
586 for i in `ls -1tr $BASEDIR/log/[^_]*`; do
587 if [ "$i" != "$BASEDIR/log/FILES" -a -n $i ]; then
588 echo "* `basename $i`" >>$BASEDIR/doc/packages-list
589 fi
590 done
591 echo "== List of softwares used to build $NAME Version: $VERSION ==" > $BASEDIR/doc/packages-list.txt
592 grep -v 'configroot$\|img$\|initrd$\|initscripts$\|installer$\|install$\|setup$\|pakfire$\|stage2$\|smp$\|tools$\|tools1$\|tools2$\|.tgz$\|-config$\|_missing_rootfile$' \
593 $BASEDIR/doc/packages-list | sort >> $BASEDIR/doc/packages-list.txt
594 rm -f $BASEDIR/doc/packages-list
595 # packages-list.txt is ready to be displayed for wiki page
596 beautify message DONE
597
598 # Create images for install
599 ipfiremake cdrom
600 ipfiremake pxe
601 cp $LFS/install/images/{*.iso,*.tgz} $BASEDIR >> $LOGFILE 2>&1
602
603 # ipfirepackages
604
605 # Cleanup
606 stdumount
607 rm -rf $BASEDIR/build/tmp/*
608
609 # Generating total list of files
610 echo "`date -u '+%b %e %T'`: Generating files list from logs" | tee -a $LOGFILE
611 rm -f $BASEDIR/log/FILES
612 for i in `ls -1tr $BASEDIR/log/[^_]*`; do
613 if [ "$i" != "$BASEDIR/log/FILES" -a -n $i ]; then
614 echo "##" >>$BASEDIR/log/FILES
615 echo "## `basename $i`" >>$BASEDIR/log/FILES
616 echo "##" >>$BASEDIR/log/FILES
617 cat $i | sed "s%^\./%#%" | sort >> $BASEDIR/log/FILES
618 fi
619 done
620 cd $BASEDIR/packages; ls -w1 *.ipfire | awk -F ".ipfire" '{ print $1 }' > $BASEDIR/packages/packages_list.txt
621 echo -n "###EOF###" >> $BASEDIR/packages/packages_list.txt
622
623 cd $PWD
624
625 }
626
627 ipfirepackages() {
628 if [ -d "$BASEDIR/packages" ]; then
629 for i in `ls $BASEDIR/packages`; do
630 touch $BASEDIR/build/install/packages/$i.empty
631 done
632 fi
633 # ipfiredist amavisd
634 ipfiredist applejuice
635 ipfiredist asterisk
636 ipfiredist clamav
637 ipfiredist cups
638 ipfiredist cyrusimap
639 ipfiredist fetchmail
640 ipfiredist ffmpeg
641 ipfiredist gnump3d
642 ipfiredist iptraf
643 ipfiredist java
644 ipfiredist lame
645 ipfiredist libmad
646 ipfiredist libogg
647 ipfiredist libvorbis
648 ipfiredist mailx
649 ipfiredist mldonkey
650 ipfiredist mpeg2dec
651 ipfiredist nagios
652 ipfiredist nfs
653 ipfiredist nmap
654 ipfiredist ntop
655 ipfiredist portmap
656 ipfiredist postfix
657 ipfiredist procmail
658 ipfiredist samba
659 ipfiredist sox
660 ipfiredist spamassassin
661 ipfiredist subversion
662 ipfiredist videolan
663 ipfiredist webcyradm
664 ipfiredist xvid
665 ipfiredist yasuc
666 test -d $BASEDIR/packages || mkdir $BASEDIR/packages
667 mv -f $LFS/install/packages/*.{ipfire,md5} $BASEDIR/packages >> $LOGFILE 2>&1
668 rm -rf $BASEDIR/build/install/packages/*
669 }
670
671 # See what we're supposed to do
672 case "$1" in
673 build)
674 clear
675 BUILDMACHINE=`uname -m`
676 PACKAGE=`ls -v -r $BASEDIR/cache/toolchains/$SNAME-$VERSION-toolchain-$BUILDMACHINE.tar.gz 2> /dev/null | head -n 1`
677 #only restore on a clean disk
678 if [ ! -f log/cleanup-toolchain-2-tools ]; then
679 if [ ! -n "$PACKAGE" ]; then
680 beautify build_stage "Full toolchain compilation - Native GCC: `gcc --version | grep GCC | awk {'print $3'}`"
681 prepareenv
682 buildtoolchain
683 else
684 PACKAGENAME=${PACKAGE%.tar.gz}
685 beautify build_stage "Packaged toolchain compilation"
686 if [ `md5sum $PACKAGE | awk '{print $1}'` == `cat $PACKAGENAME.md5 | awk '{print $1}'` ]; then
687 tar zxf $PACKAGE
688 prepareenv
689 else
690 exiterror "$PACKAGENAME md5 did not match, check downloaded package"
691 fi
692 fi
693 else
694 echo -n "Using installed toolchain" | tee -a $LOGFILE
695 beautify message SKIP
696 prepareenv
697 fi
698
699 beautify build_stage "Building base"
700 buildbase
701
702 beautify build_stage "Building IPFire"
703 buildipfire
704
705 # Setzen des IPFire Builds
706 if [ "$FIREBUILD" ]; then
707 echo "$FIREBUILD" > $BASEDIR/build/var/ipfire/firebuild
708 else
709 echo "_(OvO)_" > $BASEDIR/build/var/ipfire/firebuild
710 fi
711
712 beautify build_stage "Building installer"
713 buildinstaller
714
715 beautify build_stage "Building packages"
716 buildpackages
717 ;;
718 shell)
719 # enter a shell inside LFS chroot
720 # may be used to changed kernel settings
721 prepareenv
722 entershell
723 ;;
724 changelog)
725 echo -n "Loading new Changelog from SVN: "
726 svn log http://svn.ipfire.eu/svn/ipfire > doc/ChangeLog
727 echo "Finished!"
728 ;;
729 clean)
730 for i in `mount | grep $BASEDIR | sed 's/^.*loop=\(.*\))/\1/'`; do
731 $LOSETUP -d $i 2>/dev/null
732 done
733 for i in `mount | grep $BASEDIR | cut -d " " -f 1`; do
734 umount $i
735 done
736 stdumount
737 for i in `seq 0 7`; do
738 if ( losetup /dev/loop${i} 2>/dev/null | grep -q "/install/images" ); then
739 umount /dev/loop${i} 2>/dev/null;
740 losetup -d /dev/loop${i} 2>/dev/null;
741 fi;
742 done
743 rm -rf $BASEDIR/build
744 rm -rf $BASEDIR/cdrom
745 rm -rf $BASEDIR/packages
746 rm -rf $BASEDIR/log
747 if [ -h /tools ]; then
748 rm -f /tools
749 fi
750 ;;
751 newpak)
752 # create structure for a new package
753 echo -e "Name of the new package: $2"
754 if [ ! -f "lfs/$2" ]; then
755 echo "`date -u '+%b %e %T'`: Creating directory src/paks/$2"
756 mkdir -p src/paks/$2
757 cd src/paks/$2
758 echo "`date -u '+%b %e %T'`: Creating files"
759 cp $BASEDIR/lfs/postfix $BASEDIR/lfs/$2
760
761 touch ROOTFILES
762 touch {,un}install.sh
763 ## install.sh
764 echo '#!/bin/bash' > install.sh
765 echo '#' >> install.sh
766 echo '#################################################################' >> install.sh
767 echo '# #' >> install.sh
768 echo '# This file belongs to IPFire Firewall - GPLv2 - www.ipfire.org #' >> install.sh
769 echo '# #' >> install.sh
770 echo '#################################################################' >> install.sh
771 echo '#' >> install.sh
772 echo '# Extract the files' >> install.sh
773 echo 'tar xfz files.tgz -C /' >> install.sh
774 echo 'cp -f ROOTFILES /opt/pakfire/installed/ROOTFILES.$2' >> install.sh
775 ## uninstall.sh
776 echo '#!/bin/bash' > uninstall.sh
777 echo '#################################################################' >> uninstall.sh
778 echo '# #' >> uninstall.sh
779 echo '# This file belongs to IPFire Firewall - GPLv2 - www.ipfire.org #' >> uninstall.sh
780 echo '# #' >> uninstall.sh
781 echo '#################################################################' >> uninstall.sh
782 echo '#' >> uninstall.sh
783 echo '# Delete the files' >> uninstall.sh
784 echo '## Befehl fehlt noch' >> uninstall.sh
785 echo 'rm -f /opt/pakfire/installed/ROOTFILES.$2' >> uninstall.sh
786 echo "`date -u '+%b %e %T'`: Adding files to SVN"
787 cd - && svn add lfs/$2 && svn add src/paks/$2
788
789 echo -n "Do you want to remove the folders? [y/n]"
790 read REM
791 if [ "$REM" == "y" ]; then
792 echo "Removing the folders..."
793 svn del src/paks/$2 --force
794 else
795 echo "Folders are kept."
796 fi
797 else
798 echo "$2 already exists"
799 fi
800 exit 0
801 ;;
802 downloadsrc)
803 if [ ! -d $BASEDIR/cache ]; then
804 mkdir $BASEDIR/cache
805 fi
806 mkdir -p $BASEDIR/log
807 echo -e "${BOLD}Preload all source files${NORMAL}" | tee -a $LOGFILE
808 FINISHED=0
809 cd $BASEDIR/lfs
810 for c in `seq $MAX_RETRIES`; do
811 if (( FINISHED==1 )); then
812 break
813 fi
814 FINISHED=1
815 cd $BASEDIR/lfs
816 for i in *; do
817 if [ -f "$i" -a "$i" != "Config" ]; then
818 echo -ne "Loading $i"
819 make -s -f $i LFS_BASEDIR=$BASEDIR MESSAGE="$i\t ($c/$MAX_RETRIES)" download >> $LOGFILE 2>&1
820 if [ $? -ne 0 ]; then
821 beautify message FAIL
822 FINISHED=0
823 else
824 if [ $c -eq 1 ]; then
825 beautify message DONE
826 fi
827 fi
828 fi
829 done
830 done
831 echo -e "${BOLD}***Verifying md5sums${NORMAL}"
832 ERROR=0
833 for i in *; do
834 if [ -f "$i" -a "$i" != "Config" ]; then
835 make -s -f $i LFS_BASEDIR=$BASEDIR MESSAGE="$i\t " md5 >> $LOGFILE 2>&1
836 if [ $? -ne 0 ]; then
837 echo -ne "MD5 difference in lfs/$i"
838 beautify message FAIL
839 ERROR=1
840 fi
841 fi
842 done
843 if [ $ERROR -eq 0 ]; then
844 echo -ne "${BOLD}all files md5sum match${NORMAL}"
845 beautify message DONE
846 else
847 echo -ne "${BOLD}not all files were correctly download${NORMAL}"
848 beautify message FAIL
849 fi
850 cd - >/dev/null 2>&1
851 ;;
852 toolchain)
853 clear
854 prepareenv
855 beautify build_stage "Toolchain compilation - Native GCC: `gcc --version | grep GCC | awk {'print $3'}`"
856 buildtoolchain
857 BUILDMACHINE=`uname -m`
858 echo "`date -u '+%b %e %T'`: Create toolchain tar.gz for $BUILDMACHINE" | tee -a $LOGFILE
859 test -d $BASEDIR/cache/toolchains || mkdir $BASEDIR/cache/toolchains
860 cd $BASEDIR && tar -zc --exclude='log/_build.*.log' -f cache/toolchains/$SNAME-$VERSION-toolchain-$BUILDMACHINE.tar.gz \
861 build/{bin,etc,usr/bin,usr/local} \
862 build/tools/{bin,etc,*-linux-gnu,include,lib,libexec,sbin,share,var} \
863 log >> $LOGFILE
864 md5sum cache/toolchains/$SNAME-$VERSION-toolchain-$BUILDMACHINE.tar.gz \
865 > cache/toolchains/$SNAME-$VERSION-toolchain-$BUILDMACHINE.md5
866 stdumount
867 ;;
868 gettoolchain)
869 BUILDMACHINE=`uname -m`
870 # arbitrary name to be updated in case of new toolchain package upload
871 PACKAGE=$SNAME-$VERSION-toolchain-$BUILDMACHINE
872 if [ ! -f $BASEDIR/cache/toolchains/$PACKAGE.tar.gz ]; then
873 URL_TOOLCHAIN=`grep URL_TOOLCHAIN lfs/Config | awk '{ print $3 }'`
874 test -d $BASEDIR/cache/toolchains || mkdir $BASEDIR/cache/toolchains
875 echo "`date -u '+%b %e %T'`: Load toolchain tar.gz for $BUILDMACHINE" | tee -a $LOGFILE
876 cd $BASEDIR/cache/toolchains
877 wget $URL_TOOLCHAIN/$PACKAGE.tar.gz $URL_TOOLCHAIN/$PACKAGE.md5 >& /dev/null
878 if [ $? -ne 0 ]; then
879 echo "`date -u '+%b %e %T'`: error downloading toolchain for $BUILDMACHINE machine" | tee -a $LOGFILE
880 else
881 if [ "`md5sum $PACKAGE.tar.gz | awk '{print $1}'`" = "`cat $PACKAGE.md5 | awk '{print $1}'`" ]; then
882 echo "`date -u '+%b %e %T'`: toolchain md5 ok" | tee -a $LOGFILE
883 else
884 exiterror "$PACKAGE.md5 did not match, check downloaded package"
885 fi
886 fi
887 else
888 echo "Toolchain is already downloaded. Exiting..."
889 fi
890 ;;
891 othersrc)
892 prepareenv
893 echo -ne "`date -u '+%b %e %T'`: Build sources iso for $MACHINE" | tee -a $LOGFILE
894 chroot $LFS /tools/bin/env -i HOME=/root \
895 TERM=$TERM PS1='\u:\w\$ ' \
896 PATH=/usr/local/bin:/bin:/usr/bin:/sbin:/usr/sbin \
897 VERSION=$VERSION NAME="$NAME" SNAME="$SNAME" MACHINE=$MACHINE \
898 /bin/bash -x -c "cd /usr/src/lfs && make -f sources-iso LFS_BASEDIR=/usr/src install" >>$LOGFILE 2>&1
899 mv $LFS/install/images/ipfire-* $BASEDIR >> $LOGFILE 2>&1
900 if [ $? -eq "0" ]; then
901 beautify message DONE
902 else
903 beautify message FAIL
904 fi
905 stdumount
906 ;;
907 svn)
908 case "$2" in
909 update|up)
910 # clear
911 echo -ne "Loading the latest source files...\n"
912 if [ $3 ]; then
913 svn update -r $3 | tee -a $PWD/log/_build.svn.update.log
914 else
915 svn update | tee -a $PWD/log/_build.svn.update.log
916 fi
917 if [ $? -eq "0" ]; then
918 beautify message DONE
919 else
920 beautify message FAIL
921 exit 1
922 fi
923 echo -ne "Writing the svn-info to a file"
924 svn info > $PWD/svn_status
925 if [ $? -eq "0" ]; then
926 beautify message DONE
927 else
928 beautify message FAIL
929 exit 1
930 fi
931 chmod 755 $0
932 exit 0
933 ;;
934 commit|ci)
935 clear
936 if [ -f /usr/bin/mcedit ]; then
937 export EDITOR=/usr/bin/mcedit
938 fi
939 if [ -f /usr/bin/nano ]; then
940 export EDITOR=/usr/bin/nano
941 fi
942 echo -ne "Selecting editor $EDITOR..."
943 beautify message DONE
944 if [ -e /sbin/yast ]; then
945 if [ "`echo $SVN_REVISION | cut -c 3`" -eq "0" ]; then
946 $0 changelog
947 fi
948 fi
949 svn commit
950 $0 svn up
951 $0 uploadsrc
952 ;;
953 dist)
954 if [ $3 ]; then
955 SVN_REVISION=$3
956 fi
957 if [ -f ipfire-source-r$SVN_REVISION.tar.gz ]; then
958 echo -ne "REV $SVN_REVISION: SKIPPED!\n"
959 exit 0
960 fi
961 echo -en "REV $SVN_REVISION: Downloading..."
962 svn export http://svn.ipfire.eu/svn/ipfire/trunk ipfire-source/ --force > /dev/null
963 svn log http://svn.ipfire.eu/svn/ipfire/trunk -r 1:$SVN_REVISION > ipfire-source/Changelog
964 #svn info http://svn.ipfire.eu/svn/ipfire/trunk -r $SVN_REVISION > ipfire-source/svn_status
965 evaluate 1
966
967 echo -en "REV $SVN_REVISION: Compressing files..."
968 if [ -e ipfire-source/trunk/make.sh ]; then
969 chmod 755 ipfire-source/trunk/make.sh
970 fi
971 tar cfz ipfire-source-r$SVN_REVISION.tar.gz ipfire-source
972 evaluate 1
973 echo -en "REV $SVN_REVISION: Cleaning up..."
974 rm ipfire-source/ -r
975 evaluate 1
976 ;;
977 diff|di)
978 echo -ne "Make a local diff to last svn revision"
979 svn diff > ipfire-diff-`date +'%Y-%m-%d-%H:%M'`-r`svn info | grep Revision | cut -c 11-`.diff
980 evaluate 1
981 echo "Diff was successfully saved to ipfire-diff-`date +'%Y-%m-%d-%H:%M'`-r`svn info | grep Revision | cut -c 11-`.diff"
982 ;;
983 esac
984 ;;
985 uploadsrc)
986 PWD=`pwd`
987 cd $BASEDIR/cache/
988 echo -e "Uploading cache to ftp server:"
989 ncftpls -u $IPFIRE_FTP_USER_INT -p $IPFIRE_FTP_PASS_INT ftp://$IPFIRE_FTP_URL_INT$IPFIRE_FTP_PATH_INT/ > /var/tmp/ftplist
990 for i in *; do
991 if [ "$i" == "toolchains" ]; then continue; fi
992 grep -q $i /var/tmp/ftplist
993 if [ "$?" -ne "0" ]; then
994 echo -ne "$i"
995 ncftpput -bb -u $IPFIRE_FTP_USER_INT -p $IPFIRE_FTP_PASS_INT $IPFIRE_FTP_URL_INT $IPFIRE_FTP_PATH_INT/ $i >> $BASEDIR/log/_build.uploadsrc.log 2>&1
996 if [ "$?" -eq "0" ]; then
997 beautify message DONE
998 else
999 beautify message FAIL
1000 fi
1001 fi
1002 done
1003 rm -f /var/tmp/ftplist
1004 UL_TIME_START=`date +'%s'`
1005 ncftpbatch -d > /dev/null 2>&1
1006 while ps acx | grep -q ncftpbatch
1007 do
1008 UL_TIME=$(expr `date +'%s'` - $UL_TIME_START)
1009 echo -ne "\r ${UL_TIME}s : Upload is running..."
1010 sleep 1
1011 done
1012 beautify message DONE
1013 cd $PWD
1014 exit 0
1015 ;;
1016 upload)
1017 case "$2" in
1018 iso)
1019 echo -e "Uploading the iso to $IPFIRE_FTP_URL_EXT."
1020 cat <<EOF > .ftp-commands
1021 mkdir $IPFIRE_FTP_PATH_EXT
1022 ls -lah
1023 quit
1024 EOF
1025 ncftp -u $IPFIRE_FTP_USER_EXT -p $IPFIRE_FTP_PASS_EXT $IPFIRE_FTP_URL_EXT < .ftp-commands
1026 rm -f .ftp-commands
1027 md5sum ipfire-install-$VERSION.i386.iso > ipfire-install-$VERSION.i386.iso.md5
1028 ncftpput -u $IPFIRE_FTP_USER_EXT -p $IPFIRE_FTP_PASS_EXT $IPFIRE_FTP_URL_EXT $IPFIRE_FTP_PATH_EXT/ ipfire-install-$VERSION.i386.iso
1029 ncftpput -u $IPFIRE_FTP_USER_EXT -p $IPFIRE_FTP_PASS_EXT $IPFIRE_FTP_URL_EXT $IPFIRE_FTP_PATH_EXT/ ipfire-install-$VERSION.i386.iso.md5
1030 ncftpput -u $IPFIRE_FTP_USER_EXT -p $IPFIRE_FTP_PASS_EXT $IPFIRE_FTP_URL_EXT $IPFIRE_FTP_PATH_EXT/ ipfire-source-r$SVN_REVISION.tar.gz
1031 ncftpput -u $IPFIRE_FTP_USER_EXT -p $IPFIRE_FTP_PASS_EXT $IPFIRE_FTP_URL_EXT $IPFIRE_FTP_PATH_EXT/ svn_status
1032 if [ "$?" -eq "0" ]; then
1033 echo -e "The iso of Revision $SVN_REVISION was successfully uploaded to $IPFIRE_FTP_URL_EXT$IPFIRE_FTP_PATH_EXT/."
1034 else
1035 echo -e "There was an error while uploading the iso to the ftp server."
1036 exit 1
1037 fi
1038 if [ "$3" = "--with-sources-cd" ]; then
1039 ncftpput -u $IPFIRE_FTP_USER_EXT -p $IPFIRE_FTP_PASS_EXT $IPFIRE_FTP_URL_EXT $IPFIRE_FTP_PATH_EXT/ ipfire-sources-cd-$VERSION.$MACHINE.iso
1040 fi
1041 ;;
1042 paks)
1043 cat <<EOF > .ftp-commands
1044 mkdir $IPFIRE_FTP_PATH_PAK
1045 ls -lah
1046 quit
1047 EOF
1048 ncftp -u $IPFIRE_FTP_USER_PAK -p $IPFIRE_FTP_PASS_PAK $IPFIRE_FTP_URL_PAK < .ftp-commands
1049 rm -f .ftp-commands
1050 ncftpput -z -u $IPFIRE_FTP_USER_PAK -p $IPFIRE_FTP_PASS_PAK $IPFIRE_FTP_URL_PAK $IPFIRE_FTP_PATH_PAK/ packages/*
1051 if [ "$?" -eq "0" ]; then
1052 echo -e "The packages were successfully uploaded to $IPFIRE_FTP_URL_PAK$IPFIRE_FTP_PATH_PAK/."
1053 else
1054 echo -e "There was an error while uploading the packages to the ftp server."
1055 exit 1
1056 fi
1057 ;;
1058 esac
1059 ;;
1060 batch)
1061 if [ "$2" -eq "--background" ]; then
1062 batch_script
1063 exit $?
1064 fi
1065 if [ `screen -ls | grep -q ipfire` ]; then
1066 echo "Build is already running, sorry!"
1067 exit 1
1068 else
1069 if [ "$2" = "--rebuild" ]; then
1070 export IPFIRE_REBUILD=1
1071 echo "REBUILD!"
1072 else
1073 export IPFIRE_REBUILD=0
1074 fi
1075 echo -en "${BOLD}***IPFire-Batch-Build is starting...${NORMAL}"
1076 screen -dmS ipfire $0 batch --background
1077 evaluate 1
1078 exit 0
1079 fi
1080 ;;
1081 watch)
1082 watch_screen
1083 ;;
1084 pxe)
1085 case "$2" in
1086 start)
1087 start_tftpd
1088 ;;
1089 stop)
1090 stop_tftpd
1091 ;;
1092 reload)
1093 reload_tftpd
1094 ;;
1095 esac
1096 exit 0
1097 ;;
1098 "")
1099 clear
1100 svn info
1101 select name in "Exit" "IPFIRE: Downloadsrc" "IPFIRE: Build (silent)" "IPFIRE: Watch Build" "IPFIRE: Batch" "IPFIRE: Clean" "SVN: Commit" "SVN: Update" "SVN: Status" "SVN: Diff" "LOG: Tail" "Help"
1102 do
1103 case $name in
1104 "IPFIRE: Downloadsrc")
1105 $0 downloadsrc
1106 ;;
1107 "IPFIRE: Build (silent)")
1108 $0 build-silent
1109 ;;
1110 "IPFIRE: Watch Build")
1111 $0 watch
1112 ;;
1113 "IPFIRE: Batch")
1114 $0 batch
1115 ;;
1116 "IPFIRE: Clean")
1117 $0 clean
1118 ;;
1119 "SVN: Update")
1120 $0 svn update
1121 ;;
1122 "Help")
1123 echo "Usage: $0 {build|changelog|clean|gettoolchain|newpak|downloadsrc|shell|sync|toolchain}"
1124 cat doc/make.sh-usage
1125 ;;
1126 "LOG: Tail")
1127 tail -f log/_*
1128 ;;
1129 "Exit")
1130 break
1131 ;;
1132 esac
1133 done
1134 ;;
1135 *)
1136 echo "Usage: $0 {build|changelog|clean|gettoolchain|newpak|downloadsrc|shell|sync|toolchain}"
1137 cat doc/make.sh-usage
1138 ;;
1139 esac