source: HLFS/jhahlfs@ 36c87d2

1.0 2.3 2.3.x 2.4 ablfs ablfs-more legacy new_features trunk
Last change on this file since 36c87d2 was d5c31c2, checked in by George Boudreau <georgeb@…>, 19 years ago

Corrected typo in previous change

  • Property mode set to 100755
File size: 43.3 KB
Line 
1#!/bin/sh
2set -e # Enable error trapping
3set -u # Trap undefined variables.. Forces the programmer
4 # to define a variable before using it
5
6#
7# Load the configuration file
8#
9source jhahlfs.conf
10
11# VT100 colors
12declare -r BLACK=$'\e[1;30m'
13declare -r DK_GRAY=$'\e[0;30m'
14
15declare -r RED=$'\e[31m'
16declare -r GREEN=$'\e[32m'
17declare -r YELLOW=$'\e[33m'
18declare -r BLUE=$'\e[34m'
19declare -r MAGENTA=$'\e[35m'
20declare -r CYAN=$'\e[36m'
21declare -r WHITE=$'\e[37m'
22
23declare -r OFF=$'\e[0m'
24declare -r BOLD=$'\e[1m'
25declare -r REVERSE=$'\e[7m'
26declare -r HIDDEN=$'\e[8m'
27
28declare -r tab_=$'\t'
29declare -r nl_=$'\n'
30
31declare -r DD_BORDER="${BOLD}${WHITE}==============================================================================${OFF}"
32declare -r SD_BORDER="${BOLD}${WHITE}------------------------------------------------------------------------------${OFF}"
33declare -r STAR_BORDER="${BOLD}${WHITE}******************************************************************************${OFF}"
34
35# bold yellow > < pair
36declare -r R_arrow=$'\e[1;33m>\e[0m'
37declare -r L_arrow=$'\e[1;33m<\e[0m'
38
39
40# START predefine some internal vars.. proper programming style
41
42 # If the var BOOK contains something then, maybe, it points
43 # to a working doc.. set WC=1, else 'null'
44WC=${BOOK:+1}
45
46CLEAN=0 # Clean out build dir?
47DL= # The download app to use
48PREV= # name of previous script processed
49chapter5=
50chapter6=
51chapter7=
52
53# END predefined vars section
54
55_inline_doc="
56${GREEN}
57 This script, jhahlfs, strives to generate an accurate makefile
58 directly from the xml files used to generated the Hardened Linux From
59 Scratch document.
60 The usage of this script assumes you have read and are familiar with
61 the book and therefore the configuration variables found in jhahlfs.conf
62 will have meaning to you. There are a limited number of command line
63 switches which, if used, will override the config file settings.
64
65 NOTES::
66 *. The resulting Makefile takes considerable time to run to completion,
67 lay in a supply of caffeine beverages.
68
69 *. The document, Hardened Linux From Scratch, specifies a Linux kernel
70 >=2.6.2 and GCC >=3.0 for proper compilation.
71
72 *. It is recommended that you temporarily unpack your linux kernel and
73 run <make menuconfig> and configure the kernal as per the book and save
74 the resulting .config file.
75
76 *. Chapter07 contains numerous command files which require customizing
77 before you start 129-console, 131-profile, 133-hosts, 134-network,
78 135-fstab, 136-kernel.
79${OFF}"
80
81version="
82jhahlfs development \$Date$
83
84Written by George Boudreau
85
86Based on the jhalfs code written by Jeremy Huntwork and Manuel Canales Esparcia.
87
88This program is published under the ${WHITE}Gnu General Public License, Version 2.${OFF}
89"
90
91usage() {
92 'clear'
93cat <<- -EOF-
94${DD_BORDER}
95${BOLD}
96${WHITE} Usage: $0 ${YELLOW}[OPTION]
97${CYAN}
98Options:
99${YELLOW} -h, --help
100${CYAN} print this help, then exit
101${YELLOW} --readme
102${CYAN} print a small readme file, then exit
103${YELLOW} -V, --version
104${CYAN} print version number, then exit
105${YELLOW} -d --directory DIR
106${CYAN} use DIR directory for building HLFS; all files jhahlfs produces will be
107 in the directory DIR/jhahlfs. Default is \"/mnt/lfs\".
108${YELLOW} --rebuild
109${CYAN} clean the build directory before to perfom any other task. The directory
110 is cleaned only if it was populated by a previous jhahlfs run.
111${YELLOW} -P, --get-packages
112${CYAN} download the packages and patches. This assumes that the server declared in the
113 jhahlfs.conf file has the proper packages and patches for the book version being
114 processed.
115${YELLOW} -W, --working-copy DIR
116${CYAN} use the local working copy placed in DIR as the HLFS book
117${YELLOW} -L, --HLFS-version VER
118${CYAN} checkout VER version of the HLFS book. Supported versions at this time are:
119 dev* | trunk | SVN aliases for Development HLFS
120${YELLOW} --fstab FILE
121${CYAN} use FILE as the /etc/fstab file for the HLFS system. If not specified,
122 a default /etc/fstab file with dummy values is created.
123${YELLOW} -C, --kernel-config FILE
124${CYAN} use the kernel configuration file specified in FILE to build the kernel.
125 if the file is not found, or if not specified, the kernel build is skipped.
126${YELLOW} -M, --run-make
127${CYAN} run make on the generated Makefile
128${DD_BORDER}
129-EOF-
130 exit
131}
132
133
134help="\
135Try '$0 --help' for more information."
136
137no_empty_builddir() {
138 'clear'
139cat <<- -EOF-
140${DD_BORDER}
141
142${tab_}${tab_}${RED}W A R N I N G${OFF}
143${GREEN}
144 Looks like the \$BUILDDIR directory contains subdirectories
145 from a previous HLFS build.
146
147 Please format the partition mounted on \$BUILDDIR or set
148 a different build directory before running jhahlfs.
149${OFF}
150${DD_BORDER}
151-EOF-
152 exit
153}
154
155exit_missing_arg="\
156echo \"Option '\$1' requires an argument\" >&2
157echo \"\$help\" >&2
158exit 1"
159
160no_dl_client="\
161echo \"Could not find a way to download the HLFS sources.\" >&2
162echo \"Attempting to continue.\" >&2"
163
164HEADER="# This file is automatically generated by jhahlfs
165# DO NOT EDIT THIS FILE MANUALLY
166#
167# Generated on `date \"+%F %X %Z\"`"
168
169#>>>>>>>>>>>>>>>ERROR TRAPPING >>>>>>>>>>>>>>>>>>>>
170#-----------------------#
171simple_error() { # Basic error trap.... JUST DIE
172#-----------------------#
173 # If +e then disable text output
174 if [[ "$-" =~ "e" ]]; then
175 echo -e "\n${RED}ERROR:${GREEN} basic error trapped!${OFF}\n" >&2
176 fi
177}
178
179see_ya() {
180 echo -e "\n\t${BOLD}${WHITE}Goodbye and thank you for choosing ${YELLOW}JHAHLFS\n${OFF}"
181}
182##### Simple error TRAPS
183# ctrl-c SIGINT
184# ctrl-y
185# ctrl-z SIGTSTP
186# SIGHUP 1 HANGUP
187# SIGINT 2 INTRERRUPT FROM KEYBOARD Ctrl-C
188# SIGQUIT 3
189# SIGKILL 9 KILL
190# SIGTERM 15 TERMINATION
191# SIGSTOP 17,18,23 STOP THE PROCESS
192#####
193set -e
194trap see_ya 0
195trap simple_error ERR
196trap 'echo -e "\n\n${RED}INTERRUPT${OFF} trapped\n" && exit 2' 1 2 3 15 17 18 23
197#>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
198
199
200###################################
201### FUNCTIONS ###
202###################################
203
204#----------------------------#
205check_requirements() { # Simple routine to validate gcc and kernel versions against requirements
206#----------------------------#
207 # Minimum values acceptable
208 # bash 3.0>
209 # gcc 3.0>
210 # kernel 2.6.2>
211
212 [[ $1 = "1" ]] && echo "${nl_}BASH: ${L_arrow}${GREEN}${BASH_VERSION}${R_arrow}"
213 case $BASH_VERSION in
214 [3-9].*) ;;
215 *) 'clear'
216 echo -e "
217$DD_BORDER
218\t\t${OFF}${RED}BASH version ${BOLD}${YELLOW}-->${WHITE} $BASH_VERSION ${YELLOW}<--${OFF}${RED} is too old.
219\t\t This script requires 3.0${OFF}${RED} or greater
220$DD_BORDER"
221 exit 1
222 ;;
223 esac
224
225 [[ $1 = "1" ]] && echo "GCC: ${L_arrow}${GREEN}`gcc -dumpversion`${R_arrow}"
226 case `gcc -dumpversion` in
227 [3-9].[0-9].* ) ;;
228 *) 'clear'
229 echo -e "
230$DD_BORDER
231\t\t${OFF}${RED}GCC version ${BOLD}${YELLOW}-->${WHITE} $(gcc -dumpversion) ${YELLOW}<--${OFF}${RED} is too old.
232\t\t This script requires ${BOLD}${WHITE}3.0${OFF}${RED} or greater
233$DD_BORDER"
234 exit 1
235 ;;
236 esac
237
238 #
239 # >>>> Check kernel version against the minimum acceptable level <<<<
240 #
241 [[ $1 = "1" ]] && echo "LINUX: ${L_arrow}${GREEN}`uname -r`${R_arrow}"
242
243 local IFS
244 declare -i major minor revision change
245 min_kernel_vers=2.6.2
246
247 IFS=".-" # Split up w.x.y.z as well as w.x.y-rc (catch release candidates)
248 set -- $min_kernel_vers # set postional parameters to minimum ver values
249 major=$1; minor=$2; revision=$3
250 #
251 set -- `uname -r` # Set postional parameters to user kernel version
252 #Compare against minimum acceptable kernel version..
253 (( $1 > major )) && return
254 (( $1 == major )) && ((( $2 > minor )) ||
255 ((( $2 == minor )) && (( $3 >= revision )))) && return
256
257 # oops.. write error msg and die
258 echo -e "
259$DD_BORDER
260\t\t${OFF}${RED}The kernel version ${BOLD}${YELLOW}-->${WHITE} $(uname -r) ${YELLOW}<--${OFF}${RED} is too old.
261\t\tThis script requires version ${BOLD}${WHITE}$min_kernel_vers${OFF}${RED} or greater
262$DD_BORDER"
263 exit 1
264}
265
266
267#----------------------------#
268validate_config() { # Are the config values sane (within reason)
269#----------------------------#
270 local -r PARAM_LIST="BUILDDIR HPKG MODEL TEST TOOLCHAINTEST STRIP VIMLANG PAGE GRSECURITY_HOST RUNMAKE"
271 local -r ERROR_MSG='${OFF}${RED}The variable \"${GREEN}${config_param}${RED}\" value ${BOLD}${YELLOW}--\>${WHITE}${!config_param}${YELLOW}\<--${OFF}${RED} is invalid, check the config file ${GREEN}\<jhahlfs.conf\>${OFF}'
272 local -r PARAM_VALS='${WHITE}${config_param}: ${L_arrow}${GREEN}${!config_param}${R_arrow}'
273 local config_param
274 local validation_str
275
276 write_error_and_die() {
277 echo -e "\n${DD_BORDER}"
278 echo "`eval echo ${ERROR_MSG}`" >&2
279 echo -e "${DD_BORDER}\n"
280 exit 1
281 }
282 set +e
283 for config_param in $PARAM_LIST; do
284 [[ $1 = "1" ]] && echo -e "`eval echo $PARAM_VALS`"
285 case $config_param in
286 BUILDDIR) # We cannot have an <empty> or </> root mount point
287 if [[ "xx x/x" =~ "x${!config_param}x" ]]; then
288 write_error_and_die
289 fi
290 continue ;;
291 HPKG) validation_str="x0x x1x" ;;
292 RUNMAKE) validation_str="x0x x1x" ;;
293 TEST) validation_str="x0x x1x" ;;
294 STRIP) validation_str="x0x x1x" ;;
295 VIMLANG) validation_str="x0x x1x" ;;
296 TOOLCHAINTEST) validation_str="x0x x1x" ;;
297 GRSECURITY_HOST) validation_str="x0x x1x" ;;
298
299 MODEL) validation_str="xglibcx xuclibcx" ;;
300 PAGE) validation_str="xletterx xA4x" ;;
301 *)
302 echo "WHAT PARAMETER IS THIS.. <<${config_param}>>"
303 exit
304 ;;
305 esac
306 # This is the 'regexp' test available in bash-3.0..
307 # using it as a poor man's test for substring
308 if [[ ! "${validation_str}" =~ "x${!config_param}x" ]] ; then
309 # parameter value entered is no good
310 write_error_and_die
311 fi
312 done # for loop
313
314 for config_param in LC_ALL LANG; do
315 [[ $1 = "1" ]] && echo "`eval echo $PARAM_VALS`"
316 [[ -z "${!config_param}" ]] && continue
317 # See it the locale values exist on this machine
318 [[ "`locale -a | grep -c ${!config_param}`" > 0 ]] && continue
319
320 # If you make it this far then there is a problem
321 write_error_and_die
322 done
323
324 for config_param in FSTAB CONFIG KEYMAP BOOK; do
325 [[ $1 = "1" ]] && echo "`eval echo $PARAM_VALS`"
326 # If this is not a working copy, ie the default book, then skip
327 [[ -z $WC ]] && continue
328 [[ -z "${!config_param}" ]] && continue
329 [[ -e "${!config_param}" ]] && [[ -s "${!config_param}" ]] && continue
330
331 # If you make it this far then there is a problem
332 write_error_and_die
333 done
334
335 set -e
336 echo "$tab_${BOLD}${YELLOW} Config parameters look good${OFF}${nl_}"
337}
338
339
340#----------------------------#
341build_patches_file() { # Supply a suitably formated list of patches.
342#----------------------------#
343 local saveIFS=$IFS
344
345 LOC_add_patches_entry() {
346 for f in `grep "/$1-" patcheslist_.wget`; do
347 basename $f | sed "s|${2}|\&${1}-version;|" >> patches
348 done
349 }
350
351 xsltproc --nonet \
352 --xinclude \
353 -o patcheslist_.wget \
354 hlfs-patcheslist_.xsl \
355 $BOOK/index.xml > /dev/null 2>&1
356
357 rm -f patches
358
359 IFS=$'\x0A' # Modify the 'internal field separator' to break on 'LF' only
360 for f in `cat packages`; do
361 IFS=$saveIFS
362 LOC_add_patches_entry \
363 `echo $f | sed -e 's/-version//' \
364 -e 's/-file.*//' \
365 -e 's/"//g' \
366 -e 's/uclibc/uClibc/'`
367 done
368
369 # .... U G L Y .... what to do with the grsecurity patch to the kernel..
370 for f in `grep "/grsecurity-" patcheslist_.wget`; do
371 basename $f >> patches
372 done
373
374 IFS=$saveIFS
375 rm -f patcheslist_.wget
376}
377
378
379#----------------------------#
380clean_builddir() { #
381#----------------------------#
382 # Test if the clean must be done.
383 if [ "$CLEAN" = "1" ] ; then
384 # Test to make sure we're running the clean as root
385 if [ "$UID" != "0" ] ; then
386 echo "You must be logged in as root to clean the build directory."
387 exit 1
388 fi
389 # Test to make sure that the build directory was populated by jhahlfs
390 if [ ! -d $JHAHLFSDIR ] || [ ! -d $BUILDDIR/sources ] ; then
391 echo "Looks like $BUILDDIR was not populated by a previous jhahlfs run."
392 exit 1
393 else
394 # Clean the build directory
395 echo -ne "Cleaning $BUILDDIR...\n"
396 rm -rf $BUILDDIR/{bin,boot,dev,etc,home,lib,media,mnt,opt,proc,root,sbin,srv,sys,tmp,tools,usr,var}
397 echo -ne "Cleaning $JHAHLFSDIR...\n"
398 rm -rf $JHAHLFSDIR/{0*,1*,envars,sources-dir,commands,logs,Makefile,dump-hlfs-scripts.xsl,hlfs-functions,packages,patches}
399 echo -ne "Cleaning remainig extracted sources in $BUILDDIR/sources...\n"
400 rm -rf `find $BUILDDIR/sources/* -maxdepth 0 -type d`
401 echo -ne "done\n"
402 fi
403 fi
404}
405
406#----------------------------#
407get_book() { #
408#----------------------------#
409 cd $JHAHLFSDIR
410
411 if [ -z $WC ] ; then
412 # Check for Subversion instead of just letting the script hit 'svn' and fail.
413 test `type -p svn` || eval "echo \"This feature requires Subversion.\"
414 exit 1"
415
416 echo -n "Downloading the HLFS Book, version $HLFSVRS... "
417 # Grab a fresh HLFS book if it's missing, otherwise, update it from the
418 # repo. If we've already extracted the commands, move on to getting the
419 # sources.
420 if [ -d hlfs-$HLFSVRS ] ; then
421 cd hlfs-$HLFSVRS
422 if LC_ALL=C svn up | grep -q At && \
423 test -d $JHAHLFSDIR/commands && \
424 test -f $JHAHLFSDIR/packages && \
425 test -f $JHAHLFSDIR/patches ; then
426 echo -ne "done\n"
427 # Set the canonical book version
428 cd $JHAHLFSDIR
429 VERSION=`grep "ENTITY version " $BOOK/general.ent | sed 's@<!ENTITY version "@@;s@">@@'`
430 get_sources
431 else
432 echo -ne "done\n"
433 extract_commands
434 fi
435 else
436 case $HLFSVRS in
437 development)
438 svn co $SVN/HLFS/trunk/BOOK hlfs-$HLFSVRS >>$LOGDIR/$LOG 2>&1
439 ;;
440 *) echo -e "${RED}Invalid document version selected${OFF}"
441 ;;
442 esac
443 echo -ne "done\n"
444 extract_commands
445 fi
446 else
447 echo -ne "Using $BOOK as book's sources ...\n"
448 extract_commands
449 fi
450}
451
452#----------------------------#
453extract_commands() { #
454#----------------------------#
455 # Check for libxslt instead of just letting the script hit 'xsltproc' and fail.
456 test `type -p xsltproc` || eval "echo \"This feature requires libxslt.\"
457 exit 1"
458
459 cd $JHAHLFSDIR
460 VERSION=`grep "ENTITY version " $BOOK/general.ent | sed 's@<!ENTITY version "@@;s@">@@'`
461
462 # Start clean
463 if [ -d commands ]; then
464 rm -rf commands
465 mkdir -v commands
466 fi
467 echo -n "Extracting commands..."
468
469 # Dump the commands in shell script form from the HLFS book.
470 xsltproc --nonet \
471 --xinclude \
472 --stringparam model $MODEL \
473 --stringparam testsuite $TEST \
474 --stringparam toolchaintest $TOOLCHAINTEST \
475 --stringparam vim-lang $VIMLANG \
476 -o ./commands/ $XSL $BOOK/index.xml >>$LOGDIR/$LOG 2>&1
477
478 # Make the scripts executable.
479 chmod -R +x $JHAHLFSDIR/commands
480
481 # Grab the patches and package names.
482 cd $JHAHLFSDIR
483 for i in patches packages ; do rm -f $i ; done
484 grep "\-version" $BOOK/general.ent | sed -e 's@<!ENTITY @@' -e 's@">@"@' \
485 -e '/generic/d' >> packages
486
487 # Download the vim-lang package if it must be installed
488 if [ "$VIMLANG" = "1" ] ; then
489 echo `grep "vim" packages | sed 's@vim@&-lang@'` >> packages
490 fi
491 echo `grep "udev-config-file" $BOOK/general.ent | sed -e 's@<!ENTITY @@' -e 's@">@"@'` >> packages
492
493 # There is no HLFS patches.ent file so we will create one.
494 build_patches_file
495# grep "ENTITY" $BOOK/patches.ent | sed -e 's/.* "//' -e 's/">//' >> patches
496
497 # Done. Moving on...
498 echo -ne "done\n"
499 get_sources
500}
501
502#----------------------------#
503download() { # Download file, write name to MISSING_FILES.DMP if an error
504#----------------------------#
505 cd $BUILDDIR/sources
506
507 # Hackish fix for the bash-doc, glibc-{linuxthreads,libidn} and
508 # module-init-tools-testsuite packages that don't conform to
509 # norms in the URL scheme.
510 DIR=`echo $1 | sed 's@-doc@@;s@-linuxthreads@@;s@-libidn@@;s@-testsuite@@'`
511
512 # Find the md5 sum for this package.
513 if [ $2 != MD5SUMS ] ; then
514 set +e
515 MD5=`grep " $2" MD5SUMS`
516 if [ $? -ne 0 ]; then
517 set -e
518 echo "${RED}$2 not found in MD5SUMS${OFF}"
519 echo "$2 not found in MD5SUMS" >> MISSING_FILES.DMP
520 return
521 fi
522 set -e
523 fi
524
525 if [ ! -f $2 ] ; then
526 case $DL in
527 wget ) wget $HTTP/$DIR/$2 ;;
528 curl ) `curl -# $HTTP/$DIR/$2 -o $2` ;;
529 * ) echo "$DL not supported at this time." ;;
530 esac
531 elif ! echo "$MD5" | md5sum -c - >/dev/null 2>/dev/null ; then
532 case $DL in
533 wget ) wget -c $HTTP/$DIR/$2 ;;
534 curl ) `curl -# -C - $HTTP/$DIR/$2 -o $2` ;;
535 * ) echo "$DL not supported at this time." ;;
536 esac
537 fi
538
539 if [ $2 != MD5SUMS ] && ! echo "$MD5" | md5sum -c - ; then
540 exit 1
541 fi
542 if [ $2 != MD5SUMS ] ; then
543 echo `grep "$MD5" MD5SUMS` >> MD5SUMS-$VERSION
544 fi
545}
546
547
548#----------------------------#
549get_sources() { #
550#----------------------------#
551 local IFS
552
553 # Test if the packages must be downloaded
554 if [ ! "$HPKG" = "1" ] ; then
555 return
556 fi
557
558 # Modify the 'internal field separator' to break on 'LF' only
559 IFS=$'\x0A'
560
561 if [ ! -d $BUILDDIR/sources ] ; then mkdir $BUILDDIR/sources ; fi
562 cd $BUILDDIR/sources
563
564 > MISSING_FILES.DMP # Files not in md5sum end up here
565
566 if [ -f MD5SUMS ] ; then rm MD5SUMS ; fi
567 if [ -f MD5SUMS-$VERSION ] ; then rm MD5SUMS-$VERSION ; fi
568
569 # Retrieve the master md5sum file
570 download "" MD5SUMS
571
572 # Iterate through each package and grab it, along with any patches it needs.
573 for i in `cat $JHAHLFSDIR/packages` ; do
574 PKG=`echo $i | sed -e 's/-version.*//' \
575 -e 's/-file.*//' \
576 -e 's/uclibc/uClibc/' `
577
578 # Needed for Groff patchlevel patch on UTF-8 branch
579 GROFFLEVEL=`grep "groff-patchlevel" $JHAHLFSDIR/packages | sed -e 's/groff-patchlevel //' -e 's/"//g'`
580
581 #
582 # How to deal with orphan packages..??
583 #
584 VRS=`echo $i | sed -e 's/.* //' -e 's/"//g'`
585 case "$PKG" in
586 "expect-lib" ) continue ;; # not valid packages
587 "linux-dl" ) continue ;;
588 "groff-patchlevel" ) continue ;;
589 "uClibc-patch" ) continue ;;
590
591 "tcl" ) FILE="$PKG$VRS-src.tar.bz2" ; download $PKG $FILE ;;
592 "vim-lang" ) FILE="vim-$VRS-lang.tar.bz2"; PKG="vim" ; download $PKG $FILE ;;
593 "udev-config" ) FILE="$VRS" ; PKG="udev" ; download $PKG $FILE ;;
594
595 "uClibc-locale" ) FILE="$PKG-$VRS.tar.bz2" ; PKG="uClibc"
596 download $PKG $FILE
597 # There can be no patches for this file
598 continue ;;
599
600 "gcc" ) download $PKG "gcc-core-$VRS.tar.bz2"
601 download $PKG "gcc-g++-$VRS.tar.bz2"
602 ;;
603 "glibc") download $PKG "$PKG-$VRS.tar.bz2"
604 download $PKG "$PKG-libidn-$VRS.tar.bz2"
605 ;;
606 * ) FILE="$PKG-$VRS.tar.bz2"
607 download $PKG $FILE
608 ;;
609 esac
610
611 for patch in `grep "$PKG-&$PKG" $JHAHLFSDIR/patches` ; do
612 PATCH=`echo $patch | sed 's@&'$PKG'-version;@'$VRS'@'`
613 download $PKG $PATCH
614 done
615
616 done
617
618 # .... U G L Y .... what to do with the grsecurity patch to the kernel..
619 download grsecurity `grep grsecurity $JHAHLFSDIR/patches`
620
621 # .... U G L Y .... deal with uClibc-locale-xxxxx.tar.bz2 format issue.
622 bzcat uClibc-locale-030818.tar.bz2 | gzip > uClibc-locale-030818.tgz
623
624 if [[ -s $BUILDDIR/sources/MISSING_FILES.DMP ]]; then
625 echo -e "\n\n${tab_}${RED} One or more files were not retrieved.\n${tab_} Check <MISSING_FILES.DMP> for names ${OFF}\n\n"
626 fi
627}
628
629
630#----------------------------#
631_IS_() { # Function to test build scripts names
632#----------------------------#
633 # Returns substr $2 or null str
634 # Must use string testing
635 case $1 in
636 *$2*) echo "$2" ;;
637 *) echo "" ;;
638 esac
639}
640
641#----------------------------#
642chapter4_Makefiles() { # Initialization of the system
643#----------------------------#
644 local TARGET LOADER
645
646 echo "${YELLOW} Processing Chapter-4 scripts ${OFF}"
647
648 # Define a few model dependant variables
649 if [[ ${MODEL} = "uclibc" ]]; then
650 TARGET="tools-linux-uclibc"; LOADER="ld-uClibc.so.0"
651 else
652 TARGET="tools-linux-gnu"; LOADER="ld-linux.so.2"
653 fi
654
655 # 022-
656 # If /home/hlfs is already present in the host, we asume that the
657 # hlfs user and group are also presents in the host, and a backup
658 # of their bash init files is made.
659(
660cat << EOF
661020-creatingtoolsdir:
662 @\$(call echo_message, Building)
663 @mkdir -v \$(HLFS)/tools && \\
664 rm -fv /tools && \\
665 ln -sv \$(HLFS)/tools /
666 @if [ ! -d \$(HLFS)/sources ]; then \\
667 mkdir \$(HLFS)/sources; \\
668 fi;
669 @chmod a+wt \$(HLFS)/sources && \\
670 touch \$@
671
672021-addinguser: 020-creatingtoolsdir
673 @\$(call echo_message, Building)
674 @if [ ! -d /home/hlfs ]; then \\
675 groupadd hlfs; \\
676 useradd -s /bin/bash -g hlfs -m -k /dev/null hlfs; \\
677 else \\
678 touch user-hlfs-exist; \\
679 fi;
680 @chown hlfs \$(HLFS)/tools && \\
681 chown hlfs \$(HLFS)/sources && \\
682 touch \$@
683
684022-settingenvironment: 021-addinguser
685 @\$(call echo_message, Building)
686 @if [ -f /home/hlfs/.bashrc -a ! -f /home/hlfs/.bashrc.XXX ]; then \\
687 mv -v /home/hlfs/.bashrc /home/hlfs/.bashrc.XXX; \\
688 fi;
689 @if [ -f /home/hlfs/.bash_profile -a ! -f /home/hlfs/.bash_profile.XXX ]; then \\
690 mv -v /home/hlfs/.bash_profile /home/hlfs/.bash_profile.XXX; \\
691 fi;
692 @echo "set +h" > /home/hlfs/.bashrc && \\
693 echo "umask 022" >> /home/hlfs/.bashrc && \\
694 echo "HLFS=\$(HLFS)" >> /home/hlfs/.bashrc && \\
695 echo "LC_ALL=POSIX" >> /home/hlfs/.bashrc && \\
696 echo "PATH=/tools/bin:/bin:/usr/bin" >> /home/hlfs/.bashrc && \\
697 echo "export HLFS LC_ALL PATH" >> /home/hlfs/.bashrc && \\
698 echo "" >> /home/hlfs/.bashrc && \\
699 echo "target=$(uname -m)-${TARGET}" >> /home/hlfs/.bashrc && \\
700 echo "ldso=/tools/lib/${LOADER}" >> /home/hlfs/.bashrc && \\
701 echo "export target ldso" >> /home/hlfs/.bashrc && \\
702 echo "source $JHAHLFSDIR/envars" >> /home/hlfs/.bashrc && \\
703 chown hlfs:hlfs /home/hlfs/.bashrc && \\
704 touch envars && \\
705 touch \$@
706EOF
707) >> $MKFILE.tmp
708
709}
710
711#----------------------------#
712chapter5_Makefiles() { # Bootstrap or temptools phase
713#----------------------------#
714
715 echo "${YELLOW} Processing Chapter-5 scripts${OFF}"
716
717 for file in chapter05/* ; do
718 # Keep the script file name
719 this_script=`basename $file`
720
721 # Skip this script depending on jhahlfs.conf flags set.
722 case $this_script in
723 # If no testsuites will be run, then TCL, Expect and DejaGNU aren't needed
724 *tcl* ) [[ "$TOOLCHAINTEST" = "0" ]] && continue; ;;
725 *expect* ) [[ "$TOOLCHAINTEST" = "0" ]] && continue; ;;
726 *dejagnu* ) [[ "$TOOLCHAINTEST" = "0" ]] && continue; ;;
727 # Test if the stripping phase must be skipped
728 *stripping* ) [[ "$STRIP" = "0" ]] && continue ;;
729 # Select the appropriate library
730 *glibc*) [[ ${MODEL} = "uclibc" ]] && continue ;;
731 *uclibc*) [[ ${MODEL} = "glibc" ]] && continue ;;
732 *) ;;
733 esac
734
735 # First append each name of the script files to a list (this will become
736 # the names of the targets in the Makefile
737 chapter5="$chapter5 $this_script"
738
739 # Grab the name of the target (minus the -headers or -cross in the case of gcc
740 # and binutils in chapter 5)
741 name=`echo $this_script | sed -e 's@[0-9]\{3\}-@@' -e 's@-cross@@' -e 's@-headers@@'`
742
743 # >>>>>>>>>> U G L Y <<<<<<<<<
744 # Adjust 'name' and patch a few scripts on the fly..
745 case $name in
746 linux-libc) name=linux-libc-headers
747 ;;
748 uclibc) # this sucks as method to deal with gettext/libint inside uClibc
749 sed 's@^cd gettext-runtime@cd ../gettext-*/gettext-runtime@' -i chapter05/$this_script
750 ;;
751 gcc) # to compensate for the compiler test inside gcc (which fails), disable error trap
752 sed 's@^gcc -o test test.c@set +e; gcc -o test test.c@' -i chapter05/$this_script
753 ;;
754 esac
755
756 # Set the dependency for the first target.
757 if [ -z $PREV ] ; then PREV=022-settingenvironment ; fi
758
759
760 #--------------------------------------------------------------------#
761 # >>>>>>>> START BUILDING A Makefile ENTRY <<<<<<<< #
762 #--------------------------------------------------------------------#
763 #
764 # Drop in the name of the target on a new line, and the previous target
765 # as a dependency. Also call the echo_message function.
766 echo -e "\n$this_script: $PREV
767 @\$(call echo_message, Building)" >> $MKFILE.tmp
768
769 # Find the version of the command files, if it corresponds with the building of
770 # a specific package
771 vrs=`grep "^$name-version" $JHAHLFSDIR/packages | sed -e 's/.* //' -e 's/"//g'`
772 # If $vrs isn't empty, we've got a package...
773 if [ "$vrs" != "" ] ; then
774 # Deal with non-standard names
775 case $name in
776 tcl) FILE="$name$vrs-src.tar" ;;
777 uclibc) FILE="uClibc-$vrs.tar" ;;
778 gcc) FILE=gcc-core-$vrs.tar ;;
779 *) FILE="$name-$vrs.tar" ;;
780 esac
781 # Insert instructions for unpacking the package and to set the PKGDIR variable.
782(
783cat << EOF
784 @\$(call unpack,$FILE)
785 @ROOT=\`head -n1 /tmp/unpacked | sed 's@^./@@;s@/.*@@'\` && \\
786 chown -R hlfs \$(HLFS)\$(SRC)/\$\$ROOT && \\
787 echo "export PKGDIR=\$(HLFS)\$(SRC)/\$\$ROOT" > envars && \\
788EOF
789) >> $MKFILE.tmp
790 fi
791
792 case $this_script in
793 *binutils* ) # Dump the path to sources directory for later removal
794 echo -e '\techo "$(HLFS)$(SRC)/$$ROOT" >> sources-dir' >> $MKFILE.tmp
795 ;;
796 *adjusting* ) # For the Adjusting phase we must to cd to the binutils-build directory.
797 echo -e '\t@echo "export PKGDIR=$(HLFS)$(SRC)/binutils-build" > envars' >> $MKFILE.tmp
798 ;;
799 * ) # Everything else, add a true statment so we don't confuse make
800 echo -e '\ttrue' >> $MKFILE.tmp
801 ;;
802 esac
803
804 # Insert date and disk usage at the top of the log file, the script run
805 # and date and disk usage again at the bottom of the log file.
806(
807cat << EOF
808 @echo -e "\n\`date\`\n\nKB: \`du -sk --exclude={0,1}??-* \$(HLFS)\`\n" >logs/$this_script && \\
809 su - hlfs -c "source /home/hlfs/.bashrc && $JHAHLFSDIR/commands/$file" >>logs/$this_script 2>&1 && \\
810 echo -e "\n\`date\`\n\nKB: \`du -sk --exclude={0,1}??-* \$(HLFS)\`\n" >>logs/$this_script
811EOF
812) >> $MKFILE.tmp
813
814 # Remove the build directory(ies) except if the package build fails
815 # (so we can review config.cache, config.log, etc.)
816 # For Binutils the sources must be retained for some time.
817 if [ "$vrs" != "" ] ; then
818 if [[ ! `_IS_ $this_script binutils` ]]; then
819(
820cat << EOF
821 @ROOT=\`head -n1 /tmp/unpacked | sed 's@^./@@;s@/.*@@'\` && \\
822 rm -r \$(HLFS)\$(SRC)/\$\$ROOT && \\
823 if [ -e \$(HLFS)\$(SRC)/$name-build ]; then \\
824 rm -r \$(HLFS)\$(SRC)/$name-build; \\
825 fi;
826EOF
827) >> $MKFILE.tmp
828 fi
829 fi
830
831 # Remove the Binutils pass 1 sources after a successful Adjusting phase.
832 if [[ `_IS_ $this_script adjusting` ]] ; then
833(
834cat << EOF
835 @rm -r \`cat sources-dir\` && \\
836 rm -r \$(HLFS)\$(SRC)/binutils-build && \\
837 rm sources-dir
838EOF
839) >> $MKFILE.tmp
840 fi
841
842 # Include a touch of the target name so make can check if it's already been made.
843 echo -e '\t@touch $@' >> $MKFILE.tmp
844 #
845 #--------------------------------------------------------------------#
846 # >>>>>>>> END OF Makefile ENTRY <<<<<<<< #
847 #--------------------------------------------------------------------#
848
849 # Keep the script file name for Makefile dependencies.
850 PREV=$this_script
851 done # end for file in chapter05/*
852}
853
854
855#----------------------------#
856chapter6_Makefiles() { # sysroot or chroot build phase
857#----------------------------#
858 local TARGET LOADER
859
860 #
861 # Set these definitions early and only once
862 #
863 if [[ ${MODEL} = "uclibc" ]]; then
864 TARGET="pc-linux-uclibc"; LOADER="ld-uClibc.so.0"
865 else
866 TARGET="pc-linux-gnu"; LOADER="ld-linux.so.2"
867 fi
868
869 echo -e "${YELLOW} Processing Chapter-6 scripts ${OFF}"
870 for file in chapter06/* ; do
871 # Keep the script file name
872 this_script=`basename $file`
873
874 # Skip this script depending on jhahlfs.conf flags set.
875 case $this_script in
876 # We'll run the chroot commands differently than the others, so skip them in the
877 # dependencies and target creation.
878 *chroot* ) continue ;;
879 # Test if the stripping phase must be skipped
880 *-stripping* ) [[ "$STRIP" = "0" ]] && continue ;;
881 # Select the appropriate library
882 *glibc*) [[ ${MODEL} = "uclibc" ]] && continue ;;
883 *uclibc*) [[ ${MODEL} = "glibc" ]] && continue ;;
884 *) ;;
885 esac
886
887 # First append each name of the script files to a list (this will become
888 # the names of the targets in the Makefile
889 chapter6="$chapter6 $this_script"
890
891 # Grab the name of the target
892 name=`echo $this_script | sed -e 's@[0-9]\{3\}-@@'`
893
894 #
895 # Sed replacement for 'nodump' tag in xml scripts until Manuel has a chance to fix them
896 #
897 case $name in
898 kernfs) # Remove sysctl code if host does not have grsecurity enabled
899 if [[ "$GRSECURITY_HOST" = "0" ]]; then
900 sed '/sysctl/d' -i chapter06/$this_script
901 fi
902 ;;
903 module-init-tools)
904 if [[ "$TEST" = "0" ]]; then # This needs rework....
905 sed '/make distclean/d' -i chapter06/$this_script
906 fi
907 ;;
908 glibc) # PATCH.. Turn off error trapping for the remainder of the script.
909 sed 's|^make install|make install; set +e|' -i chapter06/$this_script
910 ;;
911 uclibc) # PATCH..
912 sed 's/EST5EDT/${TIMEZONE}/' -i chapter06/$this_script
913 # PATCH.. Cannot use interactive programs/scripts.
914 sed 's/make menuconfig/make oldconfig/' -i chapter06/$this_script
915 sed 's@^cd gettext-runtime@cd ../gettext-*/gettext-runtime@' -i chapter06/$this_script
916 ;;
917 gcc) # PATCH..
918 sed 's/rm /rm -f /' -i chapter06/$this_script
919 ;;
920 esac
921
922 #--------------------------------------------------------------------#
923 # >>>>>>>> START BUILDING A Makefile ENTRY <<<<<<<< #
924 #--------------------------------------------------------------------#
925 #
926 # Drop in the name of the target on a new line, and the previous target
927 # as a dependency. Also call the echo_message function.
928 echo -e "\n$this_script: $PREV
929 @\$(call echo_message, Building)" >> $MKFILE.tmp
930
931 # Find the version of the command files, if it corresponds with the building of
932 # a specific package
933 vrs=`grep "^$name-version" $JHAHLFSDIR/packages | sed -e 's/.* //' -e 's/"//g'`
934
935 # If $vrs isn't empty, we've got a package...
936 # Insert instructions for unpacking the package and changing directories
937 if [ "$vrs" != "" ] ; then
938 # Deal with non-standard names
939 case $name in
940 tcl) FILE="$name$vrs-src.tar.*" ;;
941 uclibc) FILE="uClibc-$vrs.tar.*" ;;
942 gcc) FILE="gcc-core-$vrs.tar.*" ;;
943 *) FILE="$name-$vrs.tar.*" ;;
944 esac
945(
946cat << EOF
947 @\$(call unpack2,$FILE)
948 @ROOT=\`head -n1 /tmp/unpacked | sed 's@^./@@;s@/.*@@'\` && \\
949 echo "export PKGDIR=\$(SRC)/\$\$ROOT" > envars && \\
950 echo "export target=$(uname -m)-${TARGET}" >> envars && \\
951 echo "export ldso=/lib/${LOADER}" >> envars
952EOF
953) >> $MKFILE.tmp
954 fi
955
956 case $this_script in
957 *readjusting*) # For the Re-Adjusting phase we must to cd to the binutils-build directory.
958 echo -e '\t@echo "export PKGDIR=$(SRC)/binutils-build" > envars' >> $MKFILE.tmp
959 ;;
960 *glibc* | *uclibc* ) # For glibc and uClibc we need to set TIMEZONE envar.
961 echo -e '\t@echo "export TIMEZONE=$(TIMEZONE)" >> envars' >> $MKFILE.tmp
962 ;;
963 *groff* ) # For Groff we need to set PAGE envar.
964 echo -e '\t@echo "export PAGE=$(PAGE)" >> envars' >> $MKFILE.tmp
965 ;;
966 esac
967
968
969 # In the mount of kernel filesystems we need to set HLFS and not to use chroot.
970 if [[ `_IS_ $this_script kernfs` ]] ; then
971(
972cat << EOF
973 @echo -e "\n\`date\`\n\nKB: \`du -sk --exclude={0,1}??-* \$(HLFS)\`\n" >logs/$this_script && \\
974 export HLFS=\$(HLFS) && commands/$file >>logs/$this_script 2>&1 && \\
975 echo -e "\n\`date\`\n\nKB: \`du -sk --exclude={0,1}??-* \$(HLFS)\`\n" >>logs/$this_script
976EOF
977) >> $MKFILE.tmp
978
979 # The rest of Chapter06
980 else
981(
982cat << EOF
983 @echo -e "\n\`date\`\n\nKB: \`du -skx --exclude={0,1}??-* \$(HLFS)\`\n" >logs/$this_script && \\
984 \$(CHROOT1) 'cd /jhahlfs && source envars && /jhahlfs/commands/$file >>/jhahlfs/logs/$this_script 2>&1' && \\
985 echo -e "\n\`date\`\n\nKB: \`du -skx --exclude={0,1}??-* \$(HLFS)\`\n" >>logs/$this_script
986EOF
987) >> $MKFILE.tmp
988 fi
989
990 # Remove the build directory(ies) except if the package build fails.
991 if [ "$vrs" != "" ] ; then
992(
993cat << EOF
994 @ROOT=\`head -n1 /tmp/unpacked | sed 's@^./@@;s@/.*@@'\` && \\
995 rm -r \$(HLFS)\$(SRC)/\$\$ROOT && \\
996 if [ -e \$(HLFS)\$(SRC)/$name-build ]; then \\
997 rm -r \$(HLFS)\$(SRC)/$name-build; \\
998 fi;
999EOF
1000) >> $MKFILE.tmp
1001 fi
1002
1003 # Remove the Binutils pass 2 sources after a successful Re-Adjusting phase.
1004 if [[ `_IS_ $this_script readjusting` ]] ; then
1005(
1006cat << EOF
1007 @rm -r \`cat sources-dir\` && \\
1008 rm -r \$(HLFS)\$(SRC)/binutils-build && \\
1009 rm sources-dir
1010EOF
1011) >> $MKFILE.tmp
1012 fi
1013
1014 # Include a touch of the target name so make can check if it's already been made.
1015 echo -e '\t@touch $@' >> $MKFILE.tmp
1016 #
1017 #--------------------------------------------------------------------#
1018 # >>>>>>>> END OF Makefile ENTRY <<<<<<<< #
1019 #--------------------------------------------------------------------#
1020
1021 # Keep the script file name for Makefile dependencies.
1022 PREV=$this_script
1023 done # end for file in chapter06/*
1024
1025}
1026
1027#----------------------------#
1028chapter7_Makefiles() { # Create a bootable system.. kernel, bootscripts..etc
1029#----------------------------#
1030
1031 echo "${YELLOW} Processing Chapter-7 scripts ${OFF}"
1032 for file in chapter07/*; do
1033 # Keep the script file name
1034 this_script=`basename $file`
1035
1036 # Grub must be configured manually.
1037 # The filesystems can't be unmounted via Makefile and the user
1038 # should enter the chroot environment to create the root
1039 # password, edit several files and setup Grub.
1040 case $this_script in
1041 *grub) continue ;;
1042 *reboot) continue ;;
1043 *console) continue ;; # Use the file generated by lfs-bootscripts
1044
1045 *kernel) # How does Manuel add this string to the file..
1046 sed 's|cd \$PKGDIR.*||' -i chapter07/$this_script
1047 # You cannot run menuconfig from within the makefile
1048 sed 's|make menuconfig|make oldconfig|' -i chapter07/$this_script
1049 # The files in the conglomeration dir are xxx.bz2
1050 sed 's|.patch.gz|.patch.bz2|' -i chapter07/$this_script
1051 sed 's|gunzip|bunzip2|' -i chapter07/$this_script
1052 # If defined include the keymap in the kernel
1053 if [[ -n "$KEYMAP" ]]; then
1054 sed "s|^loadkeys -m.*>|loadkeys -m $KEYMAP >|" -i chapter07/$this_script
1055 else
1056 sed '/loadkeys -m/d' -i chapter07/$this_script
1057 sed '/drivers\/char/d' -i chapter07/$this_script
1058 fi
1059 # If no .config file is supplied, the kernel build is skipped
1060 [[ -z $CONFIG ]] && continue
1061 ;;
1062 *usage) # The script bombs, disable error trapping
1063 sed 's|set -e|set +e|' -i chapter07/$this_script
1064 ;;
1065 *profile) # Add the config values to the script
1066 sed "s|LC_ALL=\*\*EDITME.*EDITME\*\*|LC_ALL=$LC_ALL|" -i chapter07/$this_script
1067 sed "s|LANG=\*\*EDITME.*EDITME\*\*|LANG=$LANG|" -i chapter07/$this_script
1068 ;;
1069 esac
1070
1071 # First append then name of the script file to a list (this will become
1072 # the names of the targets in the Makefile
1073 chapter7="$chapter7 $this_script"
1074
1075 #--------------------------------------------------------------------#
1076 # >>>>>>>> START BUILDING A Makefile ENTRY <<<<<<<< #
1077 #--------------------------------------------------------------------#
1078 #
1079 # Drop in the name of the target on a new line, and the previous target
1080 # as a dependency. Also call the echo_message function.
1081 echo -e "\n$this_script: $PREV
1082 @\$(call echo_message, Building)" >> $MKFILE.tmp
1083
1084 if [[ `_IS_ $this_script bootscripts` ]] ; then
1085 vrs=`grep "^lfs-bootscripts-version" $JHAHLFSDIR/packages | sed -e 's/.* //' -e 's/"//g'`
1086 FILE="lfs-bootscripts-$vrs.tar.*"
1087 # The bootscript pkg references both lfs AND blfs bootscripts...
1088 # see XML script for other additions to bootscripts file
1089 # PATCH
1090 vrs=`grep "^blfs-bootscripts-version" $JHAHLFSDIR/packages | sed -e 's/.* //' -e 's/"//g'`
1091 sed "s|make install$|make install; cd ../blfs-bootscripts-$vrs|" -i chapter07/$this_script
1092(
1093cat << EOF
1094 @\$(call unpack2,$FILE)
1095 @ROOT=\`head -n1 /tmp/unpacked | sed 's@^./@@;s@/.*@@'\` && \\
1096 echo "export PKGDIR=\$(SRC)/\$\$ROOT" > envars && \\
1097 echo "\$(HLFS)\$(SRC)/blfs-bootscripts-$vrs" > sources-dir
1098EOF
1099) >> $MKFILE.tmp
1100 fi
1101
1102 if [[ `_IS_ $this_script kernel` ]] ; then
1103 # not much really, script does everything..
1104 echo -e "\t@cp -f $CONFIG \$(HLFS)/sources/kernel-config" >> $MKFILE.tmp
1105 fi
1106
1107 # Check if we have a real /etc/fstab file
1108 if [[ `_IS_ $this_script fstab` ]] && [[ -n "$FSTAB" ]] ; then
1109(
1110cat << EOF
1111 @echo -e "\n\`date\`\n\nKB: \`du -skx --exclude={0,1}??-* \$(HLFS)\`\n" >logs/$this_script && \\
1112 cp -v $FSTAB \$(HLFS)/etc/fstab >>logs/$this_script 2>&1 && \\
1113 echo -e "\n\`date\`\n\nKB: \`du -skx --exclude={0,1}??-* \$(HLFS)\`\n" >>logs/$this_script
1114EOF
1115) >> $MKFILE.tmp
1116 else
1117 # Initialize the log and run the script
1118(
1119cat << EOF
1120 @echo -e "\n\`date\`\n\nKB: \`du -skx --exclude={0,1}??-* \$(HLFS)\`\n" >logs/$this_script && \\
1121 \$(CHROOT2) 'cd /jhahlfs && source envars && /jhahlfs/commands/$file >>/jhahlfs/logs/$this_script 2>&1' && \\
1122 echo -e "\n\`date\`\n\nKB: \`du -skx --exclude={0,1}??-* \$(HLFS)\`\n" >>logs/$this_script
1123EOF
1124) >> $MKFILE.tmp
1125 fi
1126
1127 # Remove the build directory except if the package build fails.
1128 if [[ `_IS_ $this_script bootscripts` ]]; then
1129(
1130cat << EOF
1131 @ROOT=\`head -n1 /tmp/unpacked | sed 's@^./@@;s@/.*@@'\` && \\
1132 rm -r \$(HLFS)\$(SRC)/\$\$ROOT
1133 @rm -r \`cat sources-dir\` && \\
1134 rm sources-dir
1135
1136EOF
1137) >> $MKFILE.tmp
1138 fi
1139
1140 # Include a touch of the target name so make can check if it's already been made.
1141 echo -e '\t@touch $@' >> $MKFILE.tmp
1142 #
1143 #--------------------------------------------------------------------#
1144 # >>>>>>>> END OF Makefile ENTRY <<<<<<<< #
1145 #--------------------------------------------------------------------#
1146
1147 # Keep the script file name for Makefile dependencies.
1148 PREV=$this_script
1149 done # for file in chapter07/*
1150}
1151
1152
1153#----------------------------#
1154build_Makefile() { # Construct a Makefile from the book scripts
1155#----------------------------#
1156 echo -e "${GREEN}Creating Makefile... ${OFF}"
1157
1158 cd $JHAHLFSDIR/commands
1159 # Start with a clean Makefile.tmp file
1160 >$MKFILE.tmp
1161
1162 chapter4_Makefiles
1163 chapter5_Makefiles
1164 chapter6_Makefiles
1165 chapter7_Makefiles
1166
1167 # Add a header, some variables and include the function file
1168 # to the top of the real Makefile.
1169(
1170 cat << EOF
1171$HEADER
1172
1173SRC= /sources
1174HLFS= $BUILDDIR
1175PAGE= $PAGE
1176TIMEZONE= $TIMEZONE
1177
1178include hlfs-functions
1179
1180EOF
1181) > $MKFILE
1182
1183
1184 # Add chroot commands
1185 i=1
1186 for file in chapter06/*chroot* ; do
1187 chroot=`cat $file | sed -e '/#!\/bin\/sh/d' \
1188 -e '/^export/d' \
1189 -e '/^logout/d' \
1190 -e 's@ \\\@ @g' | tr -d '\n' | sed -e 's/ */ /g' \
1191 -e 's|\\$|&&|g' \
1192 -e 's|exit||g' \
1193 -e 's|$| -c|' \
1194 -e 's|"$$HLFS"|$(HLFS)|'\
1195 -e 's|set -e||'`
1196 echo -e "CHROOT$i= $chroot\n" >> $MKFILE
1197 i=`expr $i + 1`
1198 done
1199
1200 # Drop in the main target 'all:' and the chapter targets with each sub-target
1201 # as a dependency.
1202(
1203 cat << EOF
1204all: chapter4 chapter5 chapter6 chapter7
1205 @\$(call echo_finished,$VERSION)
1206
1207chapter4: 020-creatingtoolsdir 021-addinguser 022-settingenvironment
1208
1209chapter5: chapter4 $chapter5 restore-hlfs-env
1210
1211chapter6: chapter5 $chapter6
1212
1213chapter7: chapter6 $chapter7
1214
1215clean-all: clean
1216 rm -rf ./{commands,logs,Makefile,dump-hlfs-scripts.xsl,functions,packages,patches}
1217
1218clean: clean-chapter7 clean-chapter6 clean-chapter5 clean-chapter4
1219
1220clean-chapter4:
1221 -if [ ! -f user-hlfs-exist ]; then \\
1222 userdel hlfs; \\
1223 rm -rf /home/hlfs; \\
1224 fi;
1225 rm -rf \$(HLFS)/tools
1226 rm -f /tools
1227 rm -f envars user-hlfs-exist
1228 rm -f 02* logs/02*.log
1229
1230clean-chapter5:
1231 rm -rf \$(HLFS)/tools/*
1232 rm -f $chapter5 restore-hlfs-env sources-dir
1233 cd logs && rm -f $chapter5 && cd ..
1234
1235clean-chapter6:
1236 -umount \$(HLFS)/sys
1237 -umount \$(HLFS)/proc
1238 -umount \$(HLFS)/dev/shm
1239 -umount \$(HLFS)/dev/pts
1240 -umount \$(HLFS)/dev
1241 rm -rf \$(HLFS)/{bin,boot,dev,etc,home,lib,media,mnt,opt,proc,root,sbin,srv,sys,tmp,usr,var}
1242 rm -f $chapter6
1243 cd logs && rm -f $chapter6 && cd ..
1244
1245clean-chapter7:
1246 rm -f $chapter7
1247 cd logs && rm -f $chapter7 && cd ..
1248
1249restore-hlfs-env:
1250 @\$(call echo_message, Building)
1251 @if [ -f /home/hlfs/.bashrc.XXX ]; then \\
1252 mv -fv /home/hlfs/.bashrc.XXX /home/hlfs/.bashrc; \\
1253 fi;
1254 @if [ -f /home/hlfs/.bash_profile.XXX ]; then \\
1255 mv -v /home/hlfs/.bash_profile.XXX /home/hlfs/.bash_profile; \\
1256 fi;
1257 @chown hlfs:hlfs /home/hlfs/.bash* && \\
1258 touch \$@
1259
1260EOF
1261) >> $MKFILE
1262
1263 # Bring over the items from the Makefile.tmp
1264 cat $MKFILE.tmp >> $MKFILE
1265 rm $MKFILE.tmp
1266 echo -ne "${GREEN}done\n${OFF}"
1267}
1268
1269#----------------------------#
1270run_make() { # Execute the newly constructed Makefile
1271#----------------------------#
1272 # Test if make must be run.
1273 if [ "$RUNMAKE" = "1" ] ; then
1274 # Test to make sure we're running the build as root
1275 if [ "$UID" != "0" ] ; then
1276 echo "You must be logged in as root to successfully build HLFS."
1277 exit 1
1278 fi
1279 # Build the system
1280 if [ -e $MKFILE ] ; then
1281 echo -ne "Building the HLFS system...\n"
1282 cd $JHAHLFSDIR && make
1283 echo -ne "done\n"
1284 fi
1285 fi
1286}
1287
1288
1289
1290###################################
1291### MAIN ###
1292###################################
1293
1294# Evaluate any command line switches
1295
1296while test $# -gt 0 ; do
1297 case $1 in
1298 --version | -V ) 'clear'; echo "$version" ; exit 0; ;;
1299 --help | -h ) usage | less
1300 'clear' ; exit 0
1301 ;;
1302
1303 --HLFS-version | -L )
1304 test $# = 1 && eval "$exit_missing_arg"
1305 shift
1306 case $1 in
1307 dev* | SVN | trunk )
1308 BOOK="" # necessary to overide any value set inside jhahlfs.conf
1309 WC=
1310 HLFSVRS=development
1311 ;;
1312 * )
1313 echo "$1 is an unsupported version at this time."
1314 exit 1
1315 ;;
1316 esac
1317 ;;
1318
1319 --directory | -d )
1320 test $# = 1 && eval "$exit_missing_arg"
1321 shift
1322 BUILDDIR=$1
1323 JHAHLFSDIR=$BUILDDIR/jhahlfs
1324 LOGDIR=$JHAHLFSDIR/logs
1325 MKFILE=$JHAHLFSDIR/Makefile
1326 ;;
1327
1328 --working-copy | -W )
1329 test $# = 1 && eval "$exit_missing_arg"
1330 shift
1331 if [ -f $1/patches.ent ] ; then
1332 WC=1
1333 BOOK=$1
1334 else
1335 echo -e "\nLook like $1 isn't a supported working copy."
1336 echo -e "Verify your selection and the command line.\n"
1337 exit 1
1338 fi
1339 ;;
1340
1341 --get-packages | -P ) HPKG=1 ;;
1342 --run-make | -M ) RUNMAKE=1 ;;
1343 --rebuild ) CLEAN=1 ;;
1344
1345 --readme )
1346 'clear'
1347 echo "$_inline_doc" | less
1348 'clear'; exit
1349 ;;
1350
1351 --fstab )
1352 test $# = 1 && eval "$exit_missing_arg"
1353 shift
1354 if [ -f $1 ] ; then
1355 FSTAB=$1
1356 else
1357 echo -e "\nFile $1 not found. Verify your command line.\n"
1358 exit 1
1359 fi
1360 ;;
1361
1362 --kernel-config | -C )
1363 test $# = 1 && eval "$exit_missing_arg"
1364 shift
1365 if [ -f $1 ] ; then
1366 CONFIG=$1
1367 else
1368 echo -e "\nFile $1 not found. Verify your command line.\n"
1369 exit 1
1370 fi
1371 ;;
1372 * )
1373 echo "$usage"
1374 exit 1
1375 ;;
1376 esac
1377 shift
1378done
1379
1380# Prevents setting "-d /" by mistake.
1381if [ $BUILDDIR = / ] ; then
1382 echo -ne "\nThe root directory can't be used to build HLFS.\n\n"
1383 exit 1
1384fi
1385
1386# If $BUILDDIR has subdirectories like tools/ or bin/, stop the run
1387# and notify the user about that.
1388if [ -d $BUILDDIR/tools -o -d $BUILDDIR/bin ] && [ -z $CLEAN ] ; then
1389 no_empty_builddir
1390fi
1391
1392# If requested, clean the build directory
1393clean_builddir
1394
1395# Find the download client to use, if not already specified.
1396if [ -z $DL ] ; then
1397 if [ `type -p wget` ] ; then
1398 DL=wget
1399 elif [ `type -p curl` ] ; then
1400 DL=curl
1401 else
1402 eval "$no_dl_client"
1403 fi
1404fi
1405
1406# Set the document location..
1407# if set by conf file leave it alone otherwise load the specified version
1408BOOK=${BOOK:=hlfs-$HLFSVRS}
1409
1410[[ ! -d $JHAHLFSDIR ]] && mkdir -pv $JHAHLFSDIR
1411[[ ! -d $LOGDIR ]] && mkdir -v $LOGDIR
1412if [[ "$PWD" != "$JHAHLFSDIR" ]]; then
1413 cp -v $FILES $JHAHLFSDIR/
1414 sed 's,FAKEDIR,'$BOOK',' $XSL > $JHAHLFSDIR/dump-hlfs-scripts.xsl
1415 export XSL=$JHAHLFSDIR/dump-hlfs-scripts.xsl
1416fi
1417
1418>$LOGDIR/$LOG
1419
1420
1421# Check for minumum gcc and kernel versions
1422check_requirements 1 # 0/1 0-do not display values.
1423validate_config 1 # 0/1 0-do not display values
1424get_book
1425build_Makefile
1426run_make
Note: See TracBrowser for help on using the repository browser.