source: common/common-functions@ a2c9b41

1.0 2.3 2.3.x 2.4 ablfs ablfs-more legacy new_features trunk
Last change on this file since a2c9b41 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
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_root2() { #
385#----------------------------------#
386 local this_script=$1
387 local file=$2
388(
389cat << EOF
390 @( time { source envars && ${PROGNAME}-commands/$file >>logs/$this_script 2>&1 ; } ) 2>>logs/$this_script && \\
391 echo -e "\nKB: \`du -skx --exclude=${SCRIPT_ROOT} \`\n" >>logs/$this_script
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
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}
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
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}
421EOF
422) >> $MKFILE.tmp
423}
424
425
426#----------------------------------#
427wrt_copy_fstab() { #
428#----------------------------------#
429 local i=$1
430(
431 cat << EOF
432 @cp -v $FSTAB \$(MOUNT_PT)/etc/fstab >>logs/$i 2>&1
433EOF
434) >> $MKFILE.tmp
435}
436
437#----------------------------------#
438wrt_copy_fstab2() { #
439#----------------------------------#
440 local i=$1
441(
442 cat << EOF
443 @cp -v /sources/fstab /etc/fstab >>logs/$i 2>&1
444EOF
445) >> $MKFILE.tmp
446}
447
448
449#----------------------------------#
450wrt_remove_build_dirs() { #
451#----------------------------------#
452 local name=$1
453(
454cat << EOF
455 @ROOT=\`head -n1 \$(MOUNT_PT)\$(SRC)/\$(PKG_LST) | sed 's@^./@@;s@/.*@@'\` && \\
456 rm -r \$(MOUNT_PT)\$(SRC)/\$\$ROOT && \\
457 if [ -e \$(MOUNT_PT)\$(SRC)/$name-build ]; then \\
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
471 @ROOT=\`head -n1 \$(SRC)/\$(PKG_LST) | sed 's@^./@@;s@/.*@@'\` && \\
472 rm -r \$(SRC)/\$\$ROOT && \\
473 if [ -e \$(SRC)/$name-build ]; then \\
474 rm -r \$(SRC)/$name-build; \\
475 fi;
476EOF
477) >> $MKFILE.tmp
478}
479
480
481#----------------------------------#
482wrt_touch() { #
483#----------------------------------#
484(
485cat << EOF
486 @touch \$@ && \\
487 sleep .25 && \\
488 echo -e "\n\n "\$(BOLD)Target \$(BLUE)\$@ \$(BOLD)OK && \\
489 echo --------------------------------------------------------------------------------\$(WHITE)
490EOF
491) >> $MKFILE.tmp
492}
493
494
495#----------------------------------#
496wrt_report() { #
497#----------------------------------#
498(
499cat << EOF
500
501create-sbu_du-report: $PREV
502 @\$(call echo_message, Building)
503 @./create-sbu_du-report.sh logs $VERSION
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
513#----------------------------#
514run_make() { #
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"
526 cd $JHALFSDIR && make
527 echo -ne "done\n"
528 fi
529 fi
530}
531
532
533#----------------------------#
534clean_builddir() { #
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
545 echo "Looks like $BUILDDIR was not populated by a previous jhalfs run."
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"
552 rm -rf $JHALFSDIR/{0*,1*,envars,sources-dir,*commands,*logs,Makefile,*.xsl,makefile-functions,pkg_tarball_list,*.config,*.sh}
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#----------------------------#
561get_book() { #
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
583 if LC_ALL=C svn up | grep -q At && test -d $JHALFSDIR/${PROGNAME}-commands && \
584 test -f $JHALFSDIR/pkg_tarball_list ; then
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@">@@'`
589 # Another work-around, clfs book has a x.x.x-date versioning system
590 if [ "$PROGNAME" = "clfs" ]; then
591 VERSION=${VERSION##*-}
592 fi
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@">@@'`
622 # Another work-around, clfs book has a x.x.x-date versioning system
623 if [ "$PROGNAME" = "clfs" ]; then
624 VERSION=${VERSION##*-}
625 fi
626
627 # Start clean
628 if [ -d ${PROGNAME}-commands ]; then
629 rm -rf ${PROGNAME}-commands
630 mkdir -v ${PROGNAME}-commands
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 ;;
674 *) exit 1 ;;
675 esac
676
677 echo " ...OK"
678
679 # Make the scripts executable.
680 chmod -R +x $JHALFSDIR/${PROGNAME}-commands
681
682 # Create the packages file. We need it for proper Makefile creation
683 create_package_list
684
685 # Done. Moving on...
686 get_sources
687}
688
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
715#----------------------------#
716get_sources() { # Download file, write name to MISSING_FILES.DMP if an error
717#----------------------------#
718 local saveIFS=$IFS
719 local IFS line URL1 URL2 FILE BOOKMD5 MD5 HAVEMD5 fromARCHIVE
720
721 # Test if the packages must be downloaded
722 [ ! "$GETPKG" = "1" ] && return
723
724 gs_wrt_message(){
725 echo "${RED}$1${OFF}"
726 echo "$1" >> MISSING_FILES.DMP
727 }
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 ;;
750 *linux/linux-* )
751 [[ -z "$CONFIG" ]] && [[ -z "$BOOT_CONFIG" ]] && \
752 [[ "$GETKERNEL" = "0" ]] && continue
753 ;;
754 esac
755
756 # Locations
757 URL1=`echo $line | cut -d" " -f2` # Preferred URL
758 URL2=`echo $line | cut -d" " -f1` # Fallback Upstream URL
759 FILE=`basename $URL1` # File name
760 BOOKMD5=`echo $line | cut -d" " -f3` # MD5 book value
761
762 # Validation pair
763 MD5="$BOOKMD5 $FILE"
764 HAVEMD5=1
765
766 set -e
767 # If the file exists in the archive copy it to the
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
778 # If the file does not exist yet in /sources download a fresh one
779 if [ ! -f $FILE ] ; then
780 if ! wget $URL1 && ! wget $URL2 ; then
781 gs_wrt_message "$FILE not found in the SRC_ARCHIVE or on any server..SKIPPING"
782 continue
783 fi
784 fi
785 fi
786
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
799 fi
800 fi
801
802 # Validate the MD5SUM one last time
803 if ! echo "$MD5" | md5sum -c - >/dev/null ; then
804 gs_wrt_message "$FILE does not match MD5SUMS value"
805 # Force generation of MD5SUM
806 HAVEMD5=0
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"
812 echo "NEW MD5SUM: $(md5sum $FILE)" >> MISSING_FILES.DMP
813 fi
814
815 # Good or bad we write the original md5sum to a file
816 echo "$MD5" >> MD5SUMS
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.
833 echo "${tab_}${BOLD}${RED}*** ${YELLOW}Automatic execution of the generated makefile has been inhibited. ${RED}***${OFF}${nl_}"
834 RUNMAKE=0
835 fi
836}
837
838#----------------------------#
839create_urls() { #
840#----------------------------#
841 cd $JHALFSDIR
842
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
870
871 cd $BUILDDIR/sources
872}
Note: See TracBrowser for help on using the repository browser.