source: common/common-functions@ 056486c

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

Ported r2882 from trunk.

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