source: common/common-functions@ 963fdae

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

Added config option to allow to bommb in test suites faiures.

  • Property mode set to 100644
File size: 29.2 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.
[a6655ff]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
[d385453]59 To know what branches and stable books work with this version of jhalfs
[a6655ff]60 please see http://wiki.linuxfromscratch.org/alfs/wiki/SupportedBooks
[877cc6a]61
62${BOLD} -D --directory DIR${OFF}
[73e5448]63 use DIR directory for building ${BOLD}$(echo $PROGNAME | tr [a-z] [A-Z])${OFF}; all files jhalfs produces
[1a1f099]64 will be in the directory DIR/${SCRIPT_ROOT}.
[511923a]65 The current setting for BUILDDIR is "$BUILDDIR"
[877cc6a]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
[1b65a84]72${BOLD} -O, --optimize${OFF}
73 Optimize [0-2]
74 0 = no optimization
[1ec8fce]75 1 = optimize final system only
76 2 = optimize both temporary tools and final system
[1b65a84]77 Edit common/opt_config{,.d/*} and common/opt_override as desired.
78
[877cc6a]79${BOLD} -T, --testsuites N ${OFF}
80 Run test suites [0-3]
81 0 = none
[0755d1a]82 1 = only final system Glibc, GCC and Binutils testsuites
83 2 = all final system testsuites
[b240ee6]84 3 = all temporary tools and final system testsuites
[d81c640]85 In CLFS and HLFS, 3 is an alias to 2
[877cc6a]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
[d385453]90${BOLD} -C, --comparison TYPE${OFF}
[e2fa2bd]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.
[6dcfd53]94 Types allowed are:
[e2fa2bd]95 ICA = do ICA as designed by Greg Schafer
[0ad851d]96 farce = do the farce analysis designed by Ken Moffat
[d385453]97 both = perform both ICA and farce analysis
[45f82718]98
[877cc6a]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}
[d385453]111 clean the build directory before performing any other task. The directory
[73e5448]112 is cleaned only if it was populated by a previous jhalfs run.
[877cc6a]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
[b0dd4bd]121 x86, i486, i586, ppc, mips, mipsel, sparc
[877cc6a]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
[c7c5a53]127${BOLD} --boot-config FILE ${OFF}
[877cc6a]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
[7432834]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
[877cc6a]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="
[73e5448]161${BOLD} \"jhalfs\"${OFF} builder tool (development) \$Rev$
[877cc6a]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
[73e5448]184 a different build directory before running jhalfs.
[877cc6a]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
[73e5448]199HEADER="# This file is automatically generated by jhalfs
[877cc6a]200# DO NOT EDIT THIS FILE MANUALLY
201#
202# Generated on `date \"+%F %X %Z\"`"
203
204
205
206#----------------------------------#
[3a321ea]207wrt_target() { # Create target and initialize log file
[877cc6a]208#----------------------------------#
209 local i=$1
210 local PREV=$2
[4edf3b7]211 case $i in
212 iteration* ) local LOGFILE=$this_script.log ;;
213 * ) local LOGFILE=$this_script ;;
214 esac
[877cc6a]215(
216cat << EOF
217
218$i: $PREV
219 @\$(call echo_message, Building)
[46758a2]220 @./progress_bar.sh \$@ &
[1a1f099]221 @echo -e "\n\`date\`\n\nKB: \`du -skx --exclude=${SCRIPT_ROOT} \$(MOUNT_PT)\`\n" >logs/$LOGFILE
[877cc6a]222EOF
223) >> $MKFILE.tmp
224}
225
[7eb9402]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
[dd29d02]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 *) echo $(grep "^$script_name-[[:digit:]]" $JHALFSDIR/pkg_tarball_list | head -n1 ) ;;
258 esac
259
260}
[877cc6a]261
[5842156]262#----------------------------------#
263wrt_remove_existing_dirs() { #
264#----------------------------------#
265 local PKG_NAME=$1
266(
267cat << EOF
[3b3251a]268 @PKG_PATH=\`ls -t \$(MOUNT_PT)\$(SRC)/${PKG_NAME} | head -n1\` && \\
269 ROOT=\`tar -tf \$\$PKG_PATH | head -n1 | sed -e 's@^./@@;s@/.*@@'\` && \\
[5842156]270 [[ -n \$\$ROOT ]] && \\
271 rm -rf \$(MOUNT_PT)\$(SRC)/\$\$ROOT && \\
[15787a3]272 if [ -e \$(MOUNT_PT)\$(SRC)/${PKG_NAME%-*}-build ]; then \\
273 rm -rf \$(MOUNT_PT)\$(SRC)/${PKG_NAME%-*}-build; \\
[5842156]274 fi;
275EOF
276) >> $MKFILE.tmp
277}
278
279#----------------------------------#
280wrt_remove_existing_dirs2() { #
281#----------------------------------#
282 local PKG_NAME=$1
283(
284cat << EOF
[3b3251a]285 @PKG_PATH=\`ls -t \$(SRC)/${PKG_NAME} | head -n1\` && \\
286 ROOT=\`tar -tf \$\$PKG_PATH | head -n1 | sed -e 's@^./@@;s@/.*@@'\` && \\
[5842156]287 [[ -n \$\$ROOT ]] && \\
288 rm -rf \$(SRC)/\$\$ROOT && \\
[15787a3]289 if [ -e \$(SRC)/${PKG_NAME%-*}-build ]; then \\
290 rm -rf \$(SRC)/${PKG_NAME%-*}-build; \\
[5842156]291 fi;
292EOF
293) >> $MKFILE.tmp
294}
295
296
297
[877cc6a]298#----------------------------------#
299wrt_unpack() { # Unpack and set 'ROOT' var
300#----------------------------------#
301 local FILE=$1
[5842156]302 local optSAVE_PREVIOUS=$2
[82eb8c1]303
[5842156]304 if [ "${optSAVE_PREVIOUS}" != "1" ]; then
305 wrt_remove_existing_dirs "$FILE"
306 fi
[877cc6a]307(
308cat << EOF
309 @\$(call unpack,$FILE)
[82eb8c1]310 @ROOT=\`head -n1 \$(MOUNT_PT)\$(SRC)/\$(PKG_LST) | sed 's@^./@@;s@/.*@@'\` && \\
[877cc6a]311 echo "export PKGDIR=\$(MOUNT_PT)\$(SRC)/\$\$ROOT" > envars && \\
[15537d5]312 chown -R lfs \$(MOUNT_PT)\$(SRC)/\$\$ROOT
[877cc6a]313EOF
314) >> $MKFILE.tmp
315}
316
317
[e5f5970]318#----------------------------------#
319wrt_unpack_clfs() { # Unpack and set 'ROOT' var
320#----------------------------------#
321 local FILE=$1
322 local optSAVE_PREVIOUS=$2
323
324 if [ "${optSAVE_PREVIOUS}" != "1" ]; then
325 wrt_remove_existing_dirs "$FILE"
326 fi
327(
328cat << EOF
329 @\$(call unpack,$FILE)
330 @ROOT=\`head -n1 \$(MOUNT_PT)\$(SRC)/\$(PKG_LST) | sed 's@^./@@;s@/.*@@'\` && \\
331 echo "export PKGDIR=\$(MOUNT_PT)\$(SRC)/\$\$ROOT" > envars && \\
332 chown -R clfs \$(MOUNT_PT)\$(SRC)/\$\$ROOT
333EOF
334) >> $MKFILE.tmp
335}
336
337
[877cc6a]338#----------------------------------#
339wrt_unpack2() { #
340#----------------------------------#
341 local FILE=$1
[5842156]342 local optSAVE_PREVIOUS=$2
343
344 if [ "${optSAVE_PREVIOUS}" != "1" ]; then
345 wrt_remove_existing_dirs "$FILE"
346 fi
[877cc6a]347(
348cat << EOF
349 @\$(call unpack2,$FILE)
[a229600]350 @ROOT=\`head -n1 \$(MOUNT_PT)\$(SRC)/\$(PKG_LST) | sed 's@^./@@;s@/.*@@'\` && \\
[877cc6a]351 echo "export PKGDIR=\$(SRC)/\$\$ROOT" > envars
352EOF
353) >> $MKFILE.tmp
354}
355
356
[261eea6]357#----------------------------------#
358wrt_unpack3() { #
359#----------------------------------#
[877cc6a]360 local FILE=$1
[5842156]361 local optSAVE_PREVIOUS=$2
362
363 if [ "${optSAVE_PREVIOUS}" != "1" ]; then
364 wrt_remove_existing_dirs2 "$FILE"
365 fi
[877cc6a]366(
367cat << EOF
368 @\$(call unpack3,$FILE)
[82eb8c1]369 @ROOT=\`head -n1 \$(SRC)/\$(PKG_LST) | sed 's@^./@@;s@/.*@@'\` && \\
[877cc6a]370 echo "export PKGDIR=\$(SRC)/\$\$ROOT" > envars
371EOF
372) >> $MKFILE.tmp
373}
374
[a229600]375#----------------------------------#
376wrt_test_log() { # Initialize testsuite log file
377#----------------------------------#
378 local TESTLOGFILE=$1
379(
380cat << EOF
381 @echo "export TEST_LOG=$TESTLOGDIR/$TESTLOGFILE" >> envars && \\
382 su - lfs -c "echo -e '\n\`date\`\n' >$TESTLOGDIR/$TESTLOGFILE"
383EOF
384) >> $MKFILE.tmp
385}
386
387#----------------------------------#
388wrt_test_log2() { #
389#----------------------------------#
390 local TESTLOGFILE=$1
391(
392cat << EOF
393 @echo "export TEST_LOG=/$SCRIPT_ROOT/test-logs/$TESTLOGFILE" >> envars && \\
394 echo -e "\n\`date\`\n" >test-logs/$TESTLOGFILE
395EOF
396) >> $MKFILE.tmp
397}
398
[877cc6a]399#----------------------------------#
400wrt_target_vars() { # Target vars for hlfs (cross-build method)
401#----------------------------------#
402(
403cat << EOF
404 @echo "export target=$(uname -m)-${TARGET}" >> envars && \\
405 echo "export ldso=/lib/${LOADER}" >> envars
406EOF
407) >> $MKFILE.tmp
408
409}
410
411
412#----------------------------------#
[3a321ea]413wrt_run_as_su() { # Execute script inside time { }, footer to log file
[877cc6a]414#----------------------------------#
415 local this_script=$1
416 local file=$2
417(
418cat << EOF
[3a321ea]419 @( time { su - lfs -c "source /home/lfs/.bashrc && $JHALFSDIR/${PROGNAME}-commands/$file" >>logs/$this_script 2>&1 ; } ) 2>>logs/$this_script && \\
[1a1f099]420 echo -e "\nKB: \`du -skx --exclude=${SCRIPT_ROOT} \$(MOUNT_PT)\`\n" >>logs/$this_script
[877cc6a]421EOF
422) >> $MKFILE.tmp
423}
424
425
426#----------------------------------#
[3a321ea]427wrt_run_as_root() { # Some scripts must be run as root..
[877cc6a]428#----------------------------------#
429 local this_script=$1
430 local file=$2
431(
432cat << EOF
[3a321ea]433 @( time { export LFS=\$(MOUNT_PT) && ${PROGNAME}-commands/$file >>logs/$this_script 2>&1 ; } ) 2>>logs/$this_script && \\
[1a1f099]434 echo -e "\nKB: \`du -skx --exclude=${SCRIPT_ROOT} \$(MOUNT_PT)\`\n" >>logs/$this_script
[877cc6a]435EOF
436) >> $MKFILE.tmp
437}
438
439
[e5f5970]440#----------------------------------#
441wrt_run_as_clfs_su() { # Execute script inside time { }, footer to log file
442#----------------------------------#
443 local this_script=$1
444 local file=$2
445(
446cat << EOF
447 @( time { su - clfs -c "source /home/clfs/.bashrc && $JHALFSDIR/${PROGNAME}-commands/$file" >>logs/$this_script 2>&1 ; } ) 2>>logs/$this_script && \\
448 echo -e "\nKB: \`du -skx --exclude=${SCRIPT_ROOT} \$(MOUNT_PT)\`\n" >>logs/$this_script
449EOF
450) >> $MKFILE.tmp
451}
452
453
[ac1d897]454#----------------------------------#
455wrt_run_as_clfs_root() { # Some scripts must be run as root..
456#----------------------------------#
457 local this_script=$1
458 local file=$2
459(
460cat << EOF
461 @( time { export CLFS=\$(MOUNT_PT) && ${PROGNAME}-commands/$file >>logs/$this_script 2>&1 ; } ) 2>>logs/$this_script && \\
462 echo -e "\nKB: \`du -skx --exclude=${SCRIPT_ROOT} \$(MOUNT_PT)\`\n" >>logs/$this_script
463EOF
464) >> $MKFILE.tmp
465}
466
467
[261eea6]468#----------------------------------#
469wrt_run_as_root2() { #
470#----------------------------------#
[877cc6a]471 local this_script=$1
472 local file=$2
473(
474cat << EOF
[3a321ea]475 @( time { source envars && ${PROGNAME}-commands/$file >>logs/$this_script 2>&1 ; } ) 2>>logs/$this_script && \\
[1a1f099]476 echo -e "\nKB: \`du -skx --exclude=${SCRIPT_ROOT} \`\n" >>logs/$this_script
[877cc6a]477EOF
478) >> $MKFILE.tmp
479}
480
481
482
483#----------------------------------#
484wrt_run_as_chroot1() { #
485#----------------------------------#
486 local this_script=$1
487 local file=$2
488(
489 cat << EOF
[1a1f099]490 @( time { \$(CHROOT1) 'cd /${SCRIPT_ROOT} && source envars && /${SCRIPT_ROOT}/${PROGNAME}-commands/$file >>/${SCRIPT_ROOT}/logs/${this_script} 2>&1' ; } ) 2>>logs/$this_script && \\
491 echo -e "\nKB: \`du -skx --exclude=${SCRIPT_ROOT} \$(MOUNT_PT)\`\n" >>logs/${this_script}
[877cc6a]492EOF
493) >> $MKFILE.tmp
494}
495
496
497#----------------------------------#
498wrt_run_as_chroot2() { #
499#----------------------------------#
500 local this_script=$1
501 local file=$2
502(
503cat << EOF
[1a1f099]504 @( time { \$(CHROOT2) 'cd /${SCRIPT_ROOT} && source envars && /${SCRIPT_ROOT}/${PROGNAME}-commands/$file >>/${SCRIPT_ROOT}/logs/${this_script} 2>&1' ; } ) 2>>logs/$this_script && \\
505 echo -e "\nKB: \`du -skx --exclude=${SCRIPT_ROOT} \$(MOUNT_PT)\`\n" >>logs/${this_script}
[877cc6a]506EOF
507) >> $MKFILE.tmp
508}
509
510
511#----------------------------------#
512wrt_copy_fstab() { #
513#----------------------------------#
514 local i=$1
515(
516 cat << EOF
[3a321ea]517 @cp -v $FSTAB \$(MOUNT_PT)/etc/fstab >>logs/$i 2>&1
[877cc6a]518EOF
519) >> $MKFILE.tmp
520}
521
522#----------------------------------#
[3a321ea]523wrt_copy_fstab2() { #
[877cc6a]524#----------------------------------#
525 local i=$1
526(
527 cat << EOF
[3a321ea]528 @cp -v /sources/fstab /etc/fstab >>logs/$i 2>&1
[877cc6a]529EOF
530) >> $MKFILE.tmp
531}
532
533
534#----------------------------------#
[0bdf6ed]535wrt_remove_build_dirs() { #
[877cc6a]536#----------------------------------#
[0bdf6ed]537 local name=$1
[877cc6a]538(
[0bdf6ed]539cat << EOF
[82eb8c1]540 @ROOT=\`head -n1 \$(MOUNT_PT)\$(SRC)/\$(PKG_LST) | sed 's@^./@@;s@/.*@@'\` && \\
[b7faa5a]541 rm -r \$(MOUNT_PT)\$(SRC)/\$\$ROOT && \\
542 if [ -e \$(MOUNT_PT)\$(SRC)/$name-build ]; then \\
[0bdf6ed]543 rm -r \$(MOUNT_PT)\$(SRC)/$name-build; \\
544 fi;
545EOF
546) >> $MKFILE.tmp
547}
548
549
550#----------------------------------#
551wrt_remove_build_dirs2() { #
552#----------------------------------#
553 local name=$1
554(
555cat << EOF
[82eb8c1]556 @ROOT=\`head -n1 \$(SRC)/\$(PKG_LST) | sed 's@^./@@;s@/.*@@'\` && \\
[b7faa5a]557 rm -r \$(SRC)/\$\$ROOT && \\
558 if [ -e \$(SRC)/$name-build ]; then \\
[0bdf6ed]559 rm -r \$(SRC)/$name-build; \\
560 fi;
[877cc6a]561EOF
562) >> $MKFILE.tmp
563}
564
565
[e2ef100]566#----------------------------------#
567wrt_touch() { #
568#----------------------------------#
569(
570cat << EOF
571 @touch \$@ && \\
572 sleep .25 && \\
[4a444f1]573 echo -e "\n\n "\$(BOLD)Target \$(BLUE)\$@ \$(BOLD)OK && \\
574 echo --------------------------------------------------------------------------------\$(WHITE)
[e2ef100]575EOF
576) >> $MKFILE.tmp
577}
578
579
[453bef0]580#----------------------------------#
[261eea6]581wrt_report() { #
[453bef0]582#----------------------------------#
583(
584cat << EOF
585
586create-sbu_du-report: $PREV
587 @\$(call echo_message, Building)
[a9429d5]588 @./create-sbu_du-report.sh logs $VERSION
[453bef0]589 @\$(call echo_report,$VERSION-SBU_DU-$(date --iso-8601).report)
590 @touch \$@
591EOF
592) >> $MKFILE.tmp
593
594chapter789="$chapter789 create-sbu_du-report"
595}
596
597
[877cc6a]598#----------------------------#
[261eea6]599run_make() { #
[877cc6a]600#----------------------------#
601 # Test if make must be run.
602 if [ "$RUNMAKE" = "1" ] ; then
603 # Test to make sure we're running the build as root
604 if [ "$UID" != "0" ] ; then
605 echo "You must be logged in as root to successfully build the system."
606 exit 1
607 fi
608 # Build the system
609 if [ -e $MKFILE ] ; then
610 echo -ne "Building the system...\n"
[a167246]611 cd $JHALFSDIR && make
[877cc6a]612 echo -ne "done\n"
613 fi
614 fi
615}
616
617
618#----------------------------#
[261eea6]619clean_builddir() { #
[877cc6a]620#----------------------------#
621 # Test if the clean must be done.
622 if [ "$CLEAN" = "1" ] ; then
623 # Test to make sure we're running the clean as root
624 if [ "$UID" != "0" ] ; then
625 echo "You must be logged in as root to clean the build directory."
626 exit 1
627 fi
628 # Test to make sure that the build directory was populated by jhalfs
629 if [ ! -d $JHALFSDIR ] || [ ! -d $BUILDDIR/sources ] ; then
[73e5448]630 echo "Looks like $BUILDDIR was not populated by a previous jhalfs run."
[877cc6a]631 exit 1
632 else
633 # Clean the build directory
634 echo -ne "Cleaning $BUILDDIR...\n"
635 rm -rf $BUILDDIR/{bin,boot,dev,etc,home,lib,media,mnt,opt,proc,root,sbin,srv,sys,tmp,tools,cross-tools,usr,var}
636 echo -ne "Cleaning $JHALFSDIR...\n"
[dd29d02]637 rm -rf $JHALFSDIR/{0*,1*,envars,sources-dir,*commands,*logs,Makefile,*.xsl,makefile-functions,pkg_tarball_list,*.config,*.sh}
[877cc6a]638 echo -ne "Cleaning remainig extracted sources in $BUILDDIR/sources...\n"
639 rm -rf `find $BUILDDIR/sources/* -maxdepth 0 -type d`
640 echo -ne "done\n"
641 fi
642 fi
643}
644
645#----------------------------#
[261eea6]646get_book() { #
[877cc6a]647#----------------------------#
648 cd $JHALFSDIR
649
650 if [ -z $WC ] ; then
651 # Check for Subversion instead of just letting the script hit 'svn' and fail.
652 test `type -p svn` || eval "echo \"This feature requires Subversion.\"
653 exit 1"
654 echo -n "Downloading the $PROGNAME document, $LFSVRS version... "
655
656 case $PROGNAME in
657 lfs) svn_root="LFS" ;;
658 hlfs) svn_root="HLFS" ;;
659 clfs) svn_root="cross-lfs" ;;
[7432834]660 clfs2) svn_root="cross-lfs" ;;
[877cc6a]661 *) echo "BOOK not defined in function <get_book>"
662 exit 1 ;;
663 esac
664 # Grab a fresh book if it's missing, otherwise, update it from the
665 # repo. If we've already extracted the commands, move on to getting the
666 # sources.
667 if [ -d ${PROGNAME}-$LFSVRS ] ; then
668 cd ${PROGNAME}-$LFSVRS
[1ff6768]669 if LC_ALL=C svn up | grep -q At && \
670 test -d $JHALFSDIR/${PROGNAME}-commands && \
671 test -f $JHALFSDIR/pkg_tarball_list ; then
[877cc6a]672 # Set the canonical book version
[a6655ff]673 echo -ne "done\n"
[877cc6a]674 cd $JHALFSDIR
[1ff6768]675 case $PROGNAME in
[7432834]676 clfs | clfs2)
[1ff6768]677 VERSION=$(xmllint --noent $BOOK/prologue/$ARCH/bookinfo.xml 2>/dev/null | grep subtitle | sed -e 's/^.*ion //' -e 's/<\/.*//') ;;
678 *)
679 VERSION=$(xmllint --noent $BOOK/prologue/bookinfo.xml 2>/dev/null | grep subtitle | sed -e 's/^.*ion //' -e 's/<\/.*//') ;;
680 esac
[877cc6a]681 get_sources
682 else
683 echo -ne "done\n"
684 extract_commands
685 fi
686 else
[cb39f79]687 svn co $SVN/${svn_root}/${TREE} ${PROGNAME}-$LFSVRS >>$LOGDIR/$LOG 2>&1
[877cc6a]688 echo -ne "done\n"
689 extract_commands
690 fi
[1ff6768]691
[877cc6a]692 else
693 echo -ne "Using $BOOK as book's sources ...\n"
694 extract_commands
695 fi
[a6655ff]696 echo -ne " Document version ${L_arrow}${BOLD}${VERSION}${R_arrow}\n"
[877cc6a]697}
698
699#----------------------------#
700extract_commands() { #
701#----------------------------#
702
703 # Check for libxslt instead of just letting the script hit 'xsltproc' and fail.
704 test `type -p xsltproc` || eval "echo \"This feature requires libxslt.\"
705 exit 1"
706
707 cd $JHALFSDIR
[1ff6768]708 case $PROGNAME in
[7432834]709 clfs | clfs2 )
[1ff6768]710 VERSION=$(xmllint --noent $BOOK/prologue/$ARCH/bookinfo.xml 2>/dev/null | grep subtitle | sed -e 's/^.*ion //' -e 's/<\/.*//') ;;
711 *)
712 VERSION=$(xmllint --noent $BOOK/prologue/bookinfo.xml 2>/dev/null | grep subtitle | sed -e 's/^.*ion //' -e 's/<\/.*//') ;;
713 esac
[877cc6a]714
715 # Start clean
[bfc07d6]716 if [ -d ${PROGNAME}-commands ]; then
717 rm -rf ${PROGNAME}-commands
718 mkdir -v ${PROGNAME}-commands
[877cc6a]719 fi
720 echo -n "Extracting commands for"
721
722 # Dump the commands in shell script form from the HLFS book.
723 case ${PROGNAME} in
724 clfs)
725 echo -n " ${L_arrow}${BOLD}$ARCH${R_arrow} target architecture"
726 xsltproc --nonet \
727 --xinclude \
728 --stringparam method $METHOD \
729 --stringparam testsuite $TEST \
[28f4756]730 --stringparam bomb-testsuite $BOMB_TEST \
[877cc6a]731 --stringparam vim-lang $VIMLANG \
732 --stringparam timezone $TIMEZONE \
733 --stringparam page $PAGE \
734 --stringparam lang $LANG \
735 --stringparam keymap $KEYMAP \
736 -o ./${PROGNAME}-commands/ $XSL $BOOK/$ARCH-index.xml >>$LOGDIR/$LOG 2>&1
737 ;;
[7432834]738
739 clfs2)
740 echo -n " ${L_arrow}${BOLD}$ARCH${R_arrow} target architecture"
741 xsltproc --nonet \
742 --xinclude \
743 --stringparam testsuite $TEST \
[28f4756]744 --stringparam bomb-testsuite $BOMB_TEST \
[7432834]745 --stringparam vim-lang $VIMLANG \
746 --stringparam timezone $TIMEZONE \
747 --stringparam page $PAGE \
748 --stringparam lang $LANG \
749 --stringparam keymap $KEYMAP \
750 -o ./${PROGNAME}-commands/ $XSL $BOOK/$ARCH-index.xml >>$LOGDIR/$LOG 2>&1
751 ;;
[877cc6a]752 hlfs)
753 echo -n " ${L_arrow}${BOLD}$MODEL${R_arrow} HLFS libc implementation"
754 xsltproc --nonet \
755 --xinclude \
756 --stringparam model $MODEL \
757 --stringparam testsuite $TEST \
[28f4756]758 --stringparam bomb-testsuite $BOMB_TEST \
[877cc6a]759 --stringparam timezone $TIMEZONE \
760 --stringparam page $PAGE \
761 --stringparam lang $LANG \
762 --stringparam lc_all $LC_ALL \
763 --stringparam keymap $KEYMAP \
764 --stringparam grsecurity_host $GRSECURITY_HOST \
765 -o ./${PROGNAME}-commands/ $XSL $BOOK/index.xml >>$LOGDIR/$LOG 2>&1
766 ;;
767 lfs)
768 echo -n " ${L_arrow}${BOLD}LFS${R_arrow} build"
769 xsltproc --nonet \
770 --xinclude \
771 --stringparam testsuite $TEST \
[28f4756]772 --stringparam bomb-testsuite $BOMB_TEST \
[877cc6a]773 --stringparam vim-lang $VIMLANG \
774 --stringparam timezone $TIMEZONE \
775 --stringparam page $PAGE \
776 --stringparam lang $LANG \
777 -o ./${PROGNAME}-commands/ $XSL $BOOK/index.xml >>$LOGDIR/$LOG 2>&1
778 ;;
[15cad16]779 *) exit 1 ;;
[877cc6a]780 esac
781
782 echo " ...OK"
783
784 # Make the scripts executable.
785 chmod -R +x $JHALFSDIR/${PROGNAME}-commands
786
[15cad16]787 # Create the packages file. We need it for proper Makefile creation
[dd29d02]788 create_package_list
[877cc6a]789
790 # Done. Moving on...
791 get_sources
792}
793
[dd29d02]794#----------------------------#
795create_package_list() { #
796#----------------------------#
797
798 # Create the packages file. We need it for proper Makefile creation
799 rm -f pkg_tarball_list
800 echo -n "Creating <${PROGNAME}> list of tarball names for $BOOK $ARCH"
801 case ${PROGNAME} in
[7432834]802 clfs | clfs2)
[dd29d02]803 xsltproc --nonet --xinclude -o pkg_tarball_list packages.xsl \
804 $BOOK/materials/${ARCH}-chapter.xml >>$LOGDIR/$LOG 2>&1
805 ;;
806 hlfs)
807 xsltproc --nonet --xinclude -o pkg_tarball_list packages.xsl \
808 $BOOK/chapter04/chapter04.xml >>$LOGDIR/$LOG 2>&1
809 ;;
810 lfs)
811 xsltproc --nonet --xinclude -o pkg_tarball_list packages.xsl \
812 $BOOK/chapter03/chapter03.xml >>$LOGDIR/$LOG 2>&1
813 ;;
814 esac
815 echo " ...OK"
816
817}
818
819
[877cc6a]820#----------------------------#
[15cad16]821get_sources() { # Download file, write name to MISSING_FILES.DMP if an error
[93135fd]822#----------------------------#
823 local saveIFS=$IFS
[26053c4]824 local IFS line URL1 URL2 FILE BOOKMD5 MD5 HAVEMD5 fromARCHIVE
[93135fd]825
826 # Test if the packages must be downloaded
827 [ ! "$GETPKG" = "1" ] && return
828
829 gs_wrt_message(){
830 echo "${RED}$1${OFF}"
[c7dbe78]831 echo "$1" >> MISSING_FILES.DMP
832 }
[93135fd]833 # Housekeeping
834 [[ ! -d $BUILDDIR/sources ]] && mkdir $BUILDDIR/sources
835 cd $BUILDDIR/sources
836 [[ -f MD5SUMS ]] && rm MD5SUMS
837 [[ -f MISSING_FILES.DMP ]] && rm MISSING_FILES.DMP
838 [[ -f urls.lst ]] && rm urls.lst
839
840 # Generate URLs file
841 create_urls
842
843 IFS=$'\x0A' # Modify the 'internal field separator' to break on 'LF' only
844 for line in `cat urls.lst`; do
845 IFS=$saveIFS # Restore the system defaults
846
847 # Skip some packages if they aren't needed
848 case $line in
849 */tcl* | */expect* | */dejagnu* | */tree* | */gcc-testsuite* )
850 [[ "$TEST" = "0" ]] && continue
851 ;;
852 */vim-*-lang* )
853 [[ "$VIMLANG" = "0" ]] && continue
854 ;;
[0c3f2f9]855 *linux/linux-* )
[294c937]856 [[ -z "$CONFIG" ]] && [[ -z "$BOOT_CONFIG" ]] && \
857 [[ "$GETKERNEL" = "0" ]] && continue
[0c3f2f9]858 ;;
[93135fd]859 esac
860
861 # Locations
[296ae69]862 URL1=`echo $line | cut -d" " -f2` # Preferred URL
863 URL2=`echo $line | cut -d" " -f1` # Fallback Upstream URL
[26053c4]864 FILE=`basename $URL1` # File name
865 BOOKMD5=`echo $line | cut -d" " -f3` # MD5 book value
866
[8a43b5b]867 # Validation pair
868 MD5="$BOOKMD5 $FILE"
869 HAVEMD5=1
[93135fd]870
871 set -e
[c7dbe78]872 # If the file exists in the archive copy it to the
[93135fd]873 # $BUILDDIR/sources dir. MD5SUM will be validated later.
874 if [ ! -z ${SRC_ARCHIVE} ] &&
875 [ -d ${SRC_ARCHIVE} ] &&
876 [ -f ${SRC_ARCHIVE}/$FILE ]; then
877 cp ${SRC_ARCHIVE}/$FILE .
878 echo "$FILE: -- copied from $SRC_ARCHIVE"
879 fromARCHIVE=1
880 else
881 echo "${BOLD}${YELLOW}$FILE: not found in ${SRC_ARCHIVE}${OFF}"
882 fromARCHIVE=0
[8a43b5b]883 # If the file does not exist yet in /sources download a fresh one
[93135fd]884 if [ ! -f $FILE ] ; then
885 if ! wget $URL1 && ! wget $URL2 ; then
[c7dbe78]886 gs_wrt_message "$FILE not found in the SRC_ARCHIVE or on any server..SKIPPING"
887 continue
[93135fd]888 fi
889 fi
890 fi
891
[8a43b5b]892 # IF the md5sum does not match the existing files
893 if ! echo "$MD5" | md5sum -c - >/dev/null ; then
894 [[ $fromARCHIVE = "1" ]] && echo "${BOLD}${YELLOW}MD5SUM did not match SRC_ARCHIVE copy${OFF}"
895 [[ $fromARCHIVE = "0" ]] && echo "${BOLD}${YELLOW}MD5SUM did not match REMOTE copy${OFF}"
896 # Remove the old file and download a new one
897 rm -fv $FILE
898 # Force storage in SRC_ARCHIVE
899 fromARCHIVE=0;
900 # Try to retrieve again the file. Servers in reverse order.
901 if ! wget $URL2 && ! wget $URL1 ; then
902 gs_wrt_message "$FILE not found on the servers.. SKIPPING"
903 continue
[93135fd]904 fi
905 fi
906
907 # Validate the MD5SUM one last time
[8a43b5b]908 if ! echo "$MD5" | md5sum -c - >/dev/null ; then
[93135fd]909 gs_wrt_message "$FILE does not match MD5SUMS value"
[0910f55]910 # Force generation of MD5SUM
911 HAVEMD5=0
[93135fd]912 fi
913
914 # Generate a fresh MD5SUM for this file
915 if [[ "$HAVEMD5" = "0" ]] ; then
916 echo "${BOLD}${YELLOW}Generating a new MD5SUM for ${OFF}$FILE"
[8a43b5b]917 echo "NEW MD5SUM: $(md5sum $FILE)" >> MISSING_FILES.DMP
[93135fd]918 fi
919
920 # Good or bad we write the original md5sum to a file
[8a43b5b]921 echo "$MD5" >> MD5SUMS
[93135fd]922
923 # Copy the freshly downloaded file
924 # to the source archive.
925 if [ ! -z ${SRC_ARCHIVE} ] &&
926 [ -d ${SRC_ARCHIVE} ] &&
927 [ -w ${SRC_ARCHIVE} ] &&
928 [ "$fromARCHIVE" = "0" ] ; then
929 echo "Storing file:<$FILE> in the package archive"
930 cp -f $FILE ${SRC_ARCHIVE}
931 fi
932
933 done
934
935 if [[ -s MISSING_FILES.DMP ]]; then
[d385453]936 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"
937 # Do not allow the automatic execution of the Makefile.
[261eea6]938 echo "${tab_}${BOLD}${RED}*** ${YELLOW}Automatic execution of the generated makefile has been inhibited. ${RED}***${OFF}${nl_}"
[93135fd]939 RUNMAKE=0
940 fi
941}
942
[877cc6a]943#----------------------------#
[15cad16]944create_urls() { #
[877cc6a]945#----------------------------#
[15cad16]946 cd $JHALFSDIR
[877cc6a]947
[15cad16]948 case ${PROGNAME} in
949 clfs)
950 echo -n "Creating CLFS <${ARCH}> specific URLs file"
951 xsltproc --nonet --xinclude \
952 --stringparam server $SERVER \
953 -o $BUILDDIR/sources/urls.lst urls.xsl \
954 $BOOK/materials/$ARCH-chapter.xml >>$LOGDIR/$LOG 2>&1
955 echo " ...OK"
956 ;;
[7432834]957 clfs2)
958 echo -n "Creating CLFS2 <${ARCH}> specific URLs file"
959 xsltproc --nonet --xinclude \
960 --stringparam server $SERVER \
961 -o $BUILDDIR/sources/urls.lst urls.xsl \
962 $BOOK/materials/$ARCH-chapter.xml >>$LOGDIR/$LOG 2>&1
963 echo " ...OK"
964 ;;
[15cad16]965 hlfs)
966 echo -n "Creating HLFS <${MODEL}> specific URLs file"
967 xsltproc --nonet --xinclude \
968 --stringparam server $SERVER \
969 --stringparam model $MODEL \
970 -o $BUILDDIR/sources/urls.lst urls.xsl \
971 $BOOK/chapter04/chapter04.xml >>$LOGDIR/$LOG 2>&1
972 echo " ...OK"
973 ;;
974 lfs)
975 echo -n "Creating LFS specific URLs file"
976 xsltproc --nonet --xinclude \
977 --stringparam server $SERVER \
978 -o ../sources/urls.lst urls.xsl \
979 $BOOK/chapter03/chapter03.xml >>$LOGDIR/$LOG 2>&1
980 echo " ...OK"
981 ;;
982 esac
[877cc6a]983
[15cad16]984 cd $BUILDDIR/sources
[877cc6a]985}
Note: See TracBrowser for help on using the repository browser.