source: common/common-functions@ a7db907

1.0 2.3 2.3.x 2.4 ablfs ablfs-more legacy new_features trunk
Last change on this file since a7db907 was a7db907, checked in by George Boudreau <georgeb@…>, 18 years ago

CLFS changed definition of VERSION.. added fix

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