source: jhalfs@ aa71d75

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

Fixed the svn check and added WC to the config file.
Thanks to Bruce Dubbs for pointing out both issues.

  • Property mode set to 100755
File size: 30.0 KB
Line 
1#!/bin/sh
2
3#
4# Load the configuration file
5#
6source jhalfs.conf
7
8
9version="
10jhalfs development \$Date$
11
12Written by Jeremy Huntwork and Manuel Canales Esparcia.
13
14This program is published under the \
15Gnu General Public License, Version 2.
16"
17
18usage="\
19Usage: $0 [OPTION]
20
21Options:
22 -h, --help print this help, then exit
23
24 -V, --version print version number, then exit
25
26 -d --directory DIR use DIR directory for building LFS; all files
27 jhalfs produces will be in the directory
28 DIR/jhalfs. Default is \"/mnt/lfs\".
29
30 --rebuild clean the build directory before to perfom
31 any other task. The directory is cleaned
32 only if it was populated by a previous
33 jhalfs run.
34
35 -P, --get-packages download the packages and patches. This
36 assumes that the server declared in the
37 jhalfs.conf file has the proper packages
38 and patches for the book version being
39 processed.
40
41 -D, --download-client CLIENT use CLIENT as the program for retrieving
42 packages (for use in conjunction with -P)
43
44 -W, --working-copy DIR use the local working copy placed in DIR
45 as the LFS book
46
47 -L, --LFS-version VER checkout VER version of the LFS book.
48 Supported versions at this time are:
49
50 dev* | trunk | SVN aliases for Development LFS
51 alpha* aliases for the alphabetical branch
52
53 For stable 6.1.1 book, please use jhalfs-0.2.
54
55 -T, --testsuites add support to run the optional testsuites
56
57 --no-toolchain-test don't run the toolchain testsuites. This
58 also disables the build of TCL, Expect
59 and DejaGNU
60
61 --no-strip don't run the strip command on both the
62 temporary system and the final system
63
64 --timezone TIMEZONE set TIMEZONE as the local timezone. If not
65 specified, \"Europe/London\" will be used.
66
67 --page_size PAGE set PAGE as the default page size (letter
68 or A4). This setting is required to
69 build Groff. If not specified, \"letter\"
70 will be used.
71
72 --fstab FILE use FILE as the /etc/fstab file for the
73 LFS system. If not specified, a default
74 /etc/fstab file with dummy values is
75 created.
76
77 --no-vim-lang don't install the optional vim-lang package
78
79 -C, --kernel-config FILE use the kernel configuration file specified
80 in FILE to build the kernel. If the file is
81 not found, or if not specified, the kernel
82 build is skipped.
83
84 -M, --run-make run make on the generated Makefile
85
86"
87
88help="\
89Try '$0 --help' for more information."
90
91no_empty_builddir="\
92echo \"\" >&2
93echo \" W A R N I N G\" >&2
94echo \"\" >&2
95echo \"Looks like the \$BUILDDIR directory contains subdirectories\" >&2
96echo \"from a previous LFS build.\" >&2
97echo \"\" >&2
98echo \"Please format the partition mounted on \$BUILDDIR or set\" >&2
99echo \"a different build directory before running jhalfs.\" >&2
100echo \"\" >&2
101exit 1"
102
103exit_missing_arg="\
104echo \"Option '\$1' requires an argument\" >&2
105echo \"\$help\" >&2
106exit 1"
107
108no_dl_client="\
109echo \"Could not find a way to download the LFS sources.\" >&2
110echo \"Attempting to continue.\" >&2"
111
112HEADER="# This file is automatically generated by jhalfs
113# DO NOT EDIT THIS FILE MANUALLY
114#
115# Generated on `date \"+%F %X %Z\"`"
116
117
118###################################
119### FUNCTIONS ###
120###################################
121
122
123#----------------------------#
124clean_builddir() {
125#----------------------------#
126 # Test if the clean must be done.
127 if [ "$CLEAN" = "1" ] ; then
128 # Test to make sure we're running the clean as root
129 if [ "$UID" != "0" ] ; then
130 echo "You must be logged in as root to clean the build directory."
131 exit 1
132 fi
133 # Test to make sure that the build directory was populated by jhalfs
134 if [ ! -d $JHALFSDIR ] || [ ! -d $BUILDDIR/sources ] ; then
135 echo "Looks like $BUILDDIR was not populated by a previous jhalfs run."
136 exit 1
137 else
138 # Clean the build directory
139 echo -ne "Cleaning $BUILDDIR...\n"
140 rm -rf $BUILDDIR/{bin,boot,dev,etc,home,lib,media,mnt,opt,proc,root,sbin,srv,sys,tmp,tools,usr,var}
141 echo -ne "Cleaning $JHALFSDIR...\n"
142 rm -rf $JHALFSDIR/{0*,1*,envars,sources-dir,commands,logs,Makefile,dump-lfs-scripts.xsl,functions,packages,patches}
143 echo -ne "Cleaning remainig extracted sources in $BUILDDIR/sources...\n"
144 rm -rf `find $BUILDDIR/sources/* -maxdepth 0 -type d`
145 echo -ne "done\n"
146 fi
147 fi
148}
149
150#----------------------------#
151get_book() {
152#----------------------------#
153 cd $JHALFSDIR
154
155 if [ -z $WC ] ; then
156 # Check for Subversion instead of just letting the script hit 'svn' and fail.
157 test `type -p svn` || eval "echo \"This feature requires Subversion.\"
158 exit 1"
159 echo -n "Downloading the LFS Book, version $LFSVRS... "
160
161 # Grab a fresh LFS book if it's missing, otherwise, update it from the
162 # repo. If we've already extracted the commands, move on to getting the
163 # sources.
164 if [ -d lfs-$LFSVRS ] ; then
165 cd lfs-$LFSVRS
166 if LC_ALL=C svn up | grep -q At && test -d $JHALFSDIR/commands && \
167 test -f $JHALFSDIR/packages && test -f $JHALFSDIR/patches ; then
168 echo -ne "done\n"
169 # Set the canonical book version
170 cd $JHALFSDIR
171 VERSION=`grep "ENTITY version " $BOOK/general.ent | sed 's@<!ENTITY version "@@;s@">@@'`
172 get_sources
173 else
174 echo -ne "done\n"
175 # Set the canonical book version
176 cd $JHALFSDIR
177 VERSION=`grep "ENTITY version " $BOOK/general.ent | sed 's@<!ENTITY version "@@;s@">@@'`
178 extract_commands
179 fi
180 else
181 case $LFSVRS in
182 development)
183 svn co $SVN/LFS/trunk/BOOK lfs-$LFSVRS >>$LOGDIR/$LOG 2>&1 ;;
184 alphabetical)
185 svn co $SVN/LFS/branches/$LFSVRS/BOOK lfs-$LFSVRS >>$LOGDIR/$LOG 2>&1 ;;
186 esac
187 echo -ne "done\n"
188 # Set the canonical book version
189 cd $JHALFSDIR
190 VERSION=`grep "ENTITY version " $BOOK/general.ent | sed 's@<!ENTITY version "@@;s@">@@'`
191 extract_commands
192 fi
193 else
194 echo -ne "Using $BOOK as book's sources ...\n"
195 # Set the canonical book version
196 cd $JHALFSDIR
197 VERSION=`grep "ENTITY version " $BOOK/general.ent | sed 's@<!ENTITY version "@@;s@">@@'`
198 extract_commands
199 fi
200}
201
202#----------------------------#
203extract_commands() {
204#----------------------------#
205 # Check for libxslt instead of just letting the script hit 'xsltproc' and fail.
206 test `type -p xsltproc` || eval "echo \"This feature requires libxslt.\"
207 exit 1"
208 cd $JHALFSDIR
209
210 # Start clean
211 if [ -d commands ] ; then rm -rf commands ; fi && mkdir commands
212 echo -n "Extracting commands... "
213
214 # Dump the commands in shell script form from the LFS book.
215 xsltproc --nonet --xinclude --stringparam testsuite $TEST \
216 --stringparam toolchaintest $TOOLCHAINTEST --stringparam vim-lang $VIMLANG \
217 -o ./commands/ $XSL $BOOK/index.xml >>$LOGDIR/$LOG 2>&1
218
219 # Make the scripts executable.
220 chmod -R +x $JHALFSDIR/commands
221
222 # Grab the patches and package names.
223 cd $JHALFSDIR
224 for i in patches packages ; do rm -f $i ; done
225 grep "\-version" $BOOK/general.ent | sed -e 's@<!ENTITY @@' -e 's@">@"@' \
226 -e '/generic/d' >> packages
227 # Download the vim-lang package if it must be installed
228 if [ "$VIMLANG" = "1" ] ; then
229 echo `grep "vim" packages | sed 's@vim@&-lang@'` >> packages
230 fi
231 echo `grep "udev-config-file" $BOOK/general.ent | sed -e 's@<!ENTITY @@' -e 's@">@"@'` >> packages
232 echo `grep "glibc" packages | sed 's@glibc@glibc-libidn@'` >> packages
233 grep "^<\!ENTITY" $BOOK/patches.ent | sed -e 's/.* "//' -e 's/">//' >> patches
234
235 # Needed for Groff patchlevel patch
236 GROFFLEVEL=`grep "groff-patchlevel" $BOOK/general.ent | sed -e 's/groff-patchlevel //' -e 's/"//g' \
237 -e 's@<!ENTITY @@' -e 's|>||'`
238 sed -i 's|&groff-patchlevel;|'$GROFFLEVEL'|' patches
239
240 # Done. Moving on...
241 echo -ne "done\n"
242 get_sources
243}
244
245#----------------------------#
246download() {
247#----------------------------#
248 cd $BUILDDIR/sources
249
250 # Hackish fix for the bash-doc, glibc-{linuxthreads,libidn} and
251 # module-init-tools-testsuite packages that don't conform to
252 # norms in the URL scheme.
253 DIR=`echo $1 | sed 's@-doc@@;s@-libidn@@'`
254
255 # Find the md5 sum for this package.
256 if [ $2 != MD5SUMS ] ; then MD5=`grep " $2$" MD5SUMS` ; fi
257
258 if [ ! -f $2 ] ; then
259 case $DL in
260 wget )
261 wget $HTTP/$DIR/$2
262 ;;
263 curl )
264 `curl -# $HTTP/$DIR/$2 -o $2`
265 ;;
266 * )
267 echo "$DL not supported at this time."
268 ;;
269 esac
270 elif ! echo "$MD5" | md5sum -c - >/dev/null 2>/dev/null ; then
271 case $DL in
272 wget )
273 wget -c $HTTP/$DIR/$2
274 ;;
275 curl )
276 `curl -# -C - $HTTP/$DIR/$2 -o $2`
277 ;;
278 * )
279 echo "$DL not supported at this time."
280 ;;
281 esac
282 fi
283 if [ $2 != MD5SUMS ] && ! echo "$MD5" | md5sum -c - ; then
284 exit 1
285 fi
286 if [ $2 != MD5SUMS ] ; then
287 echo `grep "$MD5" MD5SUMS` >> MD5SUMS-$VERSION
288 fi
289}
290
291#----------------------------#
292get_sources() {
293#----------------------------#
294
295 # Test if the packages must be downloaded
296 if [ "$HPKG" = "1" ] ; then
297
298 # This variable is necessary to make sure the `cat $JHALFSDIR/packages`
299 # separates each iteration by lines. It is necessary to have the second
300 # ' on the next line.
301 IFS='
302'
303
304 if [ ! -d $BUILDDIR/sources ] ; then mkdir $BUILDDIR/sources ; fi
305 cd $BUILDDIR/sources
306 if [ -f MD5SUMS ] ; then rm MD5SUMS ; fi
307 if [ -f MD5SUMS-$VERSION ] ; then rm MD5SUMS-$VERSION ; fi
308
309 download "" MD5SUMS
310
311 # Iterate through each package and grab it, along with any patches it needs.
312 for i in `cat $JHALFSDIR/packages` ; do
313 PKG=`echo $i | sed -e 's/-version.*//' -e 's/-file.*//'`
314
315 # There are some entities that aren't valid packages.
316 if [ "$PKG" = "expect-lib" -o "$PKG" = "linux-dl" -o "$PKG" = "groff-patchlevel" ] ; then continue ; fi
317
318 VRS=`echo $i | sed -e 's/.* //' -e 's/"//g'`
319 case $PKG in
320 tcl)
321 FILE="$PKG$VRS-src.tar.bz2"
322 ;;
323 vim-lang)
324 PKG="vim"
325 FILE="vim-$VRS-lang.tar.bz2"
326 ;;
327 udev-config)
328 PKG="udev"
329 FILE="$VRS"
330 ;;
331 *)
332 FILE="$PKG-$VRS.tar.bz2"
333 ;;
334 esac
335 download $PKG $FILE
336
337 # Download any associated patches
338 for patch in `grep "&$PKG-version" $JHALFSDIR/patches` ; do
339 PATCH=`echo $patch | sed 's@&'$PKG'-version;@'$VRS'@'`
340 download $PKG $PATCH
341 done
342 done
343 fi
344}
345
346#-----------------------------------------------#
347_IS_() # Function to test build scripts names
348#-----------------------------------------------#
349{
350 # Returns substr $2 or null str
351 # Must use string testing
352 case $1 in
353 *$2*) echo "$2" ;;
354 *) echo "" ;;
355 esac
356}
357
358#----------------------------#
359chapter4_Makefiles() {
360#----------------------------#
361
362# If /home/lfs is already present in the host, we asume that the
363# lfs user and group are also presents in the host, and a backup
364# of their bash init files is made.
365(
366 cat << EOF
367020-creatingtoolsdir:
368 @\$(call echo_message, Building)
369 @mkdir -v \$(LFS)/tools && \\
370 rm -fv /tools && \\
371 ln -sv \$(LFS)/tools / && \\
372 touch \$@
373
374021-addinguser: 020-creatingtoolsdir
375 @\$(call echo_message, Building)
376 @if [ ! -d /home/lfs ]; then \\
377 groupadd lfs; \\
378 useradd -s /bin/bash -g lfs -m -k /dev/null lfs; \\
379 else \\
380 touch user-lfs-exist; \\
381 fi;
382 @chown lfs \$(LFS)/tools && \\
383 chown lfs \$(LFS)/sources && \\
384 touch \$@
385
386022-settingenvironment: 021-addinguser
387 @\$(call echo_message, Building)
388 @if [ -f /home/lfs/.bashrc -a ! -f /home/lfs/.bashrc.XXX ]; then \\
389 mv -v /home/lfs/.bashrc /home/lfs/.bashrc.XXX; \\
390 fi;
391 @if [ -f /home/lfs/.bash_profile -a ! -f /home/lfs/.bash_profile.XXX ]; then \\
392 mv -v /home/lfs/.bash_profile /home/lfs/.bash_profile.XXX; \\
393 fi;
394 @echo "set +h" > /home/lfs/.bashrc && \\
395 echo "umask 022" >> /home/lfs/.bashrc && \\
396 echo "LFS=/mnt/lfs" >> /home/lfs/.bashrc && \\
397 echo "LC_ALL=POSIX" >> /home/lfs/.bashrc && \\
398 echo "PATH=/tools/bin:/bin:/usr/bin" >> /home/lfs/.bashrc && \\
399 echo "export LFS LC_ALL PATH" >> /home/lfs/.bashrc && \\
400 echo "source $JHALFSDIR/envars" >> /home/lfs/.bashrc && \\
401 chown lfs:lfs /home/lfs/.bashrc && \\
402 touch envars && \\
403 touch \$@
404EOF
405) >> $MKFILE.tmp
406}
407
408#----------------------------#
409chapter5_Makefiles() {
410#----------------------------#
411 for file in chapter05/* ; do
412 # Keep the script file name
413 i=`basename $file`
414
415 # If no testsuites will be run, then TCL, Expect and DejaGNU aren't needed
416 if [ "$TOOLCHAINTEST" = "0" ]; then
417 if [[ `_IS_ $i tcl` ]] || [[ `_IS_ $i expect` ]] || [[ `_IS_ $i dejagnu` ]] ; then
418 continue
419 fi
420 fi
421
422 # Test if the stripping phase must be skipped
423 if [ "$STRIP" = "0" ] && [[ `_IS_ $i stripping` ]] ; then
424 continue
425 fi
426
427 # First append each name of the script files to a list (this will become
428 # the names of the targets in the Makefile
429 chapter5="$chapter5 $i"
430
431 # Grab the name of the target (minus the -pass1 or -pass2 in the case of gcc
432 # and binutils in chapter 5)
433 name=`echo $i | sed -e 's@[0-9]\{3\}-@@' -e 's@-pass[0-9]\{1\}@@'`
434
435 # Set the dependency for the first target.
436 if [ -z $PREV ] ; then PREV=022-settingenvironment ; fi
437
438 # Drop in the name of the target on a new line, and the previous target
439 # as a dependency. Also call the echo_message function.
440(
441 cat << EOF
442
443$i: $PREV
444 @\$(call echo_message, Building)
445EOF
446) >> $MKFILE.tmp
447
448 # Find the version of the command files, if it corresponds with the building of
449 # a specific package
450 vrs=`grep "^$name-version" $JHALFSDIR/packages | sed -e 's/.* //' -e 's/"//g'`
451
452 # If $vrs isn't empty, we've got a package...
453 if [ "$vrs" != "" ] ; then
454 if [ "$name" = "tcl" ] ; then
455 FILE="$name$vrs-src.tar"
456 else
457 FILE="$name-$vrs.tar"
458 fi
459
460 # Insert instructions for unpacking the package and to set
461 # the PKGDIR variable.
462(
463 cat << EOF
464 @\$(call unpack,$FILE)
465 @ROOT=\`head -n1 /tmp/unpacked | sed 's@^./@@;s@/.*@@'\` && \\
466 chown -R lfs \$(LFS)\$(SRC)/\$\$ROOT && \\
467 echo "PKGDIR=\$(LFS)\$(SRC)/\$\$ROOT" > envars && \\
468 echo "export PKGDIR" >> envars && \\
469EOF
470) >> $MKFILE.tmp
471
472 fi
473
474 # Dump the path to the Binutils sources directory.
475 if [[ `_IS_ $i binutils` ]] ; then
476(
477 cat << EOF
478 echo "\$(LFS)\$(SRC)/\$\$ROOT" > sources-dir
479EOF
480) >> $MKFILE.tmp
481
482 # For the Adjusting phase we must to cd to the binutils-build directory.
483 elif [[ `_IS_ $i adjusting` ]] ; then
484(
485 cat << EOF
486 @echo "PKGDIR=\$(LFS)\$(SRC)/binutils-build" > envars && \\
487 echo "export PKGDIR" >> envars
488EOF
489) >> $MKFILE.tmp
490
491 # Everything else, add a true statment so we don't confuse make
492 else
493(
494 cat << EOF
495 true
496EOF
497) >> $MKFILE.tmp
498 fi
499
500 # Insert date and disk usage at the top of the log file, the script run
501 # and date and disk usage again at the bottom of the log file.
502(
503 cat << EOF
504 @echo -e "\n\`date\`\n\nKB: \`du -sk --exclude={0,1}??-* \$(LFS)\`\n" >logs/$i && \\
505 su - lfs -c "source /home/lfs/.bashrc && $JHALFSDIR/commands/$file" >>logs/$i 2>&1 && \\
506 echo -e "\n\`date\`\n\nKB: \`du -sk --exclude={0,1}??-* \$(LFS)\`\n" >>logs/$i
507EOF
508) >> $MKFILE.tmp
509
510 # Remove the build directory(ies) except if the package build fails
511 # (so we can review config.cache, config.log, etc.)
512 # For Binutils the sources must be retained for some time.
513 if [ "$vrs" != "" ] ; then
514 if [[ ! `_IS_ $i binutils` ]] ; then
515(
516 cat << EOF
517 @ROOT=\`head -n1 /tmp/unpacked | sed 's@^./@@;s@/.*@@'\` && \\
518 rm -r \$(LFS)\$(SRC)/\$\$ROOT && \\
519 if [ -e \$(LFS)\$(SRC)/$name-build ]; then \\
520 rm -r \$(LFS)\$(SRC)/$name-build; \\
521 fi;
522EOF
523) >> $MKFILE.tmp
524 fi
525 fi
526
527 # Remove the Binutils pass 1 sources after a successful Adjusting phase.
528 if [[ `_IS_ $i adjusting` ]] ; then
529(
530 cat << EOF
531 @rm -r \`cat sources-dir\` && \\
532 rm -r \$(LFS)\$(SRC)/binutils-build && \\
533 rm sources-dir
534EOF
535) >> $MKFILE.tmp
536 fi
537
538 # Include a touch of the target name so make can check
539 # if it's already been made.
540(
541 cat << EOF
542 @touch \$@
543EOF
544) >> $MKFILE.tmp
545
546 # Keep the script file name for Makefile dependencies.
547 PREV=$i
548 done # end for file in chapter05/*
549}
550
551#----------------------------#
552chapter6_Makefiles() {
553#----------------------------#
554 for file in chapter06/* ; do
555 # Keep the script file name
556 i=`basename $file`
557
558 # We'll run the chroot commands differently than the others, so skip them in the
559 # dependencies and target creation.
560 if [[ `_IS_ $i chroot` ]] ; then
561 continue
562 fi
563
564 # Test if the stripping phase must be skipped
565 if [ "$STRIP" = "0" ] && [[ `_IS_ $i stripping` ]] ; then
566 continue
567 fi
568
569 # First append each name of the script files to a list (this will become
570 # the names of the targets in the Makefile
571 chapter6="$chapter6 $i"
572
573 # Grab the name of the target
574 name=`echo $i | sed -e 's@[0-9]\{3\}-@@'`
575
576 # Drop in the name of the target on a new line, and the previous target
577 # as a dependency. Also call the echo_message function.
578(
579 cat << EOF
580
581$i: $PREV
582 @\$(call echo_message, Building)
583EOF
584) >> $MKFILE.tmp
585
586 # Find the version of the command files, if it corresponds with the building of
587 # a specific package
588 vrs=`grep "^$name-version" $JHALFSDIR/packages | sed -e 's/.* //' -e 's/"//g'`
589
590 # If $vrs isn't empty, we've got a package...
591 # Insert instructions for unpacking the package and changing directories
592 if [ "$vrs" != "" ] ; then
593 FILE="$name-$vrs.tar.*"
594(
595 cat << EOF
596 @\$(call unpack2,$FILE)
597 @ROOT=\`head -n1 /tmp/unpacked | sed 's@^./@@;s@/.*@@'\` && \\
598 echo "PKGDIR=\$(SRC)/\$\$ROOT" > envars && \\
599 echo "export PKGDIR" >> envars
600EOF
601) >> $MKFILE.tmp
602 fi
603
604 # For the Re-Adjusting phase we must to cd to the binutils-build directory.
605 if [[ `_IS_ $i readjusting` ]] ; then
606(
607 cat << EOF
608 @echo "PKGDIR=\$(SRC)/binutils-build" > envars && \\
609 echo "export PKGDIR" >> envars
610EOF
611) >> $MKFILE.tmp
612
613 # For Glibc we need to set TIMEZONE envar.
614 elif [[ `_IS_ $i glibc` ]] ; then
615(
616 cat << EOF
617 @echo "TIMEZONE=\$(TIMEZONE)" >> envars && \\
618 echo "export TIMEZONE" >> envars
619EOF
620) >> $MKFILE.tmp
621
622 # For Groff we need to set PAGE envar.
623 elif [[ `_IS_ $i groff` ]] ; then
624(
625 cat << EOF
626 @echo "PAGE=\$(PAGE)" >> envars && \\
627 echo "export PAGE" >> envars
628EOF
629) >> $MKFILE.tmp
630 fi
631
632 # In the mount of kernel filesystems we need to set LFS
633 # and not to use chroot.
634 if [[ `_IS_ $i kernfs` ]] ; then
635(
636 cat << EOF
637 @echo -e "\n\`date\`\n\nKB: \`du -sk --exclude={0,1}??-* \$(LFS)\`\n" >logs/$i && \\
638 export LFS=\$(LFS) && commands/$file >>logs/$i 2>&1 && \\
639 echo -e "\n\`date\`\n\nKB: \`du -sk --exclude={0,1}??-* \$(LFS)\`\n" >>logs/$i
640EOF
641) >> $MKFILE.tmp
642
643 # The rest of Chapter06
644 else
645(
646 cat << EOF
647 @echo -e "\n\`date\`\n\nKB: \`du -skx --exclude={0,1}??-* \$(LFS)\`\n" >logs/$i && \\
648 \$(CHROOT1) 'cd /jhalfs && source envars && /jhalfs/commands/$file >>/jhalfs/logs/$i 2>&1' && \\
649 echo -e "\n\`date\`\n\nKB: \`du -skx --exclude={0,1}??-* \$(LFS)\`\n" >>logs/$i
650EOF
651) >> $MKFILE.tmp
652 fi
653
654 # Remove the build directory(ies) except if the package build fails.
655 if [ "$vrs" != "" ] ; then
656(
657 cat << EOF
658 @ROOT=\`head -n1 /tmp/unpacked | sed 's@^./@@;s@/.*@@'\` && \\
659 rm -r \$(LFS)\$(SRC)/\$\$ROOT && \\
660 if [ -e \$(LFS)\$(SRC)/$name-build ]; then \\
661 rm -r \$(LFS)\$(SRC)/$name-build; \\
662 fi;
663EOF
664) >> $MKFILE.tmp
665 fi
666
667 # Remove the Binutils pass 2 sources after a successful Re-Adjusting phase.
668 if [[ `_IS_ $i readjusting` ]] ; then
669(
670 cat << EOF
671 @rm -r \`cat sources-dir\` && \\
672 rm -r \$(LFS)\$(SRC)/binutils-build && \\
673 rm sources-dir
674EOF
675) >> $MKFILE.tmp
676 fi
677
678 # Include a touch of the target name so make can check
679 # if it's already been made.
680(
681 cat << EOF
682 @touch \$@
683EOF
684) >> $MKFILE.tmp
685
686 # Keep the script file name for Makefile dependencies.
687 PREV=$i
688 done # end for file in chapter06/*
689}
690
691#----------------------------#
692chapter789_Makefiles() {
693#----------------------------#
694 for file in chapter0{7,8,9}/* ; do
695 # Keep the script file name
696 i=`basename $file`
697
698 # Grub must be configured manually.
699 # The filesystems can't be unmounted via Makefile and the user
700 # should enter the chroot environment to create the root
701 # password, edit several files and setup Grub.
702 if [[ `_IS_ $i grub` ]] || [[ `_IS_ $i reboot` ]] ; then
703 continue
704 fi
705
706 # If no .config file is supplied, the kernel build is skipped
707 if [ -z $CONFIG ] && [[ `_IS_ $i kernel` ]] ; then
708 continue
709 fi
710
711 # First append each name of the script files to a list (this will become
712 # the names of the targets in the Makefile
713 chapter789="$chapter789 $i"
714
715 # Drop in the name of the target on a new line, and the previous target
716 # as a dependency. Also call the echo_message function.
717(
718 cat << EOF
719
720$i: $PREV
721 @\$(call echo_message, Building)
722EOF
723) >> $MKFILE.tmp
724
725 # Find the bootscripts and kernel package names
726 if [[ `_IS_ $i bootscripts` ]] || [[ `_IS_ $i kernel` ]] ; then
727 if [[ `_IS_ $i bootscripts` ]] ; then
728 vrs=`grep "^lfs-bootscripts-version" $JHALFSDIR/packages | sed -e 's/.* //' -e 's/"//g'`
729 FILE="lfs-bootscripts-$vrs.tar.*"
730 elif [[ `_IS_ $i kernel` ]] ; then
731 vrs=`grep "^linux-version" $JHALFSDIR/packages | sed -e 's/.* //' -e 's/"//g'`
732 FILE="linux-$vrs.tar.*"
733 fi
734(
735 cat << EOF
736 @\$(call unpack2,$FILE)
737 @ROOT=\`head -n1 /tmp/unpacked | sed 's@^./@@;s@/.*@@'\` && \\
738 echo "PKGDIR=\$(SRC)/\$\$ROOT" > envars && \\
739 echo "export PKGDIR" >> envars
740EOF
741) >> $MKFILE.tmp
742 fi
743
744 # Put in place the kernel .config file
745 if [[ `_IS_ $i kernel` ]] ; then
746(
747 cat << EOF
748 @cp $CONFIG \$(LFS)/sources/kernel-config
749EOF
750) >> $MKFILE.tmp
751 fi
752
753 # Check if we have a real /etc/fstab file
754 if [[ `_IS_ $i fstab` ]] && [[ -n "$FSTAB" ]] ; then
755(
756 cat << EOF
757 @echo -e "\n\`date\`\n\nKB: \`du -skx --exclude={0,1}??-* \$(LFS)\`\n" >logs/$i && \\
758 cp -v $FSTAB \$(LFS)/etc/fstab >>logs/$i 2>&1 && \\
759 echo -e "\n\`date\`\n\nKB: \`du -skx --exclude={0,1}??-* \$(LFS)\`\n" >>logs/$i
760EOF
761) >> $MKFILE.tmp
762 else
763 # Initialize the log and run the script
764(
765 cat << EOF
766 @echo -e "\n\`date\`\n\nKB: \`du -skx --exclude={0,1}??-* \$(LFS)\`\n" >logs/$i && \\
767 \$(CHROOT2) 'cd /jhalfs && source envars && /jhalfs/commands/$file >>/jhalfs/logs/$i 2>&1' && \\
768 echo -e "\n\`date\`\n\nKB: \`du -skx --exclude={0,1}??-* \$(LFS)\`\n" >>logs/$i
769EOF
770) >> $MKFILE.tmp
771 fi
772
773 # Remove the build directory except if the package build fails.
774 if [[ `_IS_ $i bootscripts` ]] || [[ `_IS_ $i kernel` ]] ; then
775(
776 cat << EOF
777 @ROOT=\`head -n1 /tmp/unpacked | sed 's@^./@@;s@/.*@@'\` && \\
778 rm -r \$(LFS)\$(SRC)/\$\$ROOT
779EOF
780) >> $MKFILE.tmp
781 fi
782
783 # Include a touch of the target name so make can check
784 # if it's already been made.
785(
786 cat << EOF
787 @touch \$@
788EOF
789) >> $MKFILE.tmp
790
791 # Keep the script file name for Makefile dependencies.
792 PREV=$i
793 done # for file in chapter0{7,8,9}/*
794}
795
796
797#----------------------------#
798build_Makefile() {
799#----------------------------#
800 echo -n "Creating Makefile... "
801 cd $JHALFSDIR/commands
802
803 # Start with a clean Makefile.tmp file
804 >$MKFILE.tmp
805
806 chapter4_Makefiles
807 chapter5_Makefiles
808 chapter6_Makefiles
809 chapter789_Makefiles
810
811
812 # Add a header, some variables and include the function file
813 # to the top of the real Makefile.
814(
815 cat << EOF
816$HEADER
817
818SRC= /sources
819LFS= $BUILDDIR
820PAGE= $PAGE
821TIMEZONE= $TIMEZONE
822
823include functions
824
825EOF
826) > $MKFILE
827
828
829 # Add chroot commands
830 i=1
831 for file in chapter06/*chroot* ; do
832 chroot=`cat $file | sed -e '/#!\/bin\/sh/d' -e 's@ \\\@ @g' | tr -d '\n' | sed \
833 -e 's/ */ /g' -e 's|\\$|&&|g' -e 's|exit||g' -e 's|$| -c|' \
834 -e 's|"$$LFS"|$(LFS)|' -e 's|set -e||'`
835 echo -e "CHROOT$i= $chroot\n" >> $MKFILE
836 i=`expr $i + 1`
837 done
838
839 # Drop in the main target 'all:' and the chapter targets with each sub-target
840 # as a dependency.
841(
842 cat << EOF
843all: chapter4 chapter5 chapter6 chapter789
844 @\$(call echo_finished,$VERSION)
845
846chapter4: 020-creatingtoolsdir 021-addinguser 022-settingenvironment
847
848chapter5: chapter4 $chapter5 restore-lfs-env
849
850chapter6: chapter5 $chapter6
851
852chapter789: chapter6 $chapter789
853
854clean-all: clean
855 rm -rf ./{commands,logs,Makefile,dump-lfs-scripts.xsl,functions,packages,patches}
856
857clean: clean-chapter789 clean-chapter6 clean-chapter5 clean-chapter4
858
859clean-chapter4:
860 -if [ ! -f user-lfs-exist ]; then \\
861 userdel lfs; \\
862 rm -rf /home/lfs; \\
863 fi;
864 rm -rf \$(LFS)/tools
865 rm -f /tools
866 rm -f envars user-lfs-exist
867 rm -f 02* logs/02*.log
868
869clean-chapter5:
870 rm -rf \$(LFS)/tools/*
871 rm -f $chapter5 restore-lfs-env sources-dir
872 cd logs && rm -f $chapter5 && cd ..
873
874clean-chapter6:
875 -umount \$(LFS)/sys
876 -umount \$(LFS)/proc
877 -umount \$(LFS)/dev/shm
878 -umount \$(LFS)/dev/pts
879 -umount \$(LFS)/dev
880 rm -rf \$(LFS)/{bin,boot,dev,etc,home,lib,media,mnt,opt,proc,root,sbin,srv,sys,tmp,usr,var}
881 rm -f $chapter6
882 cd logs && rm -f $chapter6 && cd ..
883
884clean-chapter789:
885 rm -f $chapter789
886 cd logs && rm -f $chapter789 && cd ..
887
888restore-lfs-env:
889 @\$(call echo_message, Building)
890 @if [ -f /home/lfs/.bashrc.XXX ]; then \\
891 mv -fv /home/lfs/.bashrc.XXX /home/lfs/.bashrc; \\
892 fi;
893 @if [ -f /home/lfs/.bash_profile.XXX ]; then \\
894 mv -v /home/lfs/.bash_profile.XXX /home/lfs/.bash_profile; \\
895 fi;
896 @chown lfs:lfs /home/lfs/.bash* && \\
897 touch \$@
898
899EOF
900) >> $MKFILE
901
902 # Bring over the items from the Makefile.tmp
903 cat $MKFILE.tmp >> $MKFILE
904 rm $MKFILE.tmp
905 echo -ne "done\n"
906}
907
908#----------------------------#
909run_make() {
910#----------------------------#
911 # Test if make must be run.
912 if [ "$RUNMAKE" = "1" ] ; then
913 # Test to make sure we're running the build as root
914 if [ "$UID" != "0" ] ; then
915 echo "You must be logged in as root to successfully build LFS."
916 exit 1
917 fi
918 # Build the system
919 if [ -e $MKFILE ] ; then
920 echo -ne "Building the LFS system...\n"
921 cd $JHALFSDIR && make
922 echo -ne "done\n"
923 fi
924 fi
925}
926
927
928
929###################################
930### MAIN ###
931###################################
932
933# Evaluate any command line switches
934
935while test $# -gt 0 ; do
936 case $1 in
937 --version | -V )
938 echo "$version"
939 exit 0
940 ;;
941
942 --help | -h )
943 echo "$usage"
944 exit 0
945 ;;
946
947 --LFS-version | -L )
948 test $# = 1 && eval "$exit_missing_arg"
949 shift
950 case $1 in
951 dev* | SVN | trunk )
952 LFSVRS=development
953 ;;
954 6.1.1 )
955 echo "For stable 6.1.1 book, please use jhalfs-0.2."
956 exit 0
957 ;;
958
959 alpha*)
960 LFSVRS=alphabetical
961 ;;
962 * )
963 echo "$1 is an unsupported version at this time."
964 exit 1
965 ;;
966 esac
967 ;;
968
969 --directory | -d )
970 test $# = 1 && eval "$exit_missing_arg"
971 shift
972 BUILDDIR=$1
973 JHALFSDIR=$BUILDDIR/jhalfs
974 LOGDIR=$JHALFSDIR/logs
975 MKFILE=$JHALFSDIR/Makefile
976 ;;
977
978 --rebuild ) CLEAN=1 ;;
979
980 --download-client | -D )
981 test $# = 1 && eval "$exit_missing_arg"
982 shift
983 DL=$1
984 ;;
985
986 --working-copy | -W )
987 test $# = 1 && eval "$exit_missing_arg"
988 shift
989 if [ -f $1/patches.ent ] ; then
990 WC=1
991 BOOK=$1
992 else
993 echo -e "\nLook like $1 isn't a supported working copy."
994 echo -e "Verify your selection and the command line.\n"
995 exit 1
996 fi
997 ;;
998
999 --testsuites | -T ) TEST=1 ;;
1000
1001 --get-packages | -P ) HPKG=1 ;;
1002
1003 --run-make | -M ) RUNMAKE=1 ;;
1004
1005 --no-toolchain-test ) TOOLCHAINTEST=0 ;;
1006
1007 --no-strip ) STRIP=0 ;;
1008
1009 --no-vim-lang ) VIMLANG=0 ;;
1010
1011 --page_size )
1012 test $# = 1 && eval "$exit_missing_arg"
1013 shift
1014 case $1 in
1015 letter | A4 )
1016 PAGE=$1
1017 ;;
1018 * )
1019 echo "$1 isn't a supported page size."
1020 exit 1
1021 ;;
1022 esac
1023 ;;
1024
1025
1026 --timezone )
1027 test $# = 1 && eval "$exit_missing_arg"
1028 shift
1029 if [ -f /usr/share/zoneinfo/$1 ] ; then
1030 TIMEZONE=$1
1031 else
1032 echo -e "\nLooks like $1 isn't a valid timezone description."
1033 echo -e "Verify your selection and the command line.\n"
1034 exit 1
1035 fi
1036 ;;
1037
1038 --fstab )
1039 test $# = 1 && eval "$exit_missing_arg"
1040 shift
1041 if [ -f $1 ] ; then
1042 FSTAB=$1
1043 else
1044 echo -e "\nFile $1 not found. Verify your command line.\n"
1045 exit 1
1046 fi
1047 ;;
1048
1049 --kernel-config | -C )
1050 test $# = 1 && eval "$exit_missing_arg"
1051 shift
1052 if [ -f $1 ] ; then
1053 CONFIG=$1
1054 else
1055 echo -e "\nFile $1 not found. Verify your command line.\n"
1056 exit 1
1057 fi
1058 ;;
1059
1060 * )
1061 echo "$usage"
1062 exit 1
1063 ;;
1064 esac
1065 shift
1066done
1067
1068# Prevents setting "-d /" by mistake.
1069
1070if [ $BUILDDIR = / ] ; then
1071 echo -ne "\nThe root directory can't be used to build LFS.\n\n"
1072 exit 1
1073fi
1074
1075# If $BUILDDIR has subdirectories like tools/ or bin/, stop the run
1076# and notify the user about that.
1077
1078if [ -d $BUILDDIR/tools -o -d $BUILDDIR/bin ] && [ -z $CLEAN ] ; then
1079 eval "$no_empty_builddir"
1080fi
1081
1082# If requested, clean the build directory
1083clean_builddir
1084
1085# Find the download client to use, if not already specified.
1086
1087if [ -z $DL ] ; then
1088 if [ `type -p wget` ] ; then
1089 DL=wget
1090 elif [ `type -p curl` ] ; then
1091 DL=curl
1092 else
1093 eval "$no_dl_client"
1094 fi
1095fi
1096
1097if [ -z $BOOK ] ; then
1098 BOOK=lfs-$LFSVRS
1099fi
1100
1101[[ ! -d $JHALFSDIR ]] && mkdir -pv $JHALFSDIR
1102[[ "$PWD" != "$JHALFSDIR" ]] && cp -v $FILES $JHALFSDIR/ && \
1103 sed 's,FAKEDIR,'$BOOK',' $XSL > $JHALFSDIR/dump-lfs-scripts.xsl && \
1104 export XSL=$JHALFSDIR/dump-lfs-scripts.xsl
1105[[ ! -d $LOGDIR ]] && mkdir -v $LOGDIR
1106>$LOGDIR/$LOG
1107
1108get_book
1109build_Makefile
1110run_make
1111
Note: See TracBrowser for help on using the repository browser.