source: common/common-functions@ 89ddac0

experimental
Last change on this file since 89ddac0 was 9485eba, checked in by George Boudreau <georgeb@…>, 18 years ago

Implement suggestion made byDan Nicholson for configurable user/group. Required many changes and allowed for the removal of user specific function calls. Tnx Dan

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