set -o errtrace # Let shell functions inherit ERR trap.
set -o errexit
-# Don' t locate and remember (hash) commands as they are looked up for
-# execution (don' t remember path):
+# Don't locate and remember (hash) commands as they are looked up for
+# execution (don't remember path):
set +h
hvtrap_setup()
CLFS=${LFS}
+CROSS_TOOLS_DIR=${CLFS}/cross-tools
+TOOLS_DIR=${CLFS}/tools
+
# Load functions
source ../functions/fpkg
source ../functions/lpkg
HVMAKE="make -j ${MAKEJOBS}"
-case "${HVL_TARGET}" in
- arm*)
- CLFS_BUILDFLAGS="-mabi=aapcs-linux -mfloat-abi=soft"
- CLFS_TARGET="arm-linux-gnueabi"
- CLFS_ARCH=$(echo ${CLFS_TARGET} | sed -e 's/-.*//' -e 's/arm.*/arm/g')
- CLFS_ENDIAN=$(echo ${CLFS_ARCH} | sed -e 's/armeb/BIG/' -e 's/arm/LITTLE/')
- if [ "${CLFS_ENDIAN}" = "LITTLE" ]; then
- CLFS_NOT_ENDIAN="BIG"
- else
- CLFS_NOT_ENDIAN="LITTLE"
- fi
- ;;
- "x86_64")
- CLFS_BUILDFLAGS="-m64"
- CLFS_TARGET="${HVL_TARGET}-unknown-linux-gnu"
- CLFS_ARCH=${HVL_TARGET}
- ;;
- "x86")
- # No special flags
- CLFS_BUILDFLAGS=""
- CLFS_TARGET="i686-unknown-linux-gnu"
- CLFS_ARCH=${HVL_TARGET}
- ;;
- *)
- echo "Unsupported target architecture: ${HVL_TARGET}"
- return ${EXIT_FAILURE}
- ;;
-esac
+# Load default values. They can be overriden
+# by a target-specific file
+source ../targets/default
+
+if [ -f ../targets/${HVL_TARGET} ]; then
+ source ../targets/${HVL_TARGET}
+fi
+
+# When CLFS_OS is defined, define target as the standard triplet:
+CLFS_TARGET="${CLFS_ARCH}"
+if [ x"${CLFS_OS}" != x ]; then
+ CLFS_TARGET+="-${CLFS_OS}-${CLFS_ABI}"
+fi
CLFS_HOST="$(echo $MACHTYPE | \
sed "s/$(echo $MACHTYPE | cut -d- -f2)/cross/")"
-export CLFS_BUILDFLAGS CLFS_TARGET CLFS_ARCH CLFS_HOST CLFS_ENDIAN CLFS_NOT_ENDIAN
+export CLFS_BUILDFLAGS CLFS_TARGET CLFS_ARCH CLFS_HOST
test_presence_of_packages_directory()
{
}
# Create log directory and log file for current stage if necessary
-# This should be done automatically...
-init_log_file()
+# Arg #1: log file name
+static_init_log_file()
{
+ # Checking for correct number of arguments
+ if [ $# -ne 1 ]; then
+ echo "${FUNCNAME}(), wrong number of arguments: ${*}"
+ return 1
+ fi
+
+ local LOG_FILE_NAME=${1}
+
# Scripts directory
export SCRDIR=$(pwd)
test_presence_of_packages_directory
- export LFS_PKG_DIR="$(dirname $(pwd))/packages/${LFS_STAGE}"
+ export LFS_PKG_BASE="$(dirname $(pwd))/packages"
+ export LFS_PKG_DIR="${LFS_PKG_BASE}/${LFS_STAGE}"
export LFS_LOG_DIR=${LFS}/var/log/hvlinux-install/${LFS_STAGE}
- export LFS_LOG_FILE=${LFS_LOG_DIR}/install.log
+ export LFS_LOG_FILE=${LFS_LOG_DIR}/${LOG_FILE_NAME}
export LFS_TMP="${LFS}/tmp"
mkdir -p ${LFS_LOG_DIR} &&
fi
}
+# Create log directory and install log file for current stage if necessary
+init_log_file()
+{
+ static_init_log_file "install.log"
+ export LFS_PATCHES_DIR="${SCRDIR}/patches"
+}
+
+# Create log directory and update log file for current stage if necessary
+init_log_file_update()
+{
+ static_init_log_file "pkg-update.log"
+ export LFS_PATCHES_DIR="${LFS_PKG_DIR}/patches"
+}
+
# Check that we are logged in as the root user, and exit if this is not the case.
check_for_root_user()
{
echo ${1} | sed "s!.*-\([0-9].*\)!\1!g"
}
+# Extracting the version number from a complete package name using underscore as separator.
+# Arg. #1: Complete package name with version (ex: ecryptfs-utils_103 will output 103)
+get_pkg_ver_underscore()
+{
+ # Checking for correct number of arguments
+ if [ $# -ne 1 ]; then
+ echo "${FUNCNAME}(), wrong number of arguments: ${*}"
+ return 1
+ fi
+
+ echo ${1} | sed "s!.*_\([0-9].*\)!\1!g"
+}
+
+# Extracting the version number from a complete package name
+# when the package name uses the underscore as the separator.
+# Arg. #1: Complete package name with version (ex: icu4c-54_1 will output 54.1)
+get_pkg_ver_underscore2()
+{
+ # Checking for correct number of arguments
+ if [ $# -ne 1 ]; then
+ echo "${FUNCNAME}(), wrong number of arguments: ${*}"
+ return 1
+ fi
+
+ local v=$(get_pkg_ver ${1})
+
+ # Replace underscore by dot
+ echo ${v} | sed "s!_!\.!g"
+}
+
+# Convert package version dots to uderscore.
+# Ex: gcc-3.4.6 will output 3_4_6
+# Arg. #1: Complete package name with version
+ver_dots_to_underscore()
+{
+ # Checking for correct number of arguments
+ if [ $# -ne 1 ]; then
+ echo "${FUNCNAME}(), wrong number of arguments: ${*}"
+ return 1
+ fi
+
+ local v=$(get_pkg_ver ${1})
+
+ # Replace dots by underscores
+ echo ${v} | sed "s!\.!_!g"
+}
+
# Extracting the first digit version number from a complete package name.
# Arg. #1: Complete package name with version (ex: gcc-3.4.4 will output 3)
get_pkg_ver1()
echo ${1} | sed "s!^.*-\([0-9]*\)\..*!\1!g"
}
+# Extracting the first digit version number from a complete package name,
+# when the package name uses the underscore as the separator.
+# Arg. #1: Complete package name with version (ex: icu4c-54_1 will output 54)
+get_pkg_ver1_underscore()
+{
+ # Checking for correct number of arguments
+ if [ $# -ne 1 ]; then
+ echo "${FUNCNAME}(), wrong number of arguments: ${*}"
+ return 1
+ fi
+
+ echo ${1} | sed "s!^.*-\([0-9]*\)_.*!\1!g"
+}
+
# Extracting the first 2 digits version number from a complete package name.
# Arg. #1: Complete package name with version (ex: gcc-3.4.4 will output 3.4)
get_pkg_ver2()
sed -i "s!\(^${VARIABLE}.*\)!\1:${VALUE}!" ${FILE}
}
-# Adding a new group, checking if it already exist before.
-# Arguments: same arguments as for standard groupadd command.
-hv_groupadd()
-{
- arguments=${*}
-
- # The last argument is the group name
- while [ $# -ne 0 ]; do
- groupname=${*}
- shift
- done
-
- if ! cat /etc/group | egrep -q "^${groupname}:"; then
- groupadd ${arguments}
- fi
-}
-
# Adding a new user, checking if it already exist before
# Arguments: same arguments as for standard useradd command.
hv_useradd()
# Applying patch
# First argument is the name of the patch
# Second argument is the package name
-# Third argument: optional target directory (default is $LFS_TMP)
+# Third argument is the subdirectory inside the patches directory
+# Fourth argument: optional target directory (default is $LFS_TMP)
apply_patch()
{
local PATCH_FILE=${1}
local PACKAGE=${2}
+ local PDIR=${3}
local TARGET_DIR=""
- if [ $# -eq 3 ]; then
- TARGET_DIR=${3}/${PACKAGE}
+ if [ $# -eq 4 ]; then
+ TARGET_DIR=${4}/${PACKAGE}
else
TARGET_DIR=${LFS_TMP}/${PACKAGE}
fi
return ${EXIT_FAILURE}
fi
- if [ ! -f ${LFS_PKG_DIR}/${PATCH_FILE} ]; then
+ if [ ! -f ${PDIR}/${PATCH_FILE} ]; then
echo
echo "${FUNCNAME}(): patch file '${PATCH_FILE}' not found."
return ${EXIT_FAILURE}
fi
echo "Applying patch: ${PATCH_FILE}"
- patch -Np1 -d ${TARGET_DIR} -i ${LFS_PKG_DIR}/${PATCH_FILE}
+ patch -Np1 -d ${TARGET_DIR} -i ${PDIR}/${PATCH_FILE}
}
# Applying any patch(es) found for the current package.
TARGET_DIR=${2}
fi
- # Checking if we can find at least one patch.
- if ls ${LFS_PKG_DIR}/${1}-*.patch 1> /dev/null 2>&1; then
- cd ${LFS_PKG_DIR}
- for patch in ${1}-*.patch; do
- apply_patch ${patch} ${PACKAGE} ${TARGET_DIR}
- done
- fi
+ for s in common ${HVL_TARGET}; do
+ pdir=${LFS_PATCHES_DIR}/${s}
+ if [ -d ${pdir} ]; then
+ if ls ${pdir}/${1}-*.patch 1> /dev/null 2>&1; then
+ cd ${pdir}
+ for patch in ${1}-*.patch; do
+ apply_patch ${patch} ${PACKAGE} ${pdir} ${TARGET_DIR}
+ done
+ fi
+ fi
+ done
return $?
}
# Remaining arguments: Additional configure options
# Options:
# -c Do not decompress package
+# -d DIR Change to directory DIR before configuring and building.
+# -i DIR Installation directory (for cross-compilation, stage1)
# -j Disable parallel make for this package
# -l Unique identification label in 'install.log'
# (default is package name and version)
# ac Standard autoconf package, build in separate dir (default)
# acnb Standard autoconf package, build in source dir
# noac No autoconf (configure)
-# gnome
-# xorg
# pm
# -t Enable dependency tracking
# -s Name of script to source (default is from name of package)
export DECOMPRESS="1"
export IPKG_MODE="ac" # Default mode if not specified
export HVLABEL="" # Global variable
+ export SRC_DIR="" # Global variable, source directory
+ export BUILD_DIR="" # Global variable, build directory
+ export SRC_SUBDIR="" # Global variable
+ export INSTALL_DIR="" # Global variable, installation directory
export ENABLE_DEPENDENCY_TRACKING="0"
local HVMAKE_ORIG=${HVMAKE}
- while getopts "cjl:m:s:t" flag ;do
+ while getopts "cd:i:jl:m:s:t" flag ;do
case ${flag} in
c)
# Do not decompress package
DECOMPRESS="0"
;;
+ d)
+ SRC_SUBDIR=${OPTARG}
+ ;;
+ i)
+ INSTALL_DIR=${OPTARG}
+ ;;
j)
# Disable parallel make only for this package
HVMAKE="make"
m)
# Installation mode
case ${OPTARG} in
- ac|acnb|noac|gnome|xorg|pm)
+ ac|acnb|noac|pm)
IPKG_MODE=${OPTARG}
;;
*)
PACKAGE_LOG=${LFS_LOG_DIR}/${HVLABEL}.log
PACKAGE_DONE=${LFS_LOG_DIR}/${HVLABEL}.done
PACKAGE_STATUS=${LFS_LOG_DIR}/${HVLABEL}.status
+ SRC_DIR="${LFS_TMP}/${PACKAGE}"
+ BUILD_DIR="${LFS_TMP}/${PACKAGE}"
+
+ if [ -n "${SRC_SUBDIR}" ]; then
+ SRC_DIR+="/${SRC_SUBDIR}"
+ fi
+
+ case "${IPKG_MODE}" in
+ ac)
+ BUILD_DIR="${LFS_TMP}/${PACKAGE}-build"
+ ;;
+ acnb|noac|xpm)
+ BUILD_DIR="${SRC_DIR}"
+ ;;
+ esac
# Checking if package was previously successfully installed
if [ -f ${PACKAGE_DONE} ]; then
for time in ${TIMES}; do
HOURS=$(( $HOURS + $(echo ${time} | sed "s!^\([0-9]*\)\..*!\1!g") ))
-
+
# The first SED command extracts the minutes (fractions of an hour).
# The second SED command removed the leading zero, if applicable.
MIN=$(( $MIN + $(echo ${time} | sed "s!.*\.\([0-9][0-9]\)!\1!g" | sed "s!^0\([0-9]\)!\1!g" ) ))
done
-
+
HOURS=$(( ${HOURS} + ( ${MIN} / 100 ) ))
MIN=$(( ${MIN} % 100 ))
-
+
echo "${HOURS}.${MIN}"
}