#!/bin/bash
set +o posix
# $Id: build_installer.sh,v 1.129 2011/04/13 23:03:07 eha Exp eha $
#
# Copyright 2005-2018 Stuart Winter, Surrey, England, UK
# Copyright 2008, 2009, 2010, 2011, 2017 Eric Hameleers, Eindhoven, Netherlands
# Copyright 2011-2020 Patrick Volkerding, Sebeka, MN, USA
# All rights reserved.
#
# Redistribution and use of this script, with or without modification, is
# permitted provided that the following conditions are met:
#
# 1. Redistributions of this script must retain the above copyright
# notice, this list of conditions and the following disclaimer.
#
# THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED
# WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
# MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO
# EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
# PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
# OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
# OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
# ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
#
################################################################################
#
# Script: build_installer.sh
# Purpose: Build the Slackware installer from scratch (multiple architectures)
# Author: Stuart Winter <mozes@slackware.com>
# Eric Hameleers <alien@slackware.com>
#
################################################################################
#
# Notes: [1] If you want to use your own _skeleton_ initrd (containing only
# the directory layout plus all the scripts) you just make it
# available as ./sources/initrd/skeleton_initrd.tar.gz
#
# The script will look for the directory 'sources' first in your
# working directory, and next in the script's directory (whatever is
# found in your working directory takes precedence).
#
################################################################################
# INSTALLERVERSION is the Slackware version the installer will advertize!
INSTALLERVERSION=${INSTALLERVERSION:-"15.0"}
PKGNAM=slackware-installer
# Needed to find package names:
shopt -s extglob
# Automatically determine the architecture we're building on:
if [ -z "$ARCH" ]; then
case "$( uname -m )" in
i?86) export ARCH=i586 ;;
arm*) export ARCH=arm ;;
# Unless $ARCH is already set, use uname -m for all other archs:
*) export ARCH=$( uname -m ) ;;
esac
fi
# Make sure that loopback support is loaded, if it is modular.
# Use traditional Q+D methodology... i.e. shove a stick in it
# Timmy, by the time anyone notices we'll be dead
modprobe loop 1> /dev/null 2> /dev/null
# Path to Slackware source tree:
# (we need this to extract some packages - get libraries and stuff)
SLACKROOT=${SLACKROOT:-/mnt/nfs/door/non-public/slackware-current}
# Where do we look for other stuff this script requires?
SRCDIR=$(cd $(dirname $0); pwd) # where the script looks for support
CWD=$(pwd) # where the script writes files
# A list of modules (just the names, no directory path) that should not
# be included on the installer image. Typically this is a list of modules used
# with the generic kernel that are not built by the huge kernel:
MODBLACKLIST=$SRCDIR/module-blacklist
# Temporary build locations:
TMP=${TMP:-/tmp/build-$PKGNAM}
PKG=$TMP/package-$PKGNAM
# Firmware for wired network cards we need to add to the installer:
NETFIRMWARE="3com acenic adaptec bnx tigon e100 sun kaweth tr_smctr cxgb3 rtl_nic"
# Safe defaults:
DUMPSKELETON=0 # set to '1' to just create a skeleton initrd tarball
SHOWHELP=0 # Do not show help
# Default actions for the script:
case $ARCH in
arm*|aarch64)
ADD_NETMODS=1 # add network modules
ADD_PCMCIAMODS=1 # add pcmcia modules
ADD_MANPAGES=1
COMPRESS_MODS=0 # already compressed in a/kernel-modules.t?z package already
DISTRODIR=${DISTRODIR:-"slackware"} # below this you find a,ap,d,..,y
LIBDIRSUFFIX="" # the default
RECOMPILE=1 # recompile busybox/dropbear and add new binaries
SPLIT_INITRD=0 # Do not create separate initrd for each kernel
USBBOOT=0 # do not build the USB boot image
EFIBOOT=0 # do not build the EFI boot image
VERBOSE=1 # show a lot of additional output
# The firmware we include by default is only for x86, but
ADD_NETFIRMWARE=1 # we'll probably want to include some at some stage. For now supply -nf to this script.
ADD_NANO=1
;;
x86_64)
ADD_NETMODS=1
ADD_PCMCIAMODS=1
ADD_MANPAGES=1
COMPRESS_MODS=1
ADD_KMS=1
DISTRODIR=${DISTRODIR:-"slackware64"} # below this you find a,ap,d,..,y
LIBDIRSUFFIX="64"
RECOMPILE=1
SPLIT_INITRD=0
USBBOOT=1
EFIBOOT=1
VERBOSE=1
ADD_NETFIRMWARE=1 # Include the network card firmware
ADD_NANO=1
;;
i586)
ADD_NETMODS=1
ADD_PCMCIAMODS=1
ADD_MANPAGES=1
COMPRESS_MODS=1
ADD_KMS=1
DISTRODIR=${DISTRODIR:-"slackware"} # below this you find a,ap,d,..,y
LIBDIRSUFFIX=""
RECOMPILE=1
SPLIT_INITRD=0
USBBOOT=1
EFIBOOT=1
VERBOSE=1
ADD_NETFIRMWARE=1 # Include the network card firmware
ADD_NANO=1
;;
*)
ADD_NETMODS=1 # add network modules
ADD_PCMCIAMODS=1 # add pcmcia modules
ADD_MANPAGES=1 # Add preprocessed manpages
DISTRODIR=${DISTRODIR:-"slackware"} # below this you find a,ap,d,..,y
COMPRESS_MODS=1 # compress kernel modules
LIBDIRSUFFIX="" # the default
RECOMPILE=0 # re-use binaries from existing initrd and packages
SPLIT_INITRD=0 # Do not create separate initrd for each kernel
USBBOOT=0 # do not build the USB boot image
EFIBOOT=0 # do not build the EFI boot image
VERBOSE=1 # show a lot of additional output
ADD_NETFIRMWARE=1 # Include the network card firmware
ADD_NANO=1
;;
esac
# Define the CFLAGS for the known architectures:
case $ARCH in
arm) SLKCFLAGS="-O2 -march=armv7-a -mfpu=vfpv3-d16"
ARCHQUADLET="-gnueabihf" ;;
aarch64) SLKCFLAGS="-O2"
ARCHQUADLET="" ;;
i?86) SLKCFLAGS="-O2 -march=i586 -mtune=i686"
ARCHQUADLET="" ;;
s390*) SLKCFLAGS="-O2"
ARCHQUADLET="" ;;
x86_64) SLKCFLAGS="-O2 -fPIC"
ARCHQUADLET="" ;;
esac
# Here is where we take our kernel modules and dependency info from
# (at least one of these must be available):
case $ARCH in
arm*)
# What kernel directories are in this installer?
# This kernel is only here to allow us to build a generic ARM installer image from which
# the other architectures will be built. It doesn't matter which kernel this is, as it
# won't be used: post processing scripts unpack this image, generate a list of standard kernel
# modules; replace those modules with versions specific to the particular device and supplement
# the image with any additional requirements for that device.
KERNELS[0]=armv7
# The -extraversion (appended to the $KVER) for the KERNELS[*]:
KEXTRAV[0]="-armv7"
;;
aarch64)
KERNELS[0]=aarch64
# The -extraversion (appended to the $KVER) for the KERNELS[*]:
KEXTRAV[0]="-aarch64"
;;
i?86)
# What kernel directories are in this installer?
KERNELS[0]=huge.s
KERNELS[1]=hugesmp.s
# The -extraversion (appended to the $KVER) for the KERNELS[*]:
KEXTRAV[0]=""
KEXTRAV[1]="-smp"
;;
x86_64)
# What kernel directories are in this installer?
KERNELS[0]=huge.s
# The -extraversion (appended to the $KVER) for the KERNELS[*]:
KEXTRAV[0]=""
;;
esac
# Parse the commandline parameters:
while [ ! -z "$1" ]; do
case $1 in
-c|--compressmods)
COMPRESS_MODS=1
shift
;;
-h|--help)
SHOWHELP=1
shift
;;
-m|--multiple)
SPLIT_INITRD=1
shift
;;
-nf|--noaddnetfirmware)
ADD_NETFIRMWARE=0
shift
;;
-mn|--manpages)
ADD_MANPAGES=1
shift
;;
-n|--netmods)
ADD_NETMODS=1
shift
;;
-nc|--no-compressmods)
COMPRESS_MODS=0
shift
;;
-ne|--no-nano)
ADD_NANO=0
shift
;;
-nn|--no-netmods)
ADD_NETMODS=0
shift
;;
-np|--no-pcmciamods)
ADD_PCMCIAMODS=0
shift
;;
-nr|--no-recompile)
RECOMPILE=0
shift
;;
-nm|--no-multiple)
SPLIT_INITRD=0
shift
;;
-nu|--no-usbboot)
USBBOOT=0
shift
;;
-p|--pcmciamods)
ADD_PCMCIAMODS=1
shift
;;
-q|--quiet)
VERBOSE=0
shift
;;
-r|--recompile)
RECOMPILE=1
shift
;;
-s|--skeleton)
DUMPSKELETON=1
shift
;;
-u|--usbboot)
USBBOOT=1
shift
;;
-v|--verbose)
VERBOSE=1
shift
;;
-I|--initrd)
INITRDIMG="$(cd $(dirname $2); pwd)/$(basename $2)"
shift 2
;;
-S|--slackroot)
SLACKROOT="$2"
shift 2
;;
-*)
echo "Unsupported parameter '$1'!"
exit 1
;;
*)# Do nothing
shift
;;
esac
done
############### Some house keeping now that we have read the commandline #######
# The location of the initrd.img file
INITRDIMG=${INITRDIMG:-"$SLACKROOT/isolinux/initrd.img"}
# Wildcard expression for the kernel-modules package:
KERNELMODPKG=${KERNELMODPKG:-"${SLACKROOT}/${DISTRODIR}/a/kernel-modules-*.t?z"}
# PCMCIA support tools:
PCMCIAUTILS="${SLACKROOT}/${DISTRODIR}/a/pcmciautils-*.t?z"
# Needed by pcmciautils:
SYSFS="${SLACKROOT}/${DISTRODIR}/a/sysfsutils-*.t?z"
# Wildcard expression for the kernel-firmware package:
KERNELFW_PKG=${KERNELFW_PKG:-"${SLACKROOT}/${DISTRODIR}/a/kernel-firmware-*.t?z"}
# If we only want help, do no pre-processing which may lead to error messages
if [ $SHOWHELP -eq 0 ]; then
if [ "$($(which id) -u)" != "0" ]; then
echo "You need to be root to run $(basename $0)."
exit 1
fi
if [ ! -d $SLACKROOT ]; then
echo "*** I can't find the Slackware package tree $SLACKROOT!"
exit 1
fi
# Determine the kernel version:
#KVER=$( ls -1 ${KERNELMODPKG} | head -1 | sed -e "s#.*/kernel-modules-\([^-]*\)-.*.t[gblx]z#\1#")
KVER="$( ls -1 ${KERNELMODPKG} | head -1 | rev | cut -d- -f3 | rev | cut -d_ -f1 )"
if [ -z "$KVER" ]; then
echo "*** I can't determine the kernel version!"
exit 1
fi
echo "--- Detected kernel version: '$KVER' ---"
if [ $VERBOSE -eq 1 ]; then
VERBOSE1="v"
VERBOSE2="vv"
VERBOSE3="vvv"
VERBOSETXT="--verbose"
SILENTMAKE=""
else
VERBOSE1=""
VERBOSE2=""
VERBOSE3=""
VERBOSETXT=""
SILENTMAKE="-s"
fi
fi
############### Display help about command line parameters #####################
basic_usage()
{
cat <<"EOH"
# ----------------------------------------------------------------------------#
$Id: build_installer.sh,v 1.129 2011/04/13 23:03:07 eha Exp eha $
# ----------------------------------------------------------------------------#
EOH
cat <<EOT
Usage: $(basename $0) <parameters>
Parameters:
-h|--help Show this help
-c|--compressmods Compress the kernel modules inside the initrd.img
-m|--multiple Multiple initrd files (for SMP and non-SMP kernels)
-n|--netmods Add network modules to the initrd
-nc|--no-compressmods Do _not_ compress kernel modules
-ne|--no-nano Do _not_ add nano editor
-nm|--no-multiple Do _not_ create multiple initrd files
-nn|--no-netmods Do _not_ add network modules to the initrd
-np|--no-pcmciamods Do _not_ add pcmcia modules to the initrd
-nr|--no-recompile Do _not_ recompile /re-add binaries
-nu|--no-usbboot Do _not_ create a USB boot image
-p|--pcmciamods Add pcmcia modules to the initrd
-q|--quiet Be (fairly) quiet during progress
-r|--recompile Recompile /re-add binaries (busybox,dropbear as
well as any required bin/lib from Slackware packages)
-s|--skeleton Stop after creating a skeleton_initrd.tar.gz
(which only contains directories and scripts)
-u|--usbboot Create a USB boot image
-v|--verbose Be (very) verbose during progress
-I|--initrd <file> Specify location of the initrd.img file
-S|--slackroot <dir> Specify location of the Slackware directory tree
Actions to be taken (ARCH=$ARCH):
EOT
[ $VERBOSE -eq 1 ] && echo "* Be (very) verbose during progress" \
|| echo "* Be (fairly) quiet during progress"
[ $RECOMPILE -eq 1 ] && echo "* Recompile busybox/dropbear /re-add binaries" \
|| echo "* Do _not_ recompile /re-add binaries"
[ $ADD_NETMODS -eq 1 ] && echo "* Add network modules to the initrd" \
|| echo "* Do _not_ add network modules to the initrd"
[ $ADD_PCMCIAMODS -eq 1 ] && echo "* Add pcmcia modules to the initrd" \
|| echo "* Do _not_ add pcmcia modules to the initrd"
[ $COMPRESS_MODS -eq 1 ] && echo "* Compress all kernel modules" \
|| echo "* Do _not_ compress kernel modules"
[ $SPLIT_INITRD -eq 1 ] && echo "* Split initrd's for SMP and non-SMP kernels" \
|| echo "* Do _not_ split the initrd"
[ $USBBOOT -eq 1 ] && echo "* Create a USB boot image" \
|| echo "* Do _not_ create a USB boot image"
echo
echo -e "Use Slackware root: \n $SLACKROOT"
echo -e "Use initrd file: \n $INITRDIMG"
cat <<EOT
# Note: [1] If you want to build your own specific busybox and dropbear #
# instead of using the sources provided by the Slackware tree, #
# you should have these sources ready below #
# ./sources/{busybox,dropbear} #
# Delete the directory if you don't want to use it! #
# [2] If you want to use your own _skeleton_ initrd (containing only #
# the directory layout plus all the scripts) you just make it #
# available as ./sources/initrd/skeleton_initrd.tar.gz #
# #
# The script will look for the directory 'sources' first in your #
# working directory, and next in the script's directory (whatever is #
# found in your working directory takes precedence). #
# ----------------------------------------------------------------------------#
EOT
}
############### Determine patch level required & apply the patch ################################
# Functions:
# Determine patch level required & apply the patch:
function auto_apply_patch () {
patchfile=$1
echo
echo "***********************************************************"
echo "** Working on Patch: $patchfile"
echo "***********************************************************"
echo
# Decompress the patch if it's compressed with a known method:
FTYPE=$( file $patchfile )
case "$FTYPE" in
*xz*compressed*)
xz -dc $patchfile > $TMP/$(basename $patchfile).unpacked
patchfile=$TMP/$(basename $patchfile).unpacked ;;
*bzip2*compressed*)
bzcat -f $patchfile > $TMP/$(basename $patchfile).unpacked
patchfile=$TMP/$(basename $patchfile).unpacked ;;
*gzip*compressed*)
zcat -f $patchfile > $TMP/$(basename $patchfile).unpacked
patchfile=$TMP/$(basename $patchfile).unpacked ;;
esac
# By now the patch is decompressed or wasn't compressed originally.
#
# Most patches should not require more levels than this:
success=0
for (( pl=0 ; pl<=5 ; pl++ )) ; do
echo "Patch : $patchfile , trying patch level $pl"
patch -N --fuzz=20 -t --dry-run -l -p$pl < $patchfile > /dev/null 2>&1 && success=1 && break
done
if [ $success = 1 ]; then
echo "Patch: $patchfile will apply at level $pl"
patch -N --fuzz=20 --verbose -l -p$pl < $patchfile
return 0
else
echo "Patch: $patchfile failed to apply at levels 0-5"
return 1
fi
}
############### Unpack an existing initrd image ################################
unpack_oldinitrd()
{
# This function is called when we are not re-building a new initrd from scratch
# (but need to add modules for a new kernel version for instance):
echo "--- Unpacking the old initrd ---"
mkdir -p -m755 $PKG/$ARCH-installer-filesystem
cd $PKG/$ARCH-installer-filesystem
xzcat -f${VERBOSE1} $INITRDIMG | cpio -di${VERBOSE1}
# Wipe the Kernel modules:
echo "--- Removing old kernel modules ---"
rm -rf lib/modules/*
}
############### Create the Installer's filesystem #############################
create_installer_fs()
{
# Make the directories required for the filesystem:
echo "--- Creating basic filesystem layout ---"
mkdir -p -m755 $PKG/$ARCH-installer-filesystem
cd $PKG/$ARCH-installer-filesystem
mkdir -p -m755 bin
mkdir -p -m755 dev
mkdir -p -m755 etc/rc.d
mkdir -p -m755 etc/dropbear
mkdir -p -m755 floppy
mkdir -p -m755 lib/modules
[ "$ARCH" = "x86_64" ] && mkdir -p -m755 lib64
mkdir -p -m700 lost+found
mkdir -p -m755 mnt
mkdir -p -m755 proc
mkdir -p -m755 root
mkdir -p -m755 sbin
mkdir -p -m755 sys
mkdir -p -m755 tag
mkdir -p -m1777 tmp
mkdir -p -m755 usr/{bin,sbin,etc,lib/setup,libexec,share/tabset}
mkdir -p -m755 usr/share/terminfo/{c,l,v,x,s}
mkdir -p -m755 var/{mount,setup,run,lib}
ln -sf /mnt/boot boot
ln -sf /var/log/mount cdrom
ln -sf /var/log/mount nfs
( cd etc; touch mtab )
( cd etc; touch mdev.conf )
}
############### Extract skeleton from Slackware installer image ################
extract_skeleton_fs()
{
# Temporary extraction directory:
echo "--- Extracting shell scripts from original initrd ---"
rm -rf $TMP/extract-packages
mkdir -p -m755 $TMP/extract-packages
cd $TMP/extract-packages
# Unpack the real i586/current Slackware initrd.img (or a custom one specified
# with the '-I' parameter):
xzcat -f${VERBOSE1} $INITRDIMG | cpio -di${VERBOSE1}
# Wipe the binaries and x86 specific stuff. This will leave us with
# just the directories and shell scripts:
echo "--- Removing unwanted binaries and libs ---"
( find . -type f -print0 | xargs -0 file | egrep '(ELF.*)' | awk -F: '{print $1}' | xargs rm -f ) >/dev/null 2>&1
( find . -name '*.a' -type f -print0 | xargs -0 rm -f ) > /dev/null 2>&1
# Wipe the Kernel modules:
rm -rf lib/modules/*
# Wipe firmware:
rm -rf lib/firmware/*
# Wipe udev stuff:
rm -rf lib/udev etc/udev
# Wipe the pci.ids:
rm -f usr/share/hwdata/pci.ids*
# Wipe any unneeded scripts that were installed from packages:
rm -f bin/{ldd,zgrep} sbin/fsck.* sbin/{lvmdump,xfs_check}
# Wipe ncurses stuff:
( find usr/share/terminfo -type f -print0 | xargs -0 rm -f ) > /dev/null 2>&1
( find usr/share/tabset -type f -print0 | xargs -0 rm -f ) > /dev/null 2>&1
# Wipe dangling symlinks:
( find -L ./bin -type l -print0 | xargs -0 rm -f ) > /dev/null 2>&1
( find -L ./usr/bin -type l -print0 | xargs -0 rm -f ) > /dev/null 2>&1
( find -L ./sbin -type l -print0 | xargs -0 rm -f ) > /dev/null 2>&1
( find -L ./lib -type l -print0 | xargs -0 rm -f ) > /dev/null 2>&1
( find -L ./lib${LIBDIRSUFFIX} -type l -print0 | xargs -0 rm -f ) > /dev/null 2>&1
( find -L ./usr/lib -type l -print0 | xargs -0 rm -f ) > /dev/null 2>&1
( find -L ./usr/lib${LIBDIRSUFFIX} -type l -print0 | xargs -0 rm -f ) > /dev/null 2>&1
cd $PKG/$ARCH-installer-filesystem
cp --remove-destination -fa${VERBOSE2} $TMP/extract-packages/. .
rm -rf $TMP/extract-packages
# Re-create essential symlinks
ln -sf sbin/init init
( cd bin; ln -sf grep.bin grep )
( cd bin; ln -sf grep.bin egrep )
( cd bin; ln -sf grep.bin fgrep )
( cd bin; ln -sf gzip zcat )
( cd bin; ln -sf /usr/bin/compress compress )
( cd usr/bin; ln -sf ../../bin/gzip zcat )
# Add RAID re-assembly commands to rc.S if missing:
if ! grep -q mdadm etc/rc.d/rc.S ; then
sed -i -e '/# Check \/proc\/partitions again:/s%^%# Re-assemble RAID volumes:\n/sbin/mdadm -E -s > /etc/mdadm.conf\n/sbin/mdadm -A -s\n\n%m' etc/rc.d/rc.S
if [ $? -ne 0 ]; then
echo "*** Adding mdadm commands to /etc/rc.d/rc.S failed. ***"
fi
fi
}
############### Zip up skeleton from Slackware installer image #################
zipup_installer_skeleton()
{
cd $PKG/$ARCH-installer-filesystem
echo "--- Zipping up a skeleton initrd in '$CWD' ---"
tar -zc${VERBOSE1}f $CWD/skeleton_initrd.tar.gz .
}
############### Unpack skeleton of a Slackware installer image #################
use_installer_source()
{
if [ ! -f $CWD/sources/initrd/skeleton_initrd.tar.gz ]; then
if [ ! -f $SRCDIR/sources/initrd/skeleton_initrd.tar.gz ]; then
echo "*** Could not find 'skeleton_initrd.tar.gz' in either:"
echo "*** '$CWD/sources/initrd/' or '$SRCDIR/sources/initrd/'"
return 1
else
SKELFILE="$SRCDIR/sources/initrd/skeleton_initrd.tar.gz"
fi
else
SKELFILE="$CWD/sources/initrd/skeleton_initrd.tar.gz"
fi
echo "--- Using _your_ skeleton installer (not the initrd in the Slacktree) ---"
echo "--- ($SKELFILE) ---"
cd $PKG/$ARCH-installer-filesystem
tar -zx${VERBOSE1}f $SKELFILE
}
############### Build busybox ##################################################
build_busybox()
{
echo "--- Building a new busybox ---"
# Extract source:
cd $TMP
if [ -d $CWD/sources/busybox ]; then
echo "--- Using _your_ busybox sources (not those in the Slacktree) ---"
BUSYBOXPATH=$CWD/sources/busybox
elif [ -d $SRCDIR/sources/busybox ]; then
echo "--- Using _your_ busybox sources (not those in the Slacktree) ---"
BUSYBOXPATH=$SRCDIR/sources/busybox
else
# Use the busybox sources from the real Slackware tree:
BUSYBOXPATH=$SLACKROOT/source/installer
fi
[ ! -d $BUSYBOXPATH ] && ( echo "No directory '$BUSYBOXPATH'" ; exit 1 )
BUSYBOXPKG=$(ls -1 $BUSYBOXPATH/busybox-*.tar.bz2 | head -1)
BUSYBOXCFG=$(ls -1 $BUSYBOXPATH/busybox?dot?config | head -1)
BUSYBOXVER=$(echo $BUSYBOXPKG | sed -e "s#.*/busybox-\(.*\).tar.bz2#\1#")
echo "--- Compiling BUSYBOX version '$BUSYBOXVER' ---"
tar x${VERBOSE2}f $BUSYBOXPKG
cd busybox-* || exit 1
if $(ls $BUSYBOXPATH/busybox*.diff.gz 1>/dev/null 2>/dev/null) ; then
for DIFF in $(ls $BUSYBOXPATH/busybox*.diff.gz) ; do
zcat $DIFF | patch -p1 --verbose || exit 1
done
fi
chown -R root:root .
# Copy config:
# If we you rather like bash instead of busybox's ash, you'll need to adjust
# the symlinks in /bin and stuff.
install -m644 $BUSYBOXCFG .config
# Build:
make $SILENTMAKE $NUMJOBS CFLAGS="$SLKCFLAGS" || exit 1
# Install into package framework:
make $SILENTMAKE $NUMJOBS install || exit 1
cd _install
# Since Slackware 's installer uses the 'date' from coreutils, and 'zcat'
# script from gzip, we delete the busybox symlinks:
rm -f${VERBOSE1} bin/date bin/zcat
# Likewise, we will remove the 'fdisk' applet which overwrites our shell script:
rm -f${VERBOSE1} sbin/fdisk
# And we want to use our own 'cp':
rm -f${VERBOSE1} bin/cp
cp --remove-destination -fa${VERBOSE2} * $PKG/$ARCH-installer-filesystem/
}
############### Build dropbear #################################################
build_dropbear()
{
echo "--- Building a new dropbear ---"
# Extract source:
cd $TMP
if [ -d $CWD/sources/dropbear ]; then
echo "--- Using _your_ dropbear sources (not those in the Slacktree) ---"
DROPBEARPATH=$CWD/sources/dropbear
elif [ -d $SRCDIR/sources/dropbear ]; then
echo "--- Using _your_ dropbear sources (not those in the Slacktree) ---"
DROPBEARPATH=$SRCDIR/sources/dropbear
else
# Use the dropbear sources from the Slackware tree.
DROPBEARPATH=$SLACKROOT/source/installer/dropbear
fi
[ ! -d $DROPBEARPATH ] && ( echo "No directory '$DROPBEARPATH'" ; exit 1 )
DROPBEARPKG=$(ls -1 $DROPBEARPATH/dropbear-*.tar.lz | head -1)
DROPBEARVER=$(echo $DROPBEARPKG | sed -e "s#.*/dropbear-\(.*\).tar.lz#\1#")
tar x${VERBOSE2}f $DROPBEARPKG
echo "--- Compiling DROPBEAR version '$DROPBEARVER' ---"
cd dropbear* || exit 1
chown -R root:root .
chmod -R u+w,go+r-w,a-s .
# The programs we want to have as symlinks to dropbearmulti binary:
PROGS="dropbear dbclient dropbearkey dropbearconvert scp ssh"
# Patch to allow empty passwords (used in Slackware's installer):
patch -p1 ${VERBOSETXT} < $DROPBEARPATH/dropbear_emptypass.patch || exit 1
# Set local options, such as dbclient is in /bin (due to prefix=/):
cp $DROPBEARPATH/localoptions.h .
autoconf || exit 1
autoheader || exit 1
# Configure:
CFLAGS="$SLKCFLAGS" \
CXXFLAGS="$SLKCFLAGS" \
./configure \
--prefix=/ \
--mandir=/usr/man \
--disable-syslog \
--disable-utmp \
--disable-utmpx \
--disable-wtmp \
--disable-wtmpx \
--disable-pututline \
--disable-pututxline \
--build=$ARCH-slackware-linux$ARCHQUADLET || exit 1
# Build:
make $SILENTMAKE $NUMJOBS PROGRAMS="$PROGS" MULTI="1" SCPPROGRESS="1" || exit 1
# Install into installer's filesystem:
make $SILENTMAKE DESTDIR=$PKG/$ARCH-installer-filesystem/ MULTI="1" install || exit 1
# Link binaries to dropbearmulti since the 'make install' does not do that
# if we build a multicall binary
( cd $PKG/$ARCH-installer-filesystem/bin
ln -${VERBOSE1}fs ../bin/dropbearmulti ../sbin/dropbear
for i in $(echo $PROGS | sed -e 's/dropbear //') ; do
ln -${VERBOSE1}fs dropbearmulti $i
done
)
}
############### Build nano #####################################################
build_nano()
{
echo "--- Building nano editor ---"
# Extract source:
cd $TMP
if [ -d $CWD/sources/nano ]; then
echo "--- Using _your_ nano sources (not those in the Slacktree) ---"
NANOPATH=$CWD/sources/nano
elif [ -d $SRCDIR/sources/nano ]; then
echo "--- Using _your_ nano sources (not those in the Slacktree) ---"
NANOPATH=$SRCDIR/sources/nano
else
# Use the nano sources from the Slackware tree.
NANOPATH=$SLACKROOT/source/installer/nano
fi
[ ! -d $NANOPATH ] && ( echo "No directory '$NANOPATH'" ; exit 1 )
NANOPKG=$(ls -1 $NANOPATH/nano-*.tar.?z | head -1)
NANOVER=$(echo $NANOPKG | rev | cut -f 3- -d . | cut -f 1 -d - | rev)
tar x${VERBOSE2}f $NANOPKG
echo "--- Compiling NANO version '$NANOVER' ---"
cd nano* || exit 1
chown -R root:root .
chmod -R u+w,go+r-w,a-s .
# Configure:
CFLAGS="$(echo $SLKCFLAGS | sed s/-O2/-Os/g)" \
./configure \
--prefix=/usr \
--sysconfdir=/etc \
--infodir=/usr/info \
--mandir=/usr/man \
--docdir=/usr/doc/nano-$VERSION \
--datadir=/usr/share \
--program-prefix= \
--program-suffix= \
--disable-libmagic \
--enable-color \
--enable-multibuffer \
--enable-nanorc \
--enable-utf8 \
--build=$ARCH-slackware-linux$ARCHQUADLET || exit 1
# Build:
make $NUMJOBS || make || exit 1
# Install into installer's filesystem:
mkdir -p $PKG/$ARCH-installer-filesystem/usr/bin
cp -a src/nano $PKG/$ARCH-installer-filesystem/usr/bin/nano
strip --strip-unneeded $PKG/$ARCH-installer-filesystem/usr/bin/nano
mkdir -p $PKG/$ARCH-installer-filesystem/usr/man/man1
cat doc/nano.1 | gzip -9c > $PKG/$ARCH-installer-filesystem/usr/man/man1/nano.1.gz
# Install locale files if I_AM_DIDIER is defined:
if [ ! -z $I_AM_DIDIER ]; then
( cd po
make install DESTDIR=$PKG/$ARCH-installer-filesystem/
)
fi
}
############## Install binaries into installer filesystem ######################
# You can generate file-> package list in slackware-current
# cd slackware-current/${DISTRODIR}
# find . -name '*.t?z' | while read name ; do echo "****** $name ******" ; tar tvvf $name ; done > /tmp/newfest
#
import_binaries()
{
# Change into the installer's filesystem:
cd $PKG/$ARCH-installer-filesystem
echo "--- Importing binaries from Slackware packages ---"
# Temporary extraction directory:
rm -rf $TMP/extract-packages
mkdir -p -m755 $TMP/extract-packages
# This list of packages (Slackware v13.0+):
#
# Some ports require binaries from additional packages not shipped
# by Slackware/x86. Put the name of the binary into the relevant
# string below, and it'll be copied into either the installer filesystem's
# /sbin or /bin -- the installer does not have /usr/{sbin,bin}.
#
case $ARCH in
arm*) EXTRA_PKGS="a/u-boot-tools a/mtd-utils"
EXTRA_PKGS_BIN=""
EXTRA_PKGS_SBIN=""
EXTRA_PKGS_USRBIN="mkimage"
EXTRA_PKGS_USRSBIN="nand* flash_* flashcp sheeva* fw_setenv fw_printenv ubi*" ;;
*) EXTRA_PKGS=""
EXTRA_PKGS_BIN=""
EXTRA_PKGS_SBIN=""
EXTRA_PKGS_USRBIN=""
EXTRA_PKGS_USRSBIN="" ;;
esac
PKGLIST="${EXTRA_PKGS} \
a/bash \
a/btrfs-progs \
a/coreutils \
a/cryptsetup \
a/dialog \
a/dosfstools \
a/e2fsprogs \
a/efivar \
a/etc \
a/f2fs-tools \
a/gptfdisk \
a/grep \
a/gzip \
a/hdparm \
a/hwdata \
a/jfsutils \
a/kmod \
a/lvm2 \
a/lzip \
a/lzlib \
a/mdadm \
a/ncompress \
a/openssl-solibs \
a/os-prober \
a/pciutils \
a/plzip \
a/pkgtools \
a/procps-ng \
a/reiserfsprogs \
a/sed \
a/shadow \
a/sysfsutils \
a/syslinux \
a/tar \
a/eudev \
a/hostname \
a/libgudev \
a/usbutils \
a/util-linux \
a/xfsprogs \
a/xz \
a/zerofree \
ap/ddrescue \
ap/dmidecode \
ap/lsscsi \
ap/terminus-font \
d/gcc \
d/gcc-g++ \
l/argon2 \
l/glibc \
l/json-c \
l/keyutils \
l/libaio \
l/libcap \
l/libidn2 \
l/libunistring \
l/libusb \
l/lzo \
l/parted \
l/pcre \
l/popt \
l/readline \
l/zlib \
n/dhcpcd \
n/dnsmasq \
n/iproute2 \
n/krb5 \
n/libgcrypt \
n/libgpg-error \
n/libtirpc \
n/net-tools \
n/nfs-utils \
n/ntp \
n/rpcbind \
n/samba"
# Prevent a harmless (but ugly) build-time error:
mkdir -p $TMP/extract-packages/etc
touch $TMP/extract-packages/etc/shells
# Cruise through the required packages and extract them into
# a temporary directory:
for pkg in $PKGLIST ; do
if [ -s $SLACKROOT/${DISTRODIR}/$pkg-+([^-])-+([^-])-+([^-]).t[gblx]z ]; then
installpkg --terse -root $TMP/extract-packages $SLACKROOT/${DISTRODIR}/$pkg-+([^-])-+([^-])-+([^-]).t[gblx]z
else
echo "*** Package: "$pkg" not found in ${SLACKROOT}/${DISTRODIR} ***"
fi
done
#
# Deal with the installer's /bin:
#
cd $TMP/extract-packages/bin
cp --remove-destination -fa${VERBOSE1} ${EXTRA_PKGS_BIN} \
bash \
comm \
cp \
cut \
date \
dialog \
dircolors \
findmnt \
gzip \
ipmask \
ls \
lsblk \
paste \
printf \
pr \
ps \
mknod \
mount \
numfmt \
sed \
seq \
sort \
tar \
umount \
xz \
zgrep \
$PKG/$ARCH-installer-filesystem/bin/
$(readlink -s setterm 1>/dev/null) || \
cp --remove-destination -fa${VERBOSE1} setterm \
$PKG/$ARCH-installer-filesystem/bin/
cp --remove-destination -fa${VERBOSE1} grep $PKG/$ARCH-installer-filesystem/bin/grep.bin
cd $TMP/extract-packages/usr/bin
cp --remove-destination -fa${VERBOSE1} ${EXTRA_PKGS_USRBIN} \
bash \
ddrescue \
ldd \
lzip \
plzip \
rev \
uuidgen \
syslinux-nomtools \
strings \
$PKG/$ARCH-installer-filesystem/usr/bin/
# Fix ldd shebang:
sed -i "s|/usr/bin/bash|/bin/bash|g" $PKG/$ARCH-installer-filesystem/usr/bin/ldd
# Use syslinux-nomtools to avoid needing mtools on the installer:
if [[ $ARCH = *86* ]]; then
mv --verbose $PKG/$ARCH-installer-filesystem/usr/bin/syslinux-nomtools $PKG/$ARCH-installer-filesystem/usr/bin/syslinux || exit 1
fi
$(readlink -s setterm 1>/dev/null) || \
cp --remove-destination -fa${VERBOSE1} setterm \
$PKG/$ARCH-installer-filesystem/usr/bin/
cp --remove-destination -fa${VERBOSE1} \
compress \
$PKG/$ARCH-installer-filesystem/usr/bin/
# Make sure that /bin/sh points to bash:
( cd $PKG/$ARCH-installer-filesystem/bin
ln -${VERBOSE1}fs bash sh
)
#
# Deal with the installer's /sbin:
#
cd $TMP/extract-packages/sbin
cp --remove-destination -fa${VERBOSE1} ${EXTRA_PKGS_SBIN} \
badblocks \
blkid \
btrfs* \
cgdisk \
cryptsetup \
debugfs \
dmsetup \
dosfsck \
dumpe2fs \
e2fsck \
fsck \
fsck.* \
filefrag \
fixparts \
hdparm \
insmod \
e2image \
e2label \
e4crypt \
gdisk \
fsfreeze \
fstrim \
jfs_fsck \
jfs_mkfs \
kmod \
logsave \
ldconfig \
lsmod \
lspci \
lvm \
lvmdump \
mount.nfs \
mkdosfs \
mke2fs \
mkreiserfs \
mkfs.* \
mklost+found \
mkswap \
modprobe \
mount \
mdadm \
rdev \
reiserfsck \
rmmod \
resize2fs \
rpcbind \
rpc.statd \
sfdisk \
sgdisk \
swaplabel \
tune2fs \
udev* \
umount \
xfs_repair \
$PKG/$ARCH-installer-filesystem/sbin/
# This had dmsetup* above, which unnecessarily copies dmsetup.static
# This had lvm* above, which unnecessarily copies lvm.static
cp --remove-destination -fa${VERBOSE1} fdisk \
$PKG/$ARCH-installer-filesystem/sbin/fdisk.bin
# Hack reboot to call reboot -f:
rm -f $PKG/$ARCH-installer-filesystem/sbin/reboot
( cd $PKG/$ARCH-installer-filesystem/bin ; ln -sf busybox reboot )
cat << EOF > $PKG/$ARCH-installer-filesystem/sbin/reboot
#!/bin/sh
echo "Sending all processes the SIGTERM signal."
/sbin/killall5 -15
/bin/sleep 2
echo "Sending all processes the SIGKILL signal."
/sbin/killall5 -9
/bin/sleep 2
echo "Syncing filesystems."
sync
echo "Unmounting filesystems:"
# Try to unmount these bind mounts first to prevent them from blocking unmount of the target /:
umount /mnt/dev 2> /dev/null
umount /mnt/proc 2> /dev/null
umount /mnt/sys 2> /dev/null
/bin/umount -v -a -t no,proc,sysfs,devtmpfs,fuse.gvfsd-fuse,tmpfs
sync
echo "Rebooting."
if [ -z "\$*" ]; then
/bin/reboot -f
else
/bin/reboot \$*
fi
EOF
chmod 755 $PKG/$ARCH-installer-filesystem/sbin/reboot
# Copy binaries from /usr/bin into the installer's /usr/bin/
cd $TMP/extract-packages/usr/bin
cp --remove-destination -fa${VERBOSE1} ${EXTRA_PKGS_USRBIN} \
chattr \
lsattr \
lsusb \
mcookie \
usb-devices \
$PKG/$ARCH-installer-filesystem/usr/bin/
# Grab a couple of terminus fonts that we'll need to prevent
# blindness from microscopic KMS terminal fonts:
cd $TMP/extract-packages/usr/share/kbd/consolefonts
mkdir -p $PKG/$ARCH-installer-filesystem/usr/share/kbd/consolefonts
cp --remove-destination -fa${VERBOSE1} \
ter-114v.psf.gz \
$PKG/$ARCH-installer-filesystem/usr/share/kbd/consolefonts
# Copy binaries from /usr/sbin into the installer's /usr/sbin/
cd $TMP/extract-packages/usr/sbin
cp --remove-destination -fa${VERBOSE1} ${EXTRA_PKGS_USRSBIN} \
chpasswd \
dnsmasq \
ntpdate \
parted \
partprobe \
partx \
dmidecode \
mount.cifs \
sm-notify \
sparsify \
umount.cifs \
zerofree \
$PKG/$ARCH-installer-filesystem/usr/sbin/
# The installer has wrappers for cfdisk/fdisk which run /dev/makedevs.sh
# if it is there. If it is not there, udev is running and will handle
# creating or removing block devices in /dev as needed:
cd $TMP/extract-packages/sbin
cp --remove-destination -fa${VERBOSE1} \
cfdisk \
$PKG/$ARCH-installer-filesystem/sbin/cfdisk.bin
# And for LVM, there are tonnes of symlinks:
cd $TMP/extract-packages/sbin
find . -type l -lname lvm -printf "%p\n" | xargs -i cp -fa${VERBOSE1} {} $PKG/$ARCH-installer-filesystem/sbin/
# Fix lvmdump script:
sed -i -e 's?/usr/bin/tr?tr?' $PKG/$ARCH-installer-filesystem/sbin/lvmdump
# Grab the matching lvm.conf script:
mkdir -p $PKG/$ARCH-installer-filesystem/etc/lvm
cat $TMP/extract-packages/etc/lvm/lvm.conf \
> $PKG/$ARCH-installer-filesystem/etc/lvm/lvm.conf
# Use a current group file (udev expects this)
cat $TMP/extract-packages/etc/group > $PKG/$ARCH-installer-filesystem/etc/group
## Copy udev related files over (do not clobber an existing blacklist):
#if [ -f $PKG/$ARCH-installer-filesystem/etc/modprobe.d/blacklist ]; then
# mv $PKG/$ARCH-installer-filesystem/etc/modprobe.d/blacklist{,.new}
#fi
# Copy udev related files over
cp -a $TMP/extract-packages/etc/modprobe.d $PKG/$ARCH-installer-filesystem/etc/
mkdir -p $PKG/$ARCH-installer-filesystem/lib
cp -a $TMP/extract-packages/lib/modprobe.d $PKG/$ARCH-installer-filesystem/lib/
cp -a $TMP/extract-packages/etc/{modprobe.conf,modprobe.d,scsi_id.config,udev} \
$PKG/$ARCH-installer-filesystem/etc/
cp -a $TMP/extract-packages/etc/rc.d/rc.udev \
$PKG/$ARCH-installer-filesystem/etc/rc.d/
#if [ -f $PKG/$ARCH-installer-filesystem/etc/modprobe.d/blacklist.new ]; then
# mv $PKG/$ARCH-installer-filesystem/etc/modprobe.d/blacklist{.new,}
#fi
# Copy package tools:
cd $TMP/extract-packages/sbin
cp --remove-destination -fa${VERBOSE1} \
installpkg \
pkgtool \
removepkg \
$PKG/$ARCH-installer-filesystem/sbin/
# Deal with /lib stuff from the packages:
mkdir -p -m755 $PKG/$ARCH-installer-filesystem/lib
mkdir -p -m755 $PKG/$ARCH-installer-filesystem/lib${LIBDIRSUFFIX}
mkdir -p -m755 $PKG/$ARCH-installer-filesystem/usr/lib${LIBDIRSUFFIX}
cp -fa${VERBOSE1} $TMP/extract-packages/lib/udev \
$PKG/$ARCH-installer-filesystem/lib/
cd $TMP/extract-packages/lib${LIBDIRSUFFIX}
cp -fa${VERBOSE1} \
e2initrd_helper \
libaio.so* \
libblkid*so* \
libcap*so* \
libcrypto*so* \
libdevmapper*so* \
libf2fs.so* \
libfdisk.so* \
libgcc*so* \
libgcrypt*.so* \
libgpg-error*.so* \
libgssapi_krb5.so* \
libk5crypto.so* \
libkeyutils.so* \
libkmod*so* \
libkrb5.so* \
libkrb5support.so* \
liblzma*so* \
libmount.so* \
libpcre.so* \
libpopt*.so* \
libsmartcols.so* \
libssl*so* \
libtirpc*so* \
libudev*so* \
libuuid*so* \
libvolume_id*so* \
libz*.so* \
$PKG/$ARCH-installer-filesystem/lib${LIBDIRSUFFIX}/
# Deal with /usr/lib stuff from the packages:
cd $TMP/extract-packages/usr/lib${LIBDIRSUFFIX}
cp -fa${VERBOSE1} \
libargon2.so* \
libcryptsetup*.so* \
libefiboot.so* \
libefivar.so* \
libgcc*.so* \
libhistory*.so* \
libidn2*.so* \
libjson-c.so* \
liblz.so* \
liblzo*.so* \
libparted*so* \
libreadline*.so* \
libstdc++*.so* \
libunistring*.so* \
libusb-1.0*.so* \
$PKG/$ARCH-installer-filesystem/usr/lib${LIBDIRSUFFIX}/
# Stuff needed for os-prober:
cd $TMP/extract-packages/usr/share
cp -fa${VERBOSE1} \
os-prober \
$PKG/$ARCH-installer-filesystem/usr/share/
cd $TMP/extract-packages/usr/lib${LIBDIRSUFFIX}
cp -fa${VERBOSE1} \
os-probes \
os-prober \
linux-boot-probes \
$PKG/$ARCH-installer-filesystem/usr/lib${LIBDIRSUFFIX}/
cd $TMP/extract-packages/usr/bin
cp -fa${VERBOSE1} \
linux-boot-prober \
os-prober \
$PKG/$ARCH-installer-filesystem/usr/bin/
# Copy dhcpcd pieces:
cd $TMP/extract-packages/
cp -fa${VERBOSE1} \
lib/dhcpcd \
$PKG/$ARCH-installer-filesystem/lib/
cp -fa${VERBOSE1} \
usr/lib${LIBDIRSUFFIX}/dhcpcd \
$PKG/$ARCH-installer-filesystem/usr/lib${LIBDIRSUFFIX}/
cp -fa${VERBOSE1} \
var/lib/dhcpcd \
$PKG/$ARCH-installer-filesystem/var/lib/
cp -fa${VERBOSE1} \
etc/dhcpcd.conf \
$PKG/$ARCH-installer-filesystem/etc/
cp -fa${VERBOSE1} \
sbin/dhcpcd \
$PKG/$ARCH-installer-filesystem/sbin/
# Add pci.ids and usb.ids now that we have lspci and lsusb onboard:
cd $TMP/extract-packages/usr/share/hwdata
mkdir -p -m755 $PKG/$ARCH-installer-filesystem/usr/share/hwdata
cp -fa${VERBOSE1} pci.ids usb.ids \
$PKG/$ARCH-installer-filesystem/usr/share/hwdata
# Copy the rc script for rpcbind:
cd $TMP/extract-packages/etc/rc.d
cp -fa${VERBOSE1} \
rc.rpc \
$PKG/$ARCH-installer-filesystem/etc/rc.d/
chmod 755 $PKG/$ARCH-installer-filesystem/etc/rc.d/rc.rpc
mkdir -p $PKG/$ARCH-installer-filesystem/var/state/rpcbind
# Copy /etc/default/{nfs,rpc}:
cd $TMP/extract-packages/etc/default
cp -fa${VERBOSE1} \
nfs rpc \
$PKG/$ARCH-installer-filesystem/etc/default
# Remove busybox symlinks for things that we have a real version of:
for prunedir in $PKG/$ARCH-installer-filesystem/usr/bin $PKG/$ARCH-installer-filesystem/usr/sbin ; do
cd $prunedir
for removefile in $(find . -type f -maxdepth 1) ; do
rm -f $PKG/$ARCH-installer-filesystem/bin/$(basename $removefile)
rm -f $PKG/$ARCH-installer-filesystem/sbin/$(basename $removefile)
done
done
if [ -r rm -f $PKG/$ARCH-installer-filesystem/sbin/lspci -a ! -L $PKG/$ARCH-installer-filesystem/sbin/lspci -a -L $PKG/$ARCH-installer-filesystem/bin/lspci ]; then
rm -f $PKG/$ARCH-installer-filesystem/bin/lspci
fi
# Update to latest versions of files within /etc/
# /etc/ file Package Reason
# ------------------------------------------------------------------------------------
# netconfig : libtirpc : Required by libtirpc (for rpc.statd/rpcbind)
# services : etc : Always use the latest version to avoid problems with NFS.
# dialogrc : dialog : Dialog config
# mke2fs.conf : e2fsprogs: Required for ext4
# nfsmount.conf : nfs-utls : On ARM we set "vers=3" as the default which allows
# easy NFS mounting within the installer.
cd $TMP/extract-packages/etc/
cp -fa${VERBOSE1} \
services \
netconfig \
nfsmount.conf \
dialogrc \
mke2fs.conf \
$PKG/$ARCH-installer-filesystem/etc/
# For ARM:
# Copy the configuration file for fw_(printenv/saveenv) utility.
# This allows people to more easily fix up a duff u-boot config
# from the installer because the config file contains some of the memory offsets
# for the most popular devices
[ -s $TMP/extract-packages/etc/fw_env.config* ] \
&& install -${VERBOSE1}pm644 $TMP/extract-packages/etc/fw_env.config* \
$PKG/$ARCH-installer-filesystem/etc/fw_env.config
# If man pages have been requested, copy the groff sources to process later
# For now, these will be English only (sorry)
if [ $ADD_MANPAGES -eq 1 ]; then
if [ -d $TMP/extract-packages/usr/man ]; then
mkdir -p $PKG/$ARCH-installer-filesystem/usr/man/
cd $TMP/extract-packages/usr/man
cp --remove-destination -fa${VERBOSE1} man* \
$PKG/$ARCH-installer-filesystem/usr/man/
fi
# In case the real man package has been installed (unlikely)
if [ -f $TMP/extract-packages/lib${LIBDIRSUFFIX}/man.conf ]; then
cp -a $TMP/extract-packages/lib${LIBDIRSUFFIX}/man.conf $PKG/$ARCH-installer-filesystem/usr/lib${LIBDIRSUFFIX}
fi
fi
}
############### Install libraries into installer's filesystem ##################
# We install the library packages and copy only the parts that we need.
#
# Rather than automate the process, for some packages we need to specifically
# select individual library names.
# In case you wonder why we don't copy these libraries during the extraction
# in the code above, it's because this way we don't need to keep up to date with
# any new library names or versions - we either take everything or be very
# specific -- this is particularly relevant for glibc.
import_libraries()
{
rm -rf $TMP/extract-packages
mkdir -p $TMP/extract-packages
# Change into the installer's filesystem:
cd $PKG/$ARCH-installer-filesystem
echo "--- Importing libraries from Slackware packages ---"
# a/e2fsprogs:
installpkg --terse -root $TMP/extract-packages $SLACKROOT/${DISTRODIR}/a/e2fsprogs-*.t[gblx]z
cp -fa${VERBOSE1} $TMP/extract-packages/lib${LIBDIRSUFFIX}/*so* \
lib${LIBDIRSUFFIX}/
rm -rf $TMP/extract-packages
# a/glibc-solibs:
mkdir -p $TMP/extract-packages
installpkg --terse -root $TMP/extract-packages $SLACKROOT/${DISTRODIR}/a/glibc-solibs-*.t[gblx]z
cp -fa${VERBOSE1} /lib${LIBDIRSUFFIX}/ld-linux*so* lib${LIBDIRSUFFIX}/
cp -fa${VERBOSE1} $TMP/extract-packages/lib${LIBDIRSUFFIX}/*so* \
lib${LIBDIRSUFFIX}/
# pt_chown has been removed from glibc as a possible security hole:
#cp --remove-destination -fa${VERBOSE1} $TMP/extract-packages/usr/libexec/pt_chown usr/libexec
rm -rf $TMP/extract-packages
# l/ncurses:
mkdir -p $TMP/extract-packages
installpkg --terse -root $TMP/extract-packages $SLACKROOT/${DISTRODIR}/l/ncurses-*.t[gblx]z
cp -fa${VERBOSE1} $TMP/extract-packages/lib${LIBDIRSUFFIX}/*so* \
lib${LIBDIRSUFFIX}/
cp -fa${VERBOSE1} $TMP/extract-packages/usr/share/terminfo/{c,l,v,s,x} usr/share/terminfo/
# Remove any terminal entries that are broken due to them being symlinks into directories that we haven't included:
find usr/share/terminfo/ -xtype l -print0 | xargs -0 rm -f
cp -fa${VERBOSE1} $TMP/extract-packages/usr/share/tabset/* usr/share/tabset/
rm -rf $TMP/extract-packages
# Remove dangling symlinks (pointing into directories we did not copy):
( cd usr/share/terminfo
for file in $(find . -type l) ; do
if [ "$(readlink -e $file)" = "" ]; then
rm -f${VERSOSE1} $file
fi
done
)
# a/acl:
mkdir -p $TMP/extract-packages
installpkg --terse -root $TMP/extract-packages $SLACKROOT/${DISTRODIR}/a/acl-*.t[gblx]z
cp -fa${VERBOSE1} $TMP/extract-packages/lib${LIBDIRSUFFIX}/*so* \
lib${LIBDIRSUFFIX}/
rm -rf $TMP/extract-packages
# a/attr:
mkdir -p $TMP/extract-packages
installpkg --terse -root $TMP/extract-packages $SLACKROOT/${DISTRODIR}/a/attr-*.t[gblx]z
cp -fa${VERBOSE1} $TMP/extract-packages/lib${LIBDIRSUFFIX}/*so* \
lib${LIBDIRSUFFIX}/
rm -rf $TMP/extract-packages
# a/pciutils:
mkdir -p $TMP/extract-packages
installpkg --terse -root $TMP/extract-packages $SLACKROOT/${DISTRODIR}/a/pciutils-*.t[gblx]z
cp -fa${VERBOSE1} $TMP/extract-packages/lib${LIBDIRSUFFIX}/*so* \
lib${LIBDIRSUFFIX}/
rm -rf $TMP/extract-packages
# a/procps-ng:
mkdir -p $TMP/extract-packages
installpkg --terse -root $TMP/extract-packages $SLACKROOT/${DISTRODIR}/a/procps-ng-*.t[gblx]z
cp -fa${VERBOSE1} $TMP/extract-packages/lib${LIBDIRSUFFIX}/*so* \
lib${LIBDIRSUFFIX}/
rm -rf $TMP/extract-packages
# a/gpm:
#mkdir -p $TMP/extract-packages
#installpkg --terse -root $TMP/extract-packages $SLACKROOT/${DISTRODIR}/a/gpm-*.t[gblx]z
#cp -fa${VERBOSE1} $TMP/extract-packages/lib${LIBDIRSUFFIX}/*so* \
# lib${LIBDIRSUFFIX}/
#rm -rf $TMP/extract-packages
}
############### Install Kernel modules into installer's filesystem #############
#
#
############### Add the network modules ########################################
add_netmods()
{
echo "--- Adding network modules ---"
cd $PKG/$ARCH-installer-filesystem
# Clear out remaining cruft:
rm -rf ./lib/modules.incoming
# Temporary extraction directory:
rm -rf $TMP/extract-packages
mkdir -p -m755 $TMP/extract-packages
# Unpack the kernel modules (all kernels defined for this $ARCH):
for ind in $(seq 0 $((${#KERNELS[*]} -1)) ); do
tar -C $TMP/extract-packages -x${VERBOSE1}f $(ls -1 ${KERNELMODPKG} | grep "${KVER}$(echo ${KEXTRAV[$ind]}| tr - _)-" ) lib
done
mv -f${VERBOSE1} $TMP/extract-packages/lib/modules ./lib/modules.incoming
# Start removing unwanted modules to keep the resulting image small:
echo "--- Removing unneeded kernel modules ---"
for ind in $(seq 0 $((${#KERNELS[*]} -1)) ); do
kv=${KEXTRAV[$ind]}
[ ! -d ./lib/modules.incoming/$KVER$kv ] && continue
(
echo "--- Processing kernel version '$KVER$kv' ---"
cd ./lib/modules.incoming/$KVER$kv
cd kernel/
# Remove blacklisted modules:
cat $MODBLACKLIST | while read modname ; do
find . -name $modname -exec rm -f "{}" \;
done
mv -f fs{,.orig} && \
( mkdir -m755 fs
# If the architecture has a mostly modular kernel, then
# the filesystem modules may need to be included within the installer:
case $ARCH in
arm*)
cp -a fs.orig/{udf*,isofs*,cifs*,ext*,fat*,fscache,jfs*,lockd,nfs,nfs_common,jbd*,nls,reiserfs,xfs,binfmt*,mbcache*,exportfs*} fs/
;;
*86*)
cp -a fs.orig/{cifs*,fscache,lockd,nfs,nfs_common} fs/
;;
*)
cp -a fs.orig/cifs* fs/
;;
esac
rm -rf fs.orig )
rm -rf${VERBOSE1} sound arch
cd net/
# Architectures with a more modular kernel will want to keep supporting
# modules for 'nfs' et al:
case $ARCH in
arm*)
;;
*86*)
;;
*)
rm -rf${VERBOSE1} sunrpc
;;
esac
mv -f ipv4{,.orig} && ( mkdir -m755 ipv4 ; cp -a ipv4.orig/inet* ipv4/ ; rm -rf ipv4.orig )
mv -f ipv6{,.orig} && ( mkdir -m755 ipv6 ; cp -a ipv6.orig/ipv6* ipv6/ ; rm -rf ipv6.orig )
rm -rf${VERBOSE1} 9p appletalk atm ax25 bluetooth bridge dccp decnet ieee80211 ipx irda key mac80211 netfilter netrom rds rfkill rose rxrpc sched sctp tipc wanrouter wimax wireless
cd ..
cd drivers/
# Architectures with a more modular kernel will want to keep 'ide' 'scsi'
# and other core device drivers:
case $ARCH in
arm*)
;;
*)
mv scsi scsi.orig
mv md md.orig
rm -rf${VERBOSE1} cdrom ide md scsi
mkdir scsi
mv scsi.orig/hv_storvsc.ko scsi
rm -rf${VERBOSE1} scsi.orig
mkdir md
mv md.orig/dm-raid.ko md
rm -rf${VERBOSE1} md.orig
;;
esac
# Save loop.ko, nvme.ko, and virtio_blk.ko, but remove other block drivers:
mv block block.orig
mkdir block
mv block.orig/nvme.ko block
mv block.orig/loop.ko block
mv block.orig/virtio_blk.ko block
rm -rf${VERBOSE1} block.orig
# Done with block directory
# Save the Hyper-V modules in staging, but toss the rest:
mv staging staging.orig
mv staging.orig/hv staging
rm -rf${VERBOSE1} staging.orig
# Save the Hyper-V keyboard module:
mkdir -p input.orig/serio
cp -a input/serio/hyperv-keyboard.ko input.orig/serio
rm -rf${VERBOSE1} ata atm bluetooth clocksource connector crypto dma idle infiniband input isdn kvm leds media memstick message mfd misc pci power rtc serial telephony uwb w1 watchdog
mv input.orig input
if [ "$ADD_KMS" = "1" ]; then
# Keep video.ko and button.ko, needed by some gpu drivers.
# Also keep processor.ko, needed by acpi-cpufreq.
mv acpi acpi.orig
mkdir acpi
mv acpi.orig/{button,processor,video}.ko acpi
rm -rf${VERBOSE1} acpi.orig
# Keep AGP modules:
mv char/agp agp.orig
rm -rf${VERBOSE1} char
mkdir char
mv agp.orig char/agp
# Keep hwmon.ko:
mkdir hwmon.orig
mv hwmon/hwmon.ko hwmon.orig
rm -rf${VERBOSE1} hwmon
mv hwmon.orig hwmon
# Keep platform/x86/mxm-wmi.ko and platform/x86/wmi.ko
mkdir x86.orig
mv platform/x86/mxm-wmi.ko platform/x86/wmi.ko x86.orig
rm -rf${VERBOSE1} platform
mkdir platform
mv x86.orig platform/x86
# Keep thermal/thermal_sys.ko:
mv thermal thermal.orig
mkdir thermal
mv thermal.orig/thermal_sys.ko thermal
rm -rf${VERBOSE1} thermal.orig
# Keep some video drivers:
mv video video.orig
mkdir -p video/fbdev
mv video.orig/{sis,syscopyarea.ko,sysfillrect.ko,sysimgblt.ko} video
mv video.orig/fbdev/hyperv_fb.ko video/fbdev
rm -rf${VERBOSE1} video.orig
else
# Save the Hyper-V framebuffer module:
mv video video.orig
mkdir -p video/fbdevmv
mv video.orig/fbdev/hyperv_fb.ko video/fbdev
rm -rf${VERBOSE1} acpi char cpufreq hwmon platform thermal video.orig
fi
# Needed to install on MMC:
mv mmc/host mmc/host.orig
mkdir mmc/host
mv mmc/host.orig/sdhci.ko mmc/host
mv mmc/host.orig/sdhci-acpi.ko mmc/host
mv mmc/host.orig/sdhci-pci.ko mmc/host
mv mmc/host.orig/cqhci.ko mmc/host
rm -rf${VERBOSE1} mmc/host.orig
cd usb/
rm -rf${VERBOSE1} atm host/hwa-hc.ko host/whci image serial wusbcore
cd ..
cd net/
rm -rf${VERBOSE1} appletalk arcnet bonding chelsio hamradio irda ixgb wimax wireless wan
cd ..
rm -f${VERBOSE1} ieee1394/pcilynx.ko
rm -f${VERBOSE1} net/pcmcia/com20020_cs.ko
rm -f${VERBOSE1} net/plip.ko
rm -f${VERBOSE1} net/usb/hso.ko
rm -f${VERBOSE1} usb/misc/uss720.ko
rm -f${VERBOSE1} gpio/wm831x-gpio.ko
#rm -f${VERBOSE1} clocksource/scx200_hrt.ko
)
done
# Move the remaining modules into place:
mkdir -p -m755 ./lib/modules
cp --remove-destination -fa${VERBOSE2} ./lib/modules.incoming/* ./lib/modules/
# This can go now:
rm -rf${VERBOSE1} ./lib/modules.incoming
}
############### Add the pcmcia modules #########################################
add_pcmciamods()
{
echo "--- Adding pcmcia modules ---"
cd $PKG/$ARCH-installer-filesystem
# Clear out remaining cruft:
rm -rf ./lib/modules.incoming
# Temporary extraction directory:
rm -rf $TMP/extract-packages
mkdir -p -m755 $TMP/extract-packages
# Unpack the kernel modules:
for ind in $(seq 0 $((${#KERNELS[*]} -1)) ); do
kv=${KEXTRAV[$ind]}
tar -C $TMP/extract-packages -x${VERBOSE1}f $(ls -1 ${KERNELMODPKG} | grep "${KVER}$(echo $kv| tr - _)-" ) lib
done
mv -f${VERBOSE1} $TMP/extract-packages/lib/modules ./lib/modules.incoming
# Compile the list with pcmcia modules and copy into place:
for ind in $(seq 0 $((${#KERNELS[*]} -1)) ); do
kv=${KEXTRAV[$ind]}
mkdir -p $PKG/$ARCH-installer-filesystem/lib/modules/${KVER}$kv
done
for kmod in $( egrep "(/kernel/drivers/pcmcia/|/kernel/drivers/net/pcmcia/|/kernel/drivers/char/pcmcia/|/kernel/drivers/scsi/pcmcia/).*:" $PKG/$ARCH-installer-filesystem/lib/modules.incoming/$KVER${KEXTRAV[0]}/modules.dep | sed -e 's,:,,g ; s, ,\n,g' | sort | uniq | sed -e "s#^/lib/modules/$KVER${KEXTRAV[0]}##" ); do
for ind in $(seq 0 $((${#KERNELS[*]} -1)) ); do
kv=${KEXTRAV[$ind]}
mkdir -p $PKG/$ARCH-installer-filesystem/lib/modules/${KVER}$kv/$(dirname $kmod)
cp -a${VERBOSE1} $PKG/$ARCH-installer-filesystem/lib/modules.incoming/${KVER}$kv/$kmod $PKG/$ARCH-installer-filesystem/lib/modules/${KVER}$kv/$(dirname $kmod)/
done
done
# We can get rid of this now:
rm -rf ./lib/modules.incoming
# Install the necessary pcmcia support files from stock packages:
echo "--- Adding support tools from Slackware packages: ---"
rm -rf $TMP/extract-packages/*
installpkg --terse -root $TMP/extract-packages/ $PCMCIAUTILS
rm -rf $TMP/extract-packages/{usr,var}
cp -a $TMP/extract-packages/* $PKG/$ARCH-installer-filesystem/
rm -rf $TMP/extract-packages/*
installpkg --terse -root $TMP/extract-packages/ $SYSFS
rm -rf $TMP/extract-packages/usr/{doc,include} $TMP/extract-packages/var
if [ ! $ADD_MANPAGES -eq 1 ]; then
rm -rf $TMP/extract-packages/usr/man/*
fi
cp -a $TMP/extract-packages/* $PKG/$ARCH-installer-filesystem/
rm -rf $TMP/extract-packages/*
}
############### Compress kernel modules ########################################
compress_modules()
{
# If the module files should be compressed, do that now:
if [ $COMPRESS_MODS -eq 1 ]; then
echo "--- Compressing kernel modules ---"
cd $PKG/$ARCH-installer-filesystem
#find ./lib/modules -type f -name "*.ko" -exec xz -9f -C crc32 {} \;
# Do this one in parallel instead:
find ./lib/modules -type f -name "*.ko" | parallel xz -9f -C crc32
for i in $(find ./lib/modules -type l -name "*.ko") ; do ln -s $( readlink $i).xz $i.xz ; rm $i ; done
cd - 1>/dev/null
fi
}
############### Add network card firmware #####################################
add_netfirmware()
{
# Some network cards use a firmware...
echo "--- Adding firmware for network cards ---"
cd $PKG/$ARCH-installer-filesystem
# Just to be safe:
mkdir -p -m755 ./lib/firmware
# Temporary extraction directory:
rm -rf $TMP/extract-packages
mkdir -p -m755 $TMP/extract-packages
# Unpack the kernel firmware:
tar -C $TMP/extract-packages -x${VERBOSE1}f $(ls -1 ${KERNELFW_PKG}) lib
for FMW in $NETFIRMWARE ; do
cp -fa${VERBOSE2} $TMP/extract-packages/lib/firmware/${FMW}* ./lib/firmware
done
# Clean up:
rm -rf $TMP/extract-packages/lib
cd - 1>/dev/null
}
############### Calculate module dependencies (showing errors) #################
check_module_dependencies()
{
cd $PKG/$ARCH-installer-filesystem
# Make sure you compile generic and huge kernels with the same options
# (apart from the drivers that will be modularized/builtins) or else you
# will see "unknown symbol" errors when the scripts resolves dependencies!
# Unpack the System.map files we need for checking unresolved dependencies
# (aka kernel modules we forgot to add):
for ind in $(seq 0 $((${#KERNELS[*]} -1)) ); do
gunzip -cd ${SLACKROOT}/kernels/${KERNELS[$ind]}/System.map.gz \
> ./lib/modules/System.map.$KVER${KEXTRAV[$ind]}
done
echo "--- Calculating module dependencies ---"
for ind in $(seq 0 $((${#KERNELS[*]} -1)) ); do
kv=${KEXTRAV[$ind]}
[ ! -d $PKG/$ARCH-installer-filesystem/lib/modules/$KVER${kv} ] && continue
rm -f $PKG/$ARCH-installer-filesystem/lib/modules/$KVER${kv}/modules.*
/sbin/depmod -a -e -b $PKG/$ARCH-installer-filesystem \
-F $PKG/$ARCH-installer-filesystem/lib/modules/System.map.$KVER$kv $KVER$kv
done
# We do not need these any longer:
rm -f ./lib/modules/System.map.*
}
############### Architecture specific stuff ####################################
arch_specifics()
{
cd $PKG/$ARCH-installer-filesystem
echo "--- Running ARCH specific tasks ---"
# First the tasks we want to apply to every architecture:
# Set the Slackware version in the 'setup' script & /etc/issue
# to the version specified in this installer build script:
sed -i \
's?Slackware Linux Setup (version.*)?Slackware Linux Setup (version '"$INSTALLERVERSION"')?' \
usr/lib/setup/setup
sed -i 's?(version.*)?(version '"$INSTALLERVERSION"')?g' etc/issue
# Then split out per supported architecture:
case $ARCH in
arm*)
#
# ARM modifications:
#
cat << 'EOF' > root/qgo
# This makes parallel Slackware installations over SSH far easier to identify.
read -p "Host name (for window title): " winthostname
# We include additional control characters to enable us to set the window title
# even under GNU Screen:
echo -ne "\033P\033]0; Slackware ARM Installer on $winthostname \007\033\\"
ntpdate rolex.ripe.net && /bin/sh /sbin/fakedate && TERM=screen-256color setup
EOF
chmod 755 root/qgo
# Don't need these - they take up space:
#
rm -f sbin/syslinux
# Apply ARM patches to the installer scripts:
#
# We don't need to set a Kernel for Slackware ARM yet, as the boot loader config is usually
# out of reach of the OS and needs to be configured independently.
install -${VERBOSE1}pm755 $SRCDIR/arm/installer-patches/setkernel usr/lib/setup/SeTkernel
# Load Kernel modules required for filesystems and so on.
sed -i '\?^#.*!/bin/? a\/etc/rc.d/rc.modules-arm' etc/rc.d/rc.S
install -${VERBOSE1}pm755 $SRCDIR/arm/rc.modules-arm etc/rc.d/
# Set the system clock from the hardware clock before fudging the date
# since on ARM the system clock is not automatically set on all devices.
sed -i '/^touch \/.today/ a/sbin/hwclock --hctosys' etc/rc.d/rc.S
# Log errors into /tmp on the root filesystem. This helps the development
# process -- sometimes the doinst.sh scripts bail out because of a missing
# dependency (or sometimes a package just needs a recompile).
patch ${VERBOSETXT} -p0 < $SRCDIR/arm/installer-patches/slackinstall-logerror.diff || exit 1
# On some ARM devices there is no RTC so it's best to disable the
# fsck checks on the filesystems.
install -${VERBOSE1}pm755 $SRCDIR/arm/armedslack-nofscheck usr/lib/setup/
patch ${VERBOSETXT} -p0 < $SRCDIR/arm/installer-patches/SeTpartitions-add-nofscheck.diff || exit 1
;;
x86_64)
#
# x86_64 modifications:
#
# We may still need to fix-up 'slackware' directory paths to 'slackware64':
if ! grep -qr "slackware64" ./usr/lib/setup/ ; then
# Note, the order of fix-up is important:
sed -i \
-e "s#/slackware\([^-]\)#/slackware64\1#g" \
-e "s#slackware/#slackware64/#g" \
-e "s#slackware)#slackware64)#g" \
-e "s#slackware\$#slackware64#g" \
-e "s#mkdir slackware#mkdir slackware64#" \
$(grep -lr "slackware" ./usr/lib/setup)
fi
;;
esac
}
############### Create the new installer initrd ################################
create_initrd()
{
cd $PKG/$ARCH-installer-filesystem/
echo "--- Creating your new initrd.img ---"
# Leave a note in the installer image to help us work out which build version
# it is -- just aids with bug reports for now:
cat <<"EOF" > .installer-version
Version details:
----------------
Installer............: $Revision: 1.129 $ ($Date: 2011/04/13 23:03:07 $)
EOF
cat << EOF >> .installer-version
For Slackware version: $INSTALLERVERSION
Build date...........: $( date )
Build details:
--------------
Installer arch.......: $ARCH
Build host...........: $( uname -a )
EOF
if [ ! -f etc/ld.so.conf ]; then
cat <<EOF > etc/ld.so.conf
/lib${LIBDIRSUFFIX}
/usr/lib${LIBDIRSUFFIX}
EOF
fi
ldconfig -r.
## Find any remaining dangling symlinks.
#echo "--- Finding any dangling symlinks ---"
#echo " Expect to see:"
#echo " ./boot ./var/log/scripts ./var/log/packages"
#echo " ./var/adm/scripts ./var/adm/packages ./cdrom ./nfs"
#echo ""
#find -L . -type l
#echo "-------------------------------------"
# Do we have to split the initrd (separate initrd for each kernel version)?
if [ $SPLIT_INITRD -eq 1 ]; then
if [ $(ls -d --indicator-style=none ./lib/modules/${KVER}* | wc -l) -eq 2 ];
then
echo "--- Splitting into separate initrd's for $KVER ---"
local usek
for kv in $KVER $KVER-smp ; do
[ "$kv" = "$KVER" ] && usek="-smp" || usek=""
# Determine the size of the installer:
echo " Installer size (uncompressed): $( du -sh --exclude=$kv . )"
find . -path ./lib/modules/$kv -prune -o -print \
| cpio -o -H newc | xz -9fv -C crc32 > $CWD/initrd${usek}.img
echo " New installer image for kernel $KVER$usek is ${CWD}/initrd${usek}.img"
done
cat $SLACKROOT/isolinux/isolinux.cfg | sed \
-e "/label huge.s/,/label hugesmp.s/s/initrd=initrd.img/initrd=initrd.img/" \
-e "/label hugesmp.s/,/label speakup.s/s/initrd=initrd.img/initrd=initrd-smp.img/" \
-e "/label speakup.s/,\$s/initrd=initrd.img/initrd=initrd.img/" \
> $CWD/isolinux.cfg
elif [ $(ls -d --indicator-style=none ./lib/modules/${KVER}* | wc -l) -gt 2 ];
then
echo "*** Initrd splitting only supported for a total of 2 kernel versions!"
SPLIT_INITRD=0
else
echo "*** Only one set of kernel modules present, no splitting performed!"
SPLIT_INITRD=0
fi
fi
if [ $SPLIT_INITRD -eq 0 ]; then
# Determine the size of the installer:
echo " Installer size (uncompressed): $( du -sh . )"
find . | cpio -o -H newc | xz -9fv -C crc32 > $CWD/initrd.img
echo " New installer image is ${CWD}/initrd.img"
cp -a $SLACKROOT/isolinux/isolinux.cfg $CWD/
fi
echo
echo "--- Suggested actions:"
echo "[1] chroot $PKG/$ARCH-installer-filesystem"
echo "[2] Test it"
echo "[3] When done, mv -f $CWD/initrd.img $SLACKROOT/isolinux/initrd.img"
echo
}
############### Create the USB boot image file #################################
create_usbboot()
{
# Like initrd.img, the usbboot.img will be created in the current directory
echo "--- Creating an image for the USB boot disk ---"
# Calculate sizes:
let USBIMG=$( LC_ALL=C du -ck ${CWD}/initrd*.img | grep total | cut -f1 )
for KERN in ${SLACKROOT}/kernels/*.?/*zImage ; do
let USBIMG=USBIMG+$( LC_ALL=C du -sk $KERN | cut -f1 )
done
let USBIMG=USBIMG+777 # Add just that little extra...
if [ $EFIBOOT -eq 1 ]; then
# A bit more extra space since elilo will be added...
let USBIMG=USBIMG+256
fi
# Generate a pxelinux.cfg/default file (used for usbboot.img too)
cat ${CWD}/isolinux.cfg \
| sed -e "s#/kernels/#kernels/#" > ${CWD}/pxelinux.cfg_default
# Create a DOS formatted image file
if $(which mkfs.msdos 1>/dev/null 2>&1) ; then
MKDOS=mkfs.msdos
else
MKDOS=mkdosfs
fi
${MKDOS} -n USBSLACK -F 16 -C ${CWD}/usbboot.img $USBIMG || exit 1
[ $VERBOSE -eq 1 ] && file ${CWD}/usbboot.img
# Copy all relevant files into the image.
rm -rf ${CWD}/usbmount
mkdir -p -m700 ${CWD}/usbmount
mount -o loop,rw ${CWD}/usbboot.img ${CWD}/usbmount
echo "--- Copying data to the USB boot disk image: ---"
cp $SLACKROOT/isolinux/setpkg ${CWD}/usbmount/
cp $SLACKROOT/isolinux/{f*.txt,message.txt} ${CWD}/usbmount/
cp ${CWD}/initrd*.img ${CWD}/usbmount/
cat ${CWD}/pxelinux.cfg_default |sed -e 's# kernels/# #g' -e 's#/.zImage##' \
-e 's#/memtest##' \
> ${CWD}/usbmount/syslinux.cfg
# Add EFI support:
if [ $EFIBOOT -eq 1 ]; then
cp -a ${SRCDIR}/sources/efi.${ARCH}/* ${CWD}/usbmount
# Make sure the Slackware and kernel version in message.txt are up to date:
cat ${SRCDIR}/sources/efi.${ARCH}/EFI/BOOT/message.txt | sed "s/version.*/version ${INSTALLERVERSION} \(Linux kernel $(uname -r | cut -f 1 -d -)\)\!/g" > ${CWD}/usbmount/EFI/BOOT/message.txt
fi
# Older syslinux can not cope with subdirectories - let's just be safe:
echo "--- Making the usbboot image bootable: ---"
(
cd $SLACKROOT/kernels/
for dir in `find -type d -name "*.?" -maxdepth 1` ; do
cp $dir/*zImage ${CWD}/usbmount/$dir
done
cp $SLACKROOT/kernels/memtest/memtest ${CWD}/usbmount/memtest
)
sync
# Stamp the file with the syslinux bootloader:
# > Do "vi ~/.mtoolsrc" to add "mtools_skip_check=1",
# > if the next command gives an error:
umount ${CWD}/usbmount
syslinux ${CWD}/usbboot.img
# Clean up:
rm -rf ${CWD}/usbmount
}
############### Create the EFI boot image file #################################
create_efiboot()
{
# Like initrd.img, the efiboot.img will be created in the current directory
echo
echo "--- Creating an image for the EFI boot disk ---"
# Calculate sizes:
let EFIIMG=$( LC_ALL=C du -ck ${CWD}/initrd*.img | grep total | cut -f1 )
for KERN in ${SLACKROOT}/kernels/huge.s/*zImage ; do
let EFIIMG=EFIIMG+$( LC_ALL=C du -sk $KERN | cut -f1 )
done
let EFIIMG=EFIIMG+2222 # Add just that little extra...
# Round this value down to the nearest 2048 bytes:
let EFIIMG=EFIIMG\*1024
let EFIIMG=EFIIMG/2048
# Create the image:
dd if=/dev/zero of=${CWD}/efiboot.img bs=2048 count=$EFIIMG
sgdisk -N 1 -t 1:EF00 --change-name=1:EFISLACK ${CWD}/efiboot.img
losetup -o 1048576 /dev/loop3 ${CWD}/efiboot.img
mkdosfs -F 32 /dev/loop3
rm -rf ${CWD}/efimount
mkdir ${CWD}/efimount
mount /dev/loop3 ${CWD}/efimount
cp -a --verbose ${CWD}/sources/efi/* ${CWD}/efimount
cp -a --verbose ${SLACKROOT}/kernels/huge.s/*zImage ${CWD}/efimount/EFI/BOOT/huge.s
cp -a ${CWD}/initrd.img ${CWD}/efimount/EFI/BOOT/
umount /dev/loop3
losetup -d /dev/loop3
# Clean up:
rm -rf ${CWD}/efimount
}
############### Pre-process man pages ##########################################
process_manpages()
{
# We have to preprocess these, since we aren't about to ship groff on here.
if [ -d usr/man ]; then
echo "--- Pre-processing man pages ---"
( cd usr/man
for manpagedir in $(find . -type d -name "man*") ; do
( cd $manpagedir
for eachpage in $( find . -type f -maxdepth 1) ; do
echo -n "$eachpage "
# bzip2 is best for text (among gzip, bzip2, and xz tested)
/bin/gunzip -c "$eachpage" | /usr/bin/gtbl | /usr/bin/groff -mandoc -Tlatin1 | bzip2 -9c > "$(dirname $eachpage)/$(basename $eachpage .gz).bz2"
rm -f "$eachpage"
done
)
done
echo
)
fi
}
# End pre-process man pages
############### Copy man pages #################################################
copy_manpages()
{
# We will only include the man pages that are copied here.
if [ -d usr/man ]; then
echo "--- Copying desired man pages ---"
( cd usr
mv man man.full
mkdir man
# List every man page to include in the loop below.
# Pages should be preprocessed text files compressed with bzip2.
# Note that they can be any cattable text file and need not be true
# man page format... perhaps handy for future documentation, or
# README_LVM, etc. ?
for manpage in \
man8/cfdisk.8.bz2 \
man8/fdisk.8.bz2 \
man8/gdisk.8.bz2 \
man8/partprobe.8.bz2 \
man8/parted.8.bz2 \
man8/partx.8.bz2 \
man8/sfdisk.8.bz2 \
man8/sgdisk.8.bz2 \
man8/mount.8.bz2 \
man1/lsattr.1.bz2 \
man1/chattr.1.bz2 \
man8/e2image.8.bz2 \
man8/badblocks.8.bz2 \
man8/fsck.8.bz2 \
man8/e2fsck.8.bz2 \
man8/mke2fs.8.bz2 \
man8/tune2fs.8.bz2 \
man5/mke2fs.conf.5.bz2 \
man5/e2fsck.conf.5.bz2 \
man8/btrfs.8.bz2 \
man8/mkfs.btrfs.8.bz2 \
man8/jfs_mkfs.8.bz2 \
man8/jfs_fsck.8.bz2 \
man8/pvdisplay.8.bz2 \
man8/vgchange.8.bz2 \
man8/pvck.8.bz2 \
man8/lvmsar.8.bz2 \
man8/lvresize.8.bz2 \
man8/lvrename.8.bz2 \
man8/vgs.8.bz2 \
man8/pvresize.8.bz2 \
man8/vgexport.8.bz2 \
man8/vgsplit.8.bz2 \
man8/pvcreate.8.bz2 \
man8/vgreduce.8.bz2 \
man8/vgck.8.bz2 \
man8/pvchange.8.bz2 \
man8/vgdisplay.8.bz2 \
man8/pvremove.8.bz2 \
man8/vgremove.8.bz2 \
man8/vgmerge.8.bz2 \
man8/vgextend.8.bz2 \
man8/lvchange.8.bz2 \
man8/vgcfgbackup.8.bz2 \
man8/lvreduce.8.bz2 \
man8/lvscan.8.bz2 \
man8/lvs.8.bz2 \
man8/dmsetup.8.bz2 \
man8/vgimport.8.bz2 \
man8/pvscan.8.bz2 \
man8/lvcreate.8.bz2 \
man8/vgrename.8.bz2 \
man8/lvdisplay.8.bz2 \
man8/vgimportclone.8.bz2 \
man8/lvextend.8.bz2 \
man8/lvremove.8.bz2 \
man8/vgcfgrestore.8.bz2 \
man8/lvmconf.8.bz2 \
man8/lvmdiskscan.8.bz2 \
man8/lvmdump.8.bz2 \
man8/vgcreate.8.bz2 \
man8/vgscan.8.bz2 \
man8/pvmove.8.bz2 \
man8/lvmchange.8.bz2 \
man8/vgmknodes.8.bz2 \
man8/fsadm.8.bz2 \
man8/vgconvert.8.bz2 \
man8/lvconvert.8.bz2 \
man8/lvm.8.bz2 \
man8/lvmsadc.8.bz2 \
man8/dmeventd.8.bz2 \
man8/pvs.8.bz2 \
man5/lvm.conf.5.bz2 \
man8/cryptsetup.8.bz2 \
man8/mdmon.8.bz2 \
man8/mdadm.8.bz2 \
man8/mkreiserfs.8.bz2 \
man8/mkfs.xfs.8.bz2 \
man8/installpkg.8.bz2 \
man8/removepkg.8.bz2 \
man8/pkgtool.8.bz2 \
man8/mkfs.minix.8.bz2 \
man8/mkdosfs.8.bz2 \
man8/fdformat.8.bz2 \
man1/grep.1.bz2 \
man1/wc.1.bz2 \
man1/chroot.1.bz2 \
man1/tar.1.bz2 \
man1/chmod.1.bz2 \
man1/ln.1.bz2 \
man1/chown.1.bz2 \
man1/sync.1.bz2 \
man1/du.1.bz2 \
man1/ddrescue.1.bz2 \
man1/dd.1.bz2 \
man8/ifconfig.8.bz2 \
man8/route.8.bz2 \
man1/hostname.1.bz2 \
man8/arp.8.bz2 \
man8/netstat.8.bz2 \
man8/ipmask.8.bz2 \
man8/rarp.8.bz2 \
man8/mii-tool.8.bz2 \
man8/nameif.8.bz2 \
man8/findmnt.8.bz2 \
man8/lsblk.8.bz2 \
man8/fsfreeze.8.bz2 \
man8/fstrim.8.bz2 \
man8/swaplabel.8.bz2 \
man8/ip.8.bz2 \
man1/nano.1.bz2 \
man8/zerofree.8.bz2 \
; do
mkdir -p man/$(dirname $manpage)
cp -a man.full/$manpage man/$manpage
done
# Delete the pages that will not be included:
rm -rf man.full
# Create cat directories:
( cd man
for mandir in man* ; do
ln -sf $mandir cat$(echo $mandir | cut -b4-)
done
)
)
fi
}
# End copy man pages
############### Time to call all our functions #################################
############### Time to call all our functions #################################
if [ $SHOWHELP -eq 1 ]; then
basic_usage
exit
fi
# Clean build environment:
rm -rf $TMP $PKG
mkdir -p $TMP $PKG
rm -f $CWD/initrd*.img $CWD/usbboot.img
rm -f $CWD/isolinux.cfg ${CWD}/pxelinux.cfg_default
if [ $DUMPSKELETON -eq 1 ]; then
create_installer_fs
extract_skeleton_fs
zipup_installer_skeleton
else
cat <<-EOT
** Building software for: ARCH='$ARCH'
** This host's specs: machine type='$(uname -m)'
** processor='$(uname -p)'
** hardware platform"='$(uname -i)'
** Waiting 3 seconds or just press ENTER now :-)
EOT
read -p "..." -t 3
echo
# Are we re-compiling busybox/dropbear and populating with binaries?
if [ $RECOMPILE -eq 1 ]; then
create_installer_fs
if ! use_installer_source ; then
extract_skeleton_fs
fi
build_busybox || exit 1
build_dropbear || exit 1
import_binaries || exit 1
import_libraries || exit 1
arch_specifics
else
unpack_oldinitrd
fi
# Are we adding the nano editor?
if [ $ADD_NANO -eq 1 ]; then
build_nano
fi
# Are we adding network modules?
if [ $ADD_NETMODS -eq 1 ]; then
add_netmods
fi
# Are we adding pcmcia modules?
if [ $ADD_PCMCIAMODS -eq 1 ]; then
add_pcmciamods
fi
if [ $ADD_NETMODS -eq 1 -o $ADD_PCMCIAMODS -eq 1 ]; then
# If we added modules, we also need to add network card firmware:
# but only if specified. The default list of firmware is useless on ARM SoC systems.
# The TrimSlice has a RealTek card which requires firmware, but currently the firmware
# is compiled into the Kernel. This will probably have to change later, but for now
# it'll suffice.
if [ $ADD_NETFIRMWARE -eq 1 ]; then
add_netfirmware
fi
# If we added modules, compress them (if requested):
compress_modules
# If we added modules, check for missing dependencies:
check_module_dependencies
fi
if [ $ADD_MANPAGES -eq 1 ]; then
process_manpages
copy_manpages
fi
# Finally, create the Slackware installer initrd
create_initrd
# If you wanted a USB boot image as well, here it is:
if [ $USBBOOT -eq 1 ]; then
create_usbboot
fi
## Commented out. The usbboot.img handles EFI now.
## If you wanted an EFI boot image as well, here it is:
#if [ $EFIBOOT -eq 1 ]; then
# create_efiboot || exit 1
#fi
fi