-#!/bin/sh
+#!/bin/bash
LFS_PKG_BASE="$(dirname $(pwd))/packages"
LFS_PKG_DIR="${LFS_PKG_BASE}/${LFS_STAGE}"
LFS_PACKAGES_URL="ftp://ftp.osuosl.org/pub/lfs/lfs-packages/conglomeration"
HV_PACKAGES_URL="${HV_BASE_URL}/packages"
-SOURCEFORGE_URL="http://internap.dl.sourceforge.net/sourceforge"
+SOURCEFORGE_URL="http://cdnetworks-us-1.dl.sourceforge.net"
GNOME_URL="http://ftp.gnome.org/pub/gnome/sources"
GNU_URL="http://ftp.gnu.org/pub/gnu"
TETEX_URL="http://www.tug.org/ftp/tex-archive/systems/unix/teTeX"
+BLFS_XORG_URL="http://anduin.linuxfromscratch.org/files/BLFS/svn/xorg"
+XORG_URL="http://xorg.freedesktop.org/releases/individual"
-WGETCMD="wget --directory-prefix=${LFS_PKG_DIR} --timeout=5 --tries=3 -nc -c -o ${WGET_LOG_FILE}"
+WGETCMD="wget --directory-prefix=${LFS_PKG_DIR} --timeout=15 --tries=3 -nc --continue --no-check-certificate --no-verbose --output-file=${WGET_LOG_FILE}"
LFS_PATCHES_LIST=${LFS_PKG_DIR}/patches-list-lfs.html
BLFS_PATCHES_LIST=${LFS_PKG_DIR}/patches-list-blfs.html
PATCHES_LIST_FILENAME=${2}
${WGETCMD} "${PATCHES_URL}/" &&
+
+ # Append log to global log file
+ cat ${WGET_LOG_FILE} >> ${LFS_LOG_FILE} &&
+
mv ${LFS_PKG_DIR}/index.html ${PATCHES_LIST_FILENAME}
}
# slash is absolutely necessary for this to work.
update_packages_init()
{
+ # Execute a return statement instead of exit, to be able to continue with
+ # downloading other packages
+ export RCMD_NO_EXIT=1
+
# First create log directory if it does not exists.
if [ ! -d ${LFS_LOG_DIR} ]; then
install -m755 -d ${LFS_LOG_DIR} || exit 1
# HTTP: will return error code 404.
# FTP: will say "File not found"
if grep "404" ${WGET_LOG_FILE} 1> /dev/null 2>&1; then
- echo NOTFOUND
+ echo "404 NOTFOUND"
return 0
elif grep "No such file" ${WGET_LOG_FILE} 1> /dev/null 2>&1; then
+ echo "No such file"
return 0
else
return 1
# Get package if it is not in the repository
# Arg. #1: Package name and version
# Arg. #2: URL
+# Arg. #3: Optional extension
static_getpkg()
{
- PACK=${1}
- URL=${2}
+ local PACK=${1}
+ local URL=${2}
+ local MY_ARCH_EXT=${3}
# Checking for correct number of arguments
- if [ $# -ne 2 ]; then
+ if [ $# -ne 2 -a $# -ne 3 ]; then
echo "${FUNCNAME}(), wrong number of arguments: ${*}"
return 1
fi
- if [ -z "${ARCH_EXT}" ]; then
+ if [ -z "${MY_ARCH_EXT}" ]; then
# List of default archive extensions to try
- ARCH_EXT="tar.bz2 tar.gz tgz .tar.Z"
+ MY_ARCH_EXT="tar.bz2 tar.gz tgz tar.Z"
fi
- for arch_ext in ${ARCH_EXT}; do
+ for arch_ext in ${MY_ARCH_EXT}; do
+ # Don't take any chance: remove any partially downloaded file.
+ # If we arrive here, it means the final destination file was not found
+ # so we can safely remove any file prior to trying to download it.
+ rm -f ${LFS_PKG_DIR}/${PACK}.${arch_ext}
+
+ echo "Trying to fetch ${PACK}.${arch_ext}"
+
${WGETCMD} ${URL}/${PACK}.${arch_ext}
+ wget_status=$?
+
+ # Append log to global log file
+ cat ${WGET_LOG_FILE} >> ${LFS_LOG_FILE}
- # Failure: if it was a connection timeout, don't try for other file extensions.
+ # Failure: if it was a connection timeout, don't try for other file
+ # extensions.
if grep "failed: Connection timed out" ${WGET_LOG_FILE} 1> /dev/null 2>&1; then
echo "Error, wget reported: Connection timed out"
return 1
fi
if detect_file_not_found; then
- # Try next archive extension if web server reported that file is not found.
+ # Try next archive extension if web server reported that file is not
+ # found.
continue;
fi
- # If we arrive here, it means we were able to download the file.
- if [ "x${arch_ext}" != "xtar.bz2" ]; then
+ if [ ${wget_status} -ne 0 ]; then
+ echo "Error fetching package ${PACK}.${arch_ext}"
+ return 1
+ fi
+
+ # If we arrive here, it means we were able to successfully download the file.
+ if [ "x${arch_ext}" = "xtar.gz" -o "x${arch_ext}" = "xtgz" -o "x${arch_ext}" = "xtar.Z" ]; then
gztobz2 ${LFS_PKG_DIR}/${PACK}.${arch_ext}
fi
return $?
# Get package if it is not in the repository
# Arg. #1: Package name and version
# Arg. #2: URL
+# Options:
+# -e File extension (default is tar.bz2)
+# -d Fetch directory (default is LFS_PKG_DIR)
+# -f Filename on server (default is PACKAGE)
+# -h Display this help and returns
+# -s Subdirectory on server
fpkg()
{
- PACK=${1}
- URL=${2}
+ local FILE_EXT=""
+ local DEST_DIR=""
+ local SRC_FILENAME=""
+ local SRC_DIR=""
+
+ while getopts "e:d:f:hs:" flag ;do
+ case ${flag} in
+ e)
+ # File extension
+ FILE_EXT=${OPTARG}
+ ;;
+ d)
+ # Fetch directory (where to put file)
+ DEST_DIR=${OPTARG}
+ ;;
+ f)
+ # Filename if different than package name
+ SRC_FILENAME=${OPTARG}
+ ;;
+ s)
+ SRC_DIR=${OPTARG}
+ ;;
+ ?)
+ echo "${FUNCNAME}(): Invalid option: ${OPTARG}."
+ return 1
+ ;;
+ esac
+ done
+ shift `expr "${OPTIND}" - 1`
+
+ unset OPTSTRING
+ unset OPTIND
+ unset OPTARG
# Checking for correct number of arguments
if [ $# -ne 2 ]; then
return 1
fi
- if [ ! -f ${LFS_PKG_DIR}/${PACK}.tar.bz2 ]; then
- rcmd "Fetching ${PACK}" static_getpkg ${PACK} ${URL}
+ local PACK=${1}
+ local URL=${2}
+ local FETCH_STRING="Fetching ${PACK}"
+
+ if [ -z "${SRC_FILENAME}" ]; then
+ # Default source filename = name of package
+ SRC_FILENAME=${PACK}
fi
- # Check if a patch is available.
- static_getpatch ${PACK}
-}
+ if [ -n "${FILE_EXT}" ]; then
+ FETCH_STRING="${FETCH_STRING}.${FILE_EXT}"
+ fi
-# Get package if it is not in the repository.
-# This function is used if the source and target names for the
-# package are different (name mismatch).
-# Arg. #1: Target package name and version (on disk)
-# Arg. #2: Source package name and version (on internet)
-# Arg. #3: URL
-fpkg_mis()
-{
- TARGET=${1}
- SOURCE=${2}
- URL=${3}
+ if [ -z "${FILE_EXT}" -o \
+ "x${FILE_EXT}" = "xtar.gz" -o \
+ "x${FILE_EXT}" = "xtgz" -o \
+ "x${FILE_EXT}" = "xtar.Z" -o \
+ "x${FILE_EXT}" = "xtar.bz2" \
+ ]; then
+ FINAL_EXT=tar.bz2
+ else
+ FINAL_EXT=${FILE_EXT}
+ fi
- # Checking for correct number of arguments
- if [ $# -ne 3 ]; then
- echo "${FUNCNAME}(), wrong number of arguments: ${*}"
- reurn 1
+ if [ -z "${DEST_DIR}" ]; then
+ # Default destination directory
+ DEST_DIR=${LFS_PKG_DIR}
fi
- if [ ! -f ${LFS_PKG_DIR}/${TARGET}.tar.bz2 ]; then
- fpkg ${SOURCE} ${URL}
-
- if [ -f ${LFS_PKG_DIR}/${SOURCE}.tar.bz2 ]; then
- mv ${LFS_PKG_DIR}/${SOURCE}.tar.bz2 ${LFS_PKG_DIR}/${TARGET}.tar.bz2
+ mkdir -v -p ${DEST_DIR} >> ${LFS_LOG_FILE} 2>&1
+
+ if [ -z "${SRC_DIR}" ]; then
+ # Default source subdirectory on server
+ SRC_DIR=""
+ else
+ URL=${URL}/${SRC_DIR}
+ fi
+
+ DEST_FILE=${DEST_DIR}/${PACK}.${FINAL_EXT}
+
+ if [ ! -f ${DEST_FILE} ]; then
+ rcmd "${FETCH_STRING}" static_getpkg ${SRC_FILENAME} ${URL} ${FILE_EXT}
+
+ # Move file if source filename is not equal to package name and/or destination
+ # directory is not the default:
+ DOWNLOADED_FILE=${LFS_PKG_DIR}/${SRC_FILENAME}.${FINAL_EXT}
+
+ if [ "${DEST_FILE}" != "${DOWNLOADED_FILE}" ]; then
+ mv ${DOWNLOADED_FILE} ${DEST_FILE}
fi
fi
- # Check for available patches with TARGET name.
- static_getpatch ${TARGET}
+ # Test integrity of archive if requested
+ if [ -f ${DEST_FILE} -a -n "${TEST_INTEGRITY}" -a "x${FINAL_EXT}" = "xtar.bz2" ]; then
+ rcmd "Testing integrity of ${PACK}.${FINAL_EXT}" bzip2 -t ${DEST_FILE}
+ fi
+
+ # Check for available patches with PACKAGE (TARGET) name.
+ static_getpatch ${PACK}
- # Check for available patches with SOURCE name.
- static_getpatch ${SOURCE}
+ if [ ${SRC_FILENAME} != ${PACK} ]; then
+ # Check for available patches with SRC_FILENAME name.
+ static_getpatch ${SRC_FILENAME}
- # Rename any patch fetched (in fpkg call) and replace SOURCE by TARGET in
- # patch name.
- if ls ${LFS_PKG_DIR}/${SOURCE}-*.patch 1> /dev/null 2>&1; then
- rename ${SOURCE} ${TARGET} ${LFS_PKG_DIR}/${SOURCE}-*.patch
+ # Rename any patch fetched (in fpkg call) and replace SOURCE by TARGET
+ # in patch name.
+ if ls ${LFS_PKG_DIR}/${SRC_FILENAME}-*.patch 1> /dev/null 2>&1; then
+ echo "CMD=${SRC_FILENAME} ${PACK} ${LFS_PKG_DIR}/${SRC_FILENAME}-*.patch"
+ rename ${SRC_FILENAME} ${PACK} ${LFS_PKG_DIR}/${SRC_FILENAME}-*.patch
+ fi
fi
}
# Arg. #2: Directory name (optional)
fpkg_gnu()
{
- PACK=${1}
+ local PACK=${1}
if [ $# -eq 2 ]; then
NAME=${2}
fi
}
+# Get package if it is not in the repository
+# Arg. #1: Package name and version
+# Arg. #2: Subdirectory name (module name)
+fpkg_xorg()
+{
+ local PACK=${1}
+ local SUBDIR=${2}
+
+ # Checking for correct number of arguments
+ if [ $# -ne 2 ]; then
+ echo "${FUNCNAME}(), wrong number of arguments: ${*}"
+ return 1
+ fi
+
+ fpkg -d ${LFS_PKG_DIR}/${SUBDIR} -s ${SUBDIR} ${PACK} ${XORG_URL}
+}
+
# Create a symbolic link to a package that is located in another stage
# repository (to not have the same file twice).
# Arg. #1: Source stage number (1, 2, 3, etc)