source: common/common-functions@ dd29d02

1.0 2.3 2.3.x 2.4 ablfs ablfs-more legacy new_features trunk
Last change on this file since dd29d02 was dd29d02, checked in by Manuel Canales Esparcia <manuel@…>, 18 years ago

Removed obsolete code for packages file creation.
Improved the speed creation of pkg_tarball_list.
Moved the new functions to a more proper location.

  • Property mode set to 100644
File size: 25.5 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
[19528f8]583 if LC_ALL=C svn up | grep -q At && test -d $JHALFSDIR/${PROGNAME}-commands && \
[dd29d02]584 test -f $JHALFSDIR/pkg_tarball_list ; then
[877cc6a]585 echo -ne "done\n"
586 # Set the canonical book version
587 cd $JHALFSDIR
588 VERSION=`grep "ENTITY version " $BOOK/general.ent | sed 's@<!ENTITY version "@@;s@">@@'`
[a7db907]589 # Another work-around, clfs book has a x.x.x-date versioning system
590 if [ "$PROGNAME" = "clfs" ]; then
591 VERSION=${VERSION##*-}
592 fi
[877cc6a]593 get_sources
594 else
595 echo -ne "done\n"
596 extract_commands
597 fi
598 else
599 case $LFSVRS in
600 development)
601 svn co $SVN/${svn_root}/trunk/BOOK ${PROGNAME}-$LFSVRS >>$LOGDIR/$LOG 2>&1 ;;
602 esac
603 echo -ne "done\n"
604 extract_commands
605 fi
606 else
607 echo -ne "Using $BOOK as book's sources ...\n"
608 extract_commands
609 fi
610}
611
612#----------------------------#
613extract_commands() { #
614#----------------------------#
615
616 # Check for libxslt instead of just letting the script hit 'xsltproc' and fail.
617 test `type -p xsltproc` || eval "echo \"This feature requires libxslt.\"
618 exit 1"
619
620 cd $JHALFSDIR
621 VERSION=`grep "ENTITY version " $BOOK/general.ent | sed 's@<!ENTITY version "@@;s@">@@'`
[3d1b542]622 # Another work-around, clfs book has a x.x.x-date versioning system
623 if [ "$PROGNAME" = "clfs" ]; then
624 VERSION=${VERSION##*-}
625 fi
[877cc6a]626
627 # Start clean
[bfc07d6]628 if [ -d ${PROGNAME}-commands ]; then
629 rm -rf ${PROGNAME}-commands
630 mkdir -v ${PROGNAME}-commands
[877cc6a]631 fi
632 echo -n "Extracting commands for"
633
634 # Dump the commands in shell script form from the HLFS book.
635 case ${PROGNAME} in
636 clfs)
637 echo -n " ${L_arrow}${BOLD}$ARCH${R_arrow} target architecture"
638 xsltproc --nonet \
639 --xinclude \
640 --stringparam method $METHOD \
641 --stringparam testsuite $TEST \
642 --stringparam vim-lang $VIMLANG \
643 --stringparam timezone $TIMEZONE \
644 --stringparam page $PAGE \
645 --stringparam lang $LANG \
646 --stringparam keymap $KEYMAP \
647 -o ./${PROGNAME}-commands/ $XSL $BOOK/$ARCH-index.xml >>$LOGDIR/$LOG 2>&1
648 ;;
649 hlfs)
650 echo -n " ${L_arrow}${BOLD}$MODEL${R_arrow} HLFS libc implementation"
651 xsltproc --nonet \
652 --xinclude \
653 --stringparam model $MODEL \
654 --stringparam testsuite $TEST \
655 --stringparam timezone $TIMEZONE \
656 --stringparam page $PAGE \
657 --stringparam lang $LANG \
658 --stringparam lc_all $LC_ALL \
659 --stringparam keymap $KEYMAP \
660 --stringparam grsecurity_host $GRSECURITY_HOST \
661 -o ./${PROGNAME}-commands/ $XSL $BOOK/index.xml >>$LOGDIR/$LOG 2>&1
662 ;;
663 lfs)
664 echo -n " ${L_arrow}${BOLD}LFS${R_arrow} build"
665 xsltproc --nonet \
666 --xinclude \
667 --stringparam testsuite $TEST \
668 --stringparam vim-lang $VIMLANG \
669 --stringparam timezone $TIMEZONE \
670 --stringparam page $PAGE \
671 --stringparam lang $LANG \
672 -o ./${PROGNAME}-commands/ $XSL $BOOK/index.xml >>$LOGDIR/$LOG 2>&1
673 ;;
[15cad16]674 *) exit 1 ;;
[877cc6a]675 esac
676
677 echo " ...OK"
678
679 # Make the scripts executable.
680 chmod -R +x $JHALFSDIR/${PROGNAME}-commands
681
[15cad16]682 # Create the packages file. We need it for proper Makefile creation
[dd29d02]683 create_package_list
[877cc6a]684
685 # Done. Moving on...
686 get_sources
687}
688
[dd29d02]689#----------------------------#
690create_package_list() { #
691#----------------------------#
692
693 # Create the packages file. We need it for proper Makefile creation
694 rm -f pkg_tarball_list
695 echo -n "Creating <${PROGNAME}> list of tarball names for $BOOK $ARCH"
696 case ${PROGNAME} in
697 clfs)
698 xsltproc --nonet --xinclude -o pkg_tarball_list packages.xsl \
699 $BOOK/materials/${ARCH}-chapter.xml >>$LOGDIR/$LOG 2>&1
700 ;;
701 hlfs)
702 xsltproc --nonet --xinclude -o pkg_tarball_list packages.xsl \
703 $BOOK/chapter04/chapter04.xml >>$LOGDIR/$LOG 2>&1
704 ;;
705 lfs)
706 xsltproc --nonet --xinclude -o pkg_tarball_list packages.xsl \
707 $BOOK/chapter03/chapter03.xml >>$LOGDIR/$LOG 2>&1
708 ;;
709 esac
710 echo " ...OK"
711
712}
713
714
[877cc6a]715#----------------------------#
[15cad16]716get_sources() { # Download file, write name to MISSING_FILES.DMP if an error
[93135fd]717#----------------------------#
718 local saveIFS=$IFS
[26053c4]719 local IFS line URL1 URL2 FILE BOOKMD5 MD5 HAVEMD5 fromARCHIVE
[93135fd]720
721 # Test if the packages must be downloaded
722 [ ! "$GETPKG" = "1" ] && return
723
724 gs_wrt_message(){
725 echo "${RED}$1${OFF}"
[c7dbe78]726 echo "$1" >> MISSING_FILES.DMP
727 }
[93135fd]728 # Housekeeping
729 [[ ! -d $BUILDDIR/sources ]] && mkdir $BUILDDIR/sources
730 cd $BUILDDIR/sources
731 [[ -f MD5SUMS ]] && rm MD5SUMS
732 [[ -f MISSING_FILES.DMP ]] && rm MISSING_FILES.DMP
733 [[ -f urls.lst ]] && rm urls.lst
734
735 # Generate URLs file
736 create_urls
737
738 IFS=$'\x0A' # Modify the 'internal field separator' to break on 'LF' only
739 for line in `cat urls.lst`; do
740 IFS=$saveIFS # Restore the system defaults
741
742 # Skip some packages if they aren't needed
743 case $line in
744 */tcl* | */expect* | */dejagnu* | */tree* | */gcc-testsuite* )
745 [[ "$TEST" = "0" ]] && continue
746 ;;
747 */vim-*-lang* )
748 [[ "$VIMLANG" = "0" ]] && continue
749 ;;
[0c3f2f9]750 *linux/linux-* )
[294c937]751 [[ -z "$CONFIG" ]] && [[ -z "$BOOT_CONFIG" ]] && \
752 [[ "$GETKERNEL" = "0" ]] && continue
[0c3f2f9]753 ;;
[93135fd]754 esac
755
756 # Locations
[296ae69]757 URL1=`echo $line | cut -d" " -f2` # Preferred URL
758 URL2=`echo $line | cut -d" " -f1` # Fallback Upstream URL
[26053c4]759 FILE=`basename $URL1` # File name
760 BOOKMD5=`echo $line | cut -d" " -f3` # MD5 book value
761
[8a43b5b]762 # Validation pair
763 MD5="$BOOKMD5 $FILE"
764 HAVEMD5=1
[93135fd]765
766 set -e
[c7dbe78]767 # If the file exists in the archive copy it to the
[93135fd]768 # $BUILDDIR/sources dir. MD5SUM will be validated later.
769 if [ ! -z ${SRC_ARCHIVE} ] &&
770 [ -d ${SRC_ARCHIVE} ] &&
771 [ -f ${SRC_ARCHIVE}/$FILE ]; then
772 cp ${SRC_ARCHIVE}/$FILE .
773 echo "$FILE: -- copied from $SRC_ARCHIVE"
774 fromARCHIVE=1
775 else
776 echo "${BOLD}${YELLOW}$FILE: not found in ${SRC_ARCHIVE}${OFF}"
777 fromARCHIVE=0
[8a43b5b]778 # If the file does not exist yet in /sources download a fresh one
[93135fd]779 if [ ! -f $FILE ] ; then
780 if ! wget $URL1 && ! wget $URL2 ; then
[c7dbe78]781 gs_wrt_message "$FILE not found in the SRC_ARCHIVE or on any server..SKIPPING"
782 continue
[93135fd]783 fi
784 fi
785 fi
786
[8a43b5b]787 # IF the md5sum does not match the existing files
788 if ! echo "$MD5" | md5sum -c - >/dev/null ; then
789 [[ $fromARCHIVE = "1" ]] && echo "${BOLD}${YELLOW}MD5SUM did not match SRC_ARCHIVE copy${OFF}"
790 [[ $fromARCHIVE = "0" ]] && echo "${BOLD}${YELLOW}MD5SUM did not match REMOTE copy${OFF}"
791 # Remove the old file and download a new one
792 rm -fv $FILE
793 # Force storage in SRC_ARCHIVE
794 fromARCHIVE=0;
795 # Try to retrieve again the file. Servers in reverse order.
796 if ! wget $URL2 && ! wget $URL1 ; then
797 gs_wrt_message "$FILE not found on the servers.. SKIPPING"
798 continue
[93135fd]799 fi
800 fi
801
802 # Validate the MD5SUM one last time
[8a43b5b]803 if ! echo "$MD5" | md5sum -c - >/dev/null ; then
[93135fd]804 gs_wrt_message "$FILE does not match MD5SUMS value"
[0910f55]805 # Force generation of MD5SUM
806 HAVEMD5=0
[93135fd]807 fi
808
809 # Generate a fresh MD5SUM for this file
810 if [[ "$HAVEMD5" = "0" ]] ; then
811 echo "${BOLD}${YELLOW}Generating a new MD5SUM for ${OFF}$FILE"
[8a43b5b]812 echo "NEW MD5SUM: $(md5sum $FILE)" >> MISSING_FILES.DMP
[93135fd]813 fi
814
815 # Good or bad we write the original md5sum to a file
[8a43b5b]816 echo "$MD5" >> MD5SUMS
[93135fd]817
818 # Copy the freshly downloaded file
819 # to the source archive.
820 if [ ! -z ${SRC_ARCHIVE} ] &&
821 [ -d ${SRC_ARCHIVE} ] &&
822 [ -w ${SRC_ARCHIVE} ] &&
823 [ "$fromARCHIVE" = "0" ] ; then
824 echo "Storing file:<$FILE> in the package archive"
825 cp -f $FILE ${SRC_ARCHIVE}
826 fi
827
828 done
829
830 if [[ -s MISSING_FILES.DMP ]]; then
831 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"
832 # Do not allow the automatic exection of the Makefile.
[261eea6]833 echo "${tab_}${BOLD}${RED}*** ${YELLOW}Automatic execution of the generated makefile has been inhibited. ${RED}***${OFF}${nl_}"
[93135fd]834 RUNMAKE=0
835 fi
836}
837
[877cc6a]838#----------------------------#
[15cad16]839create_urls() { #
[877cc6a]840#----------------------------#
[15cad16]841 cd $JHALFSDIR
[877cc6a]842
[15cad16]843 case ${PROGNAME} in
844 clfs)
845 echo -n "Creating CLFS <${ARCH}> specific URLs file"
846 xsltproc --nonet --xinclude \
847 --stringparam server $SERVER \
848 -o $BUILDDIR/sources/urls.lst urls.xsl \
849 $BOOK/materials/$ARCH-chapter.xml >>$LOGDIR/$LOG 2>&1
850 echo " ...OK"
851 ;;
852 hlfs)
853 echo -n "Creating HLFS <${MODEL}> specific URLs file"
854 xsltproc --nonet --xinclude \
855 --stringparam server $SERVER \
856 --stringparam model $MODEL \
857 -o $BUILDDIR/sources/urls.lst urls.xsl \
858 $BOOK/chapter04/chapter04.xml >>$LOGDIR/$LOG 2>&1
859 echo " ...OK"
860 ;;
861 lfs)
862 echo -n "Creating LFS specific URLs file"
863 xsltproc --nonet --xinclude \
864 --stringparam server $SERVER \
865 -o ../sources/urls.lst urls.xsl \
866 $BOOK/chapter03/chapter03.xml >>$LOGDIR/$LOG 2>&1
867 echo " ...OK"
868 ;;
869 esac
[877cc6a]870
[15cad16]871 cd $BUILDDIR/sources
[877cc6a]872}
Note: See TracBrowser for help on using the repository browser.