]> git.ipfire.org Git - people/teissler/ipfire-2.x.git/blob - make.sh
Geaendert:
[people/teissler/ipfire-2.x.git] / make.sh
1 #!/bin/bash
2 #
3 ############################################################################
4 # #
5 # This file is part of the IPFire Firewall. #
6 # #
7 # IPFire is free software; you can redistribute it and/or modify #
8 # it under the terms of the GNU General Public License as published by #
9 # the Free Software Foundation; either version 2 of the License, or #
10 # (at your option) any later version. #
11 # #
12 # IPFire is distributed in the hope that it will be useful, #
13 # but WITHOUT ANY WARRANTY; without even the implied warranty of #
14 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the #
15 # GNU General Public License for more details. #
16 # #
17 # You should have received a copy of the GNU General Public License #
18 # along with IPFire; if not, write to the Free Software #
19 # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA #
20 # #
21 # Copyright (C) 2006 IPFire-Team <entwickler@ipfire.org>. #
22 # #
23 ############################################################################
24 #
25
26 NAME="IPFire" # Software name
27 SNAME="ipfire" # Short name
28 VERSION="2.0" # Version number
29 SLOGAN="www.ipfire.org" # Software slogan
30 CONFIG_ROOT=/var/ipfire # Configuration rootdir
31 NICE=10
32 MAX_RETRIES=3 # prefetch/check loop
33 KVER=`grep --max-count=1 VER lfs/linux | awk '{ print $3 }'`
34 MACHINE=`uname -m`
35 SVN_REVISION=`svn info | grep Revision | cut -c 11-`
36
37 # Setzen des IPFire Builds
38 if [ -e ./.svn ]; then
39 FIREBUILD=`cat .svn/entries |sed -n 's/^[ \t]*revision=\"// p' | sed -n 's/\".*$// p'`
40 fi
41
42 # Debian specific settings
43 if [ ! -e /etc/debian_version ]; then
44 FULLPATH=`which $0`
45 else
46 if [ -x /usr/bin/realpath ]; then
47 FULLPATH=`/usr/bin/realpath $0`
48 else
49 echo "ERROR: Need to do apt-get install realpath"
50 exit 1
51 fi
52 fi
53
54 PWD=`pwd`
55 BASENAME=`basename $0`
56 BASEDIR=`echo $FULLPATH | sed "s/\/$BASENAME//g"`
57 LOGFILE=$BASEDIR/log/_build.preparation.log
58 export BASEDIR LOGFILE
59 DIR_CHK=$BASEDIR/cache/check
60 mkdir $BASEDIR/log/ 2>/dev/null
61
62 if [ -f .config ]; then
63 . .config
64 fi
65
66 if [ 'x86_64' = $MACHINE -o 'i686' = $MACHINE -o 'i586' = $MACHINE -o 'i486' = $MACHINE -o 'i386' = $MACHINE ]; then
67 echo "`date -u '+%b %e %T'`: Machine is ix86 (or equivalent)" >> $LOGFILE
68 MACHINE=i386
69 BUILDTARGET=i386-pc-linux-gnu
70 CFLAGS="-O2 -mcpu=i386 -march=i386 -pipe -fomit-frame-pointer"
71 CXXFLAGS="-O2 -mcpu=i386 -march=i386 -pipe -fomit-frame-pointer"
72 elif [ 'alpha' = $MACHINE ]; then
73 echo "`date -u '+%b %e %T'`: Machine is Alpha AXP" >> $LOGFILE
74 BUILDTARGET=alpha-unknown-linux-gnu
75 CFLAGS="-O2 -mcpu=ev4 -mieee -pipe"
76 CXXFLAGS="-O2 -mcpu=ev4 -mieee -pipe"
77 else
78 echo "`date -u '+%b %e %T'`: Can't determine your architecture - $MACHINE" >> $LOGFILE
79 exit 1
80 fi
81
82 # Define immediately
83 stdumount() {
84 umount $BASEDIR/build/dev/pts 2>/dev/null;
85 umount $BASEDIR/build/proc 2>/dev/null;
86 umount $BASEDIR/build/install/mnt 2>/dev/null;
87 umount $BASEDIR/build/usr/src/cache 2>/dev/null;
88 umount $BASEDIR/build/usr/src/ccache 2>/dev/null;
89 umount $BASEDIR/build/usr/src/config 2>/dev/null;
90 umount $BASEDIR/build/usr/src/doc 2>/dev/null;
91 umount $BASEDIR/build/usr/src/html 2>/dev/null;
92 umount $BASEDIR/build/usr/src/langs 2>/dev/null;
93 umount $BASEDIR/build/usr/src/lfs 2>/dev/null;
94 umount $BASEDIR/build/usr/src/log 2>/dev/null;
95 umount $BASEDIR/build/usr/src/src 2>/dev/null;
96 }
97
98 exiterror() {
99 stdumount
100 for i in `seq 0 7`; do
101 if ( losetup /dev/loop${i} 2>/dev/null | grep -q "/install/images" ); then
102 losetup -d /dev/loop${i} 2>/dev/null
103 fi;
104 done
105 echo "ERROR: $*"
106 echo " Check $LOGFILE for errors if applicable"
107 exit 1
108 }
109
110 entershell() {
111 if [ ! -e $BASEDIR/build/usr/src/lfs/ ]; then
112 exiterror "No such file or directory: $BASEDIR/build/usr/src/lfs/"
113 fi
114 echo "Entering to a shell inside LFS chroot, go out with exit"
115 chroot $LFS /tools/bin/env -i HOME=/root TERM=$TERM PS1='\u:\w\$ ' \
116 PATH=/usr/local/bin:/bin:/usr/bin:/sbin:/usr/sbin:/tools/bin \
117 VERSION=$VERSION CONFIG_ROOT=$CONFIG_ROOT \
118 NAME="$NAME" SNAME="$SNAME" SLOGAN="$SLOGAN" \
119 CFLAGS="$CFLAGS" CXXFLAGS="$CXXFLAGS" \
120 CCACHE_DIR=/usr/src/ccache \
121 CCACHE_HASHDIR=1 \
122 KVER=$KVER \
123 BUILDTARGET="$BUILDTARGET" MACHINE="$MACHINE" \
124 KGCC="ccache /usr/bin/gcc" \
125 /tools/bin/bash
126 if [ $? -ne 0 ]; then
127 exiterror "chroot error"
128 else
129 stdumount
130 fi
131 }
132
133 prepareenv() {
134 ############################################################################
135 # #
136 # Are we running the right shell? #
137 # #
138 ############################################################################
139 if [ ! "$BASH" ]; then
140 exiterror "BASH environment variable is not set. You're probably running the wrong shell."
141 fi
142
143 if [ -z "${BASH_VERSION}" ]; then
144 exiterror "Not running BASH shell."
145 fi
146
147
148 ############################################################################
149 # #
150 # Trap on emergency exit #
151 # #
152 ############################################################################
153 trap "exiterror 'Build process interrupted'" SIGINT SIGTERM SIGKILL SIGSTOP SIGQUIT
154
155
156 ############################################################################
157 # #
158 # Resetting our nice level #
159 # #
160 ############################################################################
161 echo "`date -u '+%b %e %T'`: Resetting our nice level to $NICE" | tee -a $LOGFILE
162 renice $NICE $$ > /dev/null
163 if [ `nice` != "$NICE" ]; then
164 exiterror "Failed to set correct nice level"
165 fi
166
167 ############################################################################
168 # #
169 # Checking if running as root user #
170 # #
171 ############################################################################
172 echo "`date -u '+%b %e %T'`: Checking if we're running as root user" | tee -a $LOGFILE
173 if [ `id -u` != 0 ]; then
174 exiterror "Not building as root"
175 fi
176
177
178 ############################################################################
179 # #
180 # Checking for necessary temporary space #
181 # #
182 ############################################################################
183 echo "`date -u '+%b %e %T'`: Checking for necessary space on disk $BASE_DEV" | tee -a $LOGFILE
184 BASE_DEV=`df -P -k $BASEDIR | tail -n 1 | awk '{ print $1 }'`
185 BASE_ASPACE=`df -P -k $BASEDIR | tail -n 1 | awk '{ print $4 }'`
186 if (( 2202000 > $BASE_ASPACE )); then
187 BASE_USPACE=`du -skx $BASEDIR | awk '{print $1}'`
188 if (( 2202000 - $BASE_USPACE > $BASE_ASPACE )); then
189 exiterror "Not enough temporary space available, need at least 2.1GB on $BASE_DEV"
190 fi
191 fi
192
193 ############################################################################
194 # #
195 # Building Linux From Scratch system #
196 # #
197 ############################################################################
198 echo "`date -u '+%b %e %T'`: Building Linux From Scratch system" | tee -a $LOGFILE
199
200 # Set umask
201 umask 022
202
203 # Set LFS Directory
204 LFS=$BASEDIR/build
205
206 # Check /tools symlink
207 if [ -h /tools ]; then
208 rm -f /tools
209 fi
210 if [ ! -a /tools ]; then
211 ln -s $BASEDIR/build/tools /
212 fi
213 if [ ! -h /tools ]; then
214 exiterror "Could not create /tools symbolic link."
215 fi
216
217 # Setup environment
218 set +h
219 LC_ALL=POSIX
220 export LFS LC_ALL CFLAGS CXXFLAGS
221 unset CC CXX CPP LD_LIBRARY_PATH LD_PRELOAD
222
223 # Make some extra directories
224 mkdir -p $BASEDIR/build/{tools,etc,usr/src} 2>/dev/null
225 mkdir -p $BASEDIR/{cache,ccache} 2>/dev/null
226 mkdir -p $BASEDIR/build/dev/pts $BASEDIR/build/proc $BASEDIR/build/usr/src/{cache,config,doc,html,langs,lfs,log,src,ccache}
227
228 # Make all sources and proc available under lfs build
229 mount --bind /dev/pts $BASEDIR/build/dev/pts
230 mount --bind /proc $BASEDIR/build/proc
231 mount --bind $BASEDIR/cache $BASEDIR/build/usr/src/cache
232 mount --bind $BASEDIR/ccache $BASEDIR/build/usr/src/ccache
233 mount --bind $BASEDIR/config $BASEDIR/build/usr/src/config
234 mount --bind $BASEDIR/doc $BASEDIR/build/usr/src/doc
235 mount --bind $BASEDIR/html $BASEDIR/build/usr/src/html
236 mount --bind $BASEDIR/langs $BASEDIR/build/usr/src/langs
237 mount --bind $BASEDIR/lfs $BASEDIR/build/usr/src/lfs
238 mount --bind $BASEDIR/log $BASEDIR/build/usr/src/log
239 mount --bind $BASEDIR/src $BASEDIR/build/usr/src/src
240
241 # Run LFS static binary creation scripts one by one
242 export CCACHE_DIR=$BASEDIR/ccache
243 export CCACHE_HASHDIR=1
244
245 # Remove pre-install list of installed files in case user erase some files before rebuild
246 rm -f $BASEDIR/build/usr/src/lsalr 2>/dev/null
247 }
248
249
250 ############################################################################
251 # #
252 # Necessary shell functions #
253 # #
254 ############################################################################
255 lfsmake1() {
256 if [ -f $BASEDIR/lfs/$1 ]; then
257 echo "`date -u '+%b %e %T'`: Building $*" | tee -a $LOGFILE
258 cd $BASEDIR/lfs && make -s -f $* LFS_BASEDIR=$BASEDIR MESSAGE="$1\t " download >> $LOGFILE 2>&1
259 if [ $? -ne 0 ]; then
260 exiterror "Download error in $1"
261 fi
262 cd $BASEDIR/lfs && make -s -f $* LFS_BASEDIR=$BASEDIR MESSAGE="$1\t md5sum" md5 >> $LOGFILE 2>&1
263 if [ $? -ne 0 ]; then
264 exiterror "md5sum error in $1, check file in cache or signature"
265 fi
266 cd $BASEDIR/lfs && make -f $* BUILDTARGET=$BUILDTARGET \
267 MACHINE=$MACHINE \
268 LFS_BASEDIR=$BASEDIR \
269 ROOT=$LFS \
270 KVER=$KVER \
271 install >> $LOGFILE 2>&1
272 if [ $? -ne 0 ]; then
273 exiterror "Building $*";
274 fi
275 else
276 exiterror "No such file or directory: $BASEDIR/$1"
277 fi
278 return 0
279 }
280
281 lfsmake2() {
282 if [ -f $BASEDIR/build/usr/src/lfs/$1 ]; then
283 echo "`date -u '+%b %e %T'`: Building $*" | tee -a $LOGFILE
284 cd $BASEDIR/lfs && make -s -f $* LFS_BASEDIR=$BASEDIR MESSAGE="$1\t " download >> $LOGFILE 2>&1
285 if [ $? -ne 0 ]; then
286 exiterror "Download error in $1"
287 fi
288 cd $BASEDIR/lfs && make -s -f $* LFS_BASEDIR=$BASEDIR MESSAGE="$1\t md5sum" md5 >> $LOGFILE 2>&1
289 if [ $? -ne 0 ]; then
290 exiterror "md5sum error in $1, check file in cache or signature"
291 fi
292 chroot $LFS /tools/bin/env -i HOME=/root \
293 TERM=$TERM PS1='\u:\w\$ ' \
294 PATH=/usr/local/bin:/bin:/usr/bin:/sbin:/usr/sbin:/tools/bin \
295 VERSION=$VERSION \
296 CONFIG_ROOT=$CONFIG_ROOT \
297 NAME="$NAME" SNAME="$SNAME" SLOGAN="$SLOGAN" \
298 CFLAGS="$CFLAGS" CXXFLAGS="$CXXFLAGS" \
299 CCACHE_DIR=/usr/src/ccache CCACHE_HASHDIR=1 \
300 KVER=$KVER \
301 BUILDTARGET="$BUILDTARGET" MACHINE="$MACHINE" \
302 /tools/bin/bash -x -c "cd /usr/src/lfs && \
303 make -f $* LFS_BASEDIR=/usr/src install" >>$LOGFILE 2>&1
304 if [ $? -ne 0 ]; then
305 exiterror "Building $*"
306 fi
307 else
308 exiterror "No such file or directory: $BASEDIR/build/usr/src/lfs/$1"
309 fi
310 return 0
311 }
312
313 ipcopmake() {
314 if [ -f $BASEDIR/build/usr/src/lfs/$1 ]; then
315 echo "`date -u '+%b %e %T'`: Building $*" | tee -a $LOGFILE
316 cd $BASEDIR/lfs && make -s -f $* LFS_BASEDIR=$BASEDIR MESSAGE="$1\t " download >> $LOGFILE 2>&1
317 if [ $? -ne 0 ]; then
318 exiterror "Download error in $1"
319 fi
320 cd $BASEDIR/lfs && make -s -f $* LFS_BASEDIR=$BASEDIR MESSAGE="$1\t md5sum" md5 >> $LOGFILE 2>&1
321 if [ $? -ne 0 ]; then
322 exiterror "md5sum error in $1, check file in cache or signature"
323 fi
324 chroot $LFS /tools/bin/env -i HOME=/root \
325 TERM=$TERM PS1='\u:\w\$ ' \
326 PATH=/usr/local/bin:/bin:/usr/bin:/sbin:/usr/sbin \
327 VERSION=$VERSION \
328 CONFIG_ROOT=$CONFIG_ROOT \
329 NAME="$NAME" SNAME="$SNAME" SLOGAN="$SLOGAN" \
330 CFLAGS="$CFLAGS" CXXFLAGS="$CXXFLAGS" \
331 CCACHE_DIR=/usr/src/ccache CCACHE_HASHDIR=1 \
332 KVER=$KVER \
333 BUILDTARGET="$BUILDTARGET" MACHINE="$MACHINE" \
334 /bin/bash -x -c "cd /usr/src/lfs && \
335 make -f $* LFS_BASEDIR=/usr/src install" >>$LOGFILE 2>&1
336 if [ $? -ne 0 ]; then
337 exiterror "Building $*"
338 fi
339 else
340 exiterror "No such file or directory: $BASEDIR/build/usr/src/lfs/$1"
341 fi
342 return 0
343 }
344
345 ipfiredist() {
346 if [ -f $BASEDIR/build/usr/src/lfs/$1 ]; then
347 # if [ ! `ls -w1 $BASEDIR/packages/*.ipfire | grep $1` ]; then
348 echo "`date -u '+%b %e %T'`: Packaging $1" | tee -a $LOGFILE
349 chroot $LFS /tools/bin/env -i HOME=/root \
350 TERM=$TERM PS1='\u:\w\$ ' \
351 PATH=/usr/local/bin:/bin:/usr/bin:/sbin:/usr/sbin \
352 VERSION=$VERSION \
353 CONFIG_ROOT=$CONFIG_ROOT \
354 NAME="$NAME" SNAME="$SNAME" SLOGAN="$SLOGAN" \
355 CFLAGS="$CFLAGS" CXXFLAGS="$CXXFLAGS" \
356 CCACHE_DIR=/usr/src/ccache CCACHE_HASHDIR=1 \
357 KVER=$KVER \
358 BUILDTARGET="$BUILDTARGET" MACHINE="$MACHINE" \
359 /bin/bash -x -c "cd /usr/src/lfs && \
360 make -f $1 LFS_BASEDIR=/usr/src dist" >>$LOGFILE 2>&1
361 if [ $? -ne 0 ]; then
362 exiterror "Packaging $1"
363 fi
364 # else
365 # echo "`date -u '+%b %e %T'`: Packaging: The package $1 already exists"
366 # fi
367 else
368 exiterror "No such file or directory: $BASEDIR/build/usr/src/lfs/$1"
369 fi
370 return 0
371 }
372
373
374 installmake() {
375 if [ -f $BASEDIR/build/usr/src/lfs/$1 ]; then
376 echo "`date -u '+%b %e %T'`: Building $*" | tee -a $LOGFILE
377 cd $BASEDIR/lfs && make -s -f $* LFS_BASEDIR=$BASEDIR MESSAGE="$1\t " download >> $LOGFILE 2>&1
378 if [ $? -ne 0 ]; then
379 exiterror "Download error in $1"
380 fi
381 cd $BASEDIR/lfs && make -s -f $* LFS_BASEDIR=$BASEDIR MESSAGE="$1\t md5sum" md5 >> $LOGFILE 2>&1
382 if [ $? -ne 0 ]; then
383 exiterror "md5sum error in $1, check file in cache or signature"
384 fi
385 chroot $LFS /tools/bin/env -i HOME=/root \
386 TERM=$TERM PS1='\u:\w\$ ' \
387 PATH=/usr/local/bin:/opt/$MACHINE-uClibc/usr/bin:/bin:/usr/bin:/sbin:/usr/sbin \
388 VERSION=$VERSION \
389 CONFIG_ROOT=$CONFIG_ROOT \
390 LFS_PASS="install" \
391 NAME="$NAME" SNAME="$SNAME" SLOGAN="$SLOGAN" \
392 CFLAGS="-Os" CXXFLAGS="-Os" \
393 CCACHE_DIR=/usr/src/ccache CCACHE_HASHDIR=1 \
394 KVER=$KVER \
395 BUILDTARGET="$BUILDTARGET" MACHINE="$MACHINE" \
396 /bin/bash -x -c "cd /usr/src/lfs && \
397 make -f $* LFS_BASEDIR=/usr/src install" >>$LOGFILE 2>&1
398 if [ $? -ne 0 ]; then
399 exiterror "Building $*"
400 fi
401 else
402 exiterror "No such file or directory: $BASEDIR/build/usr/src/lfs/$1"
403 fi
404 return 0
405 }
406
407 buildtoolchain() {
408 LOGFILE="$BASEDIR/log/_build.toolchain.log"
409 export LOGFILE
410 echo -ne "`date -u '+%b %e %T'`: Stage1 toolchain build \n" | tee -a $LOGFILE
411 # Build sed now, as we use some extensions
412 ORG_PATH=$PATH
413 NATIVEGCC=`gcc --version | grep GCC | awk {'print $3'}`
414 export NATIVEGCC GCCmajor=${NATIVEGCC:0:1} GCCminor=${NATIVEGCC:2:1} GCCrelease=${NATIVEGCC:4:1}
415 lfsmake1 ccache
416 lfsmake1 sed LFS_PASS=1
417 lfsmake1 m4 LFS_PASS=1
418 lfsmake1 bison LFS_PASS=1
419 lfsmake1 flex LFS_PASS=1
420 lfsmake1 binutils LFS_PASS=1
421 lfsmake1 gcc LFS_PASS=1
422 export PATH=$BASEDIR/build/usr/local/bin:$BASEDIR/build/tools/bin:$PATH
423
424 lfsmake1 linux
425 lfsmake1 tcl
426 lfsmake1 expect
427 lfsmake1 glibc
428 lfsmake1 dejagnu
429 lfsmake1 gcc LFS_PASS=2
430 lfsmake1 binutils LFS_PASS=2
431 lfsmake1 gawk
432 lfsmake1 coreutils
433 lfsmake1 bzip2
434 lfsmake1 gzip
435 lfsmake1 diffutils
436 lfsmake1 findutils
437 lfsmake1 make
438 lfsmake1 grep
439 lfsmake1 sed LFS_PASS=2
440 lfsmake1 m4 LFS_PASS=2
441 lfsmake1 bison LFS_PASS=2
442 lfsmake1 flex LFS_PASS=2
443 lfsmake1 gettext
444 lfsmake1 ncurses
445 lfsmake1 patch
446 lfsmake1 tar
447 lfsmake1 texinfo
448 lfsmake1 bash
449 lfsmake1 util-linux
450 lfsmake1 perl
451 export PATH=$ORG_PATH
452 }
453
454 buildbase() {
455 LOGFILE="$BASEDIR/log/_build.base.log"
456 export LOGFILE
457 echo -ne "`date -u '+%b %e %T'`: Stage2 linux base build \n" | tee -a $LOGFILE
458 # Run LFS dynamic binary creation scripts one by one
459 lfsmake2 stage2
460 lfsmake2 makedev
461 lfsmake2 linux
462 lfsmake2 man-pages
463 lfsmake2 glibc
464 lfsmake2 binutils
465 lfsmake2 gcc
466 lfsmake2 coreutils
467 lfsmake2 zlib
468 lfsmake2 mktemp
469 lfsmake2 iana-etc
470 lfsmake2 findutils
471 lfsmake2 gawk
472 lfsmake2 ncurses
473 lfsmake2 vim
474 lfsmake2 m4
475 lfsmake2 bison
476 lfsmake2 less
477 lfsmake2 groff
478 lfsmake2 sed
479 lfsmake2 flex
480 lfsmake2 gettext
481 lfsmake2 net-tools
482 lfsmake2 inetutils
483 lfsmake2 perl
484 lfsmake2 texinfo
485 lfsmake2 autoconf
486 lfsmake2 automake
487 lfsmake2 bash
488 lfsmake2 file
489 lfsmake2 libtool
490 lfsmake2 bzip2
491 lfsmake2 diffutils
492 lfsmake2 ed
493 lfsmake2 kbd
494 lfsmake2 e2fsprogs
495 lfsmake2 grep
496 if [ 'i386' = $MACHINE ]; then
497 lfsmake2 grub
498 elif [ 'alpha' = $MACHINE ]; then
499 lfsmake2 aboot
500 fi
501 lfsmake2 gzip
502 lfsmake2 man
503 lfsmake2 make
504 lfsmake2 modutils
505 lfsmake2 patch
506 lfsmake2 procinfo
507 lfsmake2 procps
508 lfsmake2 psmisc
509 lfsmake2 shadow
510 lfsmake2 sysklogd
511 lfsmake2 sysvinit
512 lfsmake2 tar
513 lfsmake2 util-linux
514 }
515
516 buildipcop() {
517 # Run IPFire make scripts one by one
518 LOGFILE="$BASEDIR/log/_build.ipfire.log"
519 export LOGFILE
520 echo -ne "`date -u '+%b %e %T'`: Stage3 $NAME build \n" | tee -a $LOGFILE
521
522 # Build these first as some of the kernel packages below rely on
523 # these for some of their client program functionality
524 ipcopmake configroot
525 ipcopmake dhcp
526 ipcopmake dhcpcd
527 ipcopmake libusb
528 ipcopmake libpcap
529 ipcopmake linux-atm
530 ipcopmake ppp
531 ipcopmake rp-pppoe
532 ipcopmake unzip
533 # Do SMP now
534 if [ 'i386' = $MACHINE ]; then
535 # abuse the SMP flag, and make an minimal installer kernel first
536 # so that the boot floppy always works.....
537 ipcopmake linux LFS_PASS=ipfire SMP=installer
538 ipcopmake linux LFS_PASS=ipfire SMP=1
539 ipcopmake 3cp4218 SMP=1
540 ipcopmake amedyn SMP=1
541 ipcopmake cxacru SMP=1
542 ipcopmake eagle SMP=1
543
544 # These are here because they have i386 only binary libraries
545 # included in the package.
546 ipcopmake cnx_pci SMP=1
547 ipcopmake fcdsl SMP=1
548 ipcopmake fcdsl2 SMP=1
549 ipcopmake fcdslsl SMP=1
550 ipcopmake fcdslusb SMP=1
551 ipcopmake fcdslslusb SMP=1
552 ipcopmake fcpci SMP=1
553 ipcopmake fcclassic SMP=1
554 ipcopmake pulsar SMP=1
555 ipcopmake unicorn SMP=1
556 ipcopmake promise-sata-300-tx SMP=1
557 fi
558
559 ipcopmake linux LFS_PASS=ipfire
560 ipcopmake 3cp4218
561 ipcopmake amedyn
562 ipcopmake cxacru
563 ipcopmake eciadsl
564 ipcopmake eagle
565 ipcopmake speedtouch
566 if [ 'i386' = $MACHINE ]; then
567 # These are here because they have i386 only binary libraries
568 # included in the package.
569 ipcopmake cnx_pci
570 ipcopmake fcdsl
571 ipcopmake fcdsl2
572 ipcopmake fcdslsl
573 ipcopmake fcdslusb
574 ipcopmake fcdslslusb
575 ipcopmake fcpci
576 ipcopmake fcclassic
577 ipcopmake pulsar
578 ipcopmake unicorn
579 ipcopmake promise-sata-300-tx
580 fi
581
582 ipcopmake pcmcia-cs
583 ipcopmake expat
584 ipcopmake gdbm
585 ipcopmake gmp
586 ipcopmake openssl
587 ipcopmake python
588 ipcopmake libnet
589 ipcopmake libpng
590 ipcopmake libtiff
591 ipcopmake libjpeg
592 ipcopmake lcms
593 ipcopmake libmng
594 ipcopmake freetype
595 ipcopmake gd
596 ipcopmake popt
597 ipcopmake slang
598 ipcopmake newt
599 ipcopmake libcap
600 ipcopmake pciutils
601 ipcopmake pcre
602 ipcopmake apache
603 ipcopmake arping
604 ipcopmake beep
605 ipcopmake bind
606 ipcopmake capi4k-utils
607 ipcopmake cdrtools
608 ipcopmake dnsmasq
609 ipcopmake dosfstools
610 ipcopmake ethtool
611 ipcopmake ez-ipupdate
612 ipcopmake fcron
613 ipcopmake perl-GD
614 ipcopmake gnupg
615 ipcopmake hdparm
616 ipcopmake ibod
617 ipcopmake initscripts
618 ipcopmake iptables
619 ipcopmake ipac-ng
620 ipcopmake ipaddr
621 ipcopmake iproute2
622 ipcopmake iptstate
623 ipcopmake iputils
624 ipcopmake l7-protocols
625 ipcopmake isapnptools
626 ipcopmake isdn4k-utils
627 ipcopmake kudzu
628 ipcopmake logrotate
629 ipcopmake logwatch
630 ipcopmake mingetty
631 ipcopmake misc-progs
632 ipcopmake mtools
633 ipcopmake nano
634 ipcopmake nash
635 ipcopmake nasm
636 ipcopmake URI
637 ipcopmake HTML-Tagset
638 ipcopmake HTML-Parser
639 ipcopmake Compress-Zlib
640 ipcopmake Digest
641 ipcopmake Digest-SHA1
642 ipcopmake Digest-HMAC
643 ipcopmake libwww-perl
644 ipcopmake Net-DNS
645 ipcopmake Net-IPv4Addr
646 ipcopmake Net_SSLeay
647 ipcopmake IO-Stringy
648 ipcopmake Unix-Syslog
649 ipcopmake Mail-Tools
650 ipcopmake MIME-Tools
651 ipcopmake Net-Server
652 ipcopmake Convert-TNEF
653 ipcopmake Convert-UUlib
654 ipcopmake Archive-Tar
655 ipcopmake Archive-Zip
656 ipcopmake Text-Tabs+Wrap
657 ipcopmake Locale-Country
658 ipcopmake GeoIP
659 ipcopmake fwhits
660 ipcopmake berkeley
661 ipcopmake BerkeleyDB ## The Perl module
662 ipcopmake noip_updater
663 ipcopmake ntp
664 ipcopmake oinkmaster
665 ipcopmake openssh
666 ipcopmake openswan
667 ipcopmake pptpclient
668 ipcopmake rrdtool
669 ipcopmake setserial
670 ipcopmake setup
671 ipcopmake snort
672 #ipcopmake speedycgi
673 ipcopmake saslauthd PASS=1
674 ipcopmake openldap
675 ipcopmake squid
676 ipcopmake squid-graph
677 ipcopmake squidguard
678 ipcopmake tcpdump
679 ipcopmake traceroute
680 ipcopmake vlan
681 #ipcopmake wireless
682 ipcopmake libsafe
683 ipcopmake 3c5x9setup
684 # echo -ne "`date -u '+%b %e %T'`: Building ### IPFire modules ### \n" | tee -a $LOGFILE
685 ipcopmake pakfire
686 ipcopmake startscripts
687 ## Zuerst die Libs und dann die Programme. Ordnung muss sein!
688 ipcopmake java
689 ipcopmake bootsplash
690 ipcopmake libxml2
691 ipcopmake spandsp
692 ipcopmake lzo
693 ipcopmake openvpn
694 ipcopmake pkg-config
695 ipcopmake glib
696 ipcopmake xampp
697 ipcopmake pam
698 ipcopmake pammysql
699 ipcopmake saslauthd PASS=2
700 ipcopmake xinetd
701 ipcopmake ghostscript
702 ipcopmake cups
703 # ipcopmake lpd ## Im Moment aus, da CUPS vorhanden ist.
704 ipcopmake samba
705 ipcopmake sudo
706 ipcopmake mc
707 # ipcopmake pwlib
708 # ipcopmake openh323
709 ipcopmake wget
710 ipcopmake wput
711 ipcopmake bridge-utils
712 ipcopmake screen
713 ipcopmake hddtemp
714 ipcopmake smartmontools
715 ipcopmake htop
716 ipcopmake lynx
717 echo -ne "`date -u '+%b %e %T'`: Building ### Mailserver ### \n" | tee -a $LOGFILE
718 ipcopmake postfix
719 ipcopmake procmail
720 ipcopmake fetchmail
721 ipcopmake cyrusimap
722 ipcopmake web-cyradm
723 ipcopmake mailx
724 ipcopmake clamav
725 ipcopmake razor
726 ipcopmake spamassassin
727 # ipcopmake amavisd
728 echo -ne "`date -u '+%b %e %T'`: Building ### VoIP-Server ### \n" | tee -a $LOGFILE
729 ipcopmake stund
730 ipcopmake zaptel
731 ipcopmake libpri
732 ipcopmake bristuff
733 ipcopmake asterisk
734 ipcopmake mpg123
735 echo -ne "`date -u '+%b %e %T'`: Building ### Multimedia-Server ### \n" | tee -a $LOGFILE
736 ipcopmake libmad
737 ipcopmake libogg
738 ipcopmake libvorbis
739 ipcopmake lame
740 ipcopmake xvid
741 ipcopmake mpeg2dec
742 ipcopmake ffmpeg
743 ipcopmake sox
744 ipcopmake gnump3d
745 ipcopmake videolan
746 echo -ne "`date -u '+%b %e %T'`: Building ### P2P-Clients ### \n" | tee -a $LOGFILE
747 ipcopmake applejuice
748 ipcopmake ocaml
749 ipcopmake mldonkey
750 # ipcopmake edonkeyclc
751 # ipcopmake sane
752 echo -ne "`date -u '+%b %e %T'`: Building ### Net-Tools ### \n" | tee -a $LOGFILE
753 ipcopmake ntop
754 # ipcopmake rsync
755 ipcopmake tcpwrapper
756 ipcopmake portmap
757 ipcopmake nfs
758 ipcopmake nmap
759 ipcopmake mbmon
760 ipcopmake iftop
761 ipcopmake ncftp
762 ipcopmake cftp
763 ipcopmake etherwake
764 ipcopmake ethereal
765 ipcopmake tftp-hpa
766 ipcopmake subversion
767 ipcopmake iptraf
768 ipcopmake nagios
769 # ipcopmake stunnel # Ausgeschaltet, weil wir es doch nicht nutzen
770 }
771
772 buildinstaller() {
773 # Run installer scripts one by one
774 LOGFILE="$BASEDIR/log/_build.installer.log"
775 export LOGFILE
776 echo -ne "`date -u '+%b %e %T'`: Stage4 installer build \n" | tee -a $LOGFILE
777 if [ 'i386' = $MACHINE ]; then
778 ipcopmake syslinux
779 ipcopmake as86
780 ipcopmake mbr
781 ipcopmake uClibc
782 fi
783 installmake busybox
784 installmake sysvinit
785 installmake e2fsprogs
786 installmake misc-progs
787 installmake slang
788 installmake util-linux
789 installmake newt
790 installmake pciutils
791 installmake pcmcia-cs
792 installmake kbd
793 installmake installer
794 installmake scsi.img
795 installmake driver.img
796 installmake initrd
797 installmake boot.img
798 }
799
800 buildpackages() {
801 LOGFILE="$BASEDIR/log/_build.packages.log"
802 export LOGFILE
803 echo "... see detailed log in _build.*.log files" >> $LOGFILE
804 echo -ne "`date -u '+%b %e %T'`: Stage5 packages build \n" | tee -a $LOGFILE
805 # Strip files
806 echo "`date -u '+%b %e %T'`: Stripping files" | tee -a $LOGFILE
807 find $LFS/lib $LFS/usr/lib $LFS/usr/share/rrdtool-* $LFS/install ! -type l \( -name '*.so' -o -name '*.so[\.0-9]*' \) \
808 ! -name 'libc.so' ! -name 'libpthread.so' ! -name 'libcrypto.so.0.9.7.sha1' \
809 -exec $LFS/tools/bin/strip --strip-all {} \; >> $LOGFILE 2>&1
810 # add -ls before -exec if you want to verify what files are stripped
811
812 find $LFS/{,s}bin $LFS/usr/{,s}bin $LFS/usr/local/{,s}bin ! -type l \
813 -exec file {} \; | grep " ELF " | cut -f1 -d ':' | xargs $LFS/tools/bin/strip --strip-all >> $LOGFILE 2>&1
814 # there add -v to strip to verify
815
816 if [ 'i386' = $MACHINE ]; then
817 # Create fcdsl packages
818 echo "`date -u '+%b %e %T'`: Building fcdsl tgz" | tee -a $LOGFILE
819 cp $LFS/install/images/fcdsl/license.txt $LFS >> $LOGFILE 2>&1
820 touch $LFS/var/run/{need-depmod-$KVER,need-depmod-$KVER-smp}
821 cd $LFS && tar cvfz $LFS/install/images/$SNAME-fcdsl-$VERSION.$MACHINE.tgz \
822 lib/modules/$KVER/misc/fcdsl*.o.gz \
823 lib/modules/$KVER-smp/misc/fcdsl*.o.gz \
824 usr/lib/isdn/{fds?base.bin,fd?ubase.frm} \
825 etc/fcdsl/fcdsl*.conf \
826 etc/drdsl/{drdsl,drdsl.ini} \
827 license.txt \
828 var/run/{need-depmod-$KVER,need-depmod-$KVER-smp} >> $LOGFILE 2>&1
829 rm -f $LFS/license.txt >> $LOGFILE 2>&1
830 cd $BASEDIR
831 fi
832
833 # Generating list of packages used
834 echo "`date -u '+%b %e %T'`: Generating packages list from logs" | tee -a $LOGFILE
835 rm -f $BASEDIR/doc/packages-list
836 for i in `ls -1tr $BASEDIR/log/[^_]*`; do
837 if [ "$i" != "$BASEDIR/log/FILES" -a -n $i ]; then
838 echo " * `basename $i`" >>$BASEDIR/doc/packages-list
839 fi
840 done
841 echo "====== List of softwares used to build $NAME Version: $VERSION ======" > $BASEDIR/doc/packages-list.txt
842 grep -v 'configroot$\|img$\|initrd$\|initscripts$\|installer$\|install$\|ipfire$\|setup$\|pakfire$\|stage2$\|smp$\|tools$\|tools1$\|tools2$\|^ipfire-logs' \
843 $BASEDIR/doc/packages-list | sort >> $BASEDIR/doc/packages-list.txt
844 rm -f $BASEDIR/doc/packages-list
845 # packages-list.txt is ready to be displayed for wiki page
846
847 # Create ISO for CDRom and USB-superfloppy
848 ipcopmake cdrom
849 rm -f $LFS/install/images/*usb*
850 cp $LFS/install/images/{*.iso,*.tgz} $BASEDIR >> $LOGFILE 2>&1
851
852 ipfirepackages
853
854 # Cleanup
855 stdumount
856 rm -rf $BASEDIR/build/tmp/*
857
858 # Generating total list of files
859 echo "`date -u '+%b %e %T'`: Generating files list from logs" | tee -a $LOGFILE
860 rm -f $BASEDIR/log/FILES
861 for i in `ls -1tr $BASEDIR/log/[^_]*`; do
862 if [ "$i" != "$BASEDIR/log/FILES" -a -n $i ]; then
863 echo "##" >>$BASEDIR/log/FILES
864 echo "## `basename $i`" >>$BASEDIR/log/FILES
865 echo "##" >>$BASEDIR/log/FILES
866 cat $i | sed "s%^\./%#%" | sort >> $BASEDIR/log/FILES
867 fi
868 done
869 cd $BASEDIR/packages; ls -w1 *.ipfire | awk -F ".ipfire" '{ print $1 }' > $BASEDIR/packages/packages_list.txt
870 echo -n "###EOF###" >> $BASEDIR/packages/packages_list.txt
871
872 cd $PWD
873
874 }
875
876 ipfirepackages() {
877 if [ -d "$BASEDIR/packages" ]; then
878 for i in `ls $BASEDIR/packages`; do
879 touch $BASEDIR/build/install/packages/$i.empty
880 done
881 fi
882 ipfiredist amavisd
883 ipfiredist applejuice
884 ipfiredist asterisk
885 ipfiredist clamav
886 ipfiredist cups
887 ipfiredist cyrusimap
888 ipfiredist fetchmail
889 ipfiredist ffmpeg
890 ipfiredist gnump3d
891 ipfiredist iptraf
892 ipfiredist java
893 ipfiredist lame
894 ipfiredist libmad
895 ipfiredist libogg
896 ipfiredist libtiff
897 ipfiredist libvorbis
898 ipfiredist libxml2
899 ipfiredist mailx
900 ipfiredist mldonkey
901 ipfiredist mpeg2dec
902 ipfiredist nagios
903 ipfiredist nfs
904 ipfiredist nmap
905 ipfiredist ntop
906 ipfiredist portmap
907 ipfiredist postfix
908 ipfiredist procmail
909 ipfiredist samba
910 ipfiredist sox
911 ipfiredist spamassassin
912 ipfiredist subversion
913 ipfiredist videolan
914 ipfiredist web-cyradm
915 ipfiredist xampp
916 # ipfiredist xinetd
917 ipfiredist xvid
918 test -d $BASEDIR/packages || mkdir $BASEDIR/packages
919 mv -f $LFS/install/packages/*.{ipfire,md5} $BASEDIR/packages >> $LOGFILE 2>&1
920 rm -rf $BASEDIR/build/install/packages/*
921 }
922
923 update_logs() {
924 tar cfz log/ipfire-logs-`date +'%Y-%m-%d-%H:%M'`.tgz log/_build.*
925 rm -f log/_build.*
926 }
927
928 # See what we're supposed to do
929 case "$1" in
930 build)
931 BUILDMACHINE=`uname -m`
932 PACKAGE=`ls -v -r $BASEDIR/cache/toolchains/$SNAME-$VERSION-toolchain-$BUILDMACHINE.tar.gz 2> /dev/null | head -n 1`
933 #only restore on a clean disk
934 if [ ! -f log/perl-*-tools ]; then
935 if [ ! -n "$PACKAGE" ]; then
936 echo "`date -u '+%b %e %T'`: Full toolchain compilation" | tee -a $LOGFILE
937 prepareenv
938 buildtoolchain
939 else
940 PACKAGENAME=${PACKAGE%.tar.gz}
941 echo "`date -u '+%b %e %T'`: Restore from $PACKAGE" | tee -a $LOGFILE
942 if [ `md5sum $PACKAGE | awk '{print $1}'` == `cat $PACKAGENAME.md5 | awk '{print $1}'` ]; then
943 tar zxf $PACKAGE
944 prepareenv
945 else
946 exiterror "$PACKAGENAME md5 did not match, check downloaded package"
947 fi
948 fi
949 else
950 echo "`date -u '+%b %e %T'`: Using installed toolchain" | tee -a $LOGFILE
951 prepareenv
952 fi
953
954 buildbase
955 buildipcop
956
957 # Setzen des IPFire Builds
958 if [ "$FIREBUILD" ]; then
959 echo "$FIREBUILD" > $BASEDIR/build/var/ipfire/firebuild
960 else
961 echo "_(OvO)_" > $BASEDIR/build/var/ipfire/firebuild
962 fi
963
964 buildinstaller
965 buildpackages
966 ;;
967 shell)
968 # enter a shell inside LFS chroot
969 # may be used to changed kernel settings
970 prepareenv
971 entershell
972 ;;
973 changelog)
974 echo -n "Loading new Changelog from SVN: "
975 svn log http://svn.ipfire.eu/svn/ipfire > doc/ChangeLog
976 echo "Finished!"
977 ;;
978 check)
979 echo "Checking sources files availability on the web"
980 if [ ! -d $DIR_CHK ]; then
981 mkdir -p $DIR_CHK
982 fi
983 FINISHED=0
984 cd $BASEDIR/lfs
985 for c in `seq $MAX_RETRIES`; do
986 if (( FINISHED==1 )); then
987 break
988 fi
989 FINISHED=1
990 cd $BASEDIR/lfs
991 for i in *; do
992 if [ -f "$i" -a "$i" != "Config" ]; then
993 make -s -f $i MACHINE=$MACHINE LFS_BASEDIR=$BASEDIR ROOT=$BASEDIR/build \
994 MESSAGE="$i\t ($c/$MAX_RETRIES)" check
995 if [ $? -ne 0 ]; then
996 echo "Check : wget error in lfs/$i"
997 FINISHED=0
998 fi
999 fi
1000 done
1001 done
1002 cd -
1003 ;;
1004 checkclean)
1005 echo "Erasing sources files availability tags"
1006 rm -rf $DIR_CHK/*
1007 ;;
1008 clean)
1009 for i in `mount | grep $BASEDIR | sed 's/^.*loop=\(.*\))/\1/'`; do
1010 $LOSETUP -d $i 2>/dev/null
1011 done
1012 for i in `mount | grep $BASEDIR | cut -d " " -f 1`; do
1013 umount $i
1014 done
1015 stdumount
1016 for i in `seq 0 7`; do
1017 if ( losetup /dev/loop${i} 2>/dev/null | grep -q "/install/images" ); then
1018 umount /dev/loop${i} 2>/dev/null;
1019 losetup -d /dev/loop${i} 2>/dev/null;
1020 fi;
1021 done
1022 rm -rf $BASEDIR/build
1023 rm -rf $BASEDIR/cdrom
1024 rm -rf $BASEDIR/packages
1025 rm -rf $BASEDIR/log
1026 if [ -h /tools ]; then
1027 rm -f /tools
1028 fi
1029 ;;
1030 newpak)
1031 # create structure for a new package
1032 echo -e "Name of the new package: $2"
1033 if [ ! -f "lfs/$2" ]; then
1034 echo "`date -u '+%b %e %T'`: Creating directory src/paks/$2"
1035 mkdir -p src/paks/$2
1036 cd src/paks/$2
1037 echo "`date -u '+%b %e %T'`: Creating files"
1038 cp $BASEDIR/lfs/postfix $BASEDIR/lfs/$2
1039
1040 touch ROOTFILES
1041 touch {,un}install.sh
1042 ## install.sh
1043 echo '#!/bin/bash' > install.sh
1044 echo '#' >> install.sh
1045 echo '#################################################################' >> install.sh
1046 echo '# #' >> install.sh
1047 echo '# This file belongs to IPFire Firewall - GPLv2 - www.ipfire.org #' >> install.sh
1048 echo '# #' >> install.sh
1049 echo '#################################################################' >> install.sh
1050 echo '#' >> install.sh
1051 echo '# Extract the files' >> install.sh
1052 echo 'tar xfz files.tgz -C /' >> install.sh
1053 echo 'cp -f ROOTFILES /opt/pakfire/installed/ROOTFILES.$2' >> install.sh
1054 ## uninstall.sh
1055 echo '#!/bin/bash' > uninstall.sh
1056 echo '#################################################################' >> uninstall.sh
1057 echo '# #' >> uninstall.sh
1058 echo '# This file belongs to IPFire Firewall - GPLv2 - www.ipfire.org #' >> uninstall.sh
1059 echo '# #' >> uninstall.sh
1060 echo '#################################################################' >> uninstall.sh
1061 echo '#' >> uninstall.sh
1062 echo '# Delete the files' >> uninstall.sh
1063 echo '## Befehl fehlt noch' >> uninstall.sh
1064 echo 'rm -f /opt/pakfire/installed/ROOTFILES.$2' >> uninstall.sh
1065 echo "`date -u '+%b %e %T'`: Adding files to SVN"
1066 cd - && svn add lfs/$2 && svn add src/paks/$2
1067
1068 echo -n "Do you want to remove the folders? [y/n]"
1069 read REM
1070 if [ "$REM" == "y" ]; then
1071 echo "Removing the folders..."
1072 svn del src/paks/$2 --force
1073 else
1074 echo "Folders are kept."
1075 fi
1076 else
1077 echo "$2 already exists"
1078 fi
1079 exit 0
1080 ;;
1081 prefetch)
1082 if [ ! -d $BASEDIR/cache ]; then
1083 mkdir $BASEDIR/cache
1084 fi
1085 mkdir -p $BASEDIR/log
1086 echo "`date -u '+%b %e %T'`:Preload all source files" | tee -a $LOGFILE
1087 FINISHED=0
1088 cd $BASEDIR/lfs
1089 for c in `seq $MAX_RETRIES`; do
1090 if (( FINISHED==1 )); then
1091 break
1092 fi
1093 FINISHED=1
1094 cd $BASEDIR/lfs
1095 for i in *; do
1096 if [ -f "$i" -a "$i" != "Config" ]; then
1097 make -s -f $i LFS_BASEDIR=$BASEDIR MESSAGE="$i\t ($c/$MAX_RETRIES)" download >> $LOGFILE 2>&1
1098 if [ $? -ne 0 ]; then
1099 echo "Prefetch : wget error in lfs/$i"
1100 FINISHED=0
1101 else
1102 if [ $c -eq 1 ]; then
1103 echo "Prefetch : lfs/$i files loaded"
1104 fi
1105 fi
1106 fi
1107 done
1108 done
1109 echo "Prefetch : verifying md5sum"
1110 ERROR=0
1111 for i in *; do
1112 if [ -f "$i" -a "$i" != "Config" ]; then
1113 make -s -f $i LFS_BASEDIR=$BASEDIR MESSAGE="$i\t " md5 >> $LOGFILE 2>&1
1114 if [ $? -ne 0 ]; then
1115 echo "md5 difference in lfs/$i"
1116 ERROR=1
1117 fi
1118 fi
1119 done
1120 if [ $ERROR -eq 0 ]; then
1121 echo "Prefetch : all files md5sum match"
1122 fi
1123 cd -
1124 ;;
1125 toolchain)
1126 prepareenv
1127 buildtoolchain
1128 BUILDMACHINE=`uname -m`
1129 echo "`date -u '+%b %e %T'`: Create toolchain tar.gz for $BUILDMACHINE" | tee -a $LOGFILE
1130 test -d $BASEDIR/cache/toolchains || mkdir $BASEDIR/cache/toolchains
1131 cd $BASEDIR && tar -zc --exclude='log/_build.*.log' -f cache/toolchains/$SNAME-$VERSION-toolchain-$BUILDMACHINE.tar.gz \
1132 build/{bin,etc,usr/bin,usr/local} \
1133 build/tools/{bin,etc,*-linux-gnu,include,lib,libexec,sbin,share,var} \
1134 log >> $LOGFILE
1135 md5sum cache/toolchains/$SNAME-$VERSION-toolchain-$BUILDMACHINE.tar.gz \
1136 > cache/toolchains/$SNAME-$VERSION-toolchain-$BUILDMACHINE.md5
1137 stdumount
1138 ;;
1139 gettoolchain)
1140 BUILDMACHINE=`uname -m`
1141 # arbitrary name to be updated in case of new toolchain package upload
1142 PACKAGE=$SNAME-$VERSION-toolchain-$BUILDMACHINE
1143 if [ ! -f $BASEDIR/cache/toolchains/$PACKAGE.tar.gz ]; then
1144 URL_IPFIRE=`grep URL_IPFIRE lfs/Config | awk '{ print $3 }'`
1145 test -d $BASEDIR/cache/toolchains || mkdir $BASEDIR/cache/toolchains
1146 echo "`date -u '+%b %e %T'`: Load toolchain tar.gz for $BUILDMACHINE" | tee -a $LOGFILE
1147 cd $BASEDIR/cache/toolchains
1148 wget $URL_IPFIRE/toolchains/$PACKAGE.tar.gz $URL_IPFIRE/toolchains/$PACKAGE.md5 >& /dev/null
1149 if [ $? -ne 0 ]; then
1150 echo "`date -u '+%b %e %T'`: error downloading toolchain for $BUILDMACHINE machine" | tee -a $LOGFILE
1151 else
1152 if [ "`md5sum $PACKAGE.tar.gz | awk '{print $1}'`" = "`cat $PACKAGE.md5 | awk '{print $1}'`" ]; then
1153 echo "`date -u '+%b %e %T'`: toolchain md5 ok" | tee -a $LOGFILE
1154 else
1155 exiterror "$PACKAGE.md5 did not match, check downloaded package"
1156 fi
1157 fi
1158 else
1159 echo "Toolchain is already downloaded. Exiting..."
1160 fi
1161 ;;
1162 sources-iso)
1163 prepareenv
1164 echo "`date -u '+%b %e %T'`: Build sources iso for $MACHINE" | tee -a $LOGFILE
1165 chroot $LFS /tools/bin/env -i HOME=/root \
1166 TERM=$TERM PS1='\u:\w\$ ' \
1167 PATH=/usr/local/bin:/bin:/usr/bin:/sbin:/usr/sbin \
1168 VERSION=$VERSION NAME="$NAME" SNAME="$SNAME" MACHINE=$MACHINE \
1169 /bin/bash -x -c "cd /usr/src/lfs && make -f sources-iso LFS_BASEDIR=/usr/src install" >>$LOGFILE 2>&1
1170 mv $LFS/install/images/ipfire-* $BASEDIR >> $LOGFILE 2>&1
1171 stdumount
1172 ;;
1173 svn)
1174 case "$2" in
1175 update|up)
1176 # clear
1177 echo -n "Load the latest source files..."
1178 svn update >> $PWD/log/_build.svn.update.log
1179 if [ $? -eq 0 ]; then
1180 echo ".Done!"
1181 else
1182 echo ".Fail!"
1183 exit 1
1184 fi
1185 echo -n "Write the svn info to a file..."
1186 svn info > $PWD/svn_status
1187 if [ "$?" -eq "0" ]; then
1188 echo ".Done!"
1189 else
1190 echo ".Fail!"
1191 exit 1
1192 fi
1193 chmod 755 $0
1194 tail log/_build.svn.update.log
1195 exit 0
1196 ;;
1197 commit|ci)
1198 clear
1199 if [ -e /sbin/yast ]; then
1200 $0 changelog
1201 fi
1202 echo "Upload the changed files..."
1203 sleep 1
1204 IPFIRE_SVN_MESSAGE=/tmp/ipfire-svn-co-message.txt
1205 rm -f $IPFIRE_SVN_MESSAGE
1206 mcedit $IPFIRE_SVN_MESSAGE
1207 svn commit -F $IPFIRE_SVN_MESSAGE
1208 rm -f $IPFIRE_SVN_MESSAGE
1209 $0 svn up
1210 ;;
1211 dist)
1212 #$0 svn up
1213 echo -ne "Download source package from svn..."
1214 svn export http://svn.ipfire.eu/svn/ipfire ipfire-source/ --force > /dev/null
1215 if [ "$?" -eq "0" ]; then
1216 echo ".Done!"
1217 else
1218 echo ".Fail!"
1219 exit 1
1220 fi
1221 echo -n "Compress files..."
1222 tar cfz ipfire-source-r$SVN_REVISION.tar.gz ipfire-source
1223 if [ "$?" -eq "0" ]; then
1224 echo ".Done!"
1225 else
1226 echo ".Fail!"
1227 exit 1
1228 fi
1229 echo -n "Cleanup..."
1230 rm ipfire-source/ -r
1231 if [ "$?" -eq "0" ]; then
1232 echo ".Done!"
1233 else
1234 echo ".Fail!"
1235 exit 1
1236 fi
1237 ;;
1238 diff)
1239 echo -ne "Make a local diff to last svn revision..."
1240 svn diff > ipfire-diff-`date +'%Y-%m-%d-%H:%M'`-r`svn info | grep Revision | cut -c 11-`.diff
1241 if [ "$?" -eq "0" ]; then
1242 echo ".Done!"
1243 else
1244 echo ".Fail!"
1245 exit 1
1246 fi
1247 echo "Diff was successfully saved to ipfire-diff-`date +'%Y-%m-%d-%H:%M'`-r`svn info | grep Revision | cut -c 11-`.diff"
1248 ;;
1249 esac
1250 ;;
1251 make-config)
1252 echo -e "This is for creating your configuration..."
1253 echo -e "We will need some input:"
1254 echo -e ""
1255 echo -n "FTP-DOMAIN FOR THE ISO: "
1256 read IPFIRE_FTP_URL_EXT
1257 echo -n "PATH FOR $IPFIRE_FTP_URL_EXT: "
1258 read IPFIRE_FTP_PATH_EXT
1259 echo -n "USERNAME FOR $IPFIRE_FTP_URL_EXT: "
1260 read IPFIRE_FTP_USER_EXT
1261 echo -n "PASSWORD FOR $IPFIRE_FTP_URL_EXT: "
1262 read -s IPFIRE_FTP_PASS_EXT
1263 echo ""
1264 echo "(You can leave this empty if the cache-server is the same as your iso-server.)"
1265 echo -n "FTP-DOMAIN FOR THE CACHE: "
1266 read IPFIRE_FTP_URL_INT
1267 echo -n "PATH FOR $IPFIRE_FTP_URL_INT: "
1268 read IPFIRE_FTP_PATH_INT
1269 if [ $IPFIRE_FTP_URL_INT ]; then
1270 echo -n "USERNAME FOR $IPFIRE_FTP_URL_INT: "
1271 read IPFIRE_FTP_USER_INT
1272 echo -n "PASSWORD FOR $IPFIRE_FTP_URL_INT: "
1273 read -s IPFIRE_FTP_PASS_INT
1274 else
1275 IPFIRE_FTP_URL_INT=$IPFIRE_FTP_URL_EXT
1276 IPFIRE_FTP_USER_INT=$IPFIRE_FTP_USER_EXT
1277 IPFIRE_FTP_PASS_INT=$IPFIRE_FTP_PASS_EXT
1278 echo "USERNAME FOR $IPFIRE_FTP_URL_INT: $IPFIRE_FTP_USER_INT"
1279 echo "PASSWORD FOR $IPFIRE_FTP_URL_INT: !HIDDEN!"
1280 fi
1281 echo ""
1282 echo "(You can leave this empty if the pak-server is the same as your iso-server.)"
1283 echo -n "FTP-DOMAIN FOR THE PAKS: "
1284 read IPFIRE_FTP_URL_PAK
1285 echo -n "PATH FOR $IPFIRE_FTP_URL_PAK: "
1286 read IPFIRE_FTP_PATH_PAK
1287 if [ $IPFIRE_FTP_URL_PAK ]; then
1288 echo -n "USERNAME FOR $IPFIRE_FTP_URL_PAK: "
1289 read IPFIRE_FTP_USER_PAK
1290 echo -n "PASSWORD FOR $IPFIRE_FTP_URL_PAK: "
1291 read -s IPFIRE_FTP_PASS_PAK
1292 else
1293 IPFIRE_FTP_URL_PAK=$IPFIRE_FTP_URL_EXT
1294 IPFIRE_FTP_USER_PAK=$IPFIRE_FTP_USER_EXT
1295 IPFIRE_FTP_PASS_PAK=$IPFIRE_FTP_PASS_EXT
1296 echo "USERNAME FOR $IPFIRE_FTP_URL_PAK: $IPFIRE_FTP_USER_PAK"
1297 echo "PASSWORD FOR $IPFIRE_FTP_URL_PAK: !HIDDEN!"
1298 fi
1299 echo ""
1300 echo -e "ONE OR MORE EMAIL ADDRESS(ES) TO WHICH THE REPORTS WILL BE SENT"
1301 echo -e "(seperated by comma)"
1302 read IPFIRE_MAIL_REPORT
1303 echo -n "EMAIL FROM: "
1304 read IPFIRE_MAIL_FROM
1305 echo -n "EMAIL SERVER: "
1306 read IPFIRE_MAIL_SERVER
1307 echo -n "LOGIN TO MAIL SERVER: "
1308 read IPFIRE_MAIL_USER
1309 echo -n "MAIL PASSWORD: "
1310 read -s IPFIRE_MAIL_PASS
1311 echo -n "Saving..."
1312 for i in `seq 20`; do
1313 sleep 0.1; echo -n "."
1314 done
1315 echo ".Finished!"
1316 cat <<END > .config
1317 ### ISO server
1318 IPFIRE_FTP_URL_EXT=$IPFIRE_FTP_URL_EXT
1319 IPFIRE_FTP_PATH_EXT=$IPFIRE_FTP_PATH_EXT
1320 IPFIRE_FTP_USER_EXT=$IPFIRE_FTP_USER_EXT
1321 IPFIRE_FTP_PASS_EXT=$IPFIRE_FTP_PASS_EXT
1322 ### cache server
1323 IPFIRE_FTP_URL_INT=$IPFIRE_FTP_URL_INT
1324 IPFIRE_FTP_PATH_INT=$IPFIRE_FTP_PATH_INT
1325 IPFIRE_FTP_USER_INT=$IPFIRE_FTP_USER_INT
1326 IPFIRE_FTP_PASS_INT=$IPFIRE_FTP_PASS_INT
1327 ### paks server
1328 IPFIRE_FTP_URL_PAK=$IPFIRE_FTP_URL_PAK
1329 IPFIRE_FTP_PATH_PAK=$IPFIRE_FTP_PATH_PAK
1330 IPFIRE_FTP_USER_PAK=$IPFIRE_FTP_USER_PAK
1331 IPFIRE_FTP_PASS_PAK=$IPFIRE_FTP_PASS_PAK
1332 ### mail reports
1333 IPFIRE_MAIL_REPORT=$IPFIRE_MAIL_REPORT
1334 IPFIRE_MAIL_FROM=$IPFIRE_MAIL_FROM
1335 IPFIRE_MAIL_SERVER=$IPFIRE_MAIL_SERVER
1336 IPFIRE_MAIL_USER=$IPFIRE_MAIL_USER
1337 IPFIRE_MAIL_PASS=$IPFIRE_MAIL_PASS
1338 END
1339 ;;
1340 sync)
1341 echo -e "Syncing cache to ftp:"
1342 # rm -f doc/packages-to-remove-from-ftp
1343 ncftpls -u $IPFIRE_FTP_USER_INT -p $IPFIRE_FTP_PASS_INT ftp://$IPFIRE_FTP_URL_INT$IPFIRE_FTP_PATH_INT/ > ftplist
1344 for i in `ls -w1 cache/`; do
1345 grep $i ftplist
1346 if [ "$?" -ne "0" ]; then
1347 ncftpput -u $IPFIRE_FTP_USER_INT -p $IPFIRE_FTP_PASS_INT $IPFIRE_FTP_URL_INT $IPFIRE_FTP_PATH_INT/ cache/$i
1348 if [ "$?" -eq "0" ]; then
1349 echo -e "$i was successfully uploaded to the ftp server."
1350 else
1351 echo -e "There was an error while uploading $i to the ftp server."
1352 fi
1353 fi
1354 done
1355 # for i in `cat ftplist`; do
1356 # ls -w1 cache/ | grep $i
1357 # if [ "$?" -eq "1" ]; then
1358 # echo $i | grep -v toolchain >> doc/packages-to-remove-from-ftp
1359 # fi
1360 # done
1361 rm -f ftplist
1362 ;;
1363 upload)
1364 case "$2" in
1365 iso)
1366 echo -e "Uploading the iso to $IPFIRE_FTP_URL_EXT."
1367 cat <<EOF > .ftp-commands
1368 mkdir $IPFIRE_FTP_PATH_EXT
1369 ls -lah
1370 quit
1371 EOF
1372 ncftp -u $IPFIRE_FTP_USER_EXT -p $IPFIRE_FTP_PASS_EXT $IPFIRE_FTP_URL_EXT < .ftp-commands
1373 rm -f .ftp-commands
1374 md5sum ipfire-install-$VERSION.i386.iso > ipfire-install-$VERSION.i386.iso.md5
1375 ncftpput -u $IPFIRE_FTP_USER_EXT -p $IPFIRE_FTP_PASS_EXT $IPFIRE_FTP_URL_EXT $IPFIRE_FTP_PATH_EXT/ ipfire-install-$VERSION.i386.iso
1376 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
1377 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
1378 ncftpput -u $IPFIRE_FTP_USER_EXT -p $IPFIRE_FTP_PASS_EXT $IPFIRE_FTP_URL_EXT $IPFIRE_FTP_PATH_EXT/ svn_status
1379 if [ "$?" -eq "0" ]; then
1380 echo -e "The iso of Revision $SVN_REVISION was successfully uploaded to $IPFIRE_FTP_URL_EXT$IPFIRE_FTP_PATH_EXT/."
1381 else
1382 echo -e "There was an error while uploading the iso to the ftp server."
1383 exit 1
1384 fi
1385 if [ "$3" = "--with-sources-cd" ]; then
1386 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
1387 fi
1388 ;;
1389 paks)
1390 cat <<EOF > .ftp-commands
1391 mkdir $IPFIRE_FTP_PATH_PAK
1392 ls -lah
1393 quit
1394 EOF
1395 ncftp -u $IPFIRE_FTP_USER_PAK -p $IPFIRE_FTP_PASS_PAK $IPFIRE_FTP_URL_PAK < .ftp-commands
1396 rm -f .ftp-commands
1397 ncftpput -z -u $IPFIRE_FTP_USER_PAK -p $IPFIRE_FTP_PASS_PAK $IPFIRE_FTP_URL_PAK $IPFIRE_FTP_PATH_PAK/ packages/*
1398 if [ "$?" -eq "0" ]; then
1399 echo -e "The packages were successfully uploaded to $IPFIRE_FTP_URL_PAK$IPFIRE_FTP_PATH_PAK/."
1400 else
1401 echo -e "There was an error while uploading the packages to the ftp server."
1402 exit 1
1403 fi
1404 ;;
1405 esac
1406 ;;
1407 build-only)
1408 rm -f $BASEDIR/log/$2*
1409 BUILDMACHINE=`uname -m`
1410 prepareenv
1411 ipcopmake $2
1412 ;;
1413 build-silent)
1414 screen -dmS ipfire $0 build
1415 echo "Build started... This will take a while!"
1416 echo "You can see the status with 'screen -x ipfire'."
1417 ;;
1418 mail)
1419 chmod 755 tools/sendEmail
1420 ATTACHMENT=/tmp/ipfire-build-logs-R$SVN_REVISION.tar.gz
1421 if [ "$2" = "ERROR" ]; then
1422 SUBJECT="ERROR: IPFIRE-BUILD R$SVN_REVISION on `hostname`"
1423 echo "ERROR: $0 build!"
1424 cat <<END > /tmp/ipfire_mail_body
1425 When I was building IPFire on `hostname`, I have found an ERROR!
1426 Here you can see the logs and detect the reason for this error.
1427
1428 Best Regards
1429 Your IPFire-Build-Script
1430 END
1431 fi
1432 if [ "$2" = "SUCCESS" ]; then
1433 SUBJECT="SUCCESS: IPFIRE-BUILD R$SVN_REVISION on `hostname`"
1434 cat <<END > /tmp/ipfire_mail_body
1435 Building IPFire on `hostname` in Revision $SVN_REVISION was successfull!
1436 You can find the ISO on your ftp server.
1437
1438 Statistics:
1439 -----------
1440 Started: $IPFIRE_START_TIME
1441 Finished: `date`
1442
1443 Best Regards
1444 Your IPFire-Build-Script
1445 END
1446 fi
1447 if [ "$2" = "SVNUPDATE" ]; then
1448 SUBJECT="SVNUPDATE: IPFIRE-BUILD R$SVN_REVISION on `hostname`"
1449 echo "ERROR: $0 svn up!"
1450 cat <<END > /tmp/ipfire_mail_body
1451 When I was downloading the latest svn source,
1452 I have found an ERROR!
1453 Here you can see the logs and detect the reason for this error.
1454
1455 Best Regards
1456 Your IPFire-Build-Script
1457 END
1458 fi
1459
1460 if [ "$2" = "SVNDIST" ]; then
1461 SUBJECT="SVNDIST: IPFIRE-BUILD R$SVN_REVISION on `hostname`"
1462 echo "ERROR: $0 svn dist!"
1463 cat <<END > /tmp/ipfire_mail_body
1464 When I was exporting the latest svn source,
1465 I have found an ERROR!
1466 Here you can see the logs and detect the reason for this error.
1467
1468 Best Regards
1469 Your IPFire-Build-Script
1470 END
1471 fi
1472
1473 if [ "$2" = "PREFETCH" ]; then
1474 SUBJECT="PREFETCH: IPFIRE-BUILD R$SVN_REVISION on `hostname`"
1475 echo "ERROR: $0 prefetch!"
1476 cat <<END > /tmp/ipfire_mail_body
1477 When I was downloading the source packages,
1478 I have found an ERROR!
1479 Here you can see the logs and detect the reason for this error.
1480
1481 Best Regards
1482 Your IPFire-Build-Script
1483 END
1484 fi
1485
1486 if [ "$2" = "ISO" ]; then
1487 SUBJECT="ISO: IPFIRE-BUILD R$SVN_REVISION on `hostname`"
1488 echo "ERROR: $0 upload iso!"
1489 cat <<END > /tmp/ipfire_mail_body
1490 When I was uploading the iso image,
1491 I have found an ERROR!
1492 Here you can see the logs and detect the reason for this error.
1493
1494 Best Regards
1495 Your IPFire-Build-Script
1496 END
1497 fi
1498
1499 if [ "$2" = "PAKS" ]; then
1500 SUBJECT="PAKS: IPFIRE-BUILD R$SVN_REVISION on `hostname`"
1501 echo "ERROR: $0 upload paks!"
1502 cat <<END > /tmp/ipfire_mail_body
1503 When I was uploading the packages,
1504 I have found an ERROR!
1505 Here you can see the logs and detect the reason for this error.
1506
1507 Best Regards
1508 Your IPFire-Build-Script
1509 END
1510 fi
1511
1512 tar cfz $ATTACHMENT log/_build*
1513 cat <<END >> /tmp/ipfire_mail_body
1514
1515 Here is a summary... The full logs are in the attachment.
1516 ---------------------------------------------------------
1517
1518 `tail log/_*`
1519 END
1520 cat /tmp/ipfire_mail_body | tools/sendEmail -q \
1521 -f $IPFIRE_MAIL_FROM \
1522 -t $IPFIRE_MAIL_REPORT \
1523 -u $SUBJECT \
1524 -s $IPFIRE_MAIL_SERVER:25 \
1525 -xu $IPFIRE_MAIL_USER \
1526 -xp $IPFIRE_MAIL_PASS \
1527 -l log/_build.mail.log \
1528 -a $ATTACHMENT # -v
1529 rm -f /tmp/ipfire_mail_body $ATTACHMENT
1530 ;;
1531 unattended)
1532 if [ ! -f .config ]; then
1533 echo "No configuration found. Try ./make.sh make-config."
1534 fi
1535 ### This is our procedure that will compile the IPFire by herself...
1536 echo "### UPDATE LOGS"
1537 update_logs
1538
1539 if [ "$IPFIRE_REBUILD" -eq "0" ]; then
1540 echo "### SAVING TIME"
1541 export IPFIRE_START_TIME=`date`
1542
1543 echo "### GETTING TOOLCHAIN"
1544 $0 gettoolchain
1545
1546 echo "### RUNNING SVN-UPDATE"
1547 $0 svn update
1548 if [ $? -ne 0 ]; then
1549 $0 mail SVNUPDATE
1550 exit 1
1551 fi
1552
1553 echo "### EXPORT SOURCES"
1554 $0 svn dist
1555 if [ $? -ne 0 ]; then
1556 $0 mail SVNDIST
1557 exit 1
1558 fi
1559
1560 echo "### RUNNING PREFETCH"
1561 $0 prefetch | grep -q "md5 difference"
1562 if [ $? -eq 0 ]; then
1563 $0 mail PREFETCH
1564 exit 1
1565 fi
1566 fi
1567
1568 echo "### RUNNING BUILD"
1569 $0 build
1570 if [ $? -ne 0 ]; then
1571 $0 mail ERROR
1572 exit 1
1573 fi
1574
1575 echo "### MAKING SOURCES-ISO"
1576 echo "DISABLED by Delaco!"
1577 #$0 sources-iso
1578
1579 echo "### UPLOADING ISO"
1580 $0 upload iso
1581 if [ $? -ne 0 ]; then
1582 $0 mail ISO
1583 exit 1
1584 fi
1585
1586 echo "### UPLOADING PAKS"
1587 $0 upload paks
1588 if [ $? -ne 0 ]; then
1589 $0 mail PAKS
1590 exit 1
1591 fi
1592
1593 echo "### SUCCESS!"
1594 $0 mail SUCCESS
1595 exit 0
1596 ;;
1597 batch)
1598 if [ `screen -ls | grep -q ipfire` ]; then
1599 echo "Build is already running, sorry!"
1600 exit 1
1601 else
1602 if [ "$2" = "--rebuild" ]; then
1603 export IPFIRE_REBUILD=1
1604 echo "REBUILD!"
1605 else
1606 export IPFIRE_REBUILD=0
1607 fi
1608 echo -n "IPFire-Batch-Build is starting..."
1609 screen -dmS ipfire $0 unattended
1610 if [ "$?" -eq "0" ]; then
1611 echo ".Done!"
1612 else
1613 echo ".ERROR!"
1614 exit 1
1615 fi
1616 exit 0
1617 fi
1618 ;;
1619 *)
1620 clear
1621 svn info
1622 select name in "Exit" "IPFIRE: Prefetch" "IPFIRE: Build (silent)" "IPFIRE: Watch Build" "IPFIRE: Batch" "IPFIRE: Clean" "SVN: Commit" "SVN: Update" "SVN: Status" "SVN: Diff" "LOG: Tail" "Help"
1623 do
1624 case $name in
1625 "IPFIRE: Prefetch")
1626 $0 prefetch
1627 ;;
1628 "IPFIRE: Build (silent)")
1629 $0 build-silent
1630 ;;
1631 "IPFIRE: Watch Build")
1632 echo "Exit with Ctrl+A, Ctrl+D."
1633 echo -n "Preparing..."
1634 for i in `seq 10`; do
1635 sleep 0.1; echo -n "."
1636 done
1637 echo ".Ready!"
1638 sleep 0.3
1639 screen -x ipfire
1640 ;;
1641 "IPFIRE: Batch")
1642 $0 batch
1643 ;;
1644 "IPFIRE: Clean")
1645 $0 clean
1646 ;;
1647 "SVN: Commit")
1648 echo "Are your sure to Update all Files to the Server (write: yes)?"; read input
1649 if [ "$input" == "yes" ]; then
1650 $0 svn commit
1651 fi
1652 $0 sync
1653 ;;
1654 "SVN: Update")
1655 $0 svn update
1656 ;;
1657 "SVN: Status")
1658 svn status # | grep -v ^?
1659 ;;
1660 "SVN: Diff")
1661 $0 svn diff
1662 ;;
1663 "Help")
1664 echo "Usage: $0 {build|changelog|check|checkclean|clean|gettoolchain|newpak|prefetch|shell|sync|toolchain}"
1665 cat doc/make.sh-usage
1666 ;;
1667 "LOG: Tail")
1668 tail -f log/_*
1669 ;;
1670 "Exit")
1671 break
1672 ;;
1673 esac
1674 done
1675 ;;
1676 esac