From 646a5c1cbfd95873950a87b5f75d52073a967023 Mon Sep 17 00:00:00 2001 From: Patrick J Volkerding Date: Mon, 28 May 2018 19:12:29 +0000 Subject: Mon May 28 19:12:29 UTC 2018 a/pkgtools-15.0-noarch-13.txz: Rebuilt. installpkg: default line length for --terselength is the number of columns. removepkg: added --terse mode. upgradepkg: default line length for --terselength is the number of columns. upgradepkg: accept -option in addition to --option. ap/vim-8.1.0026-x86_64-1.txz: Upgraded. d/bison-3.0.5-x86_64-1.txz: Upgraded. e/emacs-26.1-x86_64-1.txz: Upgraded. kde/kopete-4.14.3-x86_64-8.txz: Rebuilt. Recompiled against libidn-1.35. n/conntrack-tools-1.4.5-x86_64-1.txz: Upgraded. n/libnetfilter_conntrack-1.0.7-x86_64-1.txz: Upgraded. n/libnftnl-1.1.0-x86_64-1.txz: Upgraded. n/links-2.16-x86_64-2.txz: Rebuilt. Rebuilt to enable X driver for -g mode. n/lynx-2.8.9dev.19-x86_64-1.txz: Upgraded. n/nftables-0.8.5-x86_64-1.txz: Upgraded. n/p11-kit-0.23.11-x86_64-1.txz: Upgraded. n/ulogd-2.0.7-x86_64-1.txz: Upgraded. n/whois-5.3.1-x86_64-1.txz: Upgraded. xap/network-manager-applet-1.8.12-x86_64-1.txz: Upgraded. xap/vim-gvim-8.1.0026-x86_64-1.txz: Upgraded. --- source/installer/build_installer.sh | 2179 +++++++++++++++++++++++++++++++++++ 1 file changed, 2179 insertions(+) create mode 100755 source/installer/build_installer.sh (limited to 'source/installer/build_installer.sh') diff --git a/source/installer/build_installer.sh b/source/installer/build_installer.sh new file mode 100755 index 00000000..fd6e7dd7 --- /dev/null +++ b/source/installer/build_installer.sh @@ -0,0 +1,2179 @@ +#!/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-2018 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 +# Eric Hameleers +# +################################################################################ +# +# 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. + ;; + 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 + ;; + 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_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 + ;; +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 + ;; + -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 < +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 + -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 Specify location of the initrd.img file + -S|--slackroot 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 < $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 + +zcat -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): +zcat -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 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.bz2 | head -1) +DROPBEARVER=$(echo $DROPBEARPKG | sed -e "s#.*/dropbear-\(.*\).tar.bz2#\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 +# Apply xauth path patch +patch -p0 ${VERBOSETXT} < $DROPBEARPATH/dropbear.xauth.patch || exit 1 +# Change the path used for dbclient because our prefix is '/' not '/usr': +patch -p1 ${VERBOSETXT} < $DROPBEARPATH/dropbear_dbclientpath.patch || exit 1 +# Patch for new glibc crypt() that may return NULL: +patch -p1 < $DROPBEARPATH/dropbear.glibc.crypt.diff + +# 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 +) + +} + +############## 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/etc \ +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 \ +ap/ddrescue \ +ap/dmidecode \ +ap/lsscsi \ +ap/terminus-font \ +d/gcc \ +d/gcc-g++ \ +l/glibc \ +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/libgcrypt \ +n/libgpg-error \ +n/libtirpc \ +n/net-tools \ +n/nfs-utils \ +n/ntp \ +n/rpcbind \ +n/samba" + +# 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 -root $TMP/extract-packages $SLACKROOT/${DISTRODIR}/$pkg-+([^-])-+([^-])-+([^-]).t[gblx]z | grep "Installing package " | cut -d'(' -f1 + 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/ +# 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 + +# 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-c14v.psf.gz \ + ter-120b.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 \ + umount.cifs \ + $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 \ + libblkid*so* \ + libcap*so* \ + libcrypto*so* \ + libcryptsetup*.so* \ + libdevmapper*so* \ + libfdisk.so* \ + libgcc*so* \ + libgcrypt*.so* \ + libgpg-error*.so* \ + libkmod*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} \ + libgcc*.so* \ + libhistory*.so* \ + libidn2*.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 -root $TMP/extract-packages $SLACKROOT/${DISTRODIR}/a/e2fsprogs-*.t[gblx]z | grep "Installing package " | cut -d'(' -f1 +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 -root $TMP/extract-packages $SLACKROOT/${DISTRODIR}/a/glibc-solibs-*.t[gblx]z | grep "Installing package " | cut -d'(' -f1 +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 -root $TMP/extract-packages $SLACKROOT/${DISTRODIR}/l/ncurses-*.t[gblx]z | grep "Installing package " | cut -d'(' -f1 +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 -root $TMP/extract-packages $SLACKROOT/${DISTRODIR}/a/acl-*.t[gblx]z | grep "Installing package " | cut -d'(' -f1 +cp -fa${VERBOSE1} $TMP/extract-packages/lib${LIBDIRSUFFIX}/*so* \ + lib${LIBDIRSUFFIX}/ +rm -rf $TMP/extract-packages + +# a/attr: +mkdir -p $TMP/extract-packages +installpkg -root $TMP/extract-packages $SLACKROOT/${DISTRODIR}/a/attr-*.t[gblx]z | grep "Installing package " | cut -d'(' -f1 +cp -fa${VERBOSE1} $TMP/extract-packages/lib${LIBDIRSUFFIX}/*so* \ + lib${LIBDIRSUFFIX}/ +rm -rf $TMP/extract-packages + +# a/pciutils: +mkdir -p $TMP/extract-packages +installpkg -root $TMP/extract-packages $SLACKROOT/${DISTRODIR}/a/pciutils-*.t[gblx]z | grep "Installing package " | cut -d'(' -f1 +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 -root $TMP/extract-packages $SLACKROOT/${DISTRODIR}/a/procps-ng-*.t[gblx]z | grep "Installing package " | cut -d'(' -f1 +cp -fa${VERBOSE1} $TMP/extract-packages/lib${LIBDIRSUFFIX}/*so* \ + lib${LIBDIRSUFFIX}/ +rm -rf $TMP/extract-packages + +# a/gpm: +#mkdir -p $TMP/extract-packages +#installpkg -root $TMP/extract-packages $SLACKROOT/${DISTRODIR}/a/gpm-*.t[gblx]z | grep "Installing package " | cut -d'(' -f1 +#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 + 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 + + 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 video + mv video.orig/{sis,syscopyarea.ko,sysfillrect.ko,sysimgblt.ko} video + rm -rf${VERBOSE1} video.orig + else + rm -rf${VERBOSE1} acpi char cpufreq hwmon platform thermal video + 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 + 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 -root $TMP/extract-packages/ $PCMCIAUTILS | grep "Installing package " | cut -d'(' -f1 +rm -rf $TMP/extract-packages/{usr,var} +cp -a $TMP/extract-packages/* $PKG/$ARCH-installer-filesystem/ +rm -rf $TMP/extract-packages/* +installpkg -root $TMP/extract-packages/ $SYSFS | grep "Installing package " | cut -d'(' -f1 +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 gzip -9f {} \; + for i in $(find ./lib/modules -type l -name "*.ko") ; do ln -s $( readlink $i).gz $i.gz ; 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 < 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 | gzip -9fv > $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 | gzip -9fv > $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 -s ${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 \ + ; 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 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 + -- cgit v1.2.3