source: common/common-functions@ ac1d897

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

Small correction to CLFS master.sh, bring it in line with the book.

Added to README.

  • Property mode set to 100644
File size: 26.2 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#----------------------------#
211get_package_tarball_name() { #
212#----------------------------#
213 local script_name=$1
214
215 # The use of 'head' is necessary to limit the return value to the FIRST match..
216 # hopefully this will not cause problems.
217 #
218 case $script_name in
219 tcl) echo $(grep "^tcl" $JHALFSDIR/pkg_tarball_list | head -n1 ) ;;
220 *) echo $(grep "^$script_name-[[:digit:]]" $JHALFSDIR/pkg_tarball_list | head -n1 ) ;;
221 esac
222
223}
224
225#----------------------------------#
226wrt_remove_existing_dirs() { #
227#----------------------------------#
228 local PKG_NAME=$1
229(
230cat << EOF
231 @PKG_PATH=\`ls -t \$(MOUNT_PT)\$(SRC)/${PKG_NAME} | head -n1\` && \\
232 ROOT=\`tar -tf \$\$PKG_PATH | head -n1 | sed -e 's@^./@@;s@/.*@@'\` && \\
233 [[ -n \$\$ROOT ]] && \\
234 rm -rf \$(MOUNT_PT)\$(SRC)/\$\$ROOT && \\
235 if [ -e \$(MOUNT_PT)\$(SRC)/${PKG_NAME%-*}-build ]; then \\
236 rm -rf \$(MOUNT_PT)\$(SRC)/${PKG_NAME%-*}-build; \\
237 fi;
238EOF
239) >> $MKFILE.tmp
240}
241
242#----------------------------------#
243wrt_remove_existing_dirs2() { #
244#----------------------------------#
245 local PKG_NAME=$1
246(
247cat << EOF
248 @PKG_PATH=\`ls -t \$(SRC)/${PKG_NAME} | head -n1\` && \\
249 ROOT=\`tar -tf \$\$PKG_PATH | head -n1 | sed -e 's@^./@@;s@/.*@@'\` && \\
250 [[ -n \$\$ROOT ]] && \\
251 rm -rf \$(SRC)/\$\$ROOT && \\
252 if [ -e \$(SRC)/${PKG_NAME%-*}-build ]; then \\
253 rm -rf \$(SRC)/${PKG_NAME%-*}-build; \\
254 fi;
255EOF
256) >> $MKFILE.tmp
257}
258
259
260
261#----------------------------------#
262wrt_unpack() { # Unpack and set 'ROOT' var
263#----------------------------------#
264 local FILE=$1
265 local optSAVE_PREVIOUS=$2
266
267 if [ "${optSAVE_PREVIOUS}" != "1" ]; then
268 wrt_remove_existing_dirs "$FILE"
269 fi
270(
271cat << EOF
272 @\$(call unpack,$FILE)
273 @ROOT=\`head -n1 \$(MOUNT_PT)\$(SRC)/\$(PKG_LST) | sed 's@^./@@;s@/.*@@'\` && \\
274 echo "export PKGDIR=\$(MOUNT_PT)\$(SRC)/\$\$ROOT" > envars && \\
275 chown -R lfs \$(MOUNT_PT)\$(SRC)/\$\$ROOT
276EOF
277) >> $MKFILE.tmp
278}
279
280
281#----------------------------------#
282wrt_unpack2() { #
283#----------------------------------#
284 local FILE=$1
285 local optSAVE_PREVIOUS=$2
286
287 if [ "${optSAVE_PREVIOUS}" != "1" ]; then
288 wrt_remove_existing_dirs "$FILE"
289 fi
290(
291cat << EOF
292 @\$(call unpack2,$FILE)
293 @ROOT=\`head -n1 \$(MOUNT_PT)\$(SRC)/\$(PKG_LST) | sed 's@^./@@;s@/.*@@'\` && \\
294 echo "export PKGDIR=\$(SRC)/\$\$ROOT" > envars
295EOF
296) >> $MKFILE.tmp
297}
298
299
300#----------------------------------#
301wrt_unpack3() { #
302#----------------------------------#
303 local FILE=$1
304 local optSAVE_PREVIOUS=$2
305
306 if [ "${optSAVE_PREVIOUS}" != "1" ]; then
307 wrt_remove_existing_dirs2 "$FILE"
308 fi
309(
310cat << EOF
311 @\$(call unpack3,$FILE)
312 @ROOT=\`head -n1 \$(SRC)/\$(PKG_LST) | sed 's@^./@@;s@/.*@@'\` && \\
313 echo "export PKGDIR=\$(SRC)/\$\$ROOT" > envars
314EOF
315) >> $MKFILE.tmp
316}
317
318#----------------------------------#
319wrt_test_log() { # Initialize testsuite log file
320#----------------------------------#
321 local TESTLOGFILE=$1
322(
323cat << EOF
324 @echo "export TEST_LOG=$TESTLOGDIR/$TESTLOGFILE" >> envars && \\
325 su - lfs -c "echo -e '\n\`date\`\n' >$TESTLOGDIR/$TESTLOGFILE"
326EOF
327) >> $MKFILE.tmp
328}
329
330#----------------------------------#
331wrt_test_log2() { #
332#----------------------------------#
333 local TESTLOGFILE=$1
334(
335cat << EOF
336 @echo "export TEST_LOG=/$SCRIPT_ROOT/test-logs/$TESTLOGFILE" >> envars && \\
337 echo -e "\n\`date\`\n" >test-logs/$TESTLOGFILE
338EOF
339) >> $MKFILE.tmp
340}
341
342#----------------------------------#
343wrt_target_vars() { # Target vars for hlfs (cross-build method)
344#----------------------------------#
345(
346cat << EOF
347 @echo "export target=$(uname -m)-${TARGET}" >> envars && \\
348 echo "export ldso=/lib/${LOADER}" >> envars
349EOF
350) >> $MKFILE.tmp
351
352}
353
354
355#----------------------------------#
356wrt_run_as_su() { # Execute script inside time { }, footer to log file
357#----------------------------------#
358 local this_script=$1
359 local file=$2
360(
361cat << EOF
362 @( time { su - lfs -c "source /home/lfs/.bashrc && $JHALFSDIR/${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_root() { # Some scripts must be run as root..
371#----------------------------------#
372 local this_script=$1
373 local file=$2
374(
375cat << EOF
376 @( time { export LFS=\$(MOUNT_PT) && ${PROGNAME}-commands/$file >>logs/$this_script 2>&1 ; } ) 2>>logs/$this_script && \\
377 echo -e "\nKB: \`du -skx --exclude=${SCRIPT_ROOT} \$(MOUNT_PT)\`\n" >>logs/$this_script
378EOF
379) >> $MKFILE.tmp
380}
381
382
383#----------------------------------#
384wrt_run_as_clfs_root() { # Some scripts must be run as root..
385#----------------------------------#
386 local this_script=$1
387 local file=$2
388(
389cat << EOF
390 @( time { export CLFS=\$(MOUNT_PT) && ${PROGNAME}-commands/$file >>logs/$this_script 2>&1 ; } ) 2>>logs/$this_script && \\
391 echo -e "\nKB: \`du -skx --exclude=${SCRIPT_ROOT} \$(MOUNT_PT)\`\n" >>logs/$this_script
392EOF
393) >> $MKFILE.tmp
394}
395
396
397#----------------------------------#
398wrt_run_as_root2() { #
399#----------------------------------#
400 local this_script=$1
401 local file=$2
402(
403cat << EOF
404 @( time { source envars && ${PROGNAME}-commands/$file >>logs/$this_script 2>&1 ; } ) 2>>logs/$this_script && \\
405 echo -e "\nKB: \`du -skx --exclude=${SCRIPT_ROOT} \`\n" >>logs/$this_script
406EOF
407) >> $MKFILE.tmp
408}
409
410
411
412#----------------------------------#
413wrt_run_as_chroot1() { #
414#----------------------------------#
415 local this_script=$1
416 local file=$2
417(
418 cat << EOF
419 @( time { \$(CHROOT1) 'cd /${SCRIPT_ROOT} && source envars && /${SCRIPT_ROOT}/${PROGNAME}-commands/$file >>/${SCRIPT_ROOT}/logs/${this_script} 2>&1' ; } ) 2>>logs/$this_script && \\
420 echo -e "\nKB: \`du -skx --exclude=${SCRIPT_ROOT} \$(MOUNT_PT)\`\n" >>logs/${this_script}
421EOF
422) >> $MKFILE.tmp
423}
424
425
426#----------------------------------#
427wrt_run_as_chroot2() { #
428#----------------------------------#
429 local this_script=$1
430 local file=$2
431(
432cat << EOF
433 @( time { \$(CHROOT2) 'cd /${SCRIPT_ROOT} && source envars && /${SCRIPT_ROOT}/${PROGNAME}-commands/$file >>/${SCRIPT_ROOT}/logs/${this_script} 2>&1' ; } ) 2>>logs/$this_script && \\
434 echo -e "\nKB: \`du -skx --exclude=${SCRIPT_ROOT} \$(MOUNT_PT)\`\n" >>logs/${this_script}
435EOF
436) >> $MKFILE.tmp
437}
438
439
440#----------------------------------#
441wrt_copy_fstab() { #
442#----------------------------------#
443 local i=$1
444(
445 cat << EOF
446 @cp -v $FSTAB \$(MOUNT_PT)/etc/fstab >>logs/$i 2>&1
447EOF
448) >> $MKFILE.tmp
449}
450
451#----------------------------------#
452wrt_copy_fstab2() { #
453#----------------------------------#
454 local i=$1
455(
456 cat << EOF
457 @cp -v /sources/fstab /etc/fstab >>logs/$i 2>&1
458EOF
459) >> $MKFILE.tmp
460}
461
462
463#----------------------------------#
464wrt_remove_build_dirs() { #
465#----------------------------------#
466 local name=$1
467(
468cat << EOF
469 @ROOT=\`head -n1 \$(MOUNT_PT)\$(SRC)/\$(PKG_LST) | sed 's@^./@@;s@/.*@@'\` && \\
470 rm -r \$(MOUNT_PT)\$(SRC)/\$\$ROOT && \\
471 if [ -e \$(MOUNT_PT)\$(SRC)/$name-build ]; then \\
472 rm -r \$(MOUNT_PT)\$(SRC)/$name-build; \\
473 fi;
474EOF
475) >> $MKFILE.tmp
476}
477
478
479#----------------------------------#
480wrt_remove_build_dirs2() { #
481#----------------------------------#
482 local name=$1
483(
484cat << EOF
485 @ROOT=\`head -n1 \$(SRC)/\$(PKG_LST) | sed 's@^./@@;s@/.*@@'\` && \\
486 rm -r \$(SRC)/\$\$ROOT && \\
487 if [ -e \$(SRC)/$name-build ]; then \\
488 rm -r \$(SRC)/$name-build; \\
489 fi;
490EOF
491) >> $MKFILE.tmp
492}
493
494
495#----------------------------------#
496wrt_touch() { #
497#----------------------------------#
498(
499cat << EOF
500 @touch \$@ && \\
501 sleep .25 && \\
502 echo -e "\n\n "\$(BOLD)Target \$(BLUE)\$@ \$(BOLD)OK && \\
503 echo --------------------------------------------------------------------------------\$(WHITE)
504EOF
505) >> $MKFILE.tmp
506}
507
508
509#----------------------------------#
510wrt_report() { #
511#----------------------------------#
512(
513cat << EOF
514
515create-sbu_du-report: $PREV
516 @\$(call echo_message, Building)
517 @./create-sbu_du-report.sh logs $VERSION
518 @\$(call echo_report,$VERSION-SBU_DU-$(date --iso-8601).report)
519 @touch \$@
520EOF
521) >> $MKFILE.tmp
522
523chapter789="$chapter789 create-sbu_du-report"
524}
525
526
527#----------------------------#
528run_make() { #
529#----------------------------#
530 # Test if make must be run.
531 if [ "$RUNMAKE" = "1" ] ; then
532 # Test to make sure we're running the build as root
533 if [ "$UID" != "0" ] ; then
534 echo "You must be logged in as root to successfully build the system."
535 exit 1
536 fi
537 # Build the system
538 if [ -e $MKFILE ] ; then
539 echo -ne "Building the system...\n"
540 cd $JHALFSDIR && make
541 echo -ne "done\n"
542 fi
543 fi
544}
545
546
547#----------------------------#
548clean_builddir() { #
549#----------------------------#
550 # Test if the clean must be done.
551 if [ "$CLEAN" = "1" ] ; then
552 # Test to make sure we're running the clean as root
553 if [ "$UID" != "0" ] ; then
554 echo "You must be logged in as root to clean the build directory."
555 exit 1
556 fi
557 # Test to make sure that the build directory was populated by jhalfs
558 if [ ! -d $JHALFSDIR ] || [ ! -d $BUILDDIR/sources ] ; then
559 echo "Looks like $BUILDDIR was not populated by a previous jhalfs run."
560 exit 1
561 else
562 # Clean the build directory
563 echo -ne "Cleaning $BUILDDIR...\n"
564 rm -rf $BUILDDIR/{bin,boot,dev,etc,home,lib,media,mnt,opt,proc,root,sbin,srv,sys,tmp,tools,cross-tools,usr,var}
565 echo -ne "Cleaning $JHALFSDIR...\n"
566 rm -rf $JHALFSDIR/{0*,1*,envars,sources-dir,*commands,*logs,Makefile,*.xsl,makefile-functions,pkg_tarball_list,*.config,*.sh}
567 echo -ne "Cleaning remainig extracted sources in $BUILDDIR/sources...\n"
568 rm -rf `find $BUILDDIR/sources/* -maxdepth 0 -type d`
569 echo -ne "done\n"
570 fi
571 fi
572}
573
574#----------------------------#
575get_book() { #
576#----------------------------#
577 cd $JHALFSDIR
578
579 if [ -z $WC ] ; then
580 # Check for Subversion instead of just letting the script hit 'svn' and fail.
581 test `type -p svn` || eval "echo \"This feature requires Subversion.\"
582 exit 1"
583 echo -n "Downloading the $PROGNAME document, $LFSVRS version... "
584
585 case $PROGNAME in
586 lfs) svn_root="LFS" ;;
587 hlfs) svn_root="HLFS" ;;
588 clfs) svn_root="cross-lfs" ;;
589 *) echo "BOOK not defined in function <get_book>"
590 exit 1 ;;
591 esac
592 # Grab a fresh book if it's missing, otherwise, update it from the
593 # repo. If we've already extracted the commands, move on to getting the
594 # sources.
595 if [ -d ${PROGNAME}-$LFSVRS ] ; then
596 cd ${PROGNAME}-$LFSVRS
597 if LC_ALL=C svn up | grep -q At && \
598 test -d $JHALFSDIR/${PROGNAME}-commands && \
599 test -f $JHALFSDIR/pkg_tarball_list ; then
600 # Set the canonical book version
601 echo -ne "done\n"
602 cd $JHALFSDIR
603 case $PROGNAME in
604 clfs)
605 VERSION=$(xmllint --noent $BOOK/prologue/$ARCH/bookinfo.xml 2>/dev/null | grep subtitle | sed -e 's/^.*ion //' -e 's/<\/.*//') ;;
606 *)
607 VERSION=$(xmllint --noent $BOOK/prologue/bookinfo.xml 2>/dev/null | grep subtitle | sed -e 's/^.*ion //' -e 's/<\/.*//') ;;
608 esac
609 get_sources
610 else
611 echo -ne "done\n"
612 extract_commands
613 fi
614 else
615 case $LFSVRS in
616 development)
617 svn co $SVN/${svn_root}/trunk/BOOK ${PROGNAME}-$LFSVRS >>$LOGDIR/$LOG 2>&1 ;;
618 esac
619 echo -ne "done\n"
620 extract_commands
621 fi
622
623 else
624 echo -ne "Using $BOOK as book's sources ...\n"
625 extract_commands
626 fi
627 echo -ne " Document version ${L_arrow}${BOLD}${VERSION}${R_arrow}\n"
628}
629
630#----------------------------#
631extract_commands() { #
632#----------------------------#
633
634 # Check for libxslt instead of just letting the script hit 'xsltproc' and fail.
635 test `type -p xsltproc` || eval "echo \"This feature requires libxslt.\"
636 exit 1"
637
638 cd $JHALFSDIR
639 case $PROGNAME in
640 clfs)
641 VERSION=$(xmllint --noent $BOOK/prologue/$ARCH/bookinfo.xml 2>/dev/null | grep subtitle | sed -e 's/^.*ion //' -e 's/<\/.*//') ;;
642 *)
643 VERSION=$(xmllint --noent $BOOK/prologue/bookinfo.xml 2>/dev/null | grep subtitle | sed -e 's/^.*ion //' -e 's/<\/.*//') ;;
644 esac
645
646 # Start clean
647 if [ -d ${PROGNAME}-commands ]; then
648 rm -rf ${PROGNAME}-commands
649 mkdir -v ${PROGNAME}-commands
650 fi
651 echo -n "Extracting commands for"
652
653 # Dump the commands in shell script form from the HLFS book.
654 case ${PROGNAME} in
655 clfs)
656 echo -n " ${L_arrow}${BOLD}$ARCH${R_arrow} target architecture"
657 xsltproc --nonet \
658 --xinclude \
659 --stringparam method $METHOD \
660 --stringparam testsuite $TEST \
661 --stringparam vim-lang $VIMLANG \
662 --stringparam timezone $TIMEZONE \
663 --stringparam page $PAGE \
664 --stringparam lang $LANG \
665 --stringparam keymap $KEYMAP \
666 -o ./${PROGNAME}-commands/ $XSL $BOOK/$ARCH-index.xml >>$LOGDIR/$LOG 2>&1
667 ;;
668 hlfs)
669 echo -n " ${L_arrow}${BOLD}$MODEL${R_arrow} HLFS libc implementation"
670 xsltproc --nonet \
671 --xinclude \
672 --stringparam model $MODEL \
673 --stringparam testsuite $TEST \
674 --stringparam timezone $TIMEZONE \
675 --stringparam page $PAGE \
676 --stringparam lang $LANG \
677 --stringparam lc_all $LC_ALL \
678 --stringparam keymap $KEYMAP \
679 --stringparam grsecurity_host $GRSECURITY_HOST \
680 -o ./${PROGNAME}-commands/ $XSL $BOOK/index.xml >>$LOGDIR/$LOG 2>&1
681 ;;
682 lfs)
683 echo -n " ${L_arrow}${BOLD}LFS${R_arrow} build"
684 xsltproc --nonet \
685 --xinclude \
686 --stringparam testsuite $TEST \
687 --stringparam vim-lang $VIMLANG \
688 --stringparam timezone $TIMEZONE \
689 --stringparam page $PAGE \
690 --stringparam lang $LANG \
691 -o ./${PROGNAME}-commands/ $XSL $BOOK/index.xml >>$LOGDIR/$LOG 2>&1
692 ;;
693 *) exit 1 ;;
694 esac
695
696 echo " ...OK"
697
698 # Make the scripts executable.
699 chmod -R +x $JHALFSDIR/${PROGNAME}-commands
700
701 # Create the packages file. We need it for proper Makefile creation
702 create_package_list
703
704 # Done. Moving on...
705 get_sources
706}
707
708#----------------------------#
709create_package_list() { #
710#----------------------------#
711
712 # Create the packages file. We need it for proper Makefile creation
713 rm -f pkg_tarball_list
714 echo -n "Creating <${PROGNAME}> list of tarball names for $BOOK $ARCH"
715 case ${PROGNAME} in
716 clfs)
717 xsltproc --nonet --xinclude -o pkg_tarball_list packages.xsl \
718 $BOOK/materials/${ARCH}-chapter.xml >>$LOGDIR/$LOG 2>&1
719 ;;
720 hlfs)
721 xsltproc --nonet --xinclude -o pkg_tarball_list packages.xsl \
722 $BOOK/chapter04/chapter04.xml >>$LOGDIR/$LOG 2>&1
723 ;;
724 lfs)
725 xsltproc --nonet --xinclude -o pkg_tarball_list packages.xsl \
726 $BOOK/chapter03/chapter03.xml >>$LOGDIR/$LOG 2>&1
727 ;;
728 esac
729 echo " ...OK"
730
731}
732
733
734#----------------------------#
735get_sources() { # Download file, write name to MISSING_FILES.DMP if an error
736#----------------------------#
737 local saveIFS=$IFS
738 local IFS line URL1 URL2 FILE BOOKMD5 MD5 HAVEMD5 fromARCHIVE
739
740 # Test if the packages must be downloaded
741 [ ! "$GETPKG" = "1" ] && return
742
743 gs_wrt_message(){
744 echo "${RED}$1${OFF}"
745 echo "$1" >> MISSING_FILES.DMP
746 }
747 # Housekeeping
748 [[ ! -d $BUILDDIR/sources ]] && mkdir $BUILDDIR/sources
749 cd $BUILDDIR/sources
750 [[ -f MD5SUMS ]] && rm MD5SUMS
751 [[ -f MISSING_FILES.DMP ]] && rm MISSING_FILES.DMP
752 [[ -f urls.lst ]] && rm urls.lst
753
754 # Generate URLs file
755 create_urls
756
757 IFS=$'\x0A' # Modify the 'internal field separator' to break on 'LF' only
758 for line in `cat urls.lst`; do
759 IFS=$saveIFS # Restore the system defaults
760
761 # Skip some packages if they aren't needed
762 case $line in
763 */tcl* | */expect* | */dejagnu* | */tree* | */gcc-testsuite* )
764 [[ "$TEST" = "0" ]] && continue
765 ;;
766 */vim-*-lang* )
767 [[ "$VIMLANG" = "0" ]] && continue
768 ;;
769 *linux/linux-* )
770 [[ -z "$CONFIG" ]] && [[ -z "$BOOT_CONFIG" ]] && \
771 [[ "$GETKERNEL" = "0" ]] && continue
772 ;;
773 esac
774
775 # Locations
776 URL1=`echo $line | cut -d" " -f2` # Preferred URL
777 URL2=`echo $line | cut -d" " -f1` # Fallback Upstream URL
778 FILE=`basename $URL1` # File name
779 BOOKMD5=`echo $line | cut -d" " -f3` # MD5 book value
780
781 # Validation pair
782 MD5="$BOOKMD5 $FILE"
783 HAVEMD5=1
784
785 set -e
786 # If the file exists in the archive copy it to the
787 # $BUILDDIR/sources dir. MD5SUM will be validated later.
788 if [ ! -z ${SRC_ARCHIVE} ] &&
789 [ -d ${SRC_ARCHIVE} ] &&
790 [ -f ${SRC_ARCHIVE}/$FILE ]; then
791 cp ${SRC_ARCHIVE}/$FILE .
792 echo "$FILE: -- copied from $SRC_ARCHIVE"
793 fromARCHIVE=1
794 else
795 echo "${BOLD}${YELLOW}$FILE: not found in ${SRC_ARCHIVE}${OFF}"
796 fromARCHIVE=0
797 # If the file does not exist yet in /sources download a fresh one
798 if [ ! -f $FILE ] ; then
799 if ! wget $URL1 && ! wget $URL2 ; then
800 gs_wrt_message "$FILE not found in the SRC_ARCHIVE or on any server..SKIPPING"
801 continue
802 fi
803 fi
804 fi
805
806 # IF the md5sum does not match the existing files
807 if ! echo "$MD5" | md5sum -c - >/dev/null ; then
808 [[ $fromARCHIVE = "1" ]] && echo "${BOLD}${YELLOW}MD5SUM did not match SRC_ARCHIVE copy${OFF}"
809 [[ $fromARCHIVE = "0" ]] && echo "${BOLD}${YELLOW}MD5SUM did not match REMOTE copy${OFF}"
810 # Remove the old file and download a new one
811 rm -fv $FILE
812 # Force storage in SRC_ARCHIVE
813 fromARCHIVE=0;
814 # Try to retrieve again the file. Servers in reverse order.
815 if ! wget $URL2 && ! wget $URL1 ; then
816 gs_wrt_message "$FILE not found on the servers.. SKIPPING"
817 continue
818 fi
819 fi
820
821 # Validate the MD5SUM one last time
822 if ! echo "$MD5" | md5sum -c - >/dev/null ; then
823 gs_wrt_message "$FILE does not match MD5SUMS value"
824 # Force generation of MD5SUM
825 HAVEMD5=0
826 fi
827
828 # Generate a fresh MD5SUM for this file
829 if [[ "$HAVEMD5" = "0" ]] ; then
830 echo "${BOLD}${YELLOW}Generating a new MD5SUM for ${OFF}$FILE"
831 echo "NEW MD5SUM: $(md5sum $FILE)" >> MISSING_FILES.DMP
832 fi
833
834 # Good or bad we write the original md5sum to a file
835 echo "$MD5" >> MD5SUMS
836
837 # Copy the freshly downloaded file
838 # to the source archive.
839 if [ ! -z ${SRC_ARCHIVE} ] &&
840 [ -d ${SRC_ARCHIVE} ] &&
841 [ -w ${SRC_ARCHIVE} ] &&
842 [ "$fromARCHIVE" = "0" ] ; then
843 echo "Storing file:<$FILE> in the package archive"
844 cp -f $FILE ${SRC_ARCHIVE}
845 fi
846
847 done
848
849 if [[ -s MISSING_FILES.DMP ]]; then
850 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"
851 # Do not allow the automatic exection of the Makefile.
852 echo "${tab_}${BOLD}${RED}*** ${YELLOW}Automatic execution of the generated makefile has been inhibited. ${RED}***${OFF}${nl_}"
853 RUNMAKE=0
854 fi
855}
856
857#----------------------------#
858create_urls() { #
859#----------------------------#
860 cd $JHALFSDIR
861
862 case ${PROGNAME} in
863 clfs)
864 echo -n "Creating CLFS <${ARCH}> specific URLs file"
865 xsltproc --nonet --xinclude \
866 --stringparam server $SERVER \
867 -o $BUILDDIR/sources/urls.lst urls.xsl \
868 $BOOK/materials/$ARCH-chapter.xml >>$LOGDIR/$LOG 2>&1
869 echo " ...OK"
870 ;;
871 hlfs)
872 echo -n "Creating HLFS <${MODEL}> specific URLs file"
873 xsltproc --nonet --xinclude \
874 --stringparam server $SERVER \
875 --stringparam model $MODEL \
876 -o $BUILDDIR/sources/urls.lst urls.xsl \
877 $BOOK/chapter04/chapter04.xml >>$LOGDIR/$LOG 2>&1
878 echo " ...OK"
879 ;;
880 lfs)
881 echo -n "Creating LFS specific URLs file"
882 xsltproc --nonet --xinclude \
883 --stringparam server $SERVER \
884 -o ../sources/urls.lst urls.xsl \
885 $BOOK/chapter03/chapter03.xml >>$LOGDIR/$LOG 2>&1
886 echo " ...OK"
887 ;;
888 esac
889
890 cd $BUILDDIR/sources
891}
Note: See TracBrowser for help on using the repository browser.