source: common/common-functions@ ef969ee

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

Reworked book extraction code.. will handle future changes

  • Property mode set to 100644
File size: 25.8 KB
RevLine 
[877cc6a]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
[47e524f]27declare -r DD_BORDER="${BOLD}==============================================================================${OFF}"
28declare -r SD_BORDER="${BOLD}------------------------------------------------------------------------------${OFF}"
29declare -r STAR_BORDER="${BOLD}******************************************************************************${OFF}"
[877cc6a]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
[efc0d1e]42${RED}IMPORTANT:${OFF} Only supported command line switches are listed here.
[4dd25a1]43 For more fine-grained setups you must edit the relevant
[efc0d1e]44 configuration files placed under ${BOLD}common/${OFF} and ${BOLD}$(echo $PROGNAME | tr [a-z] [A-Z])/${OFF}
45
[877cc6a]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}
[e2fa2bd]54 use VER version of the book as the system to build.
55 Supported versions are: dev*, trunk, SVN
[1ec8fce]56 These are aliases for the Development version of {C,H}LFS
[877cc6a]57
58${BOLD} -D --directory DIR${OFF}
[73e5448]59 use DIR directory for building ${BOLD}$(echo $PROGNAME | tr [a-z] [A-Z])${OFF}; all files jhalfs produces
[1a1f099]60 will be in the directory DIR/${SCRIPT_ROOT}.
[511923a]61 The current setting for BUILDDIR is "$BUILDDIR"
[877cc6a]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
[1b65a84]68${BOLD} -O, --optimize${OFF}
69 Optimize [0-2]
70 0 = no optimization
[1ec8fce]71 1 = optimize final system only
72 2 = optimize both temporary tools and final system
[1b65a84]73 Edit common/opt_config{,.d/*} and common/opt_override as desired.
74
[877cc6a]75${BOLD} -T, --testsuites N ${OFF}
76 Run test suites [0-3]
77 0 = none
[0755d1a]78 1 = only final system Glibc, GCC and Binutils testsuites
79 2 = all final system testsuites
[b240ee6]80 3 = all temporary tools and final system testsuites
[877cc6a]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
[45f82718]86${BOLD} -C, --comparasion TYPE${OFF}
[e2fa2bd]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.
[6dcfd53]90 Types allowed are:
[e2fa2bd]91 ICA = do ICA as designed by Greg Schafer
[0ad851d]92 farce = do the farce analysis designed by Ken Moffat
93 both = perfom both ICA and farce analysis
[45f82718]94
[877cc6a]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}
[e2fa2bd]107 clean the build directory before perfoming any other task. The directory
[73e5448]108 is cleaned only if it was populated by a previous jhalfs run.
[877cc6a]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
[b0dd4bd]117 x86, i486, i586, ppc, mips, mipsel, sparc
[877cc6a]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
[c7c5a53]123${BOLD} --boot-config FILE ${OFF}
[877cc6a]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="
[73e5448]145${BOLD} \"jhalfs\"${OFF} builder tool (development) \$Rev$
[877cc6a]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
[73e5448]168 a different build directory before running jhalfs.
[877cc6a]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
[73e5448]183HEADER="# This file is automatically generated by jhalfs
[877cc6a]184# DO NOT EDIT THIS FILE MANUALLY
185#
186# Generated on `date \"+%F %X %Z\"`"
187
188
189
190#----------------------------------#
[3a321ea]191wrt_target() { # Create target and initialize log file
[877cc6a]192#----------------------------------#
193 local i=$1
194 local PREV=$2
[4edf3b7]195 case $i in
196 iteration* ) local LOGFILE=$this_script.log ;;
197 * ) local LOGFILE=$this_script ;;
198 esac
[877cc6a]199(
200cat << EOF
201
202$i: $PREV
203 @\$(call echo_message, Building)
[46758a2]204 @./progress_bar.sh \$@ &
[1a1f099]205 @echo -e "\n\`date\`\n\nKB: \`du -skx --exclude=${SCRIPT_ROOT} \$(MOUNT_PT)\`\n" >logs/$LOGFILE
[877cc6a]206EOF
207) >> $MKFILE.tmp
208}
209
[dd29d02]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}
[877cc6a]224
[5842156]225#----------------------------------#
226wrt_remove_existing_dirs() { #
227#----------------------------------#
228 local PKG_NAME=$1
229(
230cat << EOF
[3b3251a]231 @PKG_PATH=\`ls -t \$(MOUNT_PT)\$(SRC)/${PKG_NAME} | head -n1\` && \\
232 ROOT=\`tar -tf \$\$PKG_PATH | head -n1 | sed -e 's@^./@@;s@/.*@@'\` && \\
[5842156]233 [[ -n \$\$ROOT ]] && \\
234 rm -rf \$(MOUNT_PT)\$(SRC)/\$\$ROOT && \\
[15787a3]235 if [ -e \$(MOUNT_PT)\$(SRC)/${PKG_NAME%-*}-build ]; then \\
236 rm -rf \$(MOUNT_PT)\$(SRC)/${PKG_NAME%-*}-build; \\
[5842156]237 fi;
238EOF
239) >> $MKFILE.tmp
240}
241
242#----------------------------------#
243wrt_remove_existing_dirs2() { #
244#----------------------------------#
245 local PKG_NAME=$1
246(
247cat << EOF
[3b3251a]248 @PKG_PATH=\`ls -t \$(SRC)/${PKG_NAME} | head -n1\` && \\
249 ROOT=\`tar -tf \$\$PKG_PATH | head -n1 | sed -e 's@^./@@;s@/.*@@'\` && \\
[5842156]250 [[ -n \$\$ROOT ]] && \\
251 rm -rf \$(SRC)/\$\$ROOT && \\
[15787a3]252 if [ -e \$(SRC)/${PKG_NAME%-*}-build ]; then \\
253 rm -rf \$(SRC)/${PKG_NAME%-*}-build; \\
[5842156]254 fi;
255EOF
256) >> $MKFILE.tmp
257}
258
259
260
[877cc6a]261#----------------------------------#
262wrt_unpack() { # Unpack and set 'ROOT' var
263#----------------------------------#
264 local FILE=$1
[5842156]265 local optSAVE_PREVIOUS=$2
[82eb8c1]266
[5842156]267 if [ "${optSAVE_PREVIOUS}" != "1" ]; then
268 wrt_remove_existing_dirs "$FILE"
269 fi
[877cc6a]270(
271cat << EOF
272 @\$(call unpack,$FILE)
[82eb8c1]273 @ROOT=\`head -n1 \$(MOUNT_PT)\$(SRC)/\$(PKG_LST) | sed 's@^./@@;s@/.*@@'\` && \\
[877cc6a]274 echo "export PKGDIR=\$(MOUNT_PT)\$(SRC)/\$\$ROOT" > envars && \\
[15537d5]275 chown -R lfs \$(MOUNT_PT)\$(SRC)/\$\$ROOT
[877cc6a]276EOF
277) >> $MKFILE.tmp
278}
279
280
281#----------------------------------#
282wrt_unpack2() { #
283#----------------------------------#
284 local FILE=$1
[5842156]285 local optSAVE_PREVIOUS=$2
286
287 if [ "${optSAVE_PREVIOUS}" != "1" ]; then
288 wrt_remove_existing_dirs "$FILE"
289 fi
[877cc6a]290(
291cat << EOF
292 @\$(call unpack2,$FILE)
[a229600]293 @ROOT=\`head -n1 \$(MOUNT_PT)\$(SRC)/\$(PKG_LST) | sed 's@^./@@;s@/.*@@'\` && \\
[877cc6a]294 echo "export PKGDIR=\$(SRC)/\$\$ROOT" > envars
295EOF
296) >> $MKFILE.tmp
297}
298
299
[261eea6]300#----------------------------------#
301wrt_unpack3() { #
302#----------------------------------#
[877cc6a]303 local FILE=$1
[5842156]304 local optSAVE_PREVIOUS=$2
305
306 if [ "${optSAVE_PREVIOUS}" != "1" ]; then
307 wrt_remove_existing_dirs2 "$FILE"
308 fi
[877cc6a]309(
310cat << EOF
311 @\$(call unpack3,$FILE)
[82eb8c1]312 @ROOT=\`head -n1 \$(SRC)/\$(PKG_LST) | sed 's@^./@@;s@/.*@@'\` && \\
[877cc6a]313 echo "export PKGDIR=\$(SRC)/\$\$ROOT" > envars
314EOF
315) >> $MKFILE.tmp
316}
317
[a229600]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
[877cc6a]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#----------------------------------#
[3a321ea]356wrt_run_as_su() { # Execute script inside time { }, footer to log file
[877cc6a]357#----------------------------------#
358 local this_script=$1
359 local file=$2
360(
361cat << EOF
[3a321ea]362 @( time { su - lfs -c "source /home/lfs/.bashrc && $JHALFSDIR/${PROGNAME}-commands/$file" >>logs/$this_script 2>&1 ; } ) 2>>logs/$this_script && \\
[1a1f099]363 echo -e "\nKB: \`du -skx --exclude=${SCRIPT_ROOT} \$(MOUNT_PT)\`\n" >>logs/$this_script
[877cc6a]364EOF
365) >> $MKFILE.tmp
366}
367
368
369#----------------------------------#
[3a321ea]370wrt_run_as_root() { # Some scripts must be run as root..
[877cc6a]371#----------------------------------#
372 local this_script=$1
373 local file=$2
374(
375cat << EOF
[3a321ea]376 @( time { export LFS=\$(MOUNT_PT) && ${PROGNAME}-commands/$file >>logs/$this_script 2>&1 ; } ) 2>>logs/$this_script && \\
[1a1f099]377 echo -e "\nKB: \`du -skx --exclude=${SCRIPT_ROOT} \$(MOUNT_PT)\`\n" >>logs/$this_script
[877cc6a]378EOF
379) >> $MKFILE.tmp
380}
381
382
[261eea6]383#----------------------------------#
384wrt_run_as_root2() { #
385#----------------------------------#
[877cc6a]386 local this_script=$1
387 local file=$2
388(
389cat << EOF
[3a321ea]390 @( time { source envars && ${PROGNAME}-commands/$file >>logs/$this_script 2>&1 ; } ) 2>>logs/$this_script && \\
[1a1f099]391 echo -e "\nKB: \`du -skx --exclude=${SCRIPT_ROOT} \`\n" >>logs/$this_script
[877cc6a]392EOF
393) >> $MKFILE.tmp
394}
395
396
397
398#----------------------------------#
399wrt_run_as_chroot1() { #
400#----------------------------------#
401 local this_script=$1
402 local file=$2
403(
404 cat << EOF
[1a1f099]405 @( time { \$(CHROOT1) '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}
[877cc6a]407EOF
408) >> $MKFILE.tmp
409}
410
411
412#----------------------------------#
413wrt_run_as_chroot2() { #
414#----------------------------------#
415 local this_script=$1
416 local file=$2
417(
418cat << EOF
[1a1f099]419 @( time { \$(CHROOT2) '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}
[877cc6a]421EOF
422) >> $MKFILE.tmp
423}
424
425
426#----------------------------------#
427wrt_copy_fstab() { #
428#----------------------------------#
429 local i=$1
430(
431 cat << EOF
[3a321ea]432 @cp -v $FSTAB \$(MOUNT_PT)/etc/fstab >>logs/$i 2>&1
[877cc6a]433EOF
434) >> $MKFILE.tmp
435}
436
437#----------------------------------#
[3a321ea]438wrt_copy_fstab2() { #
[877cc6a]439#----------------------------------#
440 local i=$1
441(
442 cat << EOF
[3a321ea]443 @cp -v /sources/fstab /etc/fstab >>logs/$i 2>&1
[877cc6a]444EOF
445) >> $MKFILE.tmp
446}
447
448
449#----------------------------------#
[0bdf6ed]450wrt_remove_build_dirs() { #
[877cc6a]451#----------------------------------#
[0bdf6ed]452 local name=$1
[877cc6a]453(
[0bdf6ed]454cat << EOF
[82eb8c1]455 @ROOT=\`head -n1 \$(MOUNT_PT)\$(SRC)/\$(PKG_LST) | sed 's@^./@@;s@/.*@@'\` && \\
[b7faa5a]456 rm -r \$(MOUNT_PT)\$(SRC)/\$\$ROOT && \\
457 if [ -e \$(MOUNT_PT)\$(SRC)/$name-build ]; then \\
[0bdf6ed]458 rm -r \$(MOUNT_PT)\$(SRC)/$name-build; \\
459 fi;
460EOF
461) >> $MKFILE.tmp
462}
463
464
465#----------------------------------#
466wrt_remove_build_dirs2() { #
467#----------------------------------#
468 local name=$1
469(
470cat << EOF
[82eb8c1]471 @ROOT=\`head -n1 \$(SRC)/\$(PKG_LST) | sed 's@^./@@;s@/.*@@'\` && \\
[b7faa5a]472 rm -r \$(SRC)/\$\$ROOT && \\
473 if [ -e \$(SRC)/$name-build ]; then \\
[0bdf6ed]474 rm -r \$(SRC)/$name-build; \\
475 fi;
[877cc6a]476EOF
477) >> $MKFILE.tmp
478}
479
480
[e2ef100]481#----------------------------------#
482wrt_touch() { #
483#----------------------------------#
484(
485cat << EOF
486 @touch \$@ && \\
487 sleep .25 && \\
[4a444f1]488 echo -e "\n\n "\$(BOLD)Target \$(BLUE)\$@ \$(BOLD)OK && \\
489 echo --------------------------------------------------------------------------------\$(WHITE)
[e2ef100]490EOF
491) >> $MKFILE.tmp
492}
493
494
[453bef0]495#----------------------------------#
[261eea6]496wrt_report() { #
[453bef0]497#----------------------------------#
498(
499cat << EOF
500
501create-sbu_du-report: $PREV
502 @\$(call echo_message, Building)
[a9429d5]503 @./create-sbu_du-report.sh logs $VERSION
[453bef0]504 @\$(call echo_report,$VERSION-SBU_DU-$(date --iso-8601).report)
505 @touch \$@
506EOF
507) >> $MKFILE.tmp
508
509chapter789="$chapter789 create-sbu_du-report"
510}
511
512
[877cc6a]513#----------------------------#
[261eea6]514run_make() { #
[877cc6a]515#----------------------------#
516 # Test if make must be run.
517 if [ "$RUNMAKE" = "1" ] ; then
518 # Test to make sure we're running the build as root
519 if [ "$UID" != "0" ] ; then
520 echo "You must be logged in as root to successfully build the system."
521 exit 1
522 fi
523 # Build the system
524 if [ -e $MKFILE ] ; then
525 echo -ne "Building the system...\n"
[a167246]526 cd $JHALFSDIR && make
[877cc6a]527 echo -ne "done\n"
528 fi
529 fi
530}
531
532
533#----------------------------#
[261eea6]534clean_builddir() { #
[877cc6a]535#----------------------------#
536 # Test if the clean must be done.
537 if [ "$CLEAN" = "1" ] ; then
538 # Test to make sure we're running the clean as root
539 if [ "$UID" != "0" ] ; then
540 echo "You must be logged in as root to clean the build directory."
541 exit 1
542 fi
543 # Test to make sure that the build directory was populated by jhalfs
544 if [ ! -d $JHALFSDIR ] || [ ! -d $BUILDDIR/sources ] ; then
[73e5448]545 echo "Looks like $BUILDDIR was not populated by a previous jhalfs run."
[877cc6a]546 exit 1
547 else
548 # Clean the build directory
549 echo -ne "Cleaning $BUILDDIR...\n"
550 rm -rf $BUILDDIR/{bin,boot,dev,etc,home,lib,media,mnt,opt,proc,root,sbin,srv,sys,tmp,tools,cross-tools,usr,var}
551 echo -ne "Cleaning $JHALFSDIR...\n"
[dd29d02]552 rm -rf $JHALFSDIR/{0*,1*,envars,sources-dir,*commands,*logs,Makefile,*.xsl,makefile-functions,pkg_tarball_list,*.config,*.sh}
[877cc6a]553 echo -ne "Cleaning remainig extracted sources in $BUILDDIR/sources...\n"
554 rm -rf `find $BUILDDIR/sources/* -maxdepth 0 -type d`
555 echo -ne "done\n"
556 fi
557 fi
558}
559
560#----------------------------#
[261eea6]561get_book() { #
[877cc6a]562#----------------------------#
563 cd $JHALFSDIR
564
565 if [ -z $WC ] ; then
566 # Check for Subversion instead of just letting the script hit 'svn' and fail.
567 test `type -p svn` || eval "echo \"This feature requires Subversion.\"
568 exit 1"
569 echo -n "Downloading the $PROGNAME document, $LFSVRS version... "
570
571 case $PROGNAME in
572 lfs) svn_root="LFS" ;;
573 hlfs) svn_root="HLFS" ;;
574 clfs) svn_root="cross-lfs" ;;
575 *) echo "BOOK not defined in function <get_book>"
576 exit 1 ;;
577 esac
578 # Grab a fresh book if it's missing, otherwise, update it from the
579 # repo. If we've already extracted the commands, move on to getting the
580 # sources.
581 if [ -d ${PROGNAME}-$LFSVRS ] ; then
582 cd ${PROGNAME}-$LFSVRS
[1ff6768]583 if LC_ALL=C svn up | grep -q At && \
584 test -d $JHALFSDIR/${PROGNAME}-commands && \
585 test -f $JHALFSDIR/pkg_tarball_list ; then
[877cc6a]586 # Set the canonical book version
[1ff6768]587 echo -ne "done\n"
[877cc6a]588 cd $JHALFSDIR
[1ff6768]589 case $PROGNAME in
590 clfs)
591 VERSION=$(xmllint --noent $BOOK/prologue/$ARCH/bookinfo.xml 2>/dev/null | grep subtitle | sed -e 's/^.*ion //' -e 's/<\/.*//') ;;
592 *)
593 VERSION=$(xmllint --noent $BOOK/prologue/bookinfo.xml 2>/dev/null | grep subtitle | sed -e 's/^.*ion //' -e 's/<\/.*//') ;;
594 esac
[877cc6a]595 get_sources
596 else
597 echo -ne "done\n"
598 extract_commands
599 fi
600 else
601 case $LFSVRS in
602 development)
603 svn co $SVN/${svn_root}/trunk/BOOK ${PROGNAME}-$LFSVRS >>$LOGDIR/$LOG 2>&1 ;;
604 esac
605 echo -ne "done\n"
606 extract_commands
607 fi
[1ff6768]608
[877cc6a]609 else
610 echo -ne "Using $BOOK as book's sources ...\n"
611 extract_commands
612 fi
[1ff6768]613 echo -ne " Document version ${L_arrow}${BOLD}${VERSION}${R_arrow}\n"
[877cc6a]614}
615
616#----------------------------#
617extract_commands() { #
618#----------------------------#
619
620 # Check for libxslt instead of just letting the script hit 'xsltproc' and fail.
621 test `type -p xsltproc` || eval "echo \"This feature requires libxslt.\"
622 exit 1"
623
624 cd $JHALFSDIR
[1ff6768]625 case $PROGNAME in
626 clfs)
627 VERSION=$(xmllint --noent $BOOK/prologue/$ARCH/bookinfo.xml 2>/dev/null | grep subtitle | sed -e 's/^.*ion //' -e 's/<\/.*//') ;;
628 *)
629 VERSION=$(xmllint --noent $BOOK/prologue/bookinfo.xml 2>/dev/null | grep subtitle | sed -e 's/^.*ion //' -e 's/<\/.*//') ;;
630 esac
[877cc6a]631
632 # Start clean
[bfc07d6]633 if [ -d ${PROGNAME}-commands ]; then
634 rm -rf ${PROGNAME}-commands
635 mkdir -v ${PROGNAME}-commands
[877cc6a]636 fi
637 echo -n "Extracting commands for"
638
639 # Dump the commands in shell script form from the HLFS book.
640 case ${PROGNAME} in
641 clfs)
642 echo -n " ${L_arrow}${BOLD}$ARCH${R_arrow} target architecture"
643 xsltproc --nonet \
644 --xinclude \
645 --stringparam method $METHOD \
646 --stringparam testsuite $TEST \
647 --stringparam vim-lang $VIMLANG \
648 --stringparam timezone $TIMEZONE \
649 --stringparam page $PAGE \
650 --stringparam lang $LANG \
651 --stringparam keymap $KEYMAP \
652 -o ./${PROGNAME}-commands/ $XSL $BOOK/$ARCH-index.xml >>$LOGDIR/$LOG 2>&1
653 ;;
654 hlfs)
655 echo -n " ${L_arrow}${BOLD}$MODEL${R_arrow} HLFS libc implementation"
656 xsltproc --nonet \
657 --xinclude \
658 --stringparam model $MODEL \
659 --stringparam testsuite $TEST \
660 --stringparam timezone $TIMEZONE \
661 --stringparam page $PAGE \
662 --stringparam lang $LANG \
663 --stringparam lc_all $LC_ALL \
664 --stringparam keymap $KEYMAP \
665 --stringparam grsecurity_host $GRSECURITY_HOST \
666 -o ./${PROGNAME}-commands/ $XSL $BOOK/index.xml >>$LOGDIR/$LOG 2>&1
667 ;;
668 lfs)
669 echo -n " ${L_arrow}${BOLD}LFS${R_arrow} build"
670 xsltproc --nonet \
671 --xinclude \
672 --stringparam testsuite $TEST \
673 --stringparam vim-lang $VIMLANG \
674 --stringparam timezone $TIMEZONE \
675 --stringparam page $PAGE \
676 --stringparam lang $LANG \
677 -o ./${PROGNAME}-commands/ $XSL $BOOK/index.xml >>$LOGDIR/$LOG 2>&1
678 ;;
[15cad16]679 *) exit 1 ;;
[877cc6a]680 esac
681
682 echo " ...OK"
683
684 # Make the scripts executable.
685 chmod -R +x $JHALFSDIR/${PROGNAME}-commands
686
[15cad16]687 # Create the packages file. We need it for proper Makefile creation
[dd29d02]688 create_package_list
[877cc6a]689
690 # Done. Moving on...
691 get_sources
692}
693
[dd29d02]694#----------------------------#
695create_package_list() { #
696#----------------------------#
697
698 # Create the packages file. We need it for proper Makefile creation
699 rm -f pkg_tarball_list
700 echo -n "Creating <${PROGNAME}> list of tarball names for $BOOK $ARCH"
701 case ${PROGNAME} in
702 clfs)
703 xsltproc --nonet --xinclude -o pkg_tarball_list packages.xsl \
704 $BOOK/materials/${ARCH}-chapter.xml >>$LOGDIR/$LOG 2>&1
705 ;;
706 hlfs)
707 xsltproc --nonet --xinclude -o pkg_tarball_list packages.xsl \
708 $BOOK/chapter04/chapter04.xml >>$LOGDIR/$LOG 2>&1
709 ;;
710 lfs)
711 xsltproc --nonet --xinclude -o pkg_tarball_list packages.xsl \
712 $BOOK/chapter03/chapter03.xml >>$LOGDIR/$LOG 2>&1
713 ;;
714 esac
715 echo " ...OK"
716
717}
718
719
[877cc6a]720#----------------------------#
[15cad16]721get_sources() { # Download file, write name to MISSING_FILES.DMP if an error
[93135fd]722#----------------------------#
723 local saveIFS=$IFS
[26053c4]724 local IFS line URL1 URL2 FILE BOOKMD5 MD5 HAVEMD5 fromARCHIVE
[93135fd]725
726 # Test if the packages must be downloaded
727 [ ! "$GETPKG" = "1" ] && return
728
729 gs_wrt_message(){
730 echo "${RED}$1${OFF}"
[c7dbe78]731 echo "$1" >> MISSING_FILES.DMP
732 }
[93135fd]733 # Housekeeping
734 [[ ! -d $BUILDDIR/sources ]] && mkdir $BUILDDIR/sources
735 cd $BUILDDIR/sources
736 [[ -f MD5SUMS ]] && rm MD5SUMS
737 [[ -f MISSING_FILES.DMP ]] && rm MISSING_FILES.DMP
738 [[ -f urls.lst ]] && rm urls.lst
739
740 # Generate URLs file
741 create_urls
742
743 IFS=$'\x0A' # Modify the 'internal field separator' to break on 'LF' only
744 for line in `cat urls.lst`; do
745 IFS=$saveIFS # Restore the system defaults
746
747 # Skip some packages if they aren't needed
748 case $line in
749 */tcl* | */expect* | */dejagnu* | */tree* | */gcc-testsuite* )
750 [[ "$TEST" = "0" ]] && continue
751 ;;
752 */vim-*-lang* )
753 [[ "$VIMLANG" = "0" ]] && continue
754 ;;
[0c3f2f9]755 *linux/linux-* )
[294c937]756 [[ -z "$CONFIG" ]] && [[ -z "$BOOT_CONFIG" ]] && \
757 [[ "$GETKERNEL" = "0" ]] && continue
[0c3f2f9]758 ;;
[93135fd]759 esac
760
761 # Locations
[296ae69]762 URL1=`echo $line | cut -d" " -f2` # Preferred URL
763 URL2=`echo $line | cut -d" " -f1` # Fallback Upstream URL
[26053c4]764 FILE=`basename $URL1` # File name
765 BOOKMD5=`echo $line | cut -d" " -f3` # MD5 book value
766
[8a43b5b]767 # Validation pair
768 MD5="$BOOKMD5 $FILE"
769 HAVEMD5=1
[93135fd]770
771 set -e
[c7dbe78]772 # If the file exists in the archive copy it to the
[93135fd]773 # $BUILDDIR/sources dir. MD5SUM will be validated later.
774 if [ ! -z ${SRC_ARCHIVE} ] &&
775 [ -d ${SRC_ARCHIVE} ] &&
776 [ -f ${SRC_ARCHIVE}/$FILE ]; then
777 cp ${SRC_ARCHIVE}/$FILE .
778 echo "$FILE: -- copied from $SRC_ARCHIVE"
779 fromARCHIVE=1
780 else
781 echo "${BOLD}${YELLOW}$FILE: not found in ${SRC_ARCHIVE}${OFF}"
782 fromARCHIVE=0
[8a43b5b]783 # If the file does not exist yet in /sources download a fresh one
[93135fd]784 if [ ! -f $FILE ] ; then
785 if ! wget $URL1 && ! wget $URL2 ; then
[c7dbe78]786 gs_wrt_message "$FILE not found in the SRC_ARCHIVE or on any server..SKIPPING"
787 continue
[93135fd]788 fi
789 fi
790 fi
791
[8a43b5b]792 # IF the md5sum does not match the existing files
793 if ! echo "$MD5" | md5sum -c - >/dev/null ; then
794 [[ $fromARCHIVE = "1" ]] && echo "${BOLD}${YELLOW}MD5SUM did not match SRC_ARCHIVE copy${OFF}"
795 [[ $fromARCHIVE = "0" ]] && echo "${BOLD}${YELLOW}MD5SUM did not match REMOTE copy${OFF}"
796 # Remove the old file and download a new one
797 rm -fv $FILE
798 # Force storage in SRC_ARCHIVE
799 fromARCHIVE=0;
800 # Try to retrieve again the file. Servers in reverse order.
801 if ! wget $URL2 && ! wget $URL1 ; then
802 gs_wrt_message "$FILE not found on the servers.. SKIPPING"
803 continue
[93135fd]804 fi
805 fi
806
807 # Validate the MD5SUM one last time
[8a43b5b]808 if ! echo "$MD5" | md5sum -c - >/dev/null ; then
[93135fd]809 gs_wrt_message "$FILE does not match MD5SUMS value"
[0910f55]810 # Force generation of MD5SUM
811 HAVEMD5=0
[93135fd]812 fi
813
814 # Generate a fresh MD5SUM for this file
815 if [[ "$HAVEMD5" = "0" ]] ; then
816 echo "${BOLD}${YELLOW}Generating a new MD5SUM for ${OFF}$FILE"
[8a43b5b]817 echo "NEW MD5SUM: $(md5sum $FILE)" >> MISSING_FILES.DMP
[93135fd]818 fi
819
820 # Good or bad we write the original md5sum to a file
[8a43b5b]821 echo "$MD5" >> MD5SUMS
[93135fd]822
823 # Copy the freshly downloaded file
824 # to the source archive.
825 if [ ! -z ${SRC_ARCHIVE} ] &&
826 [ -d ${SRC_ARCHIVE} ] &&
827 [ -w ${SRC_ARCHIVE} ] &&
828 [ "$fromARCHIVE" = "0" ] ; then
829 echo "Storing file:<$FILE> in the package archive"
830 cp -f $FILE ${SRC_ARCHIVE}
831 fi
832
833 done
834
835 if [[ -s MISSING_FILES.DMP ]]; then
836 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"
837 # Do not allow the automatic exection of the Makefile.
[261eea6]838 echo "${tab_}${BOLD}${RED}*** ${YELLOW}Automatic execution of the generated makefile has been inhibited. ${RED}***${OFF}${nl_}"
[93135fd]839 RUNMAKE=0
840 fi
841}
842
[877cc6a]843#----------------------------#
[15cad16]844create_urls() { #
[877cc6a]845#----------------------------#
[15cad16]846 cd $JHALFSDIR
[877cc6a]847
[15cad16]848 case ${PROGNAME} in
849 clfs)
850 echo -n "Creating CLFS <${ARCH}> specific URLs file"
851 xsltproc --nonet --xinclude \
852 --stringparam server $SERVER \
853 -o $BUILDDIR/sources/urls.lst urls.xsl \
854 $BOOK/materials/$ARCH-chapter.xml >>$LOGDIR/$LOG 2>&1
855 echo " ...OK"
856 ;;
857 hlfs)
858 echo -n "Creating HLFS <${MODEL}> specific URLs file"
859 xsltproc --nonet --xinclude \
860 --stringparam server $SERVER \
861 --stringparam model $MODEL \
862 -o $BUILDDIR/sources/urls.lst urls.xsl \
863 $BOOK/chapter04/chapter04.xml >>$LOGDIR/$LOG 2>&1
864 echo " ...OK"
865 ;;
866 lfs)
867 echo -n "Creating LFS specific URLs file"
868 xsltproc --nonet --xinclude \
869 --stringparam server $SERVER \
870 -o ../sources/urls.lst urls.xsl \
871 $BOOK/chapter03/chapter03.xml >>$LOGDIR/$LOG 2>&1
872 echo " ...OK"
873 ;;
874 esac
[877cc6a]875
[15cad16]876 cd $BUILDDIR/sources
[877cc6a]877}
Note: See TracBrowser for help on using the repository browser.