source: common/common-functions@ fb6b1c5

experimental
Last change on this file since fb6b1c5 was 53588e2, checked in by Manuel Canales Esparcia <manuel@…>, 18 years ago

Applied optimize patch from Jeremy Byron.

  • Property mode set to 100644
File size: 24.9 KB
Line 
1#!/bin/bash
2
3# $Id$
4
5set +e
6
7# VT100 colors
8declare -r BLACK=$'\e[1;30m'
9declare -r DK_GRAY=$'\e[0;30m'
10
11declare -r RED=$'\e[31m'
12declare -r GREEN=$'\e[32m'
13declare -r YELLOW=$'\e[33m'
14declare -r BLUE=$'\e[34m'
15declare -r MAGENTA=$'\e[35m'
16declare -r CYAN=$'\e[36m'
17declare -r WHITE=$'\e[37m'
18
19declare -r OFF=$'\e[0m'
20declare -r BOLD=$'\e[1m'
21declare -r REVERSE=$'\e[7m'
22declare -r HIDDEN=$'\e[8m'
23
24declare -r tab_=$'\t'
25declare -r nl_=$'\n'
26
27declare -r DD_BORDER="${BOLD}==============================================================================${OFF}"
28declare -r SD_BORDER="${BOLD}------------------------------------------------------------------------------${OFF}"
29declare -r STAR_BORDER="${BOLD}******************************************************************************${OFF}"
30
31# bold yellow > < pair
32declare -r R_arrow=$'\e[1;33m>\e[0m'
33declare -r L_arrow=$'\e[1;33m<\e[0m'
34
35
36usage() {
37cat <<- -EOF-
38${DD_BORDER}
39${BOLD}
40 Usage: $0 ${BOLD}[OPTION]
41
42${RED}IMPORTANT:${OFF} Only supported command line switches are listed here.
43 For more fine-grained setups you must edit the relevant
44 configuration files placed under ${BOLD}common/${OFF} and ${BOLD}$(echo $PROGNAME | tr [a-z] [A-Z])/${OFF}
45
46Options:
47${BOLD} -h, --help${OFF}
48 print this help, then exit
49
50${BOLD} -V, --version${OFF}
51 print version information, then exit
52
53${BOLD} -B, --book VER${OFF}
54 use VER version of the book as the system to build.
55 Supported versions are: dev*, trunk, SVN
56 These are aliases for the Development version of {C,H,B}LFS
57
58${BOLD} -D --directory DIR${OFF}
59 use DIR directory for building ${BOLD}$(echo $PROGNAME | tr [a-z] [A-Z])${OFF}; all files jhalfs-X produces
60 will be in the directory DIR/jhalfs.
61 The current setting for BUILDDIR is "$BUILDDIR"
62
63${BOLD} -G, --get-packages${OFF}
64 download the packages and patches. This assumes that the server declared
65 in the configuration file has the proper packages and patches for the
66 book version being processed.
67
68${BOLD} -O, --optimize${OFF}
69 Optimize [0-2]
70 0 = no optimization
71 1 = optimize chapter06 only
72 2 = optimize both chapter05 and chapter06
73 Edit common/opt_config{,.d/*} and common/opt_override as desired.
74
75${BOLD} -T, --testsuites N ${OFF}
76 Run test suites [0-3]
77 0 = none
78 1 = only final system Glibc, GCC and Binutils testsuites
79 2 = all final system testsuites
80 3 = all temporary tools and final system testsuites
81 In CLFS, 3 is an alias to 2
82 In BLFS, 1, 2, and 3 are equivalents and means that the testsuites
83 will be run.
84
85${BOLD} -W, --working-copy DIR${OFF}
86 use the local working copy placed in DIR as the $(echo $PROGNAME | tr [a-z] [A-Z]) book
87-EOF-
88
89[[ ${PROGNAME} != "blfs" ]] &&
90cat <<- -EOF-
91
92${BOLD} -C, --comparasion TYPE${OFF}
93 do iterative comparison analysis. This extends the total build time
94 considerably because the entire final system will rebuild itself
95 the number of times specified by ITERATIONS in common/config.
96 Types allowed are:
97 ICA = do ICA as designed by Greg Schafer
98 farce = do the farce analysis designed by Ken Moffat
99 both = perfom both ICA and farce analysis
100
101${BOLD} -F, --fstab FILE${OFF}
102 use FILE as the /etc/fstab file for the ${BOLD}$(echo $PROGNAME | tr [a-z] [A-Z])${OFF} system. If not specified,
103 a default /etc/fstab file with dummy values is created.
104
105${BOLD} -K, --kernel-config FILE${OFF}
106 use the kernel configuration file specified in FILE to build the kernel.
107 if the file is not found, or if not specified, the kernel build is skipped.
108
109${BOLD} -M, --run-make${OFF}
110 run make on the generated Makefile
111
112${BOLD} -R --rebuild${OFF}
113 clean the build directory before perfoming any other task. The directory
114 is cleaned only if it was populated by a previous jhalfs-X run.
115-EOF-
116
117[[ ${PROGNAME} = "clfs" ]] &&
118cat <<- -EOF-
119
120${BOLD} -A, --arch ARCH ${OFF}
121 Select the TARGET architecture, valid selections are:
122 32bit builds
123 x86, i486, i586, ppc, mips, mipsel, sparc
124 64bit builds
125 x86_64-64, mips64-64, mipsel64-64, sparc64-64, alpha
126 64bit multi-lib
127 x86_64, mips64, mipsel64, sparc64, ppc64
128
129${BOLD} --boot-config FILE ${OFF}
130 The configuration file for the bootstrap kernel if method=boot
131
132${BOLD} --method BUILDMETHOD ${OFF}
133 Select the build method, chroot or boot
134-EOF-
135
136[[ ${PROGNAME} = "hlfs" ]] &&
137cat <<- -EOF-
138
139${BOLD} --model STYLE ${OFF}
140 Select the library model for the HLFS system
141 Valid choices are: glibc or uclibc
142-EOF-
143
144[[ ${PROGNAME} = "blfs" ]] &&
145cat <<- -EOF-
146
147${BOLD} --dependencies 0/1/2${OFF}
148 add dependencies of type TYPE to the build tree.
149 If not set, both required and recommended are used.
150
151 Possible values are:
152 0 - required only required dependecies are used
153 1 - recommended both required a recommended dependencies are used
154 2 - optional all dependencies are used
155-EOF-
156
157cat <<- -EOF-
158${DD_BORDER}
159-EOF-
160 exit
161}
162
163version="
164${BOLD} \"jhalfs-X\"${OFF} builder tool (experimental) \$Rev$
165\$Date$
166
167${BOLD} \"${PROGNAME}\"${OFF} script module
168
169Written by George Boudreau,
170 Manuel Canales Esparcia,
171 Jeremy Huntwork
172
173This program is published under the ${BOLD}Gnu General Public License, Version 2.${OFF}
174"
175
176
177no_empty_builddir() {
178 'clear'
179cat <<- -EOF-
180${DD_BORDER}
181
182${tab_}${tab_}${BOLD}${RED}W A R N I N G${OFF}
183 Looks like the \$BUILDDIR directory contains subdirectories
184 from a previous HLFS build.
185
186 Please format the partition mounted on \$BUILDDIR or set
187 a different build directory before running jhalfs-X.
188${OFF}
189${DD_BORDER}
190-EOF-
191 exit
192}
193
194
195help="${nl_}Try '$0 --help' for more information."
196
197
198exit_missing_arg="\
199echo \"Option '\$1' requires an argument\" >&2
200echo \"\$help\" >&2
201exit 1"
202
203no_dl_client="\
204echo \"Could not find a way to download the ${BOLD}$(echo $PROGNAME | tr [a-z] [A-Z])${OFF} sources.\" >&2
205echo \"Attempting to continue.\" >&2"
206
207HEADER="# This file is automatically generated by jhalfs-X
208# DO NOT EDIT THIS FILE MANUALLY
209#
210# Generated on `date \"+%F %X %Z\"`"
211
212
213
214#----------------------------------#
215wrt_target() { # Create target and initialize log file
216#----------------------------------#
217 local i=$1
218 local PREV=$2
219 case $i in
220 iteration* ) local LOGFILE=$this_script.log ;;
221 * ) local LOGFILE=$this_script ;;
222 esac
223(
224cat << EOF
225
226$i: $PREV
227 @\$(call echo_message, Building)
228 @echo -e "\n\`date\`\n\nKB: \`du -skx --exclude=jhalfs \$(MOUNT_PT)\`\n" >logs/$LOGFILE
229EOF
230) >> $MKFILE.tmp
231}
232
233
234#----------------------------------#
235wrt_unpack() { # Unpack and set 'ROOT' var
236#----------------------------------#
237 local FILE=$1
238(
239cat << EOF
240 @\$(call unpack,$FILE)
241 @ROOT=\`head -n1 /tmp/unpacked | sed 's@^./@@;s@/.*@@'\` && \\
242 echo "export PKGDIR=\$(MOUNT_PT)\$(SRC)/\$\$ROOT" > envars && \\
243 chown -R lfs \$(MOUNT_PT)\$(SRC)/\$\$ROOT
244EOF
245) >> $MKFILE.tmp
246}
247
248
249#----------------------------------#
250wrt_unpack2() { #
251#----------------------------------#
252 local FILE=$1
253(
254cat << EOF
255 @\$(call unpack2,$FILE)
256 @ROOT=\`head -n1 /tmp/unpacked | sed 's@^./@@;s@/.*@@'\` && \\
257 echo "export PKGDIR=\$(SRC)/\$\$ROOT" > envars
258EOF
259) >> $MKFILE.tmp
260}
261
262
263#----------------------------------#
264wrt_unpack3() { #
265#----------------------------------#
266 local FILE=$1
267(
268cat << EOF
269 @\$(call unpack3,$FILE)
270 @ROOT=\`head -n1 /tmp/unpacked | sed 's@^./@@;s@/.*@@'\` && \\
271 echo "export PKGDIR=\$(SRC)/\$\$ROOT" > envars
272EOF
273) >> $MKFILE.tmp
274}
275
276
277#----------------------------------#
278wrt_target_vars() { # Target vars for hlfs (cross-build method)
279#----------------------------------#
280(
281cat << EOF
282 @echo "export target=$(uname -m)-${TARGET}" >> envars && \\
283 echo "export ldso=/lib/${LOADER}" >> envars
284EOF
285) >> $MKFILE.tmp
286
287}
288
289
290#----------------------------------#
291wrt_optimize() { # Apply pkg specific opt's to build
292#----------------------------------#
293 local pkg=$1
294 local optLvl optVal OPT_VAR
295
296 optLvl=`awk -v pkg="$pkg" '$1 == pkg { print $2 }' $JHALFSDIR/opt_override`
297 if [[ "$optLvl" = "" ]] ; then
298 optLvl=$DEF_OPT_LVL;
299 fi
300
301 for OPT_VAR in $ACTIVE_OPT_VARS ; do
302 eval optVal=\$${OPT_VAR}_$optLvl
303
304 if [[ "$optVal" != "unset" ]]; then
305(
306cat << EOF
307 @echo "export $OPT_VAR=\"$optVal\"" >> envars
308EOF
309) >> $MKFILE.tmp
310 else
311 continue
312 fi
313 done
314}
315
316
317#----------------------------------#
318wrt_run_as_su() { # Execute script inside time { }, footer to log file
319#----------------------------------#
320 local this_script=$1
321 local file=$2
322(
323cat << EOF
324 @( time { su - lfs -c "source /home/lfs/.bashrc && $JHALFSDIR/${PROGNAME}-commands/$file" >>logs/$this_script 2>&1 ; } ) 2>>logs/$this_script && \\
325 echo -e "\nKB: \`du -skx --exclude=jhalfs \$(MOUNT_PT)\`\n" >>logs/$this_script
326EOF
327) >> $MKFILE.tmp
328}
329
330
331#----------------------------------#
332wrt_run_as_root() { # Some scripts must be run as root..
333#----------------------------------#
334 local this_script=$1
335 local file=$2
336(
337cat << EOF
338 @( time { export LFS=\$(MOUNT_PT) && ${PROGNAME}-commands/$file >>logs/$this_script 2>&1 ; } ) 2>>logs/$this_script && \\
339 echo -e "\nKB: \`du -skx --exclude=jhalfs \$(MOUNT_PT)\`\n" >>logs/$this_script
340EOF
341) >> $MKFILE.tmp
342}
343
344
345#----------------------------------#
346wrt_run_as_root2() { #
347#----------------------------------#
348 local this_script=$1
349 local file=$2
350(
351cat << EOF
352 @( time { source envars && ${PROGNAME}-commands/$file >>logs/$this_script 2>&1 ; } ) 2>>logs/$this_script && \\
353 echo -e "\nKB: \`du -skx --exclude=jhalfs \`\n" >>logs/$this_script
354EOF
355) >> $MKFILE.tmp
356}
357
358
359
360#----------------------------------#
361wrt_run_as_chroot1() { #
362#----------------------------------#
363 local this_script=$1
364 local file=$2
365(
366 cat << EOF
367 @( time { \$(CHROOT1) 'cd /jhalfs && source envars && /jhalfs/${PROGNAME}-commands/$file >>/jhalfs/logs/${this_script} 2>&1' ; } ) 2>>logs/$this_script && \\
368 echo -e "\nKB: \`du -skx --exclude=jhalfs \$(MOUNT_PT)\`\n" >>logs/${this_script}
369EOF
370) >> $MKFILE.tmp
371}
372
373
374#----------------------------------#
375wrt_run_as_chroot2() { #
376#----------------------------------#
377 local this_script=$1
378 local file=$2
379(
380cat << EOF
381 @( time { \$(CHROOT2) 'cd /jhalfs && source envars && /jhalfs/${PROGNAME}-commands/$file >>/jhalfs/logs/${this_script} 2>&1' ; } ) 2>>logs/$this_script && \\
382 echo -e "\nKB: \`du -skx --exclude=jhalfs \$(MOUNT_PT)\`\n" >>logs/${this_script}
383EOF
384) >> $MKFILE.tmp
385}
386
387
388#----------------------------------#
389wrt_copy_fstab() { #
390#----------------------------------#
391 local i=$1
392(
393 cat << EOF
394 @cp -v $FSTAB \$(MOUNT_PT)/etc/fstab >>logs/$i 2>&1
395EOF
396) >> $MKFILE.tmp
397}
398
399#----------------------------------#
400wrt_copy_fstab2() { #
401#----------------------------------#
402 local i=$1
403(
404 cat << EOF
405 @cp -v /sources/fstab /etc/fstab >>logs/$i 2>&1
406EOF
407) >> $MKFILE.tmp
408}
409
410
411#----------------------------------#
412wrt_remove_build_dirs() { #
413#----------------------------------#
414 local name=$1
415(
416cat << EOF
417 @ROOT=\`head -n1 /tmp/unpacked | sed 's@^./@@;s@/.*@@'\` && \\
418 rm -r \$(MOUNT_PT)\$(SRC)/\$\$ROOT && \\
419 if [ -e \$(MOUNT_PT)\$(SRC)/$name-build ]; then \\
420 rm -r \$(MOUNT_PT)\$(SRC)/$name-build; \\
421 fi;
422EOF
423) >> $MKFILE.tmp
424}
425
426
427#----------------------------------#
428wrt_remove_build_dirs2() { #
429#----------------------------------#
430 local name=$1
431(
432cat << EOF
433 @ROOT=\`head -n1 /tmp/unpacked | sed 's@^./@@;s@/.*@@'\` && \\
434 rm -r \$(SRC)/\$\$ROOT && \\
435 if [ -e \$(SRC)/$name-build ]; then \\
436 rm -r \$(SRC)/$name-build; \\
437 fi;
438EOF
439) >> $MKFILE.tmp
440}
441
442
443#----------------------------------#
444wrt_report() { #
445#----------------------------------#
446(
447cat << EOF
448
449create-sbu_du-report: $PREV
450 @\$(call echo_message, Building)
451 @./create-sbu_du-report.sh logs $VERSION
452 @\$(call echo_report,$VERSION-SBU_DU-$(date --iso-8601).report)
453 @touch \$@
454EOF
455) >> $MKFILE.tmp
456
457chapter789="$chapter789 create-sbu_du-report"
458}
459
460
461#----------------------------#
462run_make() { #
463#----------------------------#
464 # Test if make must be run.
465 if [ "$RUNMAKE" = "1" ] ; then
466 # Test to make sure we're running the build as root
467 if [ "$UID" != "0" ] ; then
468 echo "You must be logged in as root to successfully build the system."
469 exit 1
470 fi
471 # Build the system
472 if [ -e $MKFILE ] ; then
473 echo -ne "Building the system...\n"
474 cd $JHALFSDIR && make
475 echo -ne "done\n"
476 fi
477 fi
478}
479
480
481#----------------------------#
482clean_builddir() { #
483#----------------------------#
484 # Test if the clean must be done.
485 if [ "$CLEAN" = "1" ] ; then
486 # Test to make sure we're running the clean as root
487 if [ "$UID" != "0" ] ; then
488 echo "You must be logged in as root to clean the build directory."
489 exit 1
490 fi
491 # Test to make sure that the build directory was populated by jhalfs
492 if [ ! -d $JHALFSDIR ] || [ ! -d $BUILDDIR/sources ] ; then
493 echo "Looks like $BUILDDIR was not populated by a previous jhalfs-X run."
494 exit 1
495 else
496 # Clean the build directory
497 echo -ne "Cleaning $BUILDDIR...\n"
498 rm -rf $BUILDDIR/{bin,boot,dev,etc,home,lib,media,mnt,opt,proc,root,sbin,srv,sys,tmp,tools,cross-tools,usr,var}
499 echo -ne "Cleaning $JHALFSDIR...\n"
500 rm -rf $JHALFSDIR/{0*,1*,envars,sources-dir,*commands,logs,Makefile,*.xsl,makefile-functions,packages,patches}
501 echo -ne "Cleaning remainig extracted sources in $BUILDDIR/sources...\n"
502 rm -rf `find $BUILDDIR/sources/* -maxdepth 0 -type d`
503 echo -ne "done\n"
504 fi
505 fi
506}
507
508#----------------------------#
509get_book() { #
510#----------------------------#
511 cd $JHALFSDIR
512
513 if [ -z $WC ] ; then
514 # Check for Subversion instead of just letting the script hit 'svn' and fail.
515 test `type -p svn` || eval "echo \"This feature requires Subversion.\"
516 exit 1"
517 echo -n "Downloading the $PROGNAME document, $LFSVRS version... "
518
519 case $PROGNAME in
520 lfs) svn_root="LFS" ;;
521 hlfs) svn_root="HLFS" ;;
522 clfs) svn_root="cross-lfs" ;;
523 blfs) svn_root="BLFS" ;;
524 *) echo "BOOK not defined in function <get_book>"
525 exit 1 ;;
526 esac
527 # Grab a fresh book if it's missing, otherwise, update it from the
528 # repo. If we've already extracted the commands, move on to getting the
529 # sources.
530 if [ -d ${PROGNAME}-$LFSVRS ] ; then
531 cd ${PROGNAME}-$LFSVRS
532 if LC_ALL=C svn up | grep -q At && test -d $JHALFSDIR/${PROGNAME}-commands && \
533 test -f $JHALFSDIR/packages ; then
534 echo -ne "done\n"
535 # Set the canonical book version
536 cd $JHALFSDIR
537 VERSION=`grep "ENTITY version " $BOOK/general.ent | sed 's@<!ENTITY version "@@;s@">@@'`
538 get_sources
539 else
540 echo -ne "done\n"
541 # Set the canonical book version
542 cd $JHALFSDIR
543 VERSION=`grep "ENTITY version " $BOOK/general.ent | sed 's@<!ENTITY version "@@;s@">@@'`
544 extract_commands
545 fi
546 else
547 case $LFSVRS in
548 development)
549 svn co $SVN/${svn_root}/trunk/BOOK ${PROGNAME}-$LFSVRS >>$LOGDIR/$LOG 2>&1 ;;
550 esac
551 echo -ne "done\n"
552 # Set the canonical book version
553 cd $JHALFSDIR
554 VERSION=`grep "ENTITY version " $BOOK/general.ent | sed 's@<!ENTITY version "@@;s@">@@'`
555 extract_commands
556 fi
557 else
558 echo -ne "Using $BOOK as book's sources ...\n"
559 # Set the canonical book version
560 cd $JHALFSDIR
561 VERSION=`grep "ENTITY version " $BOOK/general.ent | sed 's@<!ENTITY version "@@;s@">@@'`
562 extract_commands
563 fi
564}
565
566#----------------------------#
567extract_commands() { #
568#----------------------------#
569
570 # Check for libxslt instead of just letting the script hit 'xsltproc' and fail.
571 test `type -p xsltproc` || eval "echo \"This feature requires libxslt.\"
572 exit 1"
573
574 cd $JHALFSDIR
575 VERSION=`grep "ENTITY version " $BOOK/general.ent | sed 's@<!ENTITY version "@@;s@">@@'`
576
577 # Start clean
578 if [ -d ${PROGNAME}-commands ]; then
579 rm -rf ${PROGNAME}-commands
580 mkdir -v ${PROGNAME}-commands
581 fi
582 echo -n "Extracting commands for"
583
584 # Dump the commands in shell script form from the HLFS book.
585 case ${PROGNAME} in
586 clfs)
587 echo -n " ${L_arrow}${BOLD}$ARCH${R_arrow} target architecture"
588 xsltproc --nonet \
589 --xinclude \
590 --stringparam method $METHOD \
591 --stringparam testsuite $TEST \
592 --stringparam vim-lang $VIMLANG \
593 --stringparam timezone $TIMEZONE \
594 --stringparam page $PAGE \
595 --stringparam lang $LANG \
596 --stringparam keymap $KEYMAP \
597 -o ./${PROGNAME}-commands/ $XSL $BOOK/$ARCH-index.xml >>$LOGDIR/$LOG 2>&1
598 ;;
599 hlfs)
600 echo -n " ${L_arrow}${BOLD}$MODEL${R_arrow} HLFS libc implementation"
601 xsltproc --nonet \
602 --xinclude \
603 --stringparam model $MODEL \
604 --stringparam testsuite $TEST \
605 --stringparam timezone $TIMEZONE \
606 --stringparam page $PAGE \
607 --stringparam lang $LANG \
608 --stringparam lc_all $LC_ALL \
609 --stringparam keymap $KEYMAP \
610 --stringparam grsecurity_host $GRSECURITY_HOST \
611 -o ./${PROGNAME}-commands/ $XSL $BOOK/index.xml >>$LOGDIR/$LOG 2>&1
612 ;;
613 lfs)
614 echo -n " ${L_arrow}${BOLD}LFS${R_arrow} build"
615 xsltproc --nonet \
616 --xinclude \
617 --stringparam testsuite $TEST \
618 --stringparam vim-lang $VIMLANG \
619 --stringparam timezone $TIMEZONE \
620 --stringparam page $PAGE \
621 --stringparam lang $LANG \
622 -o ./${PROGNAME}-commands/ $XSL $BOOK/index.xml >>$LOGDIR/$LOG 2>&1
623 ;;
624 blfs)
625 echo -n " ${L_arrow}${BOLD}BLFS${R_arrow} build"
626 xsltproc --nonet \
627 --xinclude \
628 --stringparam testsuite $TEST \
629 --stringparam server $SERVER \
630 -o ./${PROGNAME}-commands/ $XSL $BOOK/index.xml >>$LOGDIR/$LOG 2>&1
631 ;;
632 *) exit 1 ;;
633 esac
634
635 echo " ...OK"
636
637 # Make the scripts executable.
638 chmod -R +x $JHALFSDIR/${PROGNAME}-commands
639
640 # Create the packages file. We need it for proper Makefile creation
641 rm -f packages
642 case "${PROGNAME}" in
643 clfs)
644 echo -n "Creating <${PROGNAME}> specific packages file"
645 grep "\-version " $BOOK/packages.ent | sed -e 's@<!ENTITY @@' \
646 -e 's@">@"@' \
647 -e '/generic/d' > packages
648 echo " ...OK"
649 ;;
650
651 hlfs)
652 echo -n "Creating <${PROGNAME}> specific packages file"
653 grep "\-version" $BOOK/general.ent | sed -e 's@<!ENTITY @@' \
654 -e 's@">@"@' \
655 -e '/generic/d' >> packages
656 echo " ...OK"
657 ;;
658
659 lfs)
660 echo -n "Creating <${PROGNAME}> specific packages file"
661 grep "\-version" $BOOK/general.ent | sed -e 's@<!ENTITY @@' \
662 -e 's@">@"@' \
663 -e '/generic/d' >> packages
664 echo " ...OK"
665 ;;
666 esac
667
668 # Done. Moving on...
669 get_sources
670}
671
672#----------------------------#
673get_sources() { # Download file, write name to MISSING_FILES.DMP if an error
674#----------------------------#
675 local saveIFS=$IFS
676 local IFS line URL1 URL2 FILE MD5 HAVEMD5 fromARCHIVE
677
678 # Test if the packages must be downloaded
679 [ ! "$GETPKG" = "1" ] && return
680
681 gs_wrt_message(){
682 echo "${RED}$1${OFF}"
683 echo "$1" >> MISSING_FILES.DMP
684 }
685 # Housekeeping
686 [[ ! -d $BUILDDIR/sources ]] && mkdir $BUILDDIR/sources
687 cd $BUILDDIR/sources
688 [[ -f MD5SUMS ]] && rm MD5SUMS
689 [[ -f MD5SUMS-$VERSION ]] && rm MD5SUMS-$VERSION
690 [[ -f MISSING_FILES.DMP ]] && rm MISSING_FILES.DMP
691 [[ -f urls.lst ]] && rm urls.lst
692
693 # Download a fresh MD5SUMS file
694 wget $SERVER/pub/lfs/conglomeration/MD5SUMS
695
696 # Generate URLs file
697 create_urls
698
699 IFS=$'\x0A' # Modify the 'internal field separator' to break on 'LF' only
700 for line in `cat urls.lst`; do
701 IFS=$saveIFS # Restore the system defaults
702
703 # Skip some packages if they aren't needed
704 case $line in
705 */tcl* | */expect* | */dejagnu* | */tree* | */gcc-testsuite* )
706 [[ "$TEST" = "0" ]] && continue
707 ;;
708 */vim-*-lang* )
709 [[ "$VIMLANG" = "0" ]] && continue
710 ;;
711 esac
712
713 # Locations
714 URL1=`echo $line | cut -d" " -f2` # Preferred URL
715 URL2=`echo $line | cut -d" " -f1` # Fallback Upstream URL
716 FILE=`basename $URL2` # File name
717
718 # Find the md5 sum for this package.
719 set +e
720 HAVEMD5=1 # Always assume we have a MD5SUM
721 MD5=`grep " $FILE" MD5SUMS`
722 if [ $? -ne 0 ]; then
723 set -e
724 gs_wrt_message "$FILE not found in MD5SUMS"
725 # IMPORTANT:: There is no MD5SUM for this file.
726 HAVEMD5=0
727 fi
728
729 set -e
730 # If the file exists in the archive copy it to the
731 # $BUILDDIR/sources dir. MD5SUM will be validated later.
732 if [ ! -z ${SRC_ARCHIVE} ] &&
733 [ -d ${SRC_ARCHIVE} ] &&
734 [ -f ${SRC_ARCHIVE}/$FILE ]; then
735 cp ${SRC_ARCHIVE}/$FILE .
736 echo "$FILE: -- copied from $SRC_ARCHIVE"
737 fromARCHIVE=1
738 else
739 echo "${BOLD}${YELLOW}$FILE: not found in ${SRC_ARCHIVE}${OFF}"
740 fromARCHIVE=0
741 # If the file does not exist in /sources download a fresh one
742 if [ ! -f $FILE ] ; then
743 if ! wget $URL1 && ! wget $URL2 ; then
744 gs_wrt_message "$FILE not found in the SRC_ARCHIVE or on any server..SKIPPING"
745 continue
746 fi
747 fi
748 fi
749
750 # Is there a MD5SUM to validate the file against.
751 if [[ "$HAVEMD5" = "1" ]] ; then
752 # IF the md5sum does not match the existing files
753 if ! echo "$MD5" | md5sum -c - >/dev/null ; then
754 [[ $fromARCHIVE = "1" ]] && echo "${BOLD}${YELLOW}MD5SUM did not match SRC_ARCHIVE copy${OFF}"
755 [[ $fromARCHIVE = "0" ]] && echo "${BOLD}${YELLOW}MD5SUM did not match REMOTE copy${OFF}"
756 # Remove the old file and download a new one
757 rm -fv $FILE
758 # Force generation of MD5SUM and storage in SRC_ARCHIVE
759 fromARCHIVE=0; HAVEMD5=0
760 # Try and retrieve the file
761 if ! wget -N $URL1 && ! wget -N $URL2 ; then
762 gs_wrt_message "$FILE not found on the servers.. SKIPPING"
763 continue
764 fi
765 fi
766 fi
767
768 # Validate the MD5SUM one last time
769 if [[ "$HAVEMD5" = "1" ]] && ! echo "$MD5" | md5sum -c - >/dev/null ; then
770 gs_wrt_message "$FILE does not match MD5SUMS value"
771 fi
772
773 # Generate a fresh MD5SUM for this file
774 if [[ "$HAVEMD5" = "0" ]] ; then
775 echo "${BOLD}${YELLOW}Generating a new MD5SUM for ${OFF}$FILE"
776 echo "NEW MD5SUM $(md5sum $FILE)" >> MISSING_FILES.DMP
777 fi
778
779 # Good or bad we write the original md5sum to a file
780 echo "$MD5" >> MD5SUMS-$VERSION
781
782 # Copy the freshly downloaded file
783 # to the source archive.
784 if [ ! -z ${SRC_ARCHIVE} ] &&
785 [ -d ${SRC_ARCHIVE} ] &&
786 [ -w ${SRC_ARCHIVE} ] &&
787 [ "$fromARCHIVE" = "0" ] ; then
788 echo "Storing file:<$FILE> in the package archive"
789 cp -f $FILE ${SRC_ARCHIVE}
790 fi
791
792 done
793
794 if [[ -s MISSING_FILES.DMP ]]; then
795 echo -e "\n\n${tab_}${RED} One or more files were not retrieved or have a bad MD5SUMS chechsum.\n${tab_} Check ${L_arrow}$BUILDDIR/sources/MISSING_FILES.DMP${R_arrow} for names ${OFF}\n"
796 # Do not allow the automatic exection of the Makefile.
797 echo "${tab_}${BOLD}${RED}*** ${YELLOW}Automatic execution of the generated makefile has been inhibited. ${RED}***${OFF}${nl_}"
798 RUNMAKE=0
799 fi
800}
801
802
803#----------------------------#
804create_urls() { #
805#----------------------------#
806 cd $JHALFSDIR
807
808 case ${PROGNAME} in
809 clfs)
810 echo -n "Creating CLFS <${ARCH}> specific URLs file"
811 xsltproc --nonet --xinclude \
812 --stringparam server $SERVER \
813 -o $BUILDDIR/sources/urls.lst urls.xsl \
814 $BOOK/materials/$ARCH-chapter.xml >>$LOGDIR/$LOG 2>&1
815 echo " ...OK"
816 ;;
817 hlfs)
818 echo -n "Creating HLFS <${MODEL}> specific URLs file"
819 xsltproc --nonet --xinclude \
820 --stringparam server $SERVER \
821 --stringparam model $MODEL \
822 -o $BUILDDIR/sources/urls.lst urls.xsl \
823 $BOOK/chapter04/chapter04.xml >>$LOGDIR/$LOG 2>&1
824 echo " ...OK"
825 ;;
826 lfs)
827 echo -n "Creating LFS specific URLs file"
828 xsltproc --nonet --xinclude \
829 --stringparam server $SERVER \
830 -o ../sources/urls.lst urls.xsl \
831 $BOOK/chapter03/chapter03.xml >>$LOGDIR/$LOG 2>&1
832 echo " ...OK"
833 ;;
834 esac
835
836 cd $BUILDDIR/sources
837}
Note: See TracBrowser for help on using the repository browser.