]> git.ipfire.org Git - ipfire-2.x.git/blob - make.sh
655a00c267d93b9ea166e6c1f23c4b35ec7d6430
[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.0" # Version number
28 SLOGAN="www.ipfire.eu" # 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 (( 5242880 > $BASE_ASPACE )); then
139 BASE_USPACE=`du -skx $BASEDIR | awk '{print $1}'`
140 if (( 5242880 - $BASE_USPACE > $BASE_ASPACE )); then
141 beautify message FAIL
142 exiterror "Not enough temporary space available, need at least 5GB 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 ethtool
405 ipfiremake ez-ipupdate
406 ipfiremake fcron
407 ipfiremake GD
408 ipfiremake gnupg
409 ipfiremake hdparm
410 ipfiremake ibod
411 ipfiremake initscripts
412 ipfiremake iptables
413 ipfiremake ipac-ng
414 ipfiremake ipaddr
415 ipfiremake iptstate
416 ipfiremake iputils
417 ipfiremake l7-protocols
418 # ipfiremake isapnptools # ERROR :(
419 # ipfiremake isdn4k-utils # What about mISDN???
420 # ipfiremake kudzu # ERROR :(
421 ipfiremake logrotate
422 ipfiremake logwatch
423 ipfiremake mingetty
424 ipfiremake misc-progs
425 ipfiremake mtools
426 ipfiremake nano
427 ipfiremake nash
428 ipfiremake nasm
429 ### The Perl Modules have to be updated! I will skip this now!
430 ipfiremake URI
431 ipfiremake HTML-Tagset
432 ipfiremake HTML-Parser
433 ipfiremake Compress-Zlib
434 ipfiremake Digest
435 ipfiremake Digest-SHA1
436 ipfiremake Digest-HMAC
437 ipfiremake libwww-perl
438 ipfiremake Net-DNS
439 ipfiremake Net-IPv4Addr
440 ipfiremake Net_SSLeay
441 ipfiremake IO-Stringy
442 ipfiremake Unix-Syslog
443 ipfiremake Mail-Tools
444 ipfiremake MIME-Tools
445 ipfiremake Net-Server
446 ipfiremake Convert-TNEF
447 ipfiremake Convert-UUlib
448 ipfiremake Archive-Tar
449 ipfiremake Archive-Zip
450 ipfiremake Text-Tabs+Wrap
451 ipfiremake Locale-Country
452 ipfiremake GeoIP
453 ###
454 ipfiremake fwhits
455 ipfiremake noip_updater
456 ipfiremake ntp
457 ipfiremake oinkmaster
458 ipfiremake openssh
459 ipfiremake openswan
460 ipfiremake pptpclient
461 ipfiremake rrdtool
462 ipfiremake setserial
463 ipfiremake setup
464 ipfiremake snort
465 ipfiremake squid
466 ipfiremake squid-graph
467 ipfiremake squidguard
468 # ipfiremake tcpdump
469 ipfiremake traceroute
470 ipfiremake vlan
471 ipfiremake wireless
472 ipfiremake libsafe
473 ipfiremake 3c5x9setup
474 ipfiremake pakfire
475 ipfiremake startscripts
476 ipfiremake java
477 ipfiremake bootsplash
478 ipfiremake spandsp
479 ipfiremake lzo
480 ipfiremake openvpn
481 ipfiremake pkg-config
482 ipfiremake glib
483 ipfiremake pammysql
484 ipfiremake xinetd
485 ipfiremake ghostscript
486 ipfiremake cups
487 ipfiremake samba
488 ipfiremake sudo
489 ipfiremake mc
490 ipfiremake wget
491 ipfiremake wput
492 ipfiremake bridge-utils
493 ipfiremake screen
494 ipfiremake hddtemp
495 ipfiremake smartmontools
496 ipfiremake htop
497 ipfiremake lynx
498 ipfiremake postfix
499 ipfiremake procmail
500 ipfiremake fetchmail
501 ipfiremake cyrusimap
502 ipfiremake webcyradm
503 ipfiremake mailx
504 ipfiremake clamav
505 ipfiremake razor
506 ipfiremake spamassassin
507 ipfiremake amavisd
508 ipfiremake stund
509 ipfiremake libpri
510 # ipfiremake bristuff
511 ipfiremake asterisk
512 ipfiremake mpg123
513 ipfiremake libmad
514 ipfiremake libogg
515 ipfiremake libvorbis
516 ipfiremake lame
517 ipfiremake xvid
518 ipfiremake mpeg2dec
519 ipfiremake ffmpeg
520 ipfiremake sox
521 ipfiremake gnump3d
522 ipfiremake videolan
523 ipfiremake applejuice
524 ipfiremake ocaml
525 ipfiremake mldonkey
526 ipfiremake ntop
527 ipfiremake rsync
528 ipfiremake tcpwrapper
529 ipfiremake portmap
530 ipfiremake nfs
531 ipfiremake nmap
532 ipfiremake mbmon
533 ipfiremake iftop
534 ipfiremake ncftp
535 ipfiremake cftp
536 ipfiremake etherwake
537 ipfiremake ethereal
538 ipfiremake tftp-hpa
539 ipfiremake iptraf
540 ipfiremake nagios
541 ipfiremake yasuc
542 }
543
544 buildinstaller() {
545 # Run installer scripts one by one
546 LOGFILE="$BASEDIR/log/_build.installer.log"
547 export LOGFILE
548 ipfiremake syslinux
549 ipfiremake as86
550 ipfiremake mbr
551 ipfiremake uClibc
552 installmake busybox
553 installmake sysvinit
554 installmake e2fsprogs
555 installmake misc-progs
556 installmake slang
557 installmake util-linux
558 installmake newt
559 installmake pciutils
560 installmake pcmcia-cs
561 installmake kbd
562 installmake installer
563 installmake scsi.img
564 installmake driver.img
565 installmake initrd
566 installmake boot.img
567 }
568
569 buildpackages() {
570 LOGFILE="$BASEDIR/log/_build.packages.log"
571 export LOGFILE
572 echo "... see detailed log in _build.*.log files" >> $LOGFILE
573 echo -ne "`date -u '+%b %e %T'`: Stage5 packages build \n" | tee -a $LOGFILE
574 # Strip files
575 echo "`date -u '+%b %e %T'`: Stripping files" | tee -a $LOGFILE
576 find $LFS/lib $LFS/usr/lib $LFS/usr/share/rrdtool-* $LFS/install ! -type l \( -name '*.so' -o -name '*.so[\.0-9]*' \) \
577 ! -name 'libc.so' ! -name 'libpthread.so' ! -name 'libcrypto.so.0.9.7.sha1' \
578 -exec $LFS/tools/bin/strip --strip-all {} \; >> $LOGFILE 2>&1
579 # add -ls before -exec if you want to verify what files are stripped
580
581 find $LFS/{,s}bin $LFS/usr/{,s}bin $LFS/usr/local/{,s}bin ! -type l \
582 -exec file {} \; | grep " ELF " | cut -f1 -d ':' | xargs $LFS/tools/bin/strip --strip-all >> $LOGFILE 2>&1
583 # there add -v to strip to verify
584
585 if [ 'i386' = $MACHINE ]; then
586 # Create fcdsl packages
587 echo "`date -u '+%b %e %T'`: Building fcdsl tgz" | tee -a $LOGFILE
588 cp $LFS/install/images/fcdsl/license.txt $LFS >> $LOGFILE 2>&1
589 touch $LFS/var/run/{need-depmod-$KVER,need-depmod-$KVER-smp}
590 cd $LFS && tar cvfz $LFS/install/images/$SNAME-fcdsl-$VERSION.$MACHINE.tgz \
591 lib/modules/$KVER/misc/fcdsl*.o.gz \
592 lib/modules/$KVER-smp/misc/fcdsl*.o.gz \
593 usr/lib/isdn/{fds?base.bin,fd?ubase.frm} \
594 etc/fcdsl/fcdsl*.conf \
595 etc/drdsl/{drdsl,drdsl.ini} \
596 license.txt \
597 var/run/{need-depmod-$KVER,need-depmod-$KVER-smp} >> $LOGFILE 2>&1
598 rm -f $LFS/license.txt >> $LOGFILE 2>&1
599 cd $BASEDIR
600 fi
601
602 # Generating list of packages used
603 echo "`date -u '+%b %e %T'`: Generating packages list from logs" | tee -a $LOGFILE
604 rm -f $BASEDIR/doc/packages-list
605 for i in `ls -1tr $BASEDIR/log/[^_]*`; do
606 if [ "$i" != "$BASEDIR/log/FILES" -a -n $i ]; then
607 echo "* `basename $i`" >>$BASEDIR/doc/packages-list
608 fi
609 done
610 echo "== List of softwares used to build $NAME Version: $VERSION ==" > $BASEDIR/doc/packages-list.txt
611 grep -v 'configroot$\|img$\|initrd$\|initscripts$\|installer$\|install$\|ipfire$\|setup$\|pakfire$\|stage2$\|smp$\|tools$\|tools1$\|tools2$\|.tgz$\|-config$' \
612 $BASEDIR/doc/packages-list | sort >> $BASEDIR/doc/packages-list.txt
613 rm -f $BASEDIR/doc/packages-list
614 # packages-list.txt is ready to be displayed for wiki page
615
616 # Create ISO for CDROM
617 ipfiremake cdrom
618 rm -f $LFS/install/images/*usb*
619 cp $LFS/install/images/{*.iso,*.tgz} $BASEDIR >> $LOGFILE 2>&1
620
621 ipfirepackages
622
623 # Cleanup
624 stdumount
625 rm -rf $BASEDIR/build/tmp/*
626
627 # Generating total list of files
628 echo "`date -u '+%b %e %T'`: Generating files list from logs" | tee -a $LOGFILE
629 rm -f $BASEDIR/log/FILES
630 for i in `ls -1tr $BASEDIR/log/[^_]*`; do
631 if [ "$i" != "$BASEDIR/log/FILES" -a -n $i ]; then
632 echo "##" >>$BASEDIR/log/FILES
633 echo "## `basename $i`" >>$BASEDIR/log/FILES
634 echo "##" >>$BASEDIR/log/FILES
635 cat $i | sed "s%^\./%#%" | sort >> $BASEDIR/log/FILES
636 fi
637 done
638 cd $BASEDIR/packages; ls -w1 *.ipfire | awk -F ".ipfire" '{ print $1 }' > $BASEDIR/packages/packages_list.txt
639 echo -n "###EOF###" >> $BASEDIR/packages/packages_list.txt
640
641 cd $PWD
642
643 }
644
645 ipfirepackages() {
646 if [ -d "$BASEDIR/packages" ]; then
647 for i in `ls $BASEDIR/packages`; do
648 touch $BASEDIR/build/install/packages/$i.empty
649 done
650 fi
651 # ipfiredist amavisd
652 ipfiredist applejuice
653 ipfiredist asterisk
654 ipfiredist clamav
655 ipfiredist cups
656 ipfiredist cyrusimap
657 ipfiredist fetchmail
658 ipfiredist ffmpeg
659 ipfiredist gnump3d
660 ipfiredist iptraf
661 ipfiredist java
662 ipfiredist lame
663 ipfiredist libmad
664 ipfiredist libogg
665 ipfiredist libvorbis
666 ipfiredist mailx
667 ipfiredist mldonkey
668 ipfiredist mpeg2dec
669 ipfiredist nagios
670 ipfiredist nfs
671 ipfiredist nmap
672 ipfiredist ntop
673 ipfiredist portmap
674 ipfiredist postfix
675 ipfiredist procmail
676 ipfiredist samba
677 ipfiredist sox
678 ipfiredist spamassassin
679 ipfiredist subversion
680 ipfiredist videolan
681 ipfiredist webcyradm
682 ipfiredist xvid
683 ipfiredist yasuc
684 test -d $BASEDIR/packages || mkdir $BASEDIR/packages
685 mv -f $LFS/install/packages/*.{ipfire,md5} $BASEDIR/packages >> $LOGFILE 2>&1
686 rm -rf $BASEDIR/build/install/packages/*
687 }
688
689 # See what we're supposed to do
690 case "$1" in
691 build)
692 clear
693 BUILDMACHINE=`uname -m`
694 PACKAGE=`ls -v -r $BASEDIR/cache/toolchains/$SNAME-$VERSION-toolchain-$BUILDMACHINE.tar.gz 2> /dev/null | head -n 1`
695 #only restore on a clean disk
696 if [ ! -f log/cleanup-toolchain-2-tools ]; then
697 if [ ! -n "$PACKAGE" ]; then
698 beautify build_stage "Full toolchain compilation - Native GCC: `gcc --version | grep GCC | awk {'print $3'}`"
699 prepareenv
700 buildtoolchain
701 else
702 PACKAGENAME=${PACKAGE%.tar.gz}
703 beautify build_stage "Packaged toolchain compilation"
704 if [ `md5sum $PACKAGE | awk '{print $1}'` == `cat $PACKAGENAME.md5 | awk '{print $1}'` ]; then
705 tar zxf $PACKAGE
706 prepareenv
707 else
708 exiterror "$PACKAGENAME md5 did not match, check downloaded package"
709 fi
710 fi
711 else
712 echo -n "Using installed toolchain" | tee -a $LOGFILE
713 beautify message SKIP
714 prepareenv
715 fi
716
717 beautify build_stage "Building base"
718 buildbase
719
720 beautify build_stage "Building IPFire"
721 buildipfire
722
723 # Setzen des IPFire Builds
724 if [ "$FIREBUILD" ]; then
725 echo "$FIREBUILD" > $BASEDIR/build/var/ipfire/firebuild
726 else
727 echo "_(OvO)_" > $BASEDIR/build/var/ipfire/firebuild
728 fi
729
730 beautify build_stage "Building installer"
731 buildinstaller
732
733 beautify build_stage "Building packages"
734 buildpackages
735 ;;
736 shell)
737 # enter a shell inside LFS chroot
738 # may be used to changed kernel settings
739 prepareenv
740 entershell
741 ;;
742 changelog)
743 echo -n "Loading new Changelog from SVN: "
744 svn log http://svn.ipfire.eu/svn/ipfire > doc/ChangeLog
745 echo "Finished!"
746 ;;
747 clean)
748 for i in `mount | grep $BASEDIR | sed 's/^.*loop=\(.*\))/\1/'`; do
749 $LOSETUP -d $i 2>/dev/null
750 done
751 for i in `mount | grep $BASEDIR | cut -d " " -f 1`; do
752 umount $i
753 done
754 stdumount
755 for i in `seq 0 7`; do
756 if ( losetup /dev/loop${i} 2>/dev/null | grep -q "/install/images" ); then
757 umount /dev/loop${i} 2>/dev/null;
758 losetup -d /dev/loop${i} 2>/dev/null;
759 fi;
760 done
761 rm -rf $BASEDIR/build
762 rm -rf $BASEDIR/cdrom
763 rm -rf $BASEDIR/packages
764 rm -rf $BASEDIR/log
765 if [ -h /tools ]; then
766 rm -f /tools
767 fi
768 ;;
769 newpak)
770 # create structure for a new package
771 echo -e "Name of the new package: $2"
772 if [ ! -f "lfs/$2" ]; then
773 echo "`date -u '+%b %e %T'`: Creating directory src/paks/$2"
774 mkdir -p src/paks/$2
775 cd src/paks/$2
776 echo "`date -u '+%b %e %T'`: Creating files"
777 cp $BASEDIR/lfs/postfix $BASEDIR/lfs/$2
778
779 touch ROOTFILES
780 touch {,un}install.sh
781 ## install.sh
782 echo '#!/bin/bash' > install.sh
783 echo '#' >> install.sh
784 echo '#################################################################' >> install.sh
785 echo '# #' >> install.sh
786 echo '# This file belongs to IPFire Firewall - GPLv2 - www.ipfire.org #' >> install.sh
787 echo '# #' >> install.sh
788 echo '#################################################################' >> install.sh
789 echo '#' >> install.sh
790 echo '# Extract the files' >> install.sh
791 echo 'tar xfz files.tgz -C /' >> install.sh
792 echo 'cp -f ROOTFILES /opt/pakfire/installed/ROOTFILES.$2' >> install.sh
793 ## uninstall.sh
794 echo '#!/bin/bash' > uninstall.sh
795 echo '#################################################################' >> uninstall.sh
796 echo '# #' >> uninstall.sh
797 echo '# This file belongs to IPFire Firewall - GPLv2 - www.ipfire.org #' >> uninstall.sh
798 echo '# #' >> uninstall.sh
799 echo '#################################################################' >> uninstall.sh
800 echo '#' >> uninstall.sh
801 echo '# Delete the files' >> uninstall.sh
802 echo '## Befehl fehlt noch' >> uninstall.sh
803 echo 'rm -f /opt/pakfire/installed/ROOTFILES.$2' >> uninstall.sh
804 echo "`date -u '+%b %e %T'`: Adding files to SVN"
805 cd - && svn add lfs/$2 && svn add src/paks/$2
806
807 echo -n "Do you want to remove the folders? [y/n]"
808 read REM
809 if [ "$REM" == "y" ]; then
810 echo "Removing the folders..."
811 svn del src/paks/$2 --force
812 else
813 echo "Folders are kept."
814 fi
815 else
816 echo "$2 already exists"
817 fi
818 exit 0
819 ;;
820 downloadsrc)
821 if [ ! -d $BASEDIR/cache ]; then
822 mkdir $BASEDIR/cache
823 fi
824 mkdir -p $BASEDIR/log
825 echo -e "${BOLD}Preload all source files${NORMAL}" | tee -a $LOGFILE
826 FINISHED=0
827 cd $BASEDIR/lfs
828 for c in `seq $MAX_RETRIES`; do
829 if (( FINISHED==1 )); then
830 break
831 fi
832 FINISHED=1
833 cd $BASEDIR/lfs
834 for i in *; do
835 if [ -f "$i" -a "$i" != "Config" ]; then
836 echo -ne "Loading $i"
837 make -s -f $i LFS_BASEDIR=$BASEDIR MESSAGE="$i\t ($c/$MAX_RETRIES)" download >> $LOGFILE 2>&1
838 if [ $? -ne 0 ]; then
839 beautify message FAIL
840 FINISHED=0
841 else
842 if [ $c -eq 1 ]; then
843 beautify message DONE
844 fi
845 fi
846 fi
847 done
848 done
849 echo -e "${BOLD}***Verifying md5sums${NORMAL}"
850 ERROR=0
851 for i in *; do
852 if [ -f "$i" -a "$i" != "Config" ]; then
853 make -s -f $i LFS_BASEDIR=$BASEDIR MESSAGE="$i\t " md5 >> $LOGFILE 2>&1
854 if [ $? -ne 0 ]; then
855 echo -ne "MD5 difference in lfs/$i"
856 beautify message FAIL
857 ERROR=1
858 fi
859 fi
860 done
861 if [ $ERROR -eq 0 ]; then
862 echo -ne "${BOLD}all files md5sum match${NORMAL}"
863 beautify message DONE
864 else
865 echo -ne "${BOLD}not all files were correctly download${NORMAL}"
866 beautify message FAIL
867 fi
868 cd - >/dev/null 2>&1
869 ;;
870 toolchain)
871 clear
872 prepareenv
873 beautify build_stage "Toolchain compilation - Native GCC: `gcc --version | grep GCC | awk {'print $3'}`"
874 buildtoolchain
875 BUILDMACHINE=`uname -m`
876 echo "`date -u '+%b %e %T'`: Create toolchain tar.gz for $BUILDMACHINE" | tee -a $LOGFILE
877 test -d $BASEDIR/cache/toolchains || mkdir $BASEDIR/cache/toolchains
878 cd $BASEDIR && tar -zc --exclude='log/_build.*.log' -f cache/toolchains/$SNAME-$VERSION-toolchain-$BUILDMACHINE.tar.gz \
879 build/{bin,etc,usr/bin,usr/local} \
880 build/tools/{bin,etc,*-linux-gnu,include,lib,libexec,sbin,share,var} \
881 log >> $LOGFILE
882 md5sum cache/toolchains/$SNAME-$VERSION-toolchain-$BUILDMACHINE.tar.gz \
883 > cache/toolchains/$SNAME-$VERSION-toolchain-$BUILDMACHINE.md5
884 stdumount
885 ;;
886 gettoolchain)
887 BUILDMACHINE=`uname -m`
888 # arbitrary name to be updated in case of new toolchain package upload
889 PACKAGE=$SNAME-$VERSION-toolchain-$BUILDMACHINE
890 if [ ! -f $BASEDIR/cache/toolchains/$PACKAGE.tar.gz ]; then
891 URL_IPFIRE=`grep URL_IPFIRE lfs/Config | awk '{ print $3 }'`
892 test -d $BASEDIR/cache/toolchains || mkdir $BASEDIR/cache/toolchains
893 echo "`date -u '+%b %e %T'`: Load toolchain tar.gz for $BUILDMACHINE" | tee -a $LOGFILE
894 cd $BASEDIR/cache/toolchains
895 wget $URL_IPFIRE/toolchains/$PACKAGE.tar.gz $URL_IPFIRE/toolchains/$PACKAGE.md5 >& /dev/null
896 if [ $? -ne 0 ]; then
897 echo "`date -u '+%b %e %T'`: error downloading toolchain for $BUILDMACHINE machine" | tee -a $LOGFILE
898 else
899 if [ "`md5sum $PACKAGE.tar.gz | awk '{print $1}'`" = "`cat $PACKAGE.md5 | awk '{print $1}'`" ]; then
900 echo "`date -u '+%b %e %T'`: toolchain md5 ok" | tee -a $LOGFILE
901 else
902 exiterror "$PACKAGE.md5 did not match, check downloaded package"
903 fi
904 fi
905 else
906 echo "Toolchain is already downloaded. Exiting..."
907 fi
908 ;;
909 othersrc)
910 prepareenv
911 echo -ne "`date -u '+%b %e %T'`: Build sources iso for $MACHINE" | tee -a $LOGFILE
912 chroot $LFS /tools/bin/env -i HOME=/root \
913 TERM=$TERM PS1='\u:\w\$ ' \
914 PATH=/usr/local/bin:/bin:/usr/bin:/sbin:/usr/sbin \
915 VERSION=$VERSION NAME="$NAME" SNAME="$SNAME" MACHINE=$MACHINE \
916 /bin/bash -x -c "cd /usr/src/lfs && make -f sources-iso LFS_BASEDIR=/usr/src install" >>$LOGFILE 2>&1
917 mv $LFS/install/images/ipfire-* $BASEDIR >> $LOGFILE 2>&1
918 if [ $? -eq "0" ]; then
919 beautify message DONE
920 else
921 beautify message FAIL
922 fi
923 stdumount
924 ;;
925 svn)
926 case "$2" in
927 update|up)
928 # clear
929 echo -ne "Loading the latest source files...\n"
930 if [ $3 ]; then
931 svn update -r $3 | tee -a $PWD/log/_build.svn.update.log
932 else
933 svn update | tee -a $PWD/log/_build.svn.update.log
934 fi
935 if [ $? -eq "0" ]; then
936 beautify message DONE
937 else
938 beautify message FAIL
939 exit 1
940 fi
941 echo -ne "Writing the svn-info to a file"
942 svn info > $PWD/svn_status
943 if [ $? -eq "0" ]; then
944 beautify message DONE
945 else
946 beautify message FAIL
947 exit 1
948 fi
949 chmod 755 $0
950 exit 0
951 ;;
952 commit|ci)
953 clear
954 if [ -f /usr/bin/mcedit ]; then
955 export EDITOR=/usr/bin/mcedit
956 else
957 if [ -f /usr/bin/nano ]; then
958 export EDITOR=/usr/bin/nano
959 fi
960 fi
961 echo -ne "Selecting editor $EDITOR..."
962 beautify message DONE
963 if [ -e /sbin/yast ]; then
964 if [ "`echo $SVN_REVISION | cut -c 3`" -eq "0" ]; then
965 $0 changelog
966 fi
967 fi
968 svn commit
969 $0 svn up
970 $0 uploadsrc
971 ;;
972 dist)
973 if [ $3 ]; then
974 SVN_REVISION=$3
975 fi
976 if [ -f ipfire-source-r$SVN_REVISION.tar.gz ]; then
977 echo -ne "REV $SVN_REVISION: SKIPPED!\n"
978 exit 0
979 fi
980 echo -en "REV $SVN_REVISION: Downloading..."
981 svn export http://svn.ipfire.eu/svn/ipfire/trunk ipfire-source/ --force > /dev/null
982 svn log http://svn.ipfire.eu/svn/ipfire/trunk -r 1:$SVN_REVISION > ipfire-source/Changelog
983 #svn info http://svn.ipfire.eu/svn/ipfire/trunk -r $SVN_REVISION > ipfire-source/svn_status
984 evaluate 1
985
986 echo -en "REV $SVN_REVISION: Compressing files..."
987 if [ -e ipfire-source/trunk/make.sh ]; then
988 chmod 755 ipfire-source/trunk/make.sh
989 fi
990 tar cfz ipfire-source-r$SVN_REVISION.tar.gz ipfire-source
991 evaluate 1
992 echo -en "REV $SVN_REVISION: Cleaning up..."
993 rm ipfire-source/ -r
994 evaluate 1
995 ;;
996 diff|di)
997 echo -ne "Make a local diff to last svn revision"
998 svn diff > ipfire-diff-`date +'%Y-%m-%d-%H:%M'`-r`svn info | grep Revision | cut -c 11-`.diff
999 evaluate 1
1000 echo "Diff was successfully saved to ipfire-diff-`date +'%Y-%m-%d-%H:%M'`-r`svn info | grep Revision | cut -c 11-`.diff"
1001 ;;
1002 esac
1003 ;;
1004 uploadsrc)
1005 PWD=`pwd`
1006 cd $BASEDIR/cache/
1007 echo -e "Uploading cache to ftp server:"
1008 ncftpls -u $IPFIRE_FTP_USER_INT -p $IPFIRE_FTP_PASS_INT ftp://$IPFIRE_FTP_URL_INT$IPFIRE_FTP_PATH_INT/ > /var/tmp/ftplist
1009 for i in *; do
1010 if [ "$i" == "toolchains" ]; then continue; fi
1011 grep -q $i /var/tmp/ftplist
1012 if [ "$?" -ne "0" ]; then
1013 echo -ne "$i"
1014 ncftpput -bb -u $IPFIRE_FTP_USER_INT -p $IPFIRE_FTP_PASS_INT $IPFIRE_FTP_URL_INT $IPFIRE_FTP_PATH_INT/ $i > /dev/null 2>&1
1015 if [ "$?" -eq "0" ]; then
1016 beautify message DONE
1017 else
1018 beautify message FAIL
1019 fi
1020 fi
1021 done
1022 rm -f /var/tmp/ftplist
1023 UL_TIME_START=`date +'%s'`
1024 ncftpbatch -d > /dev/null 2>&1
1025 while ps acx | grep -q ncftpbatch
1026 do
1027 UL_TIME=$(expr `date +'%s'` - $UL_TIME_START)
1028 echo -ne "\r ${UL_TIME}s : Upload is running..."
1029 sleep 1
1030 done
1031 beautify message DONE
1032 cd $PWD
1033 exit 0
1034 ;;
1035 upload)
1036 case "$2" in
1037 iso)
1038 echo -e "Uploading the iso to $IPFIRE_FTP_URL_EXT."
1039 cat <<EOF > .ftp-commands
1040 mkdir $IPFIRE_FTP_PATH_EXT
1041 ls -lah
1042 quit
1043 EOF
1044 ncftp -u $IPFIRE_FTP_USER_EXT -p $IPFIRE_FTP_PASS_EXT $IPFIRE_FTP_URL_EXT < .ftp-commands
1045 rm -f .ftp-commands
1046 md5sum ipfire-install-$VERSION.i386.iso > ipfire-install-$VERSION.i386.iso.md5
1047 ncftpput -u $IPFIRE_FTP_USER_EXT -p $IPFIRE_FTP_PASS_EXT $IPFIRE_FTP_URL_EXT $IPFIRE_FTP_PATH_EXT/ ipfire-install-$VERSION.i386.iso
1048 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
1049 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
1050 ncftpput -u $IPFIRE_FTP_USER_EXT -p $IPFIRE_FTP_PASS_EXT $IPFIRE_FTP_URL_EXT $IPFIRE_FTP_PATH_EXT/ svn_status
1051 if [ "$?" -eq "0" ]; then
1052 echo -e "The iso of Revision $SVN_REVISION was successfully uploaded to $IPFIRE_FTP_URL_EXT$IPFIRE_FTP_PATH_EXT/."
1053 else
1054 echo -e "There was an error while uploading the iso to the ftp server."
1055 exit 1
1056 fi
1057 if [ "$3" = "--with-sources-cd" ]; then
1058 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
1059 fi
1060 ;;
1061 paks)
1062 cat <<EOF > .ftp-commands
1063 mkdir $IPFIRE_FTP_PATH_PAK
1064 ls -lah
1065 quit
1066 EOF
1067 ncftp -u $IPFIRE_FTP_USER_PAK -p $IPFIRE_FTP_PASS_PAK $IPFIRE_FTP_URL_PAK < .ftp-commands
1068 rm -f .ftp-commands
1069 ncftpput -z -u $IPFIRE_FTP_USER_PAK -p $IPFIRE_FTP_PASS_PAK $IPFIRE_FTP_URL_PAK $IPFIRE_FTP_PATH_PAK/ packages/*
1070 if [ "$?" -eq "0" ]; then
1071 echo -e "The packages were successfully uploaded to $IPFIRE_FTP_URL_PAK$IPFIRE_FTP_PATH_PAK/."
1072 else
1073 echo -e "There was an error while uploading the packages to the ftp server."
1074 exit 1
1075 fi
1076 ;;
1077 esac
1078 ;;
1079 batch)
1080 if [ "$2" -eq "--background" ]; then
1081 batch_script
1082 exit $?
1083 fi
1084 if [ `screen -ls | grep -q ipfire` ]; then
1085 echo "Build is already running, sorry!"
1086 exit 1
1087 else
1088 if [ "$2" = "--rebuild" ]; then
1089 export IPFIRE_REBUILD=1
1090 echo "REBUILD!"
1091 else
1092 export IPFIRE_REBUILD=0
1093 fi
1094 echo -en "${BOLD}***IPFire-Batch-Build is starting...${NORMAL}"
1095 screen -dmS ipfire $0 batch --background
1096 evaluate 1
1097 exit 0
1098 fi
1099 ;;
1100 watch)
1101 watch_screen
1102 ;;
1103 "")
1104 clear
1105 svn info
1106 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"
1107 do
1108 case $name in
1109 "IPFIRE: Downloadsrc")
1110 $0 downloadsrc
1111 ;;
1112 "IPFIRE: Build (silent)")
1113 $0 build-silent
1114 ;;
1115 "IPFIRE: Watch Build")
1116 $0 watch
1117 ;;
1118 "IPFIRE: Batch")
1119 $0 batch
1120 ;;
1121 "IPFIRE: Clean")
1122 $0 clean
1123 ;;
1124 "SVN: Update")
1125 $0 svn update
1126 ;;
1127 "Help")
1128 echo "Usage: $0 {build|changelog|clean|gettoolchain|newpak|downloadsrc|shell|sync|toolchain}"
1129 cat doc/make.sh-usage
1130 ;;
1131 "LOG: Tail")
1132 tail -f log/_*
1133 ;;
1134 "Exit")
1135 break
1136 ;;
1137 esac
1138 done
1139 ;;
1140 *)
1141 echo "Usage: $0 {build|changelog|clean|gettoolchain|newpak|downloadsrc|shell|sync|toolchain}"
1142 cat doc/make.sh-usage
1143 ;;
1144 esac