c3c4e1dc59
If both bz2 and gz formats of the same package are found in the sources dir, only the more recent one is unpacked.
834 lines
24 KiB
Bash
834 lines
24 KiB
Bash
#!/bin/bash
|
|
|
|
# $Id$
|
|
|
|
set +e
|
|
|
|
# VT100 colors
|
|
declare -r BLACK=$'\e[1;30m'
|
|
declare -r DK_GRAY=$'\e[0;30m'
|
|
|
|
declare -r RED=$'\e[31m'
|
|
declare -r GREEN=$'\e[32m'
|
|
declare -r YELLOW=$'\e[33m'
|
|
declare -r BLUE=$'\e[34m'
|
|
declare -r MAGENTA=$'\e[35m'
|
|
declare -r CYAN=$'\e[36m'
|
|
declare -r WHITE=$'\e[37m'
|
|
|
|
declare -r OFF=$'\e[0m'
|
|
declare -r BOLD=$'\e[1m'
|
|
declare -r REVERSE=$'\e[7m'
|
|
declare -r HIDDEN=$'\e[8m'
|
|
|
|
declare -r tab_=$'\t'
|
|
declare -r nl_=$'\n'
|
|
|
|
declare -r DD_BORDER="${BOLD}${WHITE}==============================================================================${OFF}"
|
|
declare -r SD_BORDER="${BOLD}${WHITE}------------------------------------------------------------------------------${OFF}"
|
|
declare -r STAR_BORDER="${BOLD}${WHITE}******************************************************************************${OFF}"
|
|
|
|
# bold yellow > < pair
|
|
declare -r R_arrow=$'\e[1;33m>\e[0m'
|
|
declare -r L_arrow=$'\e[1;33m<\e[0m'
|
|
|
|
|
|
|
|
usage() {
|
|
'clear'
|
|
cat <<- -EOF-
|
|
${DD_BORDER}
|
|
${BOLD}
|
|
Usage: $0 ${BOLD}[OPTION]
|
|
|
|
Options:
|
|
${BOLD} -h, --help${OFF}
|
|
print this help, then exit
|
|
${BOLD} --readme${OFF}
|
|
print a small readme file, then exit
|
|
${BOLD} -V, --version${OFF}
|
|
print version number, then exit
|
|
${BOLD} -d --directory DIR${OFF}
|
|
use DIR directory for building HLFS; all files jhahlfs produces will be
|
|
in the directory DIR/jhahlfs. Default is \"/mnt/lfs\".
|
|
${BOLD} --rebuild${OFF}
|
|
clean the build directory before to perfom any other task. The directory
|
|
is cleaned only if it was populated by a previous jhahlfs run.
|
|
${BOLD} -P, --get-packages${OFF}
|
|
download the packages and patches. This assumes that the server declared in the
|
|
jhahlfs.conf file has the proper packages and patches for the book version being
|
|
processed.
|
|
${BOLD} -D, --download-client CLIENT
|
|
use CLIENT as the program for retrieving packages (use in conjunction with -P)
|
|
${BOLD} -W, --working-copy DIR${OFF}
|
|
use the local working copy placed in DIR as the HLFS book
|
|
${BOLD} -L, --HLFS-version VER${OFF}
|
|
checkout VER version of the HLFS book. Supported versions at this time are:
|
|
dev* | trunk | SVN aliases for Development HLFS
|
|
alpha* aliases for the alphabetical branch
|
|
udev* aliases for the udev_update branch
|
|
${BOLD} --fstab FILE${OFF}
|
|
use FILE as the /etc/fstab file for the HLFS system. If not specified,
|
|
a default /etc/fstab file with dummy values is created.
|
|
${BOLD} -C, --kernel-config FILE${OFF}
|
|
use the kernel configuration file specified in FILE to build the kernel.
|
|
if the file is not found, or if not specified, the kernel build is skipped.
|
|
${BOLD} -M, --run-make${OFF}
|
|
run make on the generated Makefile
|
|
${DD_BORDER}
|
|
-EOF-
|
|
exit
|
|
}
|
|
|
|
|
|
blfs_usage() {
|
|
'clear'
|
|
cat <<- -EOF-
|
|
${DD_BORDER}
|
|
${BOLD}
|
|
Usage: $0 ${BOLD}[OPTION]
|
|
|
|
Options:
|
|
${BOLD} -h, --help${OFF}
|
|
print this help, then exit
|
|
|
|
${BOLD} -V, --version${OFF}
|
|
print version number, then exit
|
|
|
|
${BOLD} -B, --BLFS-version VER${OFF}
|
|
checkout VER version of the BLFS book.
|
|
If not set, the development version is used.
|
|
|
|
Supported versions at this time are:
|
|
dev* | trunk | SVN aliases for Development BLFS
|
|
|
|
${BOLD} -W, --working-copy DIR${OFF}
|
|
use the local working copy placed in DIR as the BLFS book
|
|
|
|
${BOLD} -D, --dependencies TYPE${OFF}
|
|
add dependencies of type TYPE to the build tree.
|
|
If not set, both required a recommended are used.
|
|
|
|
Possible values are:
|
|
|
|
required only required dependecies are used
|
|
recommended both required a recommended dependencies are used
|
|
optional all dependencies are used
|
|
|
|
${BOLD} -S, --server SERVER${OFF}
|
|
set the FTP/HTTP server used as fallback to download the packages.
|
|
If not specified, the one set in jhablfs.conf is used.
|
|
|
|
${BOLD} -T, --testsuites${OFF}
|
|
add support to run the optional testsuites
|
|
${DD_BORDER}
|
|
-EOF-
|
|
exit
|
|
}
|
|
|
|
|
|
_inline_doc="
|
|
This script, ${PROGNAME}, strives to create an accurate makefile
|
|
directly from the xml files used to generate the Hardened Linux From
|
|
Scratch document.
|
|
The usage of this script assumes you have read and are familiar with
|
|
the book and therefore the configuration variables found in jhahlfs.conf
|
|
will have meaning to you. There are a limited number of command line
|
|
switches which, if used, will override the config file settings.
|
|
|
|
NOTES::
|
|
*. The resulting Makefile takes considerable time to run to completion,
|
|
lay in a supply of caffeine beverages.
|
|
|
|
*. It is recommended that you temporarily unpack your linux kernel and
|
|
run <make menuconfig> and configure the kernal as per the book and save
|
|
the resulting .config file.
|
|
|
|
*. Chapter07 contains numerous command files which require customizing
|
|
before you start console, profile, hosts, network, fstab, kernel.
|
|
"
|
|
|
|
version="
|
|
${BOLD}\"${PROGNAME}\"${OFF} script module (development) \$Date$
|
|
|
|
Written by Jeremy Huntwork,
|
|
Manuel Caneles Esparcia,
|
|
George Boudreau
|
|
|
|
This program is published under the ${BOLD}Gnu General Public License, Version 2.${OFF}
|
|
"
|
|
|
|
|
|
no_empty_builddir() {
|
|
'clear'
|
|
cat <<- -EOF-
|
|
${DD_BORDER}
|
|
|
|
${tab_}${tab_}${BOLD}${RED}W A R N I N G${OFF}
|
|
Looks like the \$BUILDDIR directory contains subdirectories
|
|
from a previous HLFS build.
|
|
|
|
Please format the partition mounted on \$BUILDDIR or set
|
|
a different build directory before running jhahlfs.
|
|
${OFF}
|
|
${DD_BORDER}
|
|
-EOF-
|
|
exit
|
|
}
|
|
|
|
|
|
help="${nl_}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 CLFS sources.\" >&2
|
|
echo \"Attempting to continue.\" >&2"
|
|
|
|
HEADER="# This file is automatically generated by jhalfs
|
|
# DO NOT EDIT THIS FILE MANUALLY
|
|
#
|
|
# Generated on `date \"+%F %X %Z\"`"
|
|
|
|
|
|
|
|
|
|
|
|
#----------------------------------#
|
|
wrt_target() { #
|
|
#----------------------------------#
|
|
local i=$1
|
|
local PREV=$2
|
|
(
|
|
cat << EOF
|
|
|
|
$i: $PREV
|
|
@\$(call echo_message, Building)
|
|
EOF
|
|
) >> $MKFILE.tmp
|
|
}
|
|
|
|
|
|
#----------------------------------#
|
|
wrt_unpack() { #
|
|
#----------------------------------#
|
|
local FILE=$1
|
|
(
|
|
cat << EOF
|
|
@\$(call unpack,$FILE)
|
|
@ROOT=\`head -n1 /tmp/unpacked | sed 's@^./@@;s@/.*@@'\` && \\
|
|
echo "export PKGDIR=\$(MOUNT_PT)\$(SRC)/\$\$ROOT" > envars && \\
|
|
chown -R lfs \$(MOUNT_PT)\$(SRC)/\$\$ROOT && \\
|
|
EOF
|
|
) >> $MKFILE.tmp
|
|
}
|
|
|
|
|
|
#----------------------------------#
|
|
wrt_unpack2() { #
|
|
#----------------------------------#
|
|
local FILE=$1
|
|
(
|
|
cat << EOF
|
|
@\$(call unpack2,$FILE)
|
|
@ROOT=\`head -n1 /tmp/unpacked | sed 's@^./@@;s@/.*@@'\` && \\
|
|
echo "export PKGDIR=\$(SRC)/\$\$ROOT" > envars
|
|
EOF
|
|
) >> $MKFILE.tmp
|
|
}
|
|
|
|
|
|
#=============================#
|
|
wrt_unpack3() { # Unpack and set 'ROOT' var
|
|
#=============================#
|
|
local FILE=$1
|
|
(
|
|
cat << EOF
|
|
@\$(call unpack3,$FILE)
|
|
@ROOT=\`head -n1 /tmp/unpacked | sed 's@^./@@;s@/.*@@'\` && \\
|
|
echo "export PKGDIR=\$(SRC)/\$\$ROOT" > envars
|
|
EOF
|
|
) >> $MKFILE.tmp
|
|
}
|
|
|
|
|
|
|
|
#----------------------------------#
|
|
wrt_target_vars() { # Target vars for hlfs (cross-build method)
|
|
#----------------------------------#
|
|
(
|
|
cat << EOF
|
|
@echo "export target=$(uname -m)-${TARGET}" >> envars && \\
|
|
echo "export ldso=/lib/${LOADER}" >> envars
|
|
EOF
|
|
) >> $MKFILE.tmp
|
|
|
|
}
|
|
|
|
|
|
#----------------------------------#
|
|
wrt_run_as_su() { #
|
|
#----------------------------------#
|
|
local this_script=$1
|
|
local file=$2
|
|
(
|
|
cat << EOF
|
|
@echo -e "\n\`date\`\n\nKB: \`du -sk --exclude={0,1}??-* \$(MOUNT_PT)\`\n" >logs/$this_script && \\
|
|
su - lfs -c "source /home/lfs/.bashrc && $JHALFSDIR/${PROGNAME}-commands/$file" >>logs/$this_script 2>&1 && \\
|
|
echo -e "\n\`date\`\n\nKB: \`du -sk --exclude={0,1}??-* \$(MOUNT_PT)\`\n" >>logs/$this_script
|
|
EOF
|
|
) >> $MKFILE.tmp
|
|
}
|
|
|
|
|
|
#==================================#
|
|
wrt_run_as_lfs() { # header to log file, execute script, footer to log file
|
|
#==================================#
|
|
local this_script=$1
|
|
local file=$2
|
|
(
|
|
cat << EOF
|
|
@echo -e "\n\`date\`\n\nKB: \`du -sk --exclude={0,1}??-* \$(MOUNT_PT)\`\n" >logs/$this_script && \\
|
|
su - lfs -c "source /home/lfs/.bashrc && $JHALFSDIR/${PROGNAME}-commands/$file" >>logs/$this_script 2>&1 && \\
|
|
echo -e "\n\`date\`\n\nKB: \`du -sk --exclude={0,1}??-* \$(MOUNT_PT)\`\n" >>logs/$this_script
|
|
EOF
|
|
) >> $MKFILE.tmp
|
|
}
|
|
|
|
|
|
#----------------------------------#
|
|
wrt_run_as_root() { #
|
|
#----------------------------------#
|
|
local this_script=$1
|
|
local file=$2
|
|
(
|
|
cat << EOF
|
|
@echo -e "\n\`date\`\n\nKB: \`du -sk --exclude={0,1}??-* \$(MOUNT_PT)\`\n" >logs/$this_script && \\
|
|
export LFS=\$(MOUNT_PT) && ${PROGNAME}-commands/$file >>logs/$this_script 2>&1 && \\
|
|
echo -e "\n\`date\`\n\nKB: \`du -sk --exclude={0,1}??-* \$(MOUNT_PT)\`\n" >>logs/$this_script
|
|
EOF
|
|
) >> $MKFILE.tmp
|
|
}
|
|
|
|
|
|
#=============================#
|
|
wrt_run_as_root2() { # Some scripts must be run as root..
|
|
#=============================#
|
|
local this_script=$1
|
|
local file=$2
|
|
(
|
|
cat << EOF
|
|
@echo -e "\n\`date\`\n\nKB: \`du -sk --exclude={0,1}??-* \`\n" >logs/$this_script && \\
|
|
source envars && ${PROGNAME}-commands/$file >>logs/$this_script 2>&1 && \\
|
|
echo -e "\n\`date\`\n\nKB: \`du -sk --exclude={0,1}??-* \`\n" >>logs/$this_script
|
|
EOF
|
|
) >> $MKFILE.tmp
|
|
}
|
|
|
|
|
|
#----------------------------------#
|
|
wrt_remove_build_dirs() { #
|
|
#----------------------------------#
|
|
local name=$1
|
|
(
|
|
cat << EOF
|
|
@ROOT=\`head -n1 /tmp/unpacked | sed 's@^./@@;s@/.*@@'\` && \\
|
|
rm -r \$(MOUNT_PT)\$(SRC)/\$\$ROOT && \\
|
|
if [ -e \$(MOUNT_PT)\$(SRC)/$name-build ]; then \\
|
|
rm -r \$(MOUNT_PT)\$(SRC)/$name-build; \\
|
|
fi;
|
|
EOF
|
|
) >> $MKFILE.tmp
|
|
}
|
|
|
|
|
|
#----------------------------------#
|
|
wrt_remove_build_dirs2() { #
|
|
#----------------------------------#
|
|
local name=$1
|
|
(
|
|
cat << EOF
|
|
@ROOT=\`head -n1 /tmp/unpacked | sed 's@^./@@;s@/.*@@'\` && \\
|
|
rm -r \$(SRC)/\$\$ROOT && \\
|
|
if [ -e \$(SRC)/$name-build ]; then \\
|
|
rm -r \$(SRC)/$name-build; \\
|
|
fi;
|
|
EOF
|
|
) >> $MKFILE.tmp
|
|
}
|
|
|
|
|
|
|
|
#----------------------------------#
|
|
wrt_run_as_chroot1() { #
|
|
#----------------------------------#
|
|
local this_script=$1
|
|
local file=$2
|
|
(
|
|
cat << EOF
|
|
@echo -e "\n\`date\`\n\nKB: \`du -skx --exclude={0,1}??-* \$(MOUNT_PT)\`\n" >logs/${this_script} && \\
|
|
\$(CHROOT1) 'cd /jhalfs && source envars && /jhalfs/${PROGNAME}-commands/$file >>/jhalfs/logs/${this_script} 2>&1' && \\
|
|
echo -e "\n\`date\`\n\nKB: \`du -skx --exclude={0,1}??-* \$(MOUNT_PT)\`\n" >>logs/${this_script}
|
|
EOF
|
|
) >> $MKFILE.tmp
|
|
}
|
|
|
|
|
|
#----------------------------------#
|
|
wrt_run_as_chroot2() { #
|
|
#----------------------------------#
|
|
local this_script=$1
|
|
local file=$2
|
|
(
|
|
cat << EOF
|
|
@echo -e "\n\`date\`\n\nKB: \`du -skx --exclude={0,1}??-* \$(MOUNT_PT)\`\n" >logs/${this_script} && \\
|
|
\$(CHROOT2) 'cd /jhalfs && source envars && /jhalfs/${PROGNAME}-commands/$file >>/jhalfs/logs/${this_script} 2>&1' && \\
|
|
echo -e "\n\`date\`\n\nKB: \`du -skx --exclude={0,1}??-* \$(MOUNT_PT)\`\n" >>logs/${this_script}
|
|
EOF
|
|
) >> $MKFILE.tmp
|
|
}
|
|
|
|
|
|
#----------------------------------#
|
|
wrt_copy_fstab() { #
|
|
#----------------------------------#
|
|
local i=$1
|
|
(
|
|
cat << EOF
|
|
@echo -e "\n\`date\`\n\nKB: \`du -skx --exclude={0,1}??-* \$(MOUNT_PT)\`\n" >logs/$i && \\
|
|
cp -v $FSTAB \$(MOUNT_PT)/etc/fstab >>logs/$i 2>&1 && \\
|
|
echo -e "\n\`date\`\n\nKB: \`du -skx --exclude={0,1}??-* \$(MOUNT_PT)\`\n" >>logs/$i
|
|
EOF
|
|
) >> $MKFILE.tmp
|
|
}
|
|
|
|
#----------------------------------#
|
|
wrt_copy_fstab2() { #
|
|
#----------------------------------#
|
|
local i=$1
|
|
(
|
|
cat << EOF
|
|
@echo -e "\n\`date\`\n\nKB: \`du -skx --exclude={0,1}??-* \`\n" >logs/$i && \\
|
|
cp -v $FSTAB /etc/fstab >>logs/$i 2>&1 && \\
|
|
echo -e "\n\`date\`\n\nKB: \`du -skx --exclude={0,1}??-* \`\n" >>logs/$i
|
|
EOF
|
|
) >> $MKFILE.tmp
|
|
}
|
|
|
|
|
|
#----------------------------------#
|
|
wrt_export_timezone() { #
|
|
#----------------------------------#
|
|
echo -e '\t@echo "export TIMEZONE=$(TIMEZONE)" >> envars' >> $MKFILE.tmp
|
|
}
|
|
|
|
|
|
#----------------------------------#
|
|
wrt_export_pagesize() { #
|
|
#----------------------------------#
|
|
echo -e '\t@echo "export PAGE=$(PAGE)" >> envars' >> $MKFILE.tmp
|
|
}
|
|
|
|
|
|
#----------------------------------#
|
|
wrt_export_lang() { #
|
|
#----------------------------------#
|
|
echo -e '\t@echo "export LANG=$(LANG)" > envars' >> $MKFILE.tmp
|
|
}
|
|
|
|
|
|
#----------------------------------#
|
|
wrt_export_lang2() { #
|
|
#----------------------------------#
|
|
echo -e '\t@echo "export LC_ALL=$(LC_ALL)" > envars' >> $MKFILE.tmp
|
|
echo -e '\t@echo "export LANG=$(LANG)" >> envars' >> $MKFILE.tmp
|
|
}
|
|
|
|
|
|
#----------------------------------#
|
|
wrt_export_pkgdir() { #
|
|
#----------------------------------#
|
|
(
|
|
cat << EOF
|
|
@echo "export PKGDIR=\$(SRC)/binutils-build" > envars
|
|
EOF
|
|
) >> $MKFILE.tmp
|
|
}
|
|
|
|
|
|
#----------------------------#
|
|
run_make() {
|
|
#----------------------------#
|
|
# Test if make must be run.
|
|
if [ "$RUNMAKE" = "1" ] ; then
|
|
# 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
|
|
# Build the system
|
|
if [ -e $MKFILE ] ; then
|
|
echo -ne "Building the LFS system...\n"
|
|
cd $JHALFSDIR && make -f ${PROGNAME}-Makefile
|
|
echo -ne "done\n"
|
|
fi
|
|
fi
|
|
}
|
|
|
|
|
|
#----------------------------#
|
|
clean_builddir() {
|
|
#----------------------------#
|
|
# Test if the clean must be done.
|
|
if [ "$CLEAN" = "1" ] ; then
|
|
# Test to make sure we're running the clean as root
|
|
if [ "$UID" != "0" ] ; then
|
|
echo "You must be logged in as root to clean the build directory."
|
|
exit 1
|
|
fi
|
|
# Test to make sure that the build directory was populated by jhalfs
|
|
if [ ! -d $JHALFSDIR ] || [ ! -d $BUILDDIR/sources ] ; then
|
|
echo "Looks like $BUILDDIR was not populated by a previous jhalfs run."
|
|
exit 1
|
|
else
|
|
# Clean the build directory
|
|
echo -ne "Cleaning $BUILDDIR...\n"
|
|
rm -rf $BUILDDIR/{bin,boot,dev,etc,home,lib,media,mnt,opt,proc,root,sbin,srv,sys,tmp,tools,usr,var}
|
|
echo -ne "Cleaning $JHALFSDIR...\n"
|
|
rm -rf $JHALFSDIR/{0*,1*,envars,sources-dir,commands,logs,Makefile,dump-lfs-scripts.xsl,functions,packages,patches}
|
|
echo -ne "Cleaning remainig extracted sources in $BUILDDIR/sources...\n"
|
|
rm -rf `find $BUILDDIR/sources/* -maxdepth 0 -type d`
|
|
echo -ne "done\n"
|
|
fi
|
|
fi
|
|
}
|
|
|
|
#----------------------------#
|
|
get_book() {
|
|
#----------------------------#
|
|
cd $JHALFSDIR
|
|
|
|
if [ -z $WC ] ; then
|
|
# 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"
|
|
echo -n "Downloading the $PROGNAME document, $LFSVRS version... "
|
|
|
|
case $PROGNAME in
|
|
lfs) svn_root="LFS" ;;
|
|
hlfs) svn_root="HLFS" ;;
|
|
clfs) svn_root="cross-lfs" ;;
|
|
blfs) svn_root="BLFS" ;;
|
|
*) echo "BOOK not defined in function <get_book>"
|
|
exit 1 ;;
|
|
esac
|
|
# Grab a fresh LFS book 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 ${PROGNAME}-$LFSVRS ] ; then
|
|
cd ${PROGNAME}-$LFSVRS
|
|
if LC_ALL=C svn up | grep -q At && test -d $JHALFSDIR/commands && \
|
|
test -f $JHALFSDIR/packages && test -f $JHALFSDIR/patches ; then
|
|
echo -ne "done\n"
|
|
# Set the canonical book version
|
|
cd $JHALFSDIR
|
|
VERSION=`grep "ENTITY version " $BOOK/general.ent | sed 's@<!ENTITY version "@@;s@">@@'`
|
|
get_sources
|
|
else
|
|
echo -ne "done\n"
|
|
# Set the canonical book version
|
|
cd $JHALFSDIR
|
|
VERSION=`grep "ENTITY version " $BOOK/general.ent | sed 's@<!ENTITY version "@@;s@">@@'`
|
|
extract_commands
|
|
fi
|
|
else
|
|
case $LFSVRS in
|
|
development)
|
|
svn co $SVN/${svn_root}/trunk/BOOK ${PROGNAME}-$LFSVRS >>$LOGDIR/$LOG 2>&1 ;;
|
|
alphabetical)
|
|
svn co $SVN/${svn_root}/branches/$LFSVRS/BOOK ${PROGNAME}-$LFSVRS >>$LOGDIR/$LOG 2>&1 ;;
|
|
udev_update)
|
|
svn co $SVN/LFS/branches/$LFSVRS/BOOK lfs-$LFSVRS >>$LOGDIR/$LOG 2>&1 ;;
|
|
esac
|
|
echo -ne "done\n"
|
|
# Set the canonical book version
|
|
cd $JHALFSDIR
|
|
VERSION=`grep "ENTITY version " $BOOK/general.ent | sed 's@<!ENTITY version "@@;s@">@@'`
|
|
extract_commands
|
|
fi
|
|
else
|
|
echo -ne "Using $BOOK as book's sources ...\n"
|
|
# Set the canonical book version
|
|
cd $JHALFSDIR
|
|
VERSION=`grep "ENTITY version " $BOOK/general.ent | sed 's@<!ENTITY version "@@;s@">@@'`
|
|
extract_commands
|
|
fi
|
|
}
|
|
|
|
|
|
#----------------------------#
|
|
build_patches_file() { # Supply a suitably formated list of patches.
|
|
#----------------------------#
|
|
local saveIFS=$IFS
|
|
local IFS
|
|
echo -ne "Creating the patch file list "
|
|
|
|
LOC_add_patches_entry() {
|
|
for f in `grep "/$1-" patcheslist_.wget`; do
|
|
basename $f | sed "s|${2}|\&${1}-version;|" >> patches
|
|
done
|
|
}
|
|
|
|
xsltproc --nonet \
|
|
--xinclude \
|
|
-o patcheslist_.wget \
|
|
patcheslist.xsl \
|
|
$BOOK/chapter04/patches.xml
|
|
#> /dev/null 2>&1
|
|
|
|
rm -f patches
|
|
|
|
IFS=$'\x0A' # Modify the 'internal field separator' to break on 'LF' only
|
|
for f in `cat packages`; do
|
|
IFS=$saveIFS # Restore the system defaults
|
|
LOC_add_patches_entry \
|
|
`echo $f | sed -e 's/-version//' \
|
|
-e 's/-file.*//' \
|
|
-e 's/"//g' \
|
|
-e 's/uclibc/uClibc/'`
|
|
done
|
|
|
|
# .... U G L Y .... what to do with the grsecurity patch to the kernel..
|
|
for f in `grep "/grsecurity-" patcheslist_.wget`; do
|
|
basename $f >> patches
|
|
done
|
|
|
|
rm -f patcheslist_.wget
|
|
echo "...OK"
|
|
}
|
|
|
|
|
|
|
|
#----------------------------#
|
|
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
|
|
VERSION=`grep "ENTITY version " $BOOK/general.ent | sed 's@<!ENTITY version "@@;s@">@@'`
|
|
|
|
# Start clean
|
|
if [ -d commands ]; then
|
|
rm -rf commands
|
|
mkdir -v commands
|
|
fi
|
|
echo -n "Extracting commands for"
|
|
|
|
# Dump the commands in shell script form from the HLFS book.
|
|
case ${PROGNAME} in
|
|
clfs)
|
|
echo -n "${tab_} ${L_arrow}${BOLD}$ARCH${R_arrow} target architecture"
|
|
xsltproc --xinclude \
|
|
--nonet \
|
|
--output ./${PROGNAME}-commands/ \
|
|
$BOOK/stylesheets/dump-commands.xsl $BOOK/$ARCH-index.xml
|
|
;;
|
|
hlfs)
|
|
echo -n "${tab_} ${L_arrow}${BOLD}$MODEL${R_arrow} HLFS architecture"
|
|
xsltproc --nonet \
|
|
--xinclude \
|
|
--stringparam model $MODEL \
|
|
--stringparam testsuite $TEST \
|
|
--stringparam keymap $KEYMAP \
|
|
--stringparam grsecurity_host $GRSECURITY_HOST \
|
|
-o ./${PROGNAME}-commands/ $XSL $BOOK/index.xml >>$LOGDIR/$LOG 2>&1
|
|
for i in $(find ./${PROGNAME}-commands/chapter07/*) ; do
|
|
sed -i 's/"EOF"/EOF/g' $i ;
|
|
done
|
|
;;
|
|
lfs)
|
|
echo -n "${tab_} ${L_arrow}${BOLD}LFS${R_arrow} build"
|
|
xsltproc --nonet \
|
|
--xinclude \
|
|
--stringparam testsuite $TEST \
|
|
--stringparam vim-lang $VIMLANG \
|
|
-o ./${PROGNAME}-commands/ $XSL $BOOK/index.xml >>$LOGDIR/$LOG 2>&1
|
|
for i in $(find ./${PROGNAME}-commands/chapter07/*) ; do
|
|
sed -i 's/"EOF"/EOF/g' $i ;
|
|
done
|
|
;;
|
|
blfs)
|
|
echo -n "${tab_} ${L_arrow}${BOLD}BLFS${R_arrow} build"
|
|
xsltproc --nonet \
|
|
--xinclude \
|
|
--stringparam testsuite $TEST \
|
|
--stringparam server $SERVER \
|
|
-o ./${PROGNAME}-commands/ $XSL $BOOK/index.xml >>$LOGDIR/$LOG 2>&1
|
|
;;
|
|
*) exit 1
|
|
esac
|
|
|
|
echo " ...OK"
|
|
|
|
# Make the scripts executable.
|
|
chmod -R +x $JHALFSDIR/${PROGNAME}-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
|
|
|
|
# Download the vim-lang package if it must be installed
|
|
if [ "$VIMLANG" = "1" ] && [ ! "$PROGNAME" = "hlfs" ] ; then
|
|
echo `grep "vim" packages | sed 's@vim@&-lang@'` >> packages
|
|
fi
|
|
echo `grep "udev-config-file" $BOOK/general.ent | sed -e 's@<!ENTITY @@' -e 's@">@"@'` >> packages
|
|
|
|
# There is no HLFS patches.ent file so we will create one.
|
|
|
|
case "${PROGNAME}" in
|
|
hlfs) build_patches_file ;;
|
|
clfs) ;;
|
|
lfs)
|
|
grep "^<\!ENTITY" $BOOK/patches.ent | sed -e 's/.* "//' -e 's/">//' >> patches
|
|
;;
|
|
blfs) ;;
|
|
*) exit 1
|
|
esac
|
|
|
|
# Done. Moving on...
|
|
get_sources
|
|
}
|
|
|
|
|
|
#----------------------------#
|
|
download() { # Download file, write name to MISSING_FILES.DMP if an error
|
|
#----------------------------#
|
|
cd $BUILDDIR/sources
|
|
|
|
# Hackish fix for the bash-doc, glibc-{linuxthreads,libidn}
|
|
# that don't conform to norms in the URL scheme.
|
|
DIR=`echo $1 | sed 's@-doc@@;s@-linuxthreads@@;s@-libidn@@;s@-testsuite@@'`
|
|
|
|
# If the file exists in the archive copy it to the $BUILDDIR/sources dir
|
|
# MD5SUM is assumed to be correct from previous download
|
|
if [ ! -z ${SRC_ARCHIVE} ] &&
|
|
[ -d ${SRC_ARCHIVE} ] &&
|
|
[ -f ${SRC_ARCHIVE}/$2 ]; then
|
|
cp ${SRC_ARCHIVE}/$2 .
|
|
echo "$2: -- ok"
|
|
return
|
|
fi
|
|
|
|
# Find the md5 sum for this package.
|
|
if [ $2 != MD5SUMS ] ; then
|
|
set +e
|
|
MD5=`grep " $2" MD5SUMS`
|
|
if [ $? -ne 0 ]; then
|
|
set -e
|
|
echo "${RED}$2 not found in MD5SUMS${OFF}"
|
|
echo "$2 not found in MD5SUMS" >> MISSING_FILES.DMP
|
|
return
|
|
fi
|
|
set -e
|
|
fi
|
|
|
|
if [ ! -f $2 ] ; then
|
|
case $DL in
|
|
wget ) wget --passive $FTP/$DIR/$2 ;;
|
|
curl ) `curl -# $FTP/$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 --passive -c $FTP/$DIR/$2 ;;
|
|
curl ) `curl -# -C - $FTP/$DIR/$2 -o $2` ;;
|
|
* ) echo "$DL not supported at this time." ;;
|
|
esac
|
|
fi
|
|
|
|
if [ $2 != MD5SUMS ] && ! echo "$MD5" | md5sum -c - ; then
|
|
exit 1
|
|
fi
|
|
if [ $2 != MD5SUMS ] ; then
|
|
echo `grep "$MD5" MD5SUMS` >> MD5SUMS-$VERSION
|
|
fi
|
|
|
|
# If we make it this far we should copy the freshly downloaded file
|
|
# to the source archive.
|
|
if [ ! -z ${SRC_ARCHIVE} ] &&
|
|
[ -d ${SRC_ARCHIVE} ] &&
|
|
[ -w ${SRC_ARCHIVE} ] &&
|
|
[ $2 != MD5SUMS ]; then
|
|
echo "Store file:<$2> in package archive"
|
|
cp -v $2 ${SRC_ARCHIVE}
|
|
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.
|
|
# Modify the 'internal field separator' to break on 'LF' only
|
|
IFS=$'\x0A'
|
|
|
|
if [ ! -d $BUILDDIR/sources ] ; then mkdir $BUILDDIR/sources ; fi
|
|
cd $BUILDDIR/sources
|
|
if [ -f MD5SUMS ] ; then rm MD5SUMS ; fi
|
|
if [ -f MD5SUMS-$VERSION ] ; then rm MD5SUMS-$VERSION ; fi
|
|
if [ -f MISSING_FILES.DMP ] ; then rm MISSING_FILES.DMP ; 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 -e 's/-version.*//' -e 's/-file.*//'`
|
|
|
|
# There are some entities that aren't valid packages.
|
|
if [ "$PKG" = "expect-lib" -o "$PKG" = "linux-dl" ] ; then continue ; fi
|
|
|
|
VRS=`echo $i | sed -e 's/.* //' -e 's/"//g'`
|
|
case $PKG in
|
|
tcl) FILE="$PKG$VRS-src.tar.bz2" ;;
|
|
vim-lang) PKG="vim"
|
|
FILE="vim-$VRS-lang.tar.bz2" ;;
|
|
udev-config) PKG="udev"
|
|
FILE="$VRS" ;;
|
|
*) FILE="$PKG-$VRS.tar.bz2" ;;
|
|
esac
|
|
download $PKG $FILE
|
|
|
|
# Download any associated patches
|
|
for patch in `grep "&$PKG-version" $JHALFSDIR/patches` ; do
|
|
PATCH=`echo $patch | sed 's@&'$PKG'-version;@'$VRS'@'`
|
|
download $PKG $PATCH
|
|
done
|
|
done
|
|
fi
|
|
}
|
|
|
|
#-----------------------------------------------#
|
|
_IS_() # Function to test build scripts names
|
|
#-----------------------------------------------#
|
|
{
|
|
# Returns substr $2 or null str
|
|
# Must use string testing
|
|
case $1 in
|
|
*$2*) echo "$2" ;;
|
|
*) echo "" ;;
|
|
esac
|
|
}
|