1f1d6a145e
Thanks to Alexander E. Patrakov for pointing the issue and David Fix for their suggestion about how to fix it.
902 lines
23 KiB
Bash
Executable file
902 lines
23 KiB
Bash
Executable file
#!/bin/sh
|
|
|
|
version="
|
|
jhalfs development \$Date$
|
|
|
|
Originally written by Jeremy Huntwork.
|
|
Maintained by Manuel Canales Esparcia.
|
|
|
|
This program is published under the \
|
|
Gnu General Public License, Version 2.
|
|
"
|
|
|
|
usage="\
|
|
Usage: $0 [OPTION]
|
|
|
|
Options:
|
|
-h, --help print this help, then exit
|
|
|
|
-V, --version print version number, then exit
|
|
|
|
-d --directory DIR use DIR directory for building LFS; all files
|
|
jhalfs produces will be in the directory
|
|
DIR/jhalfs. Default is \"/mnt/lfs\".
|
|
|
|
-P, --get-packages download the packages and patches
|
|
|
|
-D, --download-client CLIENT use CLIENT as the program for retrieving
|
|
packages (for use in conjunction with -P)
|
|
|
|
-W, --working-copy DIR use the local working copy placed in DIR
|
|
as the LFS book
|
|
|
|
-L, --LFS-version VER ckeckout VER version of the LFS book
|
|
|
|
-T, --testsuites add support to run the optional testsuites
|
|
|
|
--no-toolchain-test don't run the toolchain testsuites. This
|
|
disables also the build of TCL, Expect
|
|
and DejaGNU
|
|
|
|
--timezone TIMEZONE set TIMEZONE as the local timezone. If not
|
|
specified, Europe/London will be used.
|
|
|
|
--page_size PAGE set PAGE as the default page size (letter
|
|
or A4). This setting is required to
|
|
build Groff. If not specified, \"letter\"
|
|
will be used.
|
|
|
|
-C, --kernel-config FILE use the kernel configuration file specified
|
|
in FILE to build the kernel. If not found,
|
|
the kernel build is skipped.
|
|
|
|
-M, --run-make run make on the generated Makefile
|
|
|
|
"
|
|
|
|
help="\
|
|
Try '$0 --help' for more information."
|
|
|
|
exit_missing_arg="\
|
|
echo \"Option '\$1' requires an argument\" >&2
|
|
echo \"\$help\" >&2
|
|
exit 1"
|
|
|
|
no_dl_client="\
|
|
echo \"Could not find a way to download the LFS sources.\" >&2
|
|
echo \"Attempting to continue.\" >&2"
|
|
|
|
while test $# -gt 0 ; do
|
|
case $1 in
|
|
--version | -V )
|
|
echo "$version"
|
|
exit 0
|
|
;;
|
|
|
|
--help | -h )
|
|
echo "$usage"
|
|
exit 0
|
|
;;
|
|
|
|
--LFS-version | -L )
|
|
test $# = 1 && eval "$exit_missing_arg"
|
|
shift
|
|
case $1 in
|
|
dev* | SVN | trunk )
|
|
LFSVRS=development
|
|
;;
|
|
* )
|
|
echo "$1 is an unsupported version at this time."
|
|
exit 1
|
|
;;
|
|
esac
|
|
shift
|
|
;;
|
|
|
|
--directory | -d )
|
|
test $# = 1 && eval "$exit_missing_arg"
|
|
shift
|
|
BUILDDIR=$1
|
|
shift
|
|
;;
|
|
|
|
--download-client | -D )
|
|
test $# = 1 && eval "$exit_missing_arg"
|
|
shift
|
|
DL=$1
|
|
shift
|
|
;;
|
|
|
|
--working-copy | -W )
|
|
test $# = 1 && eval "$exit_missing_arg"
|
|
shift
|
|
if [ -f $1/patches.ent ] ; then
|
|
WC=1
|
|
BOOK=$1
|
|
else
|
|
echo -e "\nLook like $1 isn't a supported working copy."
|
|
echo -e "Verify your selection and the command line.\n"
|
|
exit 1
|
|
fi
|
|
shift
|
|
;;
|
|
|
|
--testsuites | -T )
|
|
TEST=1
|
|
shift
|
|
;;
|
|
|
|
--get-packages | -P )
|
|
HPKG=1
|
|
shift
|
|
;;
|
|
|
|
--run-make | -M )
|
|
RUNMAKE=1
|
|
shift
|
|
;;
|
|
|
|
--page_size )
|
|
test $# = 1 && eval "$exit_missing_arg"
|
|
shift
|
|
case $1 in
|
|
letter | A4 )
|
|
PAGE=$1
|
|
;;
|
|
* )
|
|
echo "$1 isn't a supported page size."
|
|
exit 1
|
|
;;
|
|
esac
|
|
shift
|
|
;;
|
|
|
|
--no-toolchain-test )
|
|
TOOLCHAINTEST=0
|
|
shift
|
|
;;
|
|
|
|
--timezone )
|
|
test $# = 1 && eval "$exit_missing_arg"
|
|
shift
|
|
if [ -f /usr/share/zoneinfo/$1 ] ; then
|
|
TIMEZONE=$1
|
|
else
|
|
echo -e "\nLook like $1 isn't a valid timezone description."
|
|
echo -e "Verify your selection and the command line.\n"
|
|
exit 1
|
|
fi
|
|
shift
|
|
;;
|
|
|
|
--kernel-config | -C )
|
|
test $# = 1 && eval "$exit_missing_arg"
|
|
shift
|
|
if [ -f $1 ] ; then
|
|
CONFIG=$1
|
|
else
|
|
echo -e "\nFile $1 not found. Verify your command line.\n"
|
|
exit 1
|
|
fi
|
|
shift
|
|
;;
|
|
|
|
* )
|
|
echo "$usage"
|
|
exit 1
|
|
;;
|
|
esac
|
|
done
|
|
|
|
# Test to make sure we're running the build as root
|
|
|
|
if [ "$UID" != "0" ] ; then
|
|
echo "You must be logged in as root to successfully build LFS."
|
|
exit 1
|
|
fi
|
|
|
|
# Find the download client to use, if not already specified.
|
|
|
|
if [ -z $DL ] ; then
|
|
if [ `type -p wget` ] ; then
|
|
DL=wget
|
|
elif [ `type -p curl` ] ; then
|
|
DL=curl
|
|
else
|
|
eval "$no_dl_client"
|
|
fi
|
|
fi
|
|
|
|
SVN="svn://svn.linuxfromscratch.org"
|
|
HTTP=http://ftp.lfs-matrix.net/pub/lfs/lfs-packages/conglomeration
|
|
if [ -z $BUILDDIR ] ; then BUILDDIR=/mnt/lfs ; fi
|
|
JHALFSDIR=$BUILDDIR/jhalfs
|
|
LOGDIR=$JHALFSDIR/logs
|
|
LOG=000-jhalfs.log
|
|
MKFILE=$JHALFSDIR/Makefile
|
|
XSL=dump-lfs-scripts.xsl
|
|
FNC=functions
|
|
if [ -z $TEST ] ; then TEST=0 ; fi
|
|
if [ -z $TOOLCHAINTEST ] ; then TOOLCHAINTEST=1 ; fi
|
|
if [ -z $PAGE ] ; then PAGE=letter ; fi
|
|
if [ -z $TIMEZONE ] ; then TIMEZONE=Europe/London ; fi
|
|
|
|
HEADER="# This file is automatically generated by jhalfs
|
|
# DO NOT EDIT THIS FILE MANUALLY
|
|
#
|
|
# Generated on `date \"+%F %X %Z\"`"
|
|
|
|
get_book() {
|
|
# Check for Subversion instead of just letting the script hit 'svn' and fail.
|
|
test `type -p svn` || eval "echo \"This feature requires Subversion.\"
|
|
exit 1"
|
|
cd $JHALFSDIR
|
|
|
|
# Test to make sure the LFS version is set
|
|
if [ -z $LFSVRS ] ; then LFSVRS=development ; fi
|
|
|
|
# Set the book's sources directory
|
|
if [ -z $BOOK ] ; then BOOK=lfs-$LFSVRS ; fi
|
|
|
|
if [ -z $WC ] ; then
|
|
echo -n "Downloading the LFS Book, version $LFSVRS... "
|
|
|
|
# Grab the LFS book fresh if it's missing, otherwise, update it from the
|
|
# repo. If we've already extracted the commands, move on to getting the
|
|
# sources.
|
|
if [ -d lfs-$LFSVRS ] ; then
|
|
cd lfs-$LFSVRS
|
|
if svn up | grep -q At && test -d $JHALFSDIR/commands && \
|
|
test -f $JHALFSDIR/packages && test -f $JHALFSDIR/patches ; then
|
|
echo -ne "done\n"
|
|
get_sources
|
|
else
|
|
echo -ne "done\n"
|
|
extract_commands
|
|
fi
|
|
else
|
|
if [ $LFSVRS = development ] ; then
|
|
svn co $SVN/LFS/trunk/BOOK lfs-$LFSVRS >>$LOGDIR/$LOG 2>&1
|
|
else
|
|
svn co $SVN/LFS/branches/$LFSVRS/BOOK lfs-$LFSVRS >>$LOGDIR/$LOG 2>&1
|
|
fi
|
|
echo -ne "done\n"
|
|
extract_commands
|
|
fi
|
|
else
|
|
echo -ne "Using $BOOK as book's sources ...\n"
|
|
extract_commands
|
|
fi
|
|
# Set the canonical book version
|
|
cd $JHALFSDIR
|
|
VERSION=`grep "ENTITY version" $BOOK/general.ent | sed -e 's@<!ENTITY version "@@' -e 's@">@@'`
|
|
}
|
|
|
|
extract_commands() {
|
|
# Check for libxslt instead of just letting the script hit 'xsltproc' and fail.
|
|
test `type -p xsltproc` || eval "echo \"This feature requires libxslt.\"
|
|
exit 1"
|
|
cd $JHALFSDIR
|
|
|
|
# Start clean
|
|
if [ -d commands ] ; then rm -rf commands ; fi && mkdir commands
|
|
echo -n "Extracting commands... "
|
|
|
|
# Dump the commands in shell script form from the LFS book.
|
|
xsltproc --nonet --xinclude --stringparam testsuite $TEST \
|
|
--stringparam toolchaintest $TOOLCHAINTEST -o ./commands/ \
|
|
$XSL $BOOK/index.xml >>$LOGDIR/$LOG 2>&1
|
|
|
|
# Make the scripts executable.
|
|
chmod -R +x $JHALFSDIR/commands
|
|
|
|
# Grab the patches and package names.
|
|
cd $JHALFSDIR
|
|
for i in patches packages ; do rm -f $i ; done
|
|
grep "\-version" $BOOK/general.ent | sed -e 's@<!ENTITY @@' -e 's@">@"@' \
|
|
-e '/generic/d' >> packages
|
|
echo `grep "glibc" packages | sed 's@glibc@glibc-linuxthreads@'` >> packages
|
|
grep "ENTITY" $BOOK/patches.ent | sed -e 's/.* "//' -e 's/">//' >> patches
|
|
|
|
# Done. Moving on...
|
|
echo -ne "done\n"
|
|
get_sources
|
|
}
|
|
|
|
download() {
|
|
cd $BUILDDIR/sources
|
|
|
|
# Hackish fix for the bash-doc and glibc-linuxthreads packages that
|
|
# doesn't conform to norms in the URL scheme.
|
|
DIR=`echo $1 | sed -e 's@-doc@@' -e 's@-linuxthreads@@'`
|
|
|
|
# Find the md5 sum for this package.
|
|
if [ $2 != MD5SUMS ] ; then MD5=`grep " $2" MD5SUMS` ; fi
|
|
|
|
if [ ! -f $2 ] ; then
|
|
case $DL in
|
|
wget )
|
|
wget $HTTP/$DIR/$2
|
|
;;
|
|
curl )
|
|
`curl -# $HTTP/$DIR/$2 -o $2`
|
|
;;
|
|
* )
|
|
echo "$DL not supported at this time."
|
|
;;
|
|
esac
|
|
elif ! echo "$MD5" | md5sum -c - >/dev/null 2>/dev/null ; then
|
|
case $DL in
|
|
wget )
|
|
wget -c $HTTP/$DIR/$2
|
|
;;
|
|
curl )
|
|
`curl -# -C - $HTTP/$DIR/$2 -o $2`
|
|
;;
|
|
* )
|
|
echo "$DL not supported at this time."
|
|
;;
|
|
esac
|
|
fi
|
|
if [ $2 != MD5SUMS ] && ! echo "$MD5" | md5sum -c - ; then
|
|
exit 1
|
|
fi
|
|
}
|
|
|
|
get_sources() {
|
|
|
|
# Test if the packages must be downloaded
|
|
if [ "$HPKG" = "1" ] ; then
|
|
|
|
# This variable is necessary to make sure the `cat $JHALFSDIR/packages`
|
|
# separates each iteration by lines. It is necessary to have the second
|
|
# ' on the next line.
|
|
IFS='
|
|
'
|
|
|
|
if [ ! -d $BUILDDIR/sources ] ; then mkdir $BUILDDIR/sources ; fi
|
|
cd $BUILDDIR/sources
|
|
if [ -f MD5SUMS ] ; then rm MD5SUMS ; fi
|
|
|
|
download "" MD5SUMS
|
|
|
|
# Iterate through each package and grab it, along with any patches it needs.
|
|
for i in `cat $JHALFSDIR/packages` ; do
|
|
PKG=`echo $i | sed 's/-version.*//'`
|
|
|
|
# Someone used some silly entities right next to the valid package entities.
|
|
if [ "$PKG" = "expect-lib" -o "$PKG" = "linux-dl" ] ; then continue ; fi
|
|
|
|
VRS=`echo $i | sed -e 's/.* //' -e 's/"//g'`
|
|
if [ "$PKG" = "tcl" ] ; then
|
|
FILE="$PKG$VRS-src.tar.bz2"
|
|
else
|
|
FILE="$PKG-$VRS.tar.bz2"
|
|
fi
|
|
download $PKG $FILE
|
|
for patch in `grep "$PKG-&$PKG" $JHALFSDIR/patches` ; do
|
|
PATCH=`echo $patch | sed 's@&'$PKG'-version;@'$VRS'@'`
|
|
download $PKG $PATCH
|
|
done
|
|
done
|
|
# Hardcoded Udev configuration file until find a better way
|
|
download udev udev-config-3.rules
|
|
fi
|
|
}
|
|
|
|
build_Makefile() {
|
|
echo -n "Creating Makefile... "
|
|
cd $JHALFSDIR/commands
|
|
|
|
# Start with a clean Makefile.tmp file
|
|
>$MKFILE.tmp
|
|
|
|
for file in chapter05/* ; do
|
|
# Keep the script file name
|
|
i=`basename $file`
|
|
|
|
# If no testsuites will be run, then TCL, Expect and DejaGNU isn't needed
|
|
if [ "$TOOLCHAINTEST" = "0" ]; then
|
|
if echo $i | grep -q "tcl" ; then
|
|
continue
|
|
elif echo $i | grep -q "expect" ; then
|
|
continue
|
|
elif echo $i | grep -q "dejagnu" ; then
|
|
continue
|
|
fi
|
|
fi
|
|
|
|
# First append each name of the script files to a list (this will become
|
|
# the names of the targets in the Makefile
|
|
chapter5="$chapter5 $i"
|
|
|
|
# Grab the name of the target (minus the -pass1 or -pass2 in the case of gcc
|
|
# and binutils in chapter 5)
|
|
name=`echo $i | sed -e 's@[0-9]\{3\}-@@' -e 's@-pass[0-9]\{1\}@@'`
|
|
|
|
# Set the dependency for the first target.
|
|
if [ -z $PREV ] ; then PREV=022-settingenvironment ; fi
|
|
|
|
# Drop in the name of the target on a new line, and the previous target
|
|
# as a dependency. Also call the echo_message function.
|
|
(
|
|
cat << EOF
|
|
|
|
$i: $PREV
|
|
@\$(call echo_message, Building)
|
|
EOF
|
|
) >> $MKFILE.tmp
|
|
|
|
# Find the version of the command files, if it corresponds with the building of
|
|
# a specific package
|
|
vrs=`grep "^$name-version" $JHALFSDIR/packages | sed -e 's/.* //' -e 's/"//g'`
|
|
|
|
# If $vrs isn't empty, we've got a package...
|
|
if [ "$vrs" != "" ] ; then
|
|
if [ "$name" = "tcl" ] ; then
|
|
FILE="$name$vrs-src.tar.bz2"
|
|
else
|
|
FILE="$name-$vrs.tar.bz2"
|
|
fi
|
|
|
|
# Insert instructions for unpacking the package and to set
|
|
# the PKGDIR variable.
|
|
(
|
|
cat << EOF
|
|
@\$(call unpack,$FILE)
|
|
@ROOT=\`head -n1 /tmp/unpacked | sed 's@^./@@;s@/.*@@'\` && \\
|
|
chown -R lfs \$(LFS)\$(SRC)/\$\$ROOT && \\
|
|
echo "PKGDIR=\$(LFS)\$(SRC)/\$\$ROOT" > envars && \\
|
|
echo "export PKGDIR" >> envars && \\
|
|
EOF
|
|
) >> $MKFILE.tmp
|
|
|
|
fi
|
|
|
|
# Dump the path to the Binutils or TCL sources directory.
|
|
if [ ${i:4:8} = "binutils" -o ${i:4:3} = "tcl" ] ; then
|
|
(
|
|
cat << EOF
|
|
echo "\$(LFS)\$(SRC)/\$\$ROOT" > sources-dir
|
|
EOF
|
|
) >> $MKFILE.tmp
|
|
|
|
# For the Adjusting phase we must to cd to the binutils-build directory.
|
|
elif [ ${i:4:9} = "adjusting" ] ; then
|
|
(
|
|
cat << EOF
|
|
@echo "PKGDIR=\$(LFS)\$(SRC)/binutils-build" > envars && \\
|
|
echo "export PKGDIR" >> envars
|
|
EOF
|
|
) >> $MKFILE.tmp
|
|
|
|
# For the Expect build we need to set the TCLPATH envar.
|
|
elif [ ${i:4:6} = "expect" ] ; then
|
|
(
|
|
cat << EOF
|
|
echo "TCLPATH=\`cat sources-dir\`" >> envars && \\
|
|
echo "export TCLPATH" >> envars
|
|
EOF
|
|
) >> $MKFILE.tmp
|
|
|
|
# Everything else, add a true statment so we don't confuse make
|
|
else
|
|
(
|
|
cat << EOF
|
|
true
|
|
EOF
|
|
) >> $MKFILE.tmp
|
|
fi
|
|
|
|
# Insert date and disk usage at the top of the log file, the script run
|
|
# and date and disk usage again at the bottom of the log file.
|
|
(
|
|
cat << EOF
|
|
@echo -e "\n\`date\`\n\nKB: \`du -sk --exclude=0??-* \$(LFS)\`\n" >logs/$i && \\
|
|
su - lfs -c "source /home/lfs/.bashrc && $JHALFSDIR/commands/$file" >>logs/$i 2>&1 && \\
|
|
echo -e "\n\`date\`\n\nKB: \`du -sk --exclude=0??-* \$(LFS)\`\n" >>logs/$i
|
|
EOF
|
|
) >> $MKFILE.tmp
|
|
|
|
# Remove the build directory(ies) except if the package build fails
|
|
# (to can review config.cache, config.log, and like.)
|
|
# For Binutils and TCL the sources must be retained some time.
|
|
if [ "$vrs" != "" ] ; then
|
|
if [ ${i:4:8} != "binutils" ] && [ ${i:4:3} != "tcl" ] ; then
|
|
(
|
|
cat << EOF
|
|
@ROOT=\`head -n1 /tmp/unpacked | sed 's@^./@@;s@/.*@@'\` && \\
|
|
rm -r \$(LFS)\$(SRC)/\$\$ROOT && \\
|
|
if [ -e \$(LFS)\$(SRC)/$name-build ]; then \\
|
|
rm -r \$(LFS)\$(SRC)/$name-build; \\
|
|
fi;
|
|
EOF
|
|
) >> $MKFILE.tmp
|
|
fi
|
|
fi
|
|
|
|
# Remove the Binutils pass 1 sources after a successful Adjusting phase.
|
|
if [ ${i:4:9} = "adjusting" ] ; then
|
|
(
|
|
cat << EOF
|
|
@rm -r \`cat sources-dir\` && \\
|
|
rm -r \$(LFS)\$(SRC)/binutils-build && \\
|
|
rm sources-dir
|
|
EOF
|
|
) >> $MKFILE.tmp
|
|
fi
|
|
|
|
# Remove the TCL sources after a successful Expect build.
|
|
if [ ${i:4:6} = "expect" ] ; then
|
|
(
|
|
cat << EOF
|
|
@rm -r \`cat sources-dir\` && \\
|
|
rm sources-dir
|
|
EOF
|
|
) >> $MKFILE.tmp
|
|
fi
|
|
|
|
# Include a touch of the target name so make can check
|
|
# if it's already been made.
|
|
(
|
|
cat << EOF
|
|
@touch \$@
|
|
EOF
|
|
) >> $MKFILE.tmp
|
|
|
|
# Keep the script file name for Makefile dependencies.
|
|
PREV=$i
|
|
done
|
|
|
|
for file in chapter06/* ; do
|
|
# Keep the script file name
|
|
i=`basename $file`
|
|
|
|
# We'll run the chroot commands differently than the others, so skip them in the
|
|
# dependencies and target creation.
|
|
if echo $i | grep -q "chroot" ; then
|
|
continue
|
|
fi
|
|
|
|
# First append each name of the script files to a list (this will become
|
|
# the names of the targets in the Makefile
|
|
chapter6="$chapter6 $i"
|
|
|
|
# Grab the name of the target
|
|
name=`echo $i | sed -e 's@[0-9]\{3\}-@@'`
|
|
|
|
# Drop in the name of the target on a new line, and the previous target
|
|
# as a dependency. Also call the echo_message function.
|
|
(
|
|
cat << EOF
|
|
|
|
$i: $PREV
|
|
@\$(call echo_message, Building)
|
|
EOF
|
|
) >> $MKFILE.tmp
|
|
|
|
# Find the version of the command files, if it corresponds with the building of
|
|
# a specific package
|
|
vrs=`grep "^$name-version" $JHALFSDIR/packages | sed -e 's/.* //' -e 's/"//g'`
|
|
|
|
# If $vrs isn't empty, we've got a package...
|
|
# Insert instructions for unpacking the package and changing directories
|
|
if [ "$vrs" != "" ] ; then
|
|
FILE="$name-$vrs.tar.bz2"
|
|
(
|
|
cat << EOF
|
|
@\$(call unpack,$FILE)
|
|
@ROOT=\`head -n1 /tmp/unpacked | sed 's@^./@@;s@/.*@@'\` && \\
|
|
echo "PKGDIR=\$(SRC)/\$\$ROOT" > envars && \\
|
|
echo "export PKGDIR" >> envars
|
|
EOF
|
|
) >> $MKFILE.tmp
|
|
fi
|
|
|
|
# For the Re-Adjusting phase we must to cd to the binutils-build directory.
|
|
if [ ${i:4:11} = "readjusting" ] ; then
|
|
(
|
|
cat << EOF
|
|
@echo "PKGDIR=\$(SRC)/binutils-build" > envars && \\
|
|
echo "export PKGDIR" >> envars
|
|
EOF
|
|
) >> $MKFILE.tmp
|
|
fi
|
|
|
|
# For Glibc we need to set TIMEZONE envar.
|
|
if [ ${i:4:5} = "glibc" ] ; then
|
|
(
|
|
cat << EOF
|
|
@echo "TIMEZONE=\$(TIMEZONE)" >> envars && \\
|
|
echo "export TIMEZONE" >> envars
|
|
EOF
|
|
) >> $MKFILE.tmp
|
|
fi
|
|
|
|
# For Groff we need to set PAGE envar.
|
|
if [ ${i:4:5} = "groff" ] ; then
|
|
(
|
|
cat << EOF
|
|
@echo "PAGE=\$(PAGE)" >> envars && \\
|
|
echo "export PAGE" >> envars
|
|
EOF
|
|
) >> $MKFILE.tmp
|
|
fi
|
|
|
|
# In the mount of kernel filesystems we need to set LFS
|
|
# and not to use chroot.
|
|
if [ ${i:4:6} = "kernfs" ] ; then
|
|
(
|
|
cat << EOF
|
|
@echo -e "\n\`date\`\n\nKB: \`du -sk --exclude=0??-* \$(LFS)\`\n" >logs/$i && \\
|
|
export LFS=\$(LFS) && commands/$file >>logs/$i 2>&1 && \\
|
|
echo -e "\n\`date\`\n\nKB: \`du -sk --exclude=0??-* \$(LFS)\`\n" >>logs/$i
|
|
EOF
|
|
) >> $MKFILE.tmp
|
|
|
|
# The rest of Chapter06
|
|
else
|
|
(
|
|
cat << EOF
|
|
@echo -e "\n\`date\`\n\nKB: \`du -skx --exclude=0??-* \$(LFS)\`\n" >logs/$i && \\
|
|
\$(CHROOT1) 'cd /jhalfs && source envars && /jhalfs/commands/$file >>/jhalfs/logs/$i 2>&1' && \\
|
|
echo -e "\n\`date\`\n\nKB: \`du -skx --exclude=0??-* \$(LFS)\`\n" >>logs/$i
|
|
EOF
|
|
) >> $MKFILE.tmp
|
|
|
|
fi
|
|
|
|
# Remove the build directory(ies) except if the package build fails.
|
|
if [ "$vrs" != "" ] ; then
|
|
(
|
|
cat << EOF
|
|
@ROOT=\`head -n1 /tmp/unpacked | sed 's@^./@@;s@/.*@@'\` && \\
|
|
rm -r \$(LFS)\$(SRC)/\$\$ROOT && \\
|
|
if [ -e \$(LFS)\$(SRC)/$name-build ]; then \\
|
|
rm -r \$(LFS)\$(SRC)/$name-build; \\
|
|
fi;
|
|
EOF
|
|
) >> $MKFILE.tmp
|
|
fi
|
|
|
|
# Remove the Binutils pass 2 sources after a successful Re-Adjusting phase.
|
|
if [ ${i:4:11} = "readjusting" ] ; then
|
|
(
|
|
cat << EOF
|
|
@rm -r \`cat sources-dir\` && \\
|
|
rm -r \$(LFS)\$(SRC)/binutils-build && \\
|
|
rm sources-dir
|
|
EOF
|
|
) >> $MKFILE.tmp
|
|
fi
|
|
|
|
# Include a touch of the target name so make can check
|
|
# if it's already been made.
|
|
(
|
|
cat << EOF
|
|
@touch \$@
|
|
EOF
|
|
) >> $MKFILE.tmp
|
|
|
|
# Keep the script file name for Makefile dependencies.
|
|
PREV=$i
|
|
done
|
|
|
|
for file in chapter0{7,8,9}/* ; do
|
|
# Keep the script file name
|
|
i=`basename $file`
|
|
|
|
# Grub must be configured manually
|
|
if echo $i | grep -q "grub" ; then
|
|
continue
|
|
# The filesystems can't be unmounted yet due that the user must
|
|
# to enter to the chroot environment to create the root password,
|
|
# edit several files and setup Grub,
|
|
elif echo $i | grep -q "reboot" ; then
|
|
continue
|
|
fi
|
|
|
|
# If no .config file is supplied, the kernel build is skipped
|
|
if [ -z $CONFIG ] ; then
|
|
if echo $i | grep -q "kernel" ; then
|
|
continue
|
|
fi
|
|
fi
|
|
|
|
# First append each name of the script files to a list (this will become
|
|
# the names of the targets in the Makefile
|
|
chapter789="$chapter789 $i"
|
|
|
|
# Drop in the name of the target on a new line, and the previous target
|
|
# as a dependency. Also call the echo_message function.
|
|
(
|
|
cat << EOF
|
|
|
|
$i: $PREV
|
|
@\$(call echo_message, Building)
|
|
EOF
|
|
) >> $MKFILE.tmp
|
|
|
|
# Find the the bootscripts and kernel package names
|
|
if [ ${i:4:11} = "bootscripts" -o ${i:4:6} = "kernel" ] ; then
|
|
if [ ${i:4:11} = "bootscripts" ] ; then
|
|
vrs=`grep "^lfs-bootscripts-version" $JHALFSDIR/packages | sed -e 's/.* //' -e 's/"//g'`
|
|
FILE="lfs-bootscripts-$vrs.tar.bz2"
|
|
elif [ ${i:4:6} = "kernel" ] ; then
|
|
vrs=`grep "^linux-version" $JHALFSDIR/packages | sed -e 's/.* //' -e 's/"//g'`
|
|
FILE="linux-$vrs.tar.bz2"
|
|
fi
|
|
(
|
|
cat << EOF
|
|
@\$(call unpack,$FILE)
|
|
@ROOT=\`head -n1 /tmp/unpacked | sed 's@^./@@;s@/.*@@'\` && \\
|
|
echo "PKGDIR=\$(SRC)/\$\$ROOT" > envars && \\
|
|
echo "export PKGDIR" >> envars
|
|
EOF
|
|
) >> $MKFILE.tmp
|
|
fi
|
|
|
|
# Put in place the kernel .config file
|
|
if [ ${i:4:6} = "kernel" ] ; then
|
|
(
|
|
cat << EOF
|
|
@cp $CONFIG \$(LFS)/sources/kernel-config
|
|
EOF
|
|
) >> $MKFILE.tmp
|
|
fi
|
|
|
|
# Initialize the log an run the script
|
|
(
|
|
cat << EOF
|
|
@echo -e "\n\`date\`\n\nKB: \`du -skx --exclude=0??-* \$(LFS)\`\n" >logs/$i && \\
|
|
\$(CHROOT2) 'cd /jhalfs && source envars && /jhalfs/commands/$file >>/jhalfs/logs/$i 2>&1' && \\
|
|
echo -e "\n\`date\`\n\nKB: \`du -skx --exclude=0??-* \$(LFS)\`\n" >>logs/$i
|
|
EOF
|
|
) >> $MKFILE.tmp
|
|
|
|
# Remove the build directory except if the package build fails.
|
|
if [ ${i:4:11} = "bootscripts" -o ${i:4:6} = "kernel" ] ; then
|
|
(
|
|
cat << EOF
|
|
@ROOT=\`head -n1 /tmp/unpacked | sed 's@^./@@;s@/.*@@'\` && \\
|
|
rm -r \$(LFS)\$(SRC)/\$\$ROOT
|
|
EOF
|
|
) >> $MKFILE.tmp
|
|
fi
|
|
|
|
# Include a touch of the target name so make can check
|
|
# if it's already been made.
|
|
(
|
|
cat << EOF
|
|
@touch \$@
|
|
EOF
|
|
) >> $MKFILE.tmp
|
|
|
|
# Keep the script file name for Makefile dependencies.
|
|
PREV=$i
|
|
done
|
|
|
|
# Add a header, some variables and include the function file
|
|
# to the top of the real Makefile.
|
|
(
|
|
cat << EOF
|
|
$HEADER
|
|
|
|
SRC= /sources
|
|
LFS= $BUILDDIR
|
|
PAGE= $PAGE
|
|
TIMEZONE= $TIMEZONE
|
|
|
|
include functions
|
|
|
|
EOF
|
|
) > $MKFILE
|
|
|
|
|
|
# Add chroot commands
|
|
i=1
|
|
for file in chapter06/*chroot* ; do
|
|
chroot=`cat $file | sed -e '/#!\/bin\/sh/d' -e 's@ \\\@ @g' | tr -d '\n' | sed \
|
|
-e 's/ */ /g' -e 's|\\$|&&|g' -e 's|&&exit||g' -e 's|$| -c|' -e 's|"$$LFS"|$(LFS)|'`
|
|
echo -e "CHROOT$i= $chroot\n" >> $MKFILE
|
|
i=`expr $i + 1`
|
|
done
|
|
|
|
# Drop in the main target 'all:' and the chapter targets with each sub-target
|
|
# as a dependency.
|
|
(
|
|
cat << EOF
|
|
all: chapter4 chapter5 chapter6 chapter789
|
|
@\$(call echo_finished,$VERSION)
|
|
|
|
chapter4: 020-creatingtoolsdir 021-addinguser 022-settingenvironment
|
|
|
|
chapter5: chapter4 $chapter5
|
|
|
|
chapter6: chapter5 $chapter6
|
|
|
|
chapter789: chapter6 $chapter789
|
|
|
|
clean-all: clean
|
|
rm -rf ./*
|
|
|
|
clean: clean-chapter5 clean-chapter4
|
|
|
|
clean-chapter4:
|
|
-userdel lfs
|
|
rm -rf /home/lfs
|
|
rm -rf \$(LFS)/tools
|
|
rm -f /tools
|
|
rm -f envars
|
|
rm -f 02* logs/02*.log
|
|
|
|
clean-chapter5:
|
|
rm -rf \$(LFS)/tools/*
|
|
rm -f $chapter5
|
|
cd logs && rm -f $chapter5 && cd ..
|
|
|
|
020-creatingtoolsdir:
|
|
@\$(call echo_message, Building)
|
|
@mkdir -v \$(LFS)/tools && \\
|
|
ln -sv \$(LFS)/tools / && \\
|
|
touch \$@
|
|
|
|
021-addinguser: 020-creatingtoolsdir
|
|
@\$(call echo_message, Building)
|
|
@groupadd lfs && \\
|
|
useradd -s /bin/bash -g lfs -m -k /dev/null lfs && \\
|
|
chown lfs \$(LFS)/tools && \\
|
|
chown lfs \$(LFS)/sources && \\
|
|
touch \$@
|
|
|
|
022-settingenvironment: 021-addinguser
|
|
@\$(call echo_message, Building)
|
|
@echo "exec env -i HOME=\\\$\$HOME TERM=\\\$\$TERM PS1='\u:\w\$$ ' /bin/bash" > /home/lfs/.bash_profile && \\
|
|
echo "set +h" > /home/lfs/.bashrc && \\
|
|
echo "umask 022" >> /home/lfs/.bashrc && \\
|
|
echo "LFS=/mnt/lfs" >> /home/lfs/.bashrc && \\
|
|
echo "LC_ALL=POSIX" >> /home/lfs/.bashrc && \\
|
|
echo "PATH=/tools/bin:/bin:/usr/bin" >> /home/lfs/.bashrc && \\
|
|
echo "export LFS LC_ALL PATH" >> /home/lfs/.bashrc && \\
|
|
echo "source $JHALFSDIR/envars" >> /home/lfs/.bashrc && \\
|
|
chown lfs:lfs /home/lfs/.bash* && \\
|
|
touch envars && \\
|
|
touch \$@
|
|
EOF
|
|
) >> $MKFILE
|
|
|
|
# Bring over the items from the Makefile.tmp
|
|
cat $MKFILE.tmp >> $MKFILE
|
|
rm $MKFILE.tmp
|
|
echo -ne "done\n"
|
|
}
|
|
|
|
run_make() {
|
|
# Test if make must be run.
|
|
if [ "$RUNMAKE" = "1" ] ; then
|
|
# Build the system
|
|
if [ -e $MKFILE ] ; then
|
|
echo -ne "Building the LFS system...\n"
|
|
cd $JHALFSDIR && make
|
|
echo -ne "done\n"
|
|
fi
|
|
fi
|
|
}
|
|
|
|
if [ ! -d $JHALFSDIR ] ; then
|
|
mkdir -pv $JHALFSDIR
|
|
fi
|
|
|
|
if [ ! -d $LOGDIR ] ; then
|
|
mkdir -v $LOGDIR
|
|
fi
|
|
|
|
>$LOGDIR/$LOG
|
|
|
|
if [ "$PWD" != "$JHALFSDIR" ] ; then
|
|
cp -v $0 $XSL $FNC $JHALFSDIR/
|
|
fi
|
|
|
|
get_book
|
|
build_Makefile
|
|
run_make
|