mirror of
https://git.launchpad.net/livecd-rootfs
synced 2025-02-13 06:17:08 +00:00
Now that we have the cloud-minimal seed for minimized cloud image builds, we should drop all the workarounds and hacks we once needed when we were using the server seed. We can directly use the new metapackage and get rid of the tasks and other autoremoves, et al.
1708 lines
49 KiB
Bash
Executable File
1708 lines
49 KiB
Bash
Executable File
#! /bin/sh
|
|
set -e
|
|
|
|
if [ -e config/germinate-output ]; then
|
|
mv -T config/germinate-output germ-tmp
|
|
rm -rf config
|
|
mkdir config
|
|
mv -T germ-tmp config/germinate-output
|
|
else
|
|
rm -rf config
|
|
fi
|
|
|
|
echo "Building on $(hostname --fqdn)"
|
|
|
|
SEEDMIRROR=https://ubuntu-archive-team.ubuntu.com/seeds/
|
|
if [ -z "$MIRROR" ]; then
|
|
case $(hostname --fqdn) in
|
|
*.ubuntu.com) MIRROR=http://ftpmaster.internal/ubuntu/
|
|
SEEDMIRROR=http://archive-team.internal/seeds/
|
|
;;
|
|
*.buildd) MIRROR=http://ftpmaster.internal/ubuntu/
|
|
SEEDMIRROR=http://archive-team.internal/seeds/
|
|
;;
|
|
*.ppa|*.scalingstack) MIRROR=http://ftpmaster.internal/ubuntu/
|
|
SEEDMIRROR=http://archive-team.internal/seeds/
|
|
;;
|
|
*) case $ARCH in
|
|
i386|amd64) MIRROR=http://archive.ubuntu.com/ubuntu/ ;;
|
|
*) MIRROR=http://ports.ubuntu.com/ubuntu-ports/ ;;
|
|
esac
|
|
;;
|
|
esac
|
|
fi
|
|
|
|
mkdir -p config
|
|
cp -af /usr/share/livecd-rootfs/live-build/functions config/functions
|
|
cp -af /usr/share/livecd-rootfs/live-build/lb_*_layered config/
|
|
cp -af /usr/share/livecd-rootfs/live-build/snap-seed-parse.py config/snap-seed-parse
|
|
cp -af /usr/share/livecd-rootfs/live-build/expand-task config/expand-task
|
|
cp -af /usr/share/livecd-rootfs/live-build/squashfs-exclude-files config/
|
|
|
|
mkdir -p config/package-lists
|
|
|
|
. config/functions
|
|
|
|
OPTS=
|
|
COMPONENTS=
|
|
BINARY_REMOVE_LINUX=:
|
|
BINARY_IMAGES=none
|
|
MEMTEST=none
|
|
SOURCE='--source false'
|
|
BOOTLOADER=none
|
|
BOOTAPPEND_LIVE=
|
|
LIVE_TASK=
|
|
PREINSTALLED=false
|
|
PREINSTALL_POOL=
|
|
PREINSTALL_POOL_SEEDS=
|
|
PREFIX="livecd.$PROJECT${SUBARCH:+-$SUBARCH}"
|
|
|
|
CHROOT_HOOKS=
|
|
BINARY_HOOKS=
|
|
|
|
APT_OPTIONS=" --yes -oDebug::pkgDepCache::AutoInstall=yes "
|
|
|
|
PASSES_TO_LAYERS=false
|
|
_PASSES_TO_LAYERS= # Stores the initial value of PASSES_TO_LAYERS
|
|
PASSES=
|
|
|
|
_check_immutable_passes_to_layers () {
|
|
# Check that PASSES_TO_LAYERS didn't change ie we didn't switch from layer
|
|
# to non-layer image format and vice versa.
|
|
if [ -z "$_PASSES_TO_LAYERS" ]; then
|
|
_PASSES_TO_LAYERS=$PASSES_TO_LAYERS
|
|
fi
|
|
|
|
if [ "$_PASSES_TO_LAYERS" != "$PASSES_TO_LAYERS" ]; then
|
|
echo "ERROR: PASSES_TO_LAYERS has changed from $_PASSES_TO_LAYERS to $PASSES_TO_LAYERS between 2 API calls. Please set it first."
|
|
exit 1
|
|
fi
|
|
}
|
|
|
|
_check_layers_only_API () {
|
|
# Check if a function is designed only for layered mode
|
|
# $1 name of the function
|
|
if [ "$PASSES_TO_LAYERS" != "true" ]; then
|
|
echo "$1 should only be used in layered mode, with PASSES_TO_LAYERS set to true"
|
|
exit 1
|
|
fi
|
|
}
|
|
|
|
_register_pass () {
|
|
# In layer mode, record a pass into the list of passes
|
|
# $1 Name of the pass
|
|
[ "$PASSES_TO_LAYERS" != "true" ] && return
|
|
|
|
PASSES="$PASSES $1"
|
|
}
|
|
|
|
add_pass ()
|
|
{
|
|
local pass="$1"
|
|
_check_immutable_passes_to_layers
|
|
_register_pass "$pass"
|
|
}
|
|
|
|
add_task ()
|
|
{
|
|
local pass="$1"
|
|
shift
|
|
local file pkg_file snap_file task
|
|
|
|
_check_immutable_passes_to_layers
|
|
_register_pass "$pass"
|
|
|
|
if [ ! -e config/germinate-output/structure ]; then
|
|
echo "add_task too soon" >&2
|
|
exit 1
|
|
fi
|
|
|
|
pkg_file="config/package-lists/livecd-rootfs.list.chroot_$pass"
|
|
|
|
if [ $PASSES_TO_LAYERS = "true" ]; then
|
|
snap_file="config/package-lists/livecd-rootfs.snaplist.chroot_$pass.full"
|
|
else
|
|
snap_file="config/seeded-snaps"
|
|
fi
|
|
|
|
for task; do
|
|
./config/expand-task config/germinate-output $FLAVOUR $task packages >> "$pkg_file"
|
|
./config/expand-task config/germinate-output $FLAVOUR $task snaps >> "$snap_file"
|
|
done
|
|
|
|
for file in $pkg_file $snap_file; do
|
|
if [ -s $file ]; then
|
|
sort -u -o $file $file
|
|
else
|
|
rm -f $file
|
|
fi
|
|
done
|
|
}
|
|
|
|
add_package ()
|
|
{
|
|
# Adds a pass named pass_name composed of packages to install
|
|
# $1 pass
|
|
# $@ list of packages
|
|
|
|
local pass="$1"
|
|
shift
|
|
local pkg
|
|
|
|
_check_immutable_passes_to_layers
|
|
_register_pass "$pass"
|
|
|
|
for pkg; do
|
|
echo "$pkg" >> "config/package-lists/livecd-rootfs.list.chroot_$pass"
|
|
done
|
|
}
|
|
|
|
remove_package ()
|
|
{
|
|
# Adds a pass named pass_name composed of packages to remove
|
|
# $1 pass
|
|
# $@ list of packages
|
|
|
|
local pass="$1"
|
|
shift
|
|
local pkg
|
|
|
|
_check_immutable_passes_to_layers
|
|
_check_layers_only_API "remove_package"
|
|
_register_pass "$pass"
|
|
|
|
for pkg; do
|
|
echo "$pkg" >> "config/package-lists/livecd-rootfs.removal-list.chroot_$pass"
|
|
done
|
|
}
|
|
|
|
add_snap ()
|
|
{
|
|
# Adds a pass named pass_name composed of snaps to install
|
|
# $1 pass
|
|
# $@ list of snaps
|
|
|
|
local pass="$1"
|
|
shift
|
|
local pkg
|
|
|
|
_check_immutable_passes_to_layers
|
|
_register_pass "$pass"
|
|
|
|
local channel=""
|
|
if [ -n "$CHANNEL" ] ; then
|
|
channel="=$CHANNEL"
|
|
fi
|
|
|
|
for pkg; do
|
|
echo "$pkg$channel" >> "config/package-lists/livecd-rootfs.snaplist.chroot_$pass.full"
|
|
done
|
|
}
|
|
|
|
get_seeded_languages () {
|
|
# We assume any seed name of the form ${no_lang_seed}-${foo} where
|
|
# ${foo} is only two or three characters long is a default language
|
|
# seed.
|
|
langs=''
|
|
for no_lang_seed in "$@"; do
|
|
seed_regex="${no_lang_seed}"'-[^-.]{2,3}$'
|
|
for seed in $(ls config/germinate-output | grep -E "${seed_regex}"); do
|
|
lang=$(echo "${seed}" | grep -oE '[^-.]{2,3}$')
|
|
langs="$langs $lang"
|
|
done
|
|
done
|
|
echo $langs | tr ' ' '\n' | sort -u | tr '\n' ' '
|
|
}
|
|
|
|
derive_language_layers () {
|
|
# create special layers for each default language
|
|
#
|
|
# $1 base pass
|
|
# $2 base seed (without any languages)
|
|
# $3 default language seed
|
|
# $4 space separated list of default languages
|
|
# e.g.:
|
|
# derive_language_layers minimal desktop-minimal desktop-minimal-default-languages
|
|
# derive_language_layers minimal.standard desktop desktop-default-languages
|
|
#
|
|
# The way this works is perhaps a little counterintuitive.
|
|
#
|
|
# The first goal here is that the installed system should contain
|
|
# language support for the language the user selected. One way to do
|
|
# this using layers would be to have a layer that contained no
|
|
# language support and a derived layer for each (default) language. So
|
|
# something like:
|
|
#
|
|
# filesystem.squashfs (contains no language support)
|
|
# filesystem.en.squashfs (contains English language support)
|
|
# filesystem.fr.squashfs (contains French language support)
|
|
# ...
|
|
#
|
|
# Then if the user selects French as their language, we just copy
|
|
# filesystem.fr.squashfs to the target system.
|
|
#
|
|
# But we want the live session to support these languages too and
|
|
# simply adding all the language support to the live layer would mean
|
|
# we'd have the each language's support files on the ISO twice (once
|
|
# in filesystem.$LANG.squashfs and once in filesystem.live.squashfs).
|
|
#
|
|
# So what is done instead is that we add support for all the default
|
|
# languages to the base layer and then create derived layers that
|
|
# _remove_ support for all languages but the desired language and
|
|
# because file removals are cheap to represent in overlays, this all
|
|
# ends up taking way less space, and filesystem.live.squashfs gets
|
|
# support for all languages from the base layer. We also create a
|
|
# layer than has support for all languages removed, which can be used
|
|
# for the base of an install for a non-default language.
|
|
local pass base_pass=$1 no_lang_seed=$2 def_lang_seed=$3 langs=$4
|
|
_check_immutable_passes_to_layers
|
|
_check_layers_only_API "derive_language_layers"
|
|
|
|
for lang in $langs; do
|
|
pass="${base_pass}.${lang}"
|
|
_register_pass ${pass}
|
|
# Remove packages from the default language seed that are not
|
|
# in the language specific seed from the language specific layer.
|
|
# I find this expression helps a little to make this make sense:
|
|
# ((base) + (en fr de)) - ( (en fr de) - (fr)) == (base + fr)
|
|
# `layer will all langs' `def_lang_seed' `lang' `what we want to install'
|
|
subtract_package_lists ${def_lang_seed} ${no_lang_seed}-${lang} >> config/package-lists/livecd-rootfs.removal-list.chroot_$pass
|
|
done
|
|
|
|
no_lang_pass=$base_pass.no-languages
|
|
_register_pass ${no_lang_pass}
|
|
# Remove all packages from the default language seed that are not in
|
|
# the no_lang_seed from the no-languages layer.
|
|
subtract_package_lists ${def_lang_seed} ${no_lang_seed} >> config/package-lists/livecd-rootfs.removal-list.chroot_${no_lang_pass}
|
|
}
|
|
|
|
add_chroot_hook ()
|
|
{
|
|
CHROOT_HOOKS="${CHROOT_HOOKS:+$CHROOT_HOOKS }$1"
|
|
}
|
|
|
|
add_binary_hook ()
|
|
{
|
|
BINARY_HOOKS="${BINARY_HOOKS:+$BINARY_HOOKS }$1"
|
|
}
|
|
|
|
_sanitize_passes ()
|
|
{
|
|
# Returns an uniquely ordered list of passes and ensure dependency tree is coherent
|
|
# $1 list of passes
|
|
local passes="$1"
|
|
[ -z "$passes" ] && return
|
|
|
|
passes=$(echo $passes | tr ' ' '\n' | sort -u)
|
|
for pass in $passes; do
|
|
parent=$(get_parent_pass $pass)
|
|
# if root pass, no parent to find
|
|
[ -z "$parent" ] && continue
|
|
if [ $(echo "$passes"|grep -cE "^$parent\$") -ne 1 ]; then
|
|
echo "ERROR: '$parent' is required by '$pass' but is missing. Registered passes are:\n$passes" >&2
|
|
exit 1
|
|
fi
|
|
done
|
|
|
|
# return the list of passes
|
|
echo $passes
|
|
}
|
|
|
|
_get_live_passes ()
|
|
{
|
|
# Returns a list of all passes that ends with .live for automated live passes detection
|
|
# $1 list of passes
|
|
local passes="$1"
|
|
local livepasses=""
|
|
[ -z "$passes" ] && return
|
|
|
|
for pass in $passes; do
|
|
if echo $pass | grep -Eq '\.live$'; then
|
|
livepasses="$pass $livepasses"
|
|
fi
|
|
done
|
|
echo $livepasses
|
|
}
|
|
|
|
if [ -z "${IMAGEFORMAT:-}" ]; then
|
|
case $PROJECT:${SUBPROJECT:-} in
|
|
ubuntu-cpc:*|ubuntu:desktop-preinstalled|ubuntu-wsl:*)
|
|
case $ARCH+${SUBARCH:-} in
|
|
*+raspi)
|
|
# All raspi images use ubuntu-image.
|
|
IMAGEFORMAT=ubuntu-image
|
|
;;
|
|
arm64+tegra|arm64+tegra-igx)
|
|
# Pre-installed Tegra images use
|
|
# ubuntu-image
|
|
IMAGEFORMAT=ubuntu-image
|
|
;;
|
|
*)
|
|
IMAGEFORMAT=ext4
|
|
;;
|
|
esac
|
|
;;
|
|
ubuntu-server:live|ubuntu-mini-iso:)
|
|
IMAGEFORMAT=plain
|
|
;;
|
|
esac
|
|
fi
|
|
|
|
# Configure preinstalled ubuntu-cpc images with included password
|
|
# one also must request disk1-img-xz image format
|
|
if [ "$IMAGEFORMAT" = "ext4" ] && [ "$PROJECT" = "ubuntu-cpc" ]; then
|
|
case $ARCH:$SUBARCH in
|
|
armhf:raspi2 | \
|
|
riscv64:icicle | \
|
|
riscv64:nezha | \
|
|
riscv64:licheerv | \
|
|
riscv64:sifive_* | \
|
|
riscv64:visionfive | \
|
|
riscv64:visionfive2 | \
|
|
*:generic)
|
|
IMAGE_HAS_HARDCODED_PASSWORD=1
|
|
if [ -z "${IMAGE_TARGETS:-}" ]; then
|
|
export IMAGE_TARGETS="disk-image-non-cloud"
|
|
fi
|
|
;;
|
|
esac
|
|
fi
|
|
|
|
skip_lb_stage() {
|
|
STAGE="$1"
|
|
mkdir -p .build
|
|
touch ".build/$STAGE"
|
|
}
|
|
|
|
case $IMAGEFORMAT in
|
|
ext2|ext3|ext4)
|
|
OPTS="${OPTS:+$OPTS }--initramfs none --chroot-filesystem $IMAGEFORMAT"
|
|
PREINSTALLED=true
|
|
;;
|
|
plain)
|
|
case $PROJECT:${SUBPROJECT:-} in
|
|
ubuntu-server:live)
|
|
touch config/universe-enabled
|
|
;;
|
|
ubuntu-mini-iso:)
|
|
;;
|
|
*)
|
|
PREINSTALLED=true
|
|
;;
|
|
esac
|
|
OPTS="${OPTS:+$OPTS }--initramfs none --chroot-filesystem $IMAGEFORMAT"
|
|
;;
|
|
|
|
ubuntu-image)
|
|
UBUNTU_IMAGE_ARGS=""
|
|
case "$ARCH+${SUBARCH:-}" in
|
|
amd64+intel-iot)
|
|
MODEL=intel-iot ;;
|
|
amd64+*)
|
|
MODEL=pc-amd64 ;;
|
|
arm64+snapdragon)
|
|
MODEL=dragonboard ;;
|
|
armhf+raspi)
|
|
MODEL=pi ;;
|
|
armhf+raspi2)
|
|
MODEL=pi2 ;;
|
|
armhf+raspi3)
|
|
MODEL=pi3 ;;
|
|
arm64+raspi)
|
|
MODEL=pi-arm64 ;;
|
|
arm64+raspi3)
|
|
MODEL=pi3-arm64 ;;
|
|
armhf+cm3)
|
|
MODEL=cm3 ;;
|
|
arm64+tegra)
|
|
MODEL=tegra ;;
|
|
arm64+tegra-igx)
|
|
MODEL=tegra-igx ;;
|
|
arm64+*)
|
|
MODEL=pc-arm64 ;;
|
|
*)
|
|
echo "Model $ARCH+${SUBARCH:-} unknown to livecd-rootfs" >&2
|
|
exit 1
|
|
;;
|
|
esac
|
|
|
|
# If we have a datestamp coming from cdimage, use that to populate
|
|
# .disk/info on the target image
|
|
if [ -n "$NOW" ]; then
|
|
echo "$NOW" > config/disk-info
|
|
UBUNTU_IMAGE_ARGS="$UBUNTU_IMAGE_ARGS --disk-info config/disk-info"
|
|
fi
|
|
|
|
if [ $PROJECT = "ubuntu-core" ]; then
|
|
# snap-based core images
|
|
|
|
CHANNEL="${CHANNEL:-edge}"
|
|
case $MODEL in
|
|
pc-amd64|pc-arm64)
|
|
if [ -z "${SUBARCH:-}" ]; then
|
|
# This is to make sure there's enough writable space
|
|
UBUNTU_IMAGE_ARGS="$UBUNTU_IMAGE_ARGS --image-size 3700M"
|
|
fi
|
|
;;
|
|
*) ;;
|
|
esac
|
|
case $SUITE in
|
|
xenial)
|
|
# Ubuntu Core 16
|
|
UBUNTU_IMAGE_ARGS="$UBUNTU_IMAGE_ARGS -c $CHANNEL"
|
|
;;
|
|
bionic)
|
|
# Ubuntu Core 18
|
|
MODEL="ubuntu-core-18-${MODEL#pc-}"
|
|
UBUNTU_IMAGE_ARGS="$UBUNTU_IMAGE_ARGS -c $CHANNEL"
|
|
;;
|
|
*)
|
|
if [ "$SUITE" = "focal" ]; then
|
|
CORE_MAJOR=20
|
|
else
|
|
CORE_MAJOR=22
|
|
fi
|
|
if [ "${MODEL}" = "pi" ]; then
|
|
MODEL=pi-armhf
|
|
fi
|
|
# Ubuntu Core 2x
|
|
# Currently uc2x assertions do not support global
|
|
# channel overrides, instead we have per-channel models
|
|
case $CHANNEL in
|
|
stable)
|
|
MODEL="ubuntu-core-${CORE_MAJOR}-${MODEL#pc-}"
|
|
;;
|
|
candidate|beta|edge|dangerous)
|
|
MODEL="ubuntu-core-${CORE_MAJOR}-${MODEL#pc-}-${CHANNEL}"
|
|
;;
|
|
dangerous-*)
|
|
# That being said, the dangerous grade *does*
|
|
# support channel overrides, so we can use the
|
|
# dangerous model assertion and override the channel
|
|
# freely.
|
|
MODEL="ubuntu-core-${CORE_MAJOR}-${MODEL#pc-}-dangerous"
|
|
CHANNEL=${CHANNEL#dangerous-}
|
|
UBUNTU_IMAGE_ARGS="$UBUNTU_IMAGE_ARGS -c $CHANNEL"
|
|
;;
|
|
*)
|
|
echo "Unknown CHANNEL ${CHANNEL} specification for ${SUITE}"
|
|
exit 1
|
|
;;
|
|
esac
|
|
;;
|
|
esac
|
|
|
|
case "$ARCH+${SUBARCH:-}" in
|
|
amd64+kassel)
|
|
EXTRA_SNAPS="$EXTRA_SNAPS core bluez alsa-utils"
|
|
;;
|
|
*) ;;
|
|
esac
|
|
for snap in $EXTRA_SNAPS; do
|
|
UBUNTU_IMAGE_ARGS="$UBUNTU_IMAGE_ARGS --extra-snaps $snap"
|
|
done
|
|
echo "IMAGEFORMAT=$IMAGEFORMAT" >> config/common
|
|
echo "UBUNTU_IMAGE_ARGS=\"$UBUNTU_IMAGE_ARGS\"" >> config/common
|
|
# Store model assertion in top dir to get it picked up later as a build artifact
|
|
env SNAPPY_STORE_NO_CDN=1 snap known --remote model series=16 model="$MODEL" brand-id=canonical > "$PREFIX".model-assertion
|
|
echo "Configured ubuntu-image for the following model assertion:"
|
|
cat "$PREFIX".model-assertion
|
|
echo "----------------------------------------------------------"
|
|
else
|
|
# classic images
|
|
|
|
IMAGE_PROJECT=$PROJECT
|
|
[ "$IMAGE_PROJECT" = "ubuntu-cpc" ] && IMAGE_PROJECT="ubuntu-server"
|
|
|
|
LB_UBUNTU_IMAGES_REPO="${LB_UBUNTU_IMAGES_REPO:-git://git.launchpad.net/ubuntu-images}"
|
|
LB_UBUNTU_IMAGES_BRANCH="${LB_UBUNTU_IMAGES_BRANCH:-$SUITE}"
|
|
git clone "$LB_UBUNTU_IMAGES_REPO" -b "$LB_UBUNTU_IMAGES_BRANCH" image-definitions
|
|
IMAGE_DEFINITION="image-definitions/$IMAGE_PROJECT-$MODEL.yaml"
|
|
echo "IMAGE_DEFINITION=$IMAGE_DEFINITION" >> config/common
|
|
echo "Configured ubuntu-image to use image definition file $IMAGE_DEFINITION which has the following contents:"
|
|
cat "$IMAGE_DEFINITION"
|
|
echo "----------------------------------------------------------"
|
|
fi
|
|
|
|
# Save the model name used for building, mostly for any model-specific hook execution
|
|
echo "MODEL=$MODEL" >> config/common
|
|
echo "IMAGEFORMAT=$IMAGEFORMAT" >> config/common
|
|
# Fake finished configuration for lb build
|
|
mkdir -p .build
|
|
touch .build/config
|
|
exit 0
|
|
;;
|
|
|
|
none)
|
|
# Currently the IMAGEFORMAT none format is used only for ubuntu-image
|
|
# targeted image builds which, currently, only target physical devices.
|
|
OPTS="${OPTS:+$OPTS }--chroot-filesystem $IMAGEFORMAT"
|
|
PREINSTALLED=true
|
|
;;
|
|
*)
|
|
case $PROJECT in
|
|
ubuntu-server)
|
|
;;
|
|
ubuntu-wsl)
|
|
;;
|
|
ubuntu|ubuntu-budgie)
|
|
if [ "$SUBPROJECT" = "legacy" ]; then
|
|
add_package live casper
|
|
fi
|
|
;;
|
|
ubuntu-oem)
|
|
;;
|
|
*)
|
|
add_package live casper
|
|
;;
|
|
esac
|
|
;;
|
|
esac
|
|
|
|
if [ "$PREINSTALLED" = "true" ]; then
|
|
# Touch a random file that we can refer back to during build,
|
|
# cause that's wildly hackish
|
|
touch config/universe-enabled
|
|
case $PROJECT in
|
|
kubuntu*)
|
|
add_package live oem-config-kde ubiquity-frontend-kde
|
|
add_package live ubiquity-slideshow-kubuntu
|
|
;;
|
|
lubuntu*)
|
|
add_package live oem-config-gtk ubiquity-frontend-gtk
|
|
add_package live ubiquity-slideshow-lubuntu
|
|
;;
|
|
xubuntu*)
|
|
add_package live oem-config-gtk ubiquity-frontend-gtk
|
|
add_package live ubiquity-slideshow-xubuntu
|
|
;;
|
|
ubuntu-mate)
|
|
add_package live oem-config-gtk ubiquity-frontend-gtk
|
|
add_package live ubiquity-slideshow-ubuntu-mate
|
|
;;
|
|
ubuntu-unity)
|
|
add_package live oem-config-gtk ubiquity-frontend-gtk
|
|
add_package live ubiquity-slideshow-ubuntu
|
|
;;
|
|
ubuntu-server)
|
|
add_package live oem-config-debconf ubiquity-frontend-debconf
|
|
;;
|
|
ubuntu-base|ubuntu-oci|ubuntu-cpc|ubuntu-wsl|ubuntu-mini-iso)
|
|
;;
|
|
ubuntu)
|
|
add_package live oem-config-gtk ubiquity-frontend-gtk
|
|
add_package live ubiquity-slideshow-ubuntu
|
|
if [ "$SUBPROJECT" = "desktop-preinstalled" ]; then
|
|
add_package live language-pack-en-base oem-config-slideshow-ubuntu
|
|
fi
|
|
;;
|
|
*)
|
|
add_package live oem-config-gtk ubiquity-frontend-gtk
|
|
add_package live ubiquity-slideshow-ubuntu
|
|
;;
|
|
esac
|
|
fi
|
|
|
|
case $BINARYFORMAT in
|
|
iso*|usb*)
|
|
BINARY_IMAGES="$BINARYFORMAT"
|
|
MEMTEST=memtest86+
|
|
BOOTLOADER=syslinux
|
|
OPTS="${OPTS:+$OPTS }--zsync=false"
|
|
;;
|
|
esac
|
|
|
|
if [ "${SUBPROJECT:-}" = minimized ]; then
|
|
OPTS="${OPTS:+$OPTS }--bootstrap-flavour=minimal --linux-packages=linux-image"
|
|
fi
|
|
|
|
mkdir -p config/germinate-output
|
|
case $PROJECT in
|
|
edubuntu*)
|
|
FLAVOUR=edubuntu
|
|
;;
|
|
kubuntu*)
|
|
FLAVOUR=kubuntu
|
|
;;
|
|
xubuntu*)
|
|
FLAVOUR=xubuntu
|
|
;;
|
|
ubuntu-mate*)
|
|
FLAVOUR=ubuntu-mate
|
|
;;
|
|
ubuntu-unity*)
|
|
FLAVOUR=ubuntu-unity
|
|
;;
|
|
lubuntu*)
|
|
FLAVOUR=lubuntu
|
|
;;
|
|
ubuntu-budgie*)
|
|
FLAVOUR=ubuntu-budgie
|
|
;;
|
|
ubuntukylin*)
|
|
FLAVOUR=ubuntukylin
|
|
;;
|
|
ubuntustudio*)
|
|
FLAVOUR=ubuntustudio
|
|
;;
|
|
ubuntucinnamon*)
|
|
FLAVOUR=ubuntucinnamon
|
|
;;
|
|
*)
|
|
FLAVOUR=ubuntu
|
|
;;
|
|
esac
|
|
|
|
case $PROJECT in
|
|
ubuntu-server|ubuntu-mini-iso)
|
|
COMPONENTS='main'
|
|
;;
|
|
kubuntu|kubuntu-dvd|kubuntu-plasma5|edubuntu|ubuntu-gnome|ubuntu-budgie|ubuntukylin|ubuntucinnamon)
|
|
COMPONENTS='main restricted universe'
|
|
;;
|
|
xubuntu|mythbuntu|lubuntu|ubuntu-mate|ubuntu-unity|ubuntustudio-dvd|ubuntu-unity)
|
|
COMPONENTS='main restricted universe multiverse'
|
|
;;
|
|
esac
|
|
|
|
case $SUBPROJECT in
|
|
buildd)
|
|
COMPONENTS='main restricted universe multiverse'
|
|
;;
|
|
esac
|
|
|
|
if ! [ -e config/germinate-output/structure ]; then
|
|
echo "Running germinate..."
|
|
if [ -n "$COMPONENTS" ]; then
|
|
GERMINATE_ARG="-c $(echo $COMPONENTS | sed -e's/ \+/,/g')"
|
|
fi
|
|
(cd config/germinate-output && germinate --no-rdepends --no-installer \
|
|
-S $SEEDMIRROR -m $MIRROR -d $SUITE -s $FLAVOUR.$SUITE \
|
|
$GERMINATE_ARG -a $ARCH)
|
|
fi
|
|
|
|
case $PROJECT in
|
|
ubuntu|ubuntu-dvd)
|
|
|
|
case ${SUBPROJECT:-} in
|
|
legacy)
|
|
LIVE_TASK='ubuntu-live'
|
|
add_task install minimal standard ubuntu-desktop
|
|
add_task live ubuntu-desktop-minimal-default-languages ubuntu-desktop-default-languages
|
|
KERNEL_FLAVOURS='generic-hwe-22.04'
|
|
if [ "$SUBARCH" = "intel-iot" ]; then
|
|
KERNEL_FLAVOURS='intel-iotg'
|
|
fi
|
|
;;
|
|
desktop-preinstalled)
|
|
add_task install minimal standard ubuntu-desktop
|
|
case $SUBARCH in
|
|
raspi)
|
|
add_task install ubuntu-desktop-raspi
|
|
# XXX: Are those actually needed? I see we use those for ubuntu-cpc, which is the project
|
|
# for existing raspi preinstalled images
|
|
# XXX: I would prefer to use --hdd-label=desktop-rootfs like 040-hyperv-desktop-images.binary
|
|
OPTS="${OPTS:+$OPTS }--initramfs=none"
|
|
OPTS="${OPTS:+$OPTS }--system=normal"
|
|
OPTS="${OPTS:+$OPTS }--hdd-label=cloudimg-rootfs"
|
|
OPTS="${OPTS:+$OPTS }--ext-resize-blocks=536870912 --ext-block-size=4096"
|
|
OPTS="${OPTS:+$OPTS }--ext-fudge-factor=15"
|
|
;;
|
|
intel-iot)
|
|
KERNEL_FLAVOURS='intel-iotg'
|
|
OPTS="${OPTS:+$OPTS }--initramfs=none"
|
|
OPTS="${OPTS:+$OPTS }--system=normal"
|
|
OPTS="${OPTS:+$OPTS }--hdd-label=cloudimg-rootfs"
|
|
OPTS="${OPTS:+$OPTS }--ext-resize-blocks=536870912 --ext-block-size=4096"
|
|
OPTS="${OPTS:+$OPTS }--ext-fudge-factor=15"
|
|
;;
|
|
*)
|
|
## Otherwise HYPERV image options.... *crickets* see the hyperv hook
|
|
;;
|
|
esac
|
|
;;
|
|
canary)
|
|
PASSES_TO_LAYERS="true"
|
|
# the minimal layer, for minimal installs
|
|
add_task minimal minimal standard ubuntu-desktop-minimal ubuntu-desktop-minimal-default-languages
|
|
add_package minimal cloud-init
|
|
# the standard layer, contains all base common packages for later layers (we're splitting out the snaps)
|
|
add_task minimal.standard ubuntu-desktop ubuntu-desktop-default-languages
|
|
# the classic layer, basically only contains snaps from the standard and minimal tasks
|
|
add_pass minimal.standard.classic
|
|
if [ -e "config/package-lists/livecd-rootfs.snaplist.chroot_minimal.full" ]; then
|
|
cat config/package-lists/livecd-rootfs.snaplist.chroot_minimal.full >>config/package-lists/livecd-rootfs.snaplist.chroot_minimal.standard.classic.full
|
|
rm config/package-lists/livecd-rootfs.snaplist.chroot_minimal.full
|
|
fi
|
|
if [ -e "config/package-lists/livecd-rootfs.snaplist.chroot_minimal.standard.full" ]; then
|
|
cat config/package-lists/livecd-rootfs.snaplist.chroot_minimal.standard.full >>config/package-lists/livecd-rootfs.snaplist.chroot_minimal.standard.classic.full
|
|
rm config/package-lists/livecd-rootfs.snaplist.chroot_minimal.standard.full
|
|
fi
|
|
# the live layer, contains all packages for the live session installer
|
|
# TODO: we should probably add the kernel per KERNEL_FLAVOURS
|
|
add_package minimal.standard.live linux-generic casper lvm2 mdadm cryptsetup
|
|
remove_package minimal.standard.live ubiquity-frontend-gtk
|
|
# the enhanced-secureboot layer, contains all packages for the enhanced secureboot install
|
|
add_package minimal.standard.enhanced-secureboot cryptsetup boot-managed-by-snapd
|
|
# now let's create the neccessary catalog files
|
|
# TODO: make sure that we handle locale_support: langpack correctly
|
|
cat <<-EOF > config/minimal.catalog-in.yaml
|
|
name: "Ubuntu Desktop (minimized)"
|
|
description: >-
|
|
A minimal but usable Ubuntu Desktop.
|
|
id: ubuntu-desktop-minimal
|
|
type: fsimage-layered
|
|
variant: desktop
|
|
locale_support: none
|
|
EOF
|
|
cat <<-EOF > config/minimal.standard.catalog-in.yaml
|
|
name: "Ubuntu Desktop"
|
|
description: >-
|
|
A full featured Ubuntu Desktop.
|
|
id: ubuntu-desktop
|
|
type: fsimage-layered
|
|
variant: desktop
|
|
locale_support: none
|
|
default: yes
|
|
EOF
|
|
cat <<-EOF > config/minimal.standard.classic.catalog-in.yaml
|
|
id: ubuntu-desktop
|
|
variations:
|
|
classic:
|
|
path: minimal.standard.squashfs
|
|
EOF
|
|
cat <<-EOF > config/minimal.standard.enhanced-secureboot.catalog-in.yaml
|
|
id: ubuntu-desktop
|
|
variations:
|
|
enhanced-secureboot:
|
|
path: minimal.standard.enhanced-secureboot.squashfs
|
|
snapd_system_label: enhanced-secureboot-desktop
|
|
EOF
|
|
/usr/share/livecd-rootfs/checkout-translations-branch \
|
|
https://git.launchpad.net/subiquity po config/catalog-translations
|
|
;;
|
|
*)
|
|
touch config/universe-enabled
|
|
PASSES_TO_LAYERS="true"
|
|
KERNEL_FLAVOURS='generic-hwe-22.04'
|
|
add_task minimal minimal standard ubuntu-desktop-minimal ubuntu-desktop-minimal-default-languages
|
|
add_task minimal.standard ubuntu-desktop ubuntu-desktop-default-languages
|
|
add_task minimal.standard.live ubuntu-live
|
|
add_package minimal cloud-init
|
|
remove_package minimal.standard.live ubiquity-frontend-gtk
|
|
add_snap minimal.standard.live ubuntu-desktop-installer/classic
|
|
|
|
seeded_langs="$(get_seeded_languages desktop-minimal desktop)"
|
|
echo "$seeded_langs" | tr ' ' ',' > config/seeded-languages
|
|
derive_language_layers minimal desktop-minimal desktop-minimal-default-languages "$seeded_langs"
|
|
derive_language_layers minimal.standard desktop desktop-default-languages "$seeded_langs"
|
|
cat <<-EOF > config/minimal.standard.catalog-in.yaml
|
|
name: "Ubuntu Desktop"
|
|
description: >-
|
|
Ubuntu Desktop.
|
|
id: ubuntu-desktop
|
|
type: fsimage-layered
|
|
variant: desktop
|
|
locale_support: langpack
|
|
default: yes
|
|
EOF
|
|
/usr/share/livecd-rootfs/checkout-translations-branch \
|
|
https://git.launchpad.net/subiquity po config/catalog-translations
|
|
;;
|
|
esac
|
|
;;
|
|
|
|
ubuntu-oem)
|
|
touch config/universe-enabled
|
|
PASSES_TO_LAYERS="true"
|
|
#KERNEL_FLAVOURS='oem-22.04'
|
|
KERNEL_FLAVOURS='generic-hwe-22.04'
|
|
add_task minimal minimal standard ubuntu-desktop-minimal ubuntu-desktop-minimal-default-languages
|
|
add_task minimal.standard ubuntu-desktop ubuntu-desktop-default-languages
|
|
add_task minimal.standard.live ubuntu-live
|
|
add_package minimal cloud-init
|
|
remove_package minimal.standard.live ubiquity-frontend-gtk
|
|
add_snap minimal.standard.live ubuntu-desktop-installer/classic
|
|
|
|
cat <<-EOF > config/minimal.standard.catalog-in.yaml
|
|
name: "Ubuntu Desktop for OEM"
|
|
description: >-
|
|
Ubuntu Desktop for OEM preinstallation.
|
|
id: ubuntu-desktop-oem
|
|
type: fsimage-layered
|
|
variant: desktop
|
|
locale_support: none
|
|
default: yes
|
|
EOF
|
|
;;
|
|
|
|
kubuntu|kubuntu-dvd)
|
|
add_task install minimal standard
|
|
add_task install kubuntu-desktop
|
|
LIVE_TASK='kubuntu-live'
|
|
add_chroot_hook remove-gnome-icon-cache
|
|
;;
|
|
|
|
kubuntu-plasma5)
|
|
add_task install minimal standard
|
|
add_package install kubuntu-plasma5-desktop
|
|
# Technically cheating, but PPAs don't have tasks and the
|
|
# live seed doesn't have a corresponding metapackage. We'll
|
|
# get away with this as long as kubuntu-desktop and
|
|
# kubuntu-plasma5-desktop don't grow too far apart.
|
|
LIVE_TASK='kubuntu-live'
|
|
add_chroot_hook remove-gnome-icon-cache
|
|
;;
|
|
|
|
edubuntu)
|
|
add_task install minimal standard edubuntu-desktop-gnome
|
|
LIVE_TASK='edubuntu-live'
|
|
;;
|
|
|
|
ubuntucinnamon)
|
|
add_task install minimal standard ubuntucinnamon-desktop
|
|
# XXX: Adding live packages manually temporarily until we have
|
|
# the live task for ubuntucinnamon set up properly.
|
|
add_package live ubiquity-frontend-gtk
|
|
add_package live ubiquity-ubuntu-artwork ubiquity-slideshow-ubuntu
|
|
add_package live gtk-im-libthai ibus-hangul ibus-mozc ibus-unikey
|
|
add_package live zfsutils-linux zfs-initramfs zsys
|
|
add_package live sssd realmd adcli
|
|
add_package live gparted cifs-utils
|
|
KERNEL_FLAVOURS=generic
|
|
;;
|
|
|
|
xubuntu)
|
|
case ${SUBPROJECT:-} in
|
|
minimal)
|
|
add_task install minimal standard xubuntu-minimal
|
|
;;
|
|
*)
|
|
add_task install minimal standard xubuntu-desktop
|
|
;;
|
|
esac
|
|
add_package install xterm
|
|
LIVE_TASK='xubuntu-live'
|
|
case $ARCH in
|
|
amd64) KERNEL_FLAVOURS=generic ;;
|
|
esac
|
|
;;
|
|
|
|
ubuntu-netbook)
|
|
add_task install minimal standard ubuntu-netbook
|
|
LIVE_TASK='netbook-live'
|
|
;;
|
|
|
|
mythbuntu)
|
|
add_task install minimal standard mythbuntu-desktop
|
|
LIVE_TASK='mythbuntu-live'
|
|
;;
|
|
|
|
lubuntu)
|
|
add_task install minimal standard lubuntu-desktop
|
|
LIVE_TASK='lubuntu-live'
|
|
case $ARCH in
|
|
amd64) KERNEL_FLAVOURS=generic ;;
|
|
esac
|
|
;;
|
|
|
|
ubuntu-gnome)
|
|
add_task install minimal standard ubuntu-gnome-desktop
|
|
LIVE_TASK='ubuntu-gnome-live'
|
|
;;
|
|
|
|
ubuntu-budgie)
|
|
case ${SUBPROJECT:-} in
|
|
legacy)
|
|
add_task install minimal standard ubuntu-budgie-desktop
|
|
LIVE_TASK='ubuntu-budgie-live'
|
|
;;
|
|
|
|
*)
|
|
# By default Ubuntu Budgie now ships the new installer.
|
|
PASSES_TO_LAYERS="true"
|
|
KERNEL_FLAVOURS='generic-hwe-22.04'
|
|
add_task minimal minimal standard ubuntu-budgie-desktop-minimal ubuntu-budgie-desktop-minimal-default-languages
|
|
add_task minimal.standard ubuntu-budgie-desktop ubuntu-budgie-desktop-default-languages
|
|
add_task minimal.standard.live ubuntu-budgie-live
|
|
add_package minimal cloud-init
|
|
remove_package minimal.standard.live ubiquity-frontend-gtk
|
|
add_snap minimal.standard.live ubuntu-budgie-installer/classic
|
|
|
|
seeded_langs="$(get_seeded_languages budgie-desktop-minimal budgie-desktop)"
|
|
echo "$seeded_langs" | tr ' ' ',' > config/seeded-languages
|
|
derive_language_layers minimal budgie-desktop-minimal budgie-desktop-minimal-default-languages "$seeded_langs"
|
|
derive_language_layers minimal.standard budgie-desktop budgie-desktop-default-languages "$seeded_langs"
|
|
cat <<-EOF > config/minimal.catalog-in.yaml
|
|
name: "Ubuntu Budgie Desktop (minimized)"
|
|
description: >-
|
|
A minimal but usable Ubuntu Budgie Desktop.
|
|
id: ubuntu-budgie-desktop-minimal
|
|
type: fsimage-layered
|
|
variant: desktop
|
|
locale_support: langpack
|
|
EOF
|
|
cat <<-EOF > config/minimal.standard.catalog-in.yaml
|
|
name: "Ubuntu Budgie Desktop"
|
|
description: >-
|
|
A full featured Ubuntu Budgie Desktop.
|
|
id: ubuntu-budgie-desktop
|
|
type: fsimage-layered
|
|
variant: desktop
|
|
locale_support: langpack
|
|
default: yes
|
|
EOF
|
|
/usr/share/livecd-rootfs/checkout-translations-branch \
|
|
https://git.launchpad.net/subiquity po config/catalog-translations
|
|
;;
|
|
esac
|
|
;;
|
|
|
|
ubuntu-mate)
|
|
add_task install minimal standard ubuntu-mate-core ubuntu-mate-desktop
|
|
LIVE_TASK='ubuntu-mate-live'
|
|
;;
|
|
|
|
ubuntu-unity)
|
|
add_task install minimal standard ubuntu-unity-desktop
|
|
# XXX: Adding live packages manually temporarily until we have
|
|
# the live task for ubuntu-unity set up properly.
|
|
add_package live metacity ubiquity-frontend-gtk
|
|
add_package live ubiquity-ubuntu-artwork ubiquity-slideshow-ubuntu
|
|
add_package live a11y-profile-manager
|
|
add_package live gparted cifs-utils
|
|
add_package live memtest86+
|
|
;;
|
|
|
|
ubuntustudio-dvd)
|
|
add_task install minimal standard ubuntustudio-desktop ubuntustudio-audio ubuntustudio-graphics ubuntustudio-video ubuntustudio-photography
|
|
case $ARCH in
|
|
amd64) KERNEL_FLAVOURS=lowlatency ;;
|
|
esac
|
|
;;
|
|
|
|
ubuntukylin)
|
|
add_task install minimal standard ubuntukylin-desktop
|
|
add_package install ubuntukylin-default-settings
|
|
LIVE_TASK='ubuntukylin-live'
|
|
;;
|
|
|
|
ubuntu-server)
|
|
case ${SUBPROJECT:-} in
|
|
live)
|
|
OPTS="${OPTS:+$OPTS }--bootstrap-flavour=minimal"
|
|
PASSES_TO_LAYERS=true
|
|
add_task ubuntu-server-minimal server-minimal
|
|
add_package ubuntu-server-minimal lxd-installer
|
|
add_task ubuntu-server-minimal.ubuntu-server minimal standard server
|
|
add_package ubuntu-server-minimal.ubuntu-server cloud-init
|
|
|
|
add_package ubuntu-server-minimal.ubuntu-server.installer linux-firmware casper openssh-server
|
|
add_snap ubuntu-server-minimal.ubuntu-server.installer subiquity/classic
|
|
if [ $ARCH = s390x ]; then
|
|
add_package ubuntu-server-minimal.ubuntu-server.installer s390-tools-zkey
|
|
fi
|
|
|
|
# Live server ISOs for LTS point releases past .2 offer both
|
|
# the GA and HWE kernels (in separate layers) so this code is
|
|
# written generically to support both even though a lot of the
|
|
# time only one kernel is offered.
|
|
case ${SUBARCH:-} in
|
|
intel-iot)
|
|
variants='intel'
|
|
;;
|
|
tegra)
|
|
variants='tegra'
|
|
;;
|
|
tegra-igx)
|
|
variants='tegra-igx'
|
|
;;
|
|
*)
|
|
# variants='ga hwe'
|
|
variants='ga'
|
|
;;
|
|
esac
|
|
|
|
for variant in $variants; do
|
|
if [ "$variant" = "ga" ]; then
|
|
kernel_metapkg=linux-generic
|
|
flavor=generic
|
|
elif [ "$variant" = "hwe" ]; then
|
|
kernel_metapkg=linux-generic-hwe-$(lsb_release -sr)
|
|
flavor=generic-hwe
|
|
elif [ "$variant" = "intel" ]; then
|
|
kernel_metapkg=linux-intel-iotg
|
|
flavor=intel-iotg
|
|
elif [ "$variant" = "tegra" ]; then
|
|
kernel_metapkg=linux-nvidia-tegra
|
|
flavor=nvidia-tegra
|
|
elif [ "$variant" = "tegra-igx" ]; then
|
|
kernel_metapkg=linux-nvidia-tegra-igx
|
|
flavor=nvidia-tegra-igx
|
|
else
|
|
echo "bogus variant: $variant"
|
|
exit 1
|
|
fi
|
|
|
|
add_package ubuntu-server-minimal.ubuntu-server.installer.$flavor $kernel_metapkg
|
|
LIVE_PASSES="${LIVE_PASSES:+$LIVE_PASSES }ubuntu-server-minimal.ubuntu-server.installer.$flavor"
|
|
done
|
|
case $ARCH in
|
|
amd64)
|
|
add_package ubuntu-server-minimal.ubuntu-server.installer.generic.netboot grub-pc shim-signed pxelinux
|
|
;;
|
|
arm64)
|
|
add_package ubuntu-server-minimal.ubuntu-server.installer.generic.netboot shim-signed
|
|
;;
|
|
*)
|
|
add_package ubuntu-server-minimal.ubuntu-server.installer.generic.netboot
|
|
;;
|
|
esac
|
|
NO_SQUASHFS_PASSES=ubuntu-server-minimal.ubuntu-server.installer.generic.netboot
|
|
|
|
/usr/share/livecd-rootfs/checkout-translations-branch \
|
|
https://git.launchpad.net/subiquity po config/catalog-translations
|
|
;;
|
|
*)
|
|
echo "unrecognized subproject for server: '$SUBPROJECT'"
|
|
exit 1
|
|
;;
|
|
esac
|
|
PREINSTALL_POOL_SEEDS='server-ship'
|
|
;;
|
|
|
|
ubuntu-mini-iso)
|
|
OPTS="${OPTS:+$OPTS }--bootstrap-flavour=minimal"
|
|
|
|
OPTS="${OPTS:+$OPTS }--linux-packages=none --initramfs=none"
|
|
KERNEL_FLAVOURS=none
|
|
BINARY_REMOVE_LINUX=false
|
|
|
|
add_package install mini-iso-tools openssl ca-certificates isc-dhcp-client linux-generic
|
|
case $ARCH in
|
|
amd64)
|
|
add_package install cd-boot-images-amd64
|
|
;;
|
|
*)
|
|
echo "unexpected architecture for $PROJECT: '$ARCH'"
|
|
exit 1
|
|
;;
|
|
esac
|
|
;;
|
|
|
|
ubuntu-base)
|
|
OPTS="${OPTS:+$OPTS }--bootstrap-flavour=minimal"
|
|
;;
|
|
|
|
ubuntu-oci)
|
|
OPTS="${OPTS:+$OPTS }--bootstrap-flavour=minimal"
|
|
;;
|
|
|
|
ubuntu-wsl)
|
|
add_task install minimal ubuntu-wsl
|
|
OPTS="${OPTS:+$OPTS }--linux-packages=none --initramfs=none"
|
|
KERNEL_FLAVOURS=none
|
|
BINARY_REMOVE_LINUX=false
|
|
;;
|
|
|
|
ubuntu-cpc)
|
|
KERNEL_FLAVOURS=virtual
|
|
|
|
if [ "${SUBPROJECT:-}" = minimized ]; then
|
|
add_package install ubuntu-cloud-minimal
|
|
else
|
|
add_task install minimal standard cloud-image
|
|
add_package install ubuntu-minimal
|
|
case $ARCH in
|
|
armhf|arm64|ppc64el|powerpc)
|
|
add_task install server
|
|
;;
|
|
esac
|
|
fi
|
|
|
|
BINARY_REMOVE_LINUX=false
|
|
OPTS="${OPTS:+$OPTS }--initramfs=none"
|
|
case "$ARCH+${SUBARCH:-}" in
|
|
*+raspi)
|
|
add_task install ubuntu-server-raspi
|
|
;;
|
|
armhf*)
|
|
add_package install flash-kernel
|
|
;;
|
|
arm64*)
|
|
add_package install flash-kernel
|
|
if [ "${SUBARCH:-}" = "generic" ]; then
|
|
KERNEL_FLAVOURS=generic
|
|
fi
|
|
;;
|
|
amd64*)
|
|
if [ "${SUBARCH:-}" = "generic" ]; then
|
|
KERNEL_FLAVOURS=generic
|
|
elif [ "${SUBARCH:-}" = "intel-iot" ]; then
|
|
KERNEL_FLAVOURS=intel-iotg
|
|
OPTS="${OPTS:+$OPTS }--initramfs=none"
|
|
fi
|
|
;;
|
|
riscv64*)
|
|
if [ -n "$SUBARCH" ]; then
|
|
case "${SUBARCH:-}" in
|
|
nezha|licheerv)
|
|
KERNEL_FLAVOURS=allwinner
|
|
;;
|
|
visionfive)
|
|
KERNEL_FLAVOURS=starfive
|
|
;;
|
|
*)
|
|
KERNEL_FLAVOURS=generic
|
|
;;
|
|
esac
|
|
fi
|
|
;;
|
|
esac
|
|
OPTS="${OPTS:+$OPTS }--system=normal"
|
|
OPTS="${OPTS:+$OPTS }--hdd-label=cloudimg-rootfs"
|
|
OPTS="${OPTS:+$OPTS }--ext-resize-blocks=536870912 --ext-block-size=4096"
|
|
OPTS="${OPTS:+$OPTS }--ext-fudge-factor=15"
|
|
;;
|
|
|
|
*)
|
|
echo "unknown project $PROJECT" >&2
|
|
exit 2
|
|
;;
|
|
esac
|
|
|
|
case $SUBPROJECT in
|
|
buildd)
|
|
OPTS="${OPTS:+$OPTS }--archive-areas main"
|
|
OPTS="${OPTS:+$OPTS }--apt-recommends false"
|
|
OPTS="${OPTS:+$OPTS }--apt-secure false"
|
|
OPTS="${OPTS:+$OPTS }--parent-mirror-binary ${MIRROR}"
|
|
# XXX cjwatson 2018-04-27: We need to work out how to make
|
|
# this conditional so that we can do things like building
|
|
# buildd chroots with -updates. This probably involves
|
|
# either extending the PROPOSED hack or fixing the strange
|
|
# way that SUITE is in fact a series; in either case it's
|
|
# likely to involve work both here and in launchpad-buildd.
|
|
OPTS="${OPTS:+$OPTS }--security false --volatile false"
|
|
|
|
add_package install adduser
|
|
add_package install pkgbinarymangler
|
|
add_package install ca-certificates
|
|
add_package install gpg
|
|
add_package install gpg-agent
|
|
add_package install fakeroot
|
|
add_package install build-essential
|
|
# Needed for LXD-based builds.
|
|
add_package install init
|
|
# Not strictly build-essential, but traditionally present
|
|
# and a variety of things fail without it.
|
|
add_package install tzdata
|
|
|
|
cp -af /usr/share/livecd-rootfs/live-build/make-lxd-metadata.py config/make-lxd-metadata
|
|
;;
|
|
esac
|
|
|
|
# we'll expand the base seed given here according to the STRUCTURE file, and
|
|
# then look in all of the seeds found to see which snaps are seeded
|
|
case $PROJECT:${SUBPROJECT:-} in
|
|
ubuntu-wsl:*)
|
|
BASE_SEED='wsl'
|
|
;;
|
|
ubuntu-cpc:*)
|
|
# we don't preseed any snaps in minimized images, so no need to set
|
|
# BASE_SEED in that case.
|
|
if [ "${SUBPROJECT:-}" != minimized ]; then
|
|
BASE_SEED='server'
|
|
fi
|
|
;;
|
|
ubuntu-server:live)
|
|
BASE_SEED='server'
|
|
;;
|
|
ubuntu-base:*|ubuntu-core:*|ubuntu-mini-iso:)
|
|
;;
|
|
ubuntu-oci:*)
|
|
;;
|
|
xubuntu:minimal)
|
|
;;
|
|
edubuntu:*)
|
|
BASE_SEED='desktop-gnome'
|
|
;;
|
|
*)
|
|
BASE_SEED='desktop'
|
|
;;
|
|
esac
|
|
|
|
if [ "$PROJECT:${SUBPROJECT:-}" = ubuntu-cpc:minimized ]; then
|
|
# We install a lxc script that installs the snap when invoked and
|
|
# don't want any other snaps.
|
|
if [ -s config/seeded-snaps ]; then
|
|
echo "Unexpected seeded snaps for ubuntu-cpc:minimized build:"
|
|
cat config/seeded-snaps
|
|
exit 1
|
|
fi
|
|
|
|
# Create an empty file to trigger initialization of assertions.
|
|
truncate --size 0 config/seeded-snaps
|
|
fi
|
|
|
|
# grab a list of packags to remove for a "minimal" installation from the seed
|
|
# mirror for this project
|
|
if [ -n "${BASE_SEED}" ] && [ -n "${BASE_SEED}" ]; then
|
|
minimal_packages_url=${SEEDMIRROR}/${SEED}/${BASE_SEED}.minimal-remove
|
|
echo -n "Checking ${minimal_packages_url} for a minimal installation list... "
|
|
minimal_packages_remove=$(wget -q -O- ${minimal_packages_url} | sed -e '/\s*#.*$/d' -e '/^\s*$/d')
|
|
if [ -n "${minimal_packages_remove}" ]; then
|
|
echo "${minimal_packages_remove}" > config/manifest-minimal-remove
|
|
echo "$(echo ${minimal_packages_remove} | tr '\n' ' ')"
|
|
else
|
|
echo "failed to retrieve, not including."
|
|
fi
|
|
fi
|
|
|
|
export APT_OPTIONS
|
|
|
|
if [ "$PREINSTALLED" != "true" ] && [ "$PASSES_TO_LAYERS" != "true" ] && [ "$LIVE_TASK" ]; then
|
|
add_task live "$LIVE_TASK"
|
|
fi
|
|
|
|
case $PROJECT in
|
|
ubuntu-dvd)
|
|
add_task install ubuntu-usb
|
|
add_task live ubuntu-usb-live
|
|
;;
|
|
|
|
*-dvd)
|
|
add_task live "$PROJECT-live"
|
|
;;
|
|
esac
|
|
|
|
case "$ARCH${SUBARCH:++$SUBARCH}" in
|
|
arm*+raspi)
|
|
# Common configuration for all Raspberry Pi image variants (server,
|
|
# desktop etc.)
|
|
KERNEL_FLAVOURS="$SUBARCH"
|
|
# Most Pi-specific package installation is handled via the seeds in the
|
|
# per-project/subproject cases above
|
|
add_package install linux-firmware-raspi pi-bluetooth u-boot-rpi u-boot-tools
|
|
BINARY_REMOVE_LINUX=false
|
|
;;
|
|
arm64+tegra|arm64+tegra-igx)
|
|
# Common configuration for all NVIDIA Tegra image variants
|
|
# (server, desktop etc.)
|
|
KERNEL_FLAVOURS="nvidia-$SUBARCH"
|
|
;;
|
|
riscv*+*)
|
|
if [ "${SUBARCH:-}" = "licheerv" ]; then
|
|
# The wifi driver of the licheerv is an out-of-tree driver packaged
|
|
# in universe for now, so to ease its installation for those without
|
|
# network, install its dependencies.
|
|
add_package install dkms
|
|
fi
|
|
# We'll add wpasupplicant to the seeds when we work on RISC-V seeds.
|
|
add_package install wpasupplicant
|
|
;;
|
|
esac
|
|
|
|
case $PROJECT:${SUBPROJECT:-} in
|
|
ubuntu-server:*|ubuntu-base:*|ubuntu-oci:*|ubuntu:canary)
|
|
OPTS="${OPTS:+$OPTS }--linux-packages=none --initramfs=none"
|
|
KERNEL_FLAVOURS=none
|
|
BINARY_REMOVE_LINUX=false
|
|
;;
|
|
esac
|
|
|
|
add_chroot_hook update-apt-file-cache
|
|
add_chroot_hook update-apt-xapian-index
|
|
add_chroot_hook update-mlocate-database
|
|
add_chroot_hook remove-dbus-machine-id
|
|
add_chroot_hook remove-openssh-server-host-keys
|
|
add_chroot_hook remove-udev-persistent-rules
|
|
|
|
case $PROJECT in
|
|
# if any flavours want to strip .pyc files from their live images, add them here
|
|
_)
|
|
add_chroot_hook remove-python-py
|
|
;;
|
|
amd64)
|
|
KERNEL_FLAVOURS="${SUBARCH:-$KERNEL_FLAVOURS}"
|
|
case $SUBARCH in
|
|
intel-iot)
|
|
KERNEL_FLAVOURS='intel-iotg'
|
|
;;
|
|
esac
|
|
;;
|
|
esac
|
|
|
|
lb config noauto \
|
|
--mode ubuntu \
|
|
--distribution "$SUITE" \
|
|
--iso-preparer "livecd-rootfs" \
|
|
--bootstrap-keyring ubuntu-keyring \
|
|
--binary-images "$BINARY_IMAGES" \
|
|
--memtest "$MEMTEST" \
|
|
$SOURCE \
|
|
--build-with-chroot false \
|
|
${MIRROR:+--parent-mirror-bootstrap $MIRROR} \
|
|
${COMPONENTS:+--parent-archive-areas "$COMPONENTS"} \
|
|
--apt-source-archives false \
|
|
${KERNEL_FLAVOURS:+--linux-flavours "$KERNEL_FLAVOURS"} \
|
|
--initsystem none \
|
|
--bootloader "$BOOTLOADER" \
|
|
${INITRAMFS_COMPRESSION:+--initramfs-compression "$INITRAMFS_COMPRESSION"} \
|
|
--checksums none \
|
|
--cache false \
|
|
${BOOTAPPEND_LIVE:+--bootappend-live "$BOOTAPPEND_LIVE"} \
|
|
$OPTS \
|
|
"$@"
|
|
|
|
PASSES=$(_sanitize_passes "$PASSES")
|
|
LIVE_PASSES=${LIVE_PASSES:-$(_get_live_passes "$PASSES")}
|
|
|
|
if [ -n "$PASSES" ] && [ -z "$LIVE_PASSES" ]; then
|
|
echo "W: Multi-layered mode is enabled, but we didn't find any live pass." \
|
|
"Either set \$LIVE_PASSES or add a pass ending with '.live'."
|
|
fi
|
|
|
|
echo "LB_CHROOT_HOOKS=\"$CHROOT_HOOKS\"" >> config/chroot
|
|
echo "SUBPROJECT=\"${SUBPROJECT:-}\"" >> config/chroot
|
|
echo "LB_DISTRIBUTION=\"$SUITE\"" >> config/chroot
|
|
echo "IMAGEFORMAT=\"$IMAGEFORMAT\"" >> config/chroot
|
|
if [ -n "$PASSES" ]; then
|
|
echo "PASSES=\"$PASSES\"" >> config/common
|
|
fi
|
|
if [ -n "$NO_SQUASHFS_PASSES" ]; then
|
|
echo "NO_SQUASHFS_PASSES=\"$NO_SQUASHFS_PASSES\"" >> config/common
|
|
fi
|
|
if [ -n "$LIVE_PASSES" ]; then
|
|
echo "LIVE_PASSES=\"$LIVE_PASSES\"" >> config/common
|
|
fi
|
|
echo "LB_BINARY_HOOKS=\"$BINARY_HOOKS\"" >> config/binary
|
|
echo "BUILDSTAMP=\"$NOW\"" >> config/binary
|
|
echo "SUBPROJECT=\"${SUBPROJECT:-}\"" >> config/binary
|
|
echo "LB_DISTRIBUTION=\"$SUITE\"" >> config/binary
|
|
echo "CHANNEL=\"${CHANNEL:-}\"" >> config/binary
|
|
|
|
if [ "${IMAGE_HAS_HARDCODED_PASSWORD:-}" = "1" ]; then
|
|
echo IMAGE_HAS_HARDCODED_PASSWORD=1 >> config/binary
|
|
if [ -n "${IMAGE_TARGETS:-}" ]; then
|
|
echo "IMAGE_TARGETS=\"${IMAGE_TARGETS:-}\"" >> config/binary
|
|
fi
|
|
fi
|
|
|
|
case $PROJECT in
|
|
ubuntu-cpc|ubuntu-core|ubuntu-base|ubuntu-oci|ubuntu-wsl|ubuntu-mini-iso)
|
|
# ubuntu-cpc gets this added in 025-create-groups.chroot, and we do
|
|
# not want this group in projects that are effectively just chroots
|
|
;;
|
|
*)
|
|
# We add the lxd group at image build time so that the default user
|
|
# created by the installer or cloud-init is added to it (cloud-init
|
|
# will create any group the user is configured to be added to, but as
|
|
# a normal group not a system group, see
|
|
# https://bugs.launchpad.net/cloud-images/+bug/1844498).
|
|
cat > config/hooks/100-add-lxd-group.chroot <<EOF
|
|
#!/bin/bash
|
|
|
|
echo "Adding lxd group..."
|
|
addgroup --system --quiet lxd
|
|
EOF
|
|
;;
|
|
esac
|
|
|
|
case $ARCH+$SUBARCH in
|
|
armhf+raspi2|armhf+raspi|arm64+raspi)
|
|
cat > config/hooks/01-firmware-directory.chroot_early <<EOF
|
|
#!/bin/sh -ex
|
|
mkdir -p /boot/firmware
|
|
EOF
|
|
cat > config/hooks/999-raspi2-fixes.chroot <<EOF
|
|
#!/bin/sh -ex
|
|
cat >> /etc/fstab << EOM
|
|
LABEL=system-boot /boot/firmware vfat defaults 0 1
|
|
EOM
|
|
|
|
cat > /boot/firmware/cmdline.txt << EOM
|
|
net.ifnames=0 dwc_otg.lpm_enable=0 console=ttyAMA0,115200 console=tty1 root=/dev/mmcblk0p2 rootfstype=ext4 elevator=deadline rootwait
|
|
EOM
|
|
|
|
cat > /boot/firmware/config.txt << EOM
|
|
# For more options and information see
|
|
# http://www.raspberrypi.org/documentation/configuration/config-txt.md
|
|
# Some settings may impact device functionality. See link above for details
|
|
|
|
kernel=uboot.bin
|
|
device_tree_address=0x02000000
|
|
|
|
# enable i2c
|
|
dtparam=i2c_arm=on
|
|
dtparam=spi=on
|
|
|
|
# uncomment if you get no picture on HDMI for a default "safe" mode
|
|
#hdmi_safe=1
|
|
|
|
# uncomment this if your display has a black border of unused pixels visible
|
|
# and your display can output without overscan
|
|
#disable_overscan=1
|
|
|
|
# uncomment the following to adjust overscan. Use positive numbers if console
|
|
# goes off screen, and negative if there is too much border
|
|
#overscan_left=16
|
|
#overscan_right=16
|
|
#overscan_top=16
|
|
#overscan_bottom=16
|
|
|
|
# uncomment to force a console size. By default it will be display's size minus
|
|
# overscan.
|
|
#framebuffer_width=1280
|
|
#framebuffer_height=720
|
|
|
|
# uncomment if hdmi display is not detected and composite is being output
|
|
#hdmi_force_hotplug=1
|
|
|
|
# uncomment to force a specific HDMI mode (this will force VGA)
|
|
#hdmi_group=1
|
|
#hdmi_mode=1
|
|
|
|
# uncomment to force a HDMI mode rather than DVI. This can make audio work in
|
|
# DMT (computer monitor) modes
|
|
#hdmi_drive=2
|
|
|
|
# uncomment to increase signal to HDMI, if you have interference, blanking, or
|
|
# no display
|
|
#config_hdmi_boost=4
|
|
|
|
# uncomment for composite PAL
|
|
#sdtv_mode=2
|
|
|
|
#uncomment to overclock the arm. 700 MHz is the default.
|
|
#arm_freq=800
|
|
|
|
EOM
|
|
EOF
|
|
;;
|
|
*)
|
|
;;
|
|
esac
|
|
|
|
if [ $PROJECT = ubuntu-server ] && [ "${SUBPROJECT:-}" != live ]; then
|
|
cat > config/hooks/100-remove-fstab.chroot <<EOF
|
|
#! /bin/sh
|
|
rm -f /etc/fstab
|
|
EOF
|
|
fi
|
|
|
|
if [ $PROJECT != ubuntu-cpc ]; then
|
|
cat > config/hooks/100-preserve-apt-prefs.chroot <<\EOF
|
|
#! /bin/sh -ex
|
|
|
|
# live-build "helpfully" removes /etc/apt/preferences.d/* so we put a
|
|
# copy somewhere it won't touch it.
|
|
|
|
if [ -n "$(ls -A /etc/apt/preferences.d)" ]; then
|
|
cp -a /etc/apt/preferences.d /etc/apt/preferences.d.save
|
|
fi
|
|
EOF
|
|
fi
|
|
|
|
if [ $PROJECT = ubuntukylin ]; then
|
|
cat > config/hooks/100-ubuntukylin.chroot <<EOF
|
|
#! /bin/sh
|
|
set -e
|
|
HOOK=/usr/share/ubuntukylin-default-settings/hooks/chroot
|
|
if [ -x \$HOOK ]; then
|
|
exec \$HOOK
|
|
fi
|
|
exit 0
|
|
EOF
|
|
fi
|
|
|
|
if $BINARY_REMOVE_LINUX; then
|
|
cat > config/binary_rootfs/excludes << EOF
|
|
boot/vmlinu?-*
|
|
boot/initrd.img-*
|
|
EOF
|
|
fi
|
|
|
|
if [ "$PROPOSED" ]; then
|
|
. config/bootstrap
|
|
|
|
cat > config/archives/proposed.list.chroot << EOF
|
|
deb $LB_PARENT_MIRROR_BINARY_VOLATILE $SUITE-proposed $LB_PARENT_ARCHIVE_AREAS
|
|
EOF
|
|
cp -a config/archives/proposed.list.chroot \
|
|
config/archives/proposed.list.binary
|
|
|
|
mkdir -p config/chroot_apt/
|
|
cat > config/chroot_apt/proposed.pref <<EOF
|
|
# override for NotAutomatic: yes
|
|
Package: *
|
|
Pin: release a=*-proposed
|
|
Pin-Priority: 500
|
|
EOF
|
|
fi
|
|
|
|
case $PROJECT:${SUBPROJECT:-} in
|
|
*-dvd:*)
|
|
. config/bootstrap
|
|
|
|
cat > config/archives/dvd.list.binary << EOF
|
|
deb $LB_PARENT_MIRROR_BINARY $SUITE universe multiverse
|
|
deb $LB_PARENT_MIRROR_BINARY_VOLATILE $SUITE-updates universe multiverse
|
|
deb $LB_PARENT_MIRROR_BINARY_SECURITY $SUITE-security universe multiverse
|
|
EOF
|
|
if [ "$PROPOSED" ]; then
|
|
cat >> config/archives/dvd.list.binary << EOF
|
|
deb $LB_PARENT_MIRROR_BINARY_VOLATILE $SUITE-proposed universe multiverse
|
|
EOF
|
|
fi
|
|
;;
|
|
|
|
ubuntu-cpc:*|ubuntu-server:live|ubuntu:desktop-preinstalled| \
|
|
ubuntu-wsl:*|ubuntu-mini-iso:*|ubuntu:canary|ubuntu-oem:*)
|
|
# Ensure that most things e.g. includes.chroot are copied as is
|
|
for entry in /usr/share/livecd-rootfs/live-build/${PROJECT}/*; do
|
|
case $entry in
|
|
*hooks*)
|
|
# But hooks are shared across the projects with symlinks
|
|
# dereference them
|
|
cp -afL $entry config/
|
|
;;
|
|
*)
|
|
# Most places want to preserve symlinks as is
|
|
cp -af $entry config/
|
|
;;
|
|
esac
|
|
done
|
|
|
|
if [ "$PROJECT" = "ubuntu-cpc" ] || [ "$PROJECT" = "ubuntu-oem" ] ; then
|
|
case ${IMAGE_TARGETS:-} in
|
|
"")
|
|
config/hooks.d/make-hooks --hooks-dir config/hooks all
|
|
;;
|
|
*)
|
|
config/hooks.d/make-hooks --hooks-dir config/hooks \
|
|
"$IMAGE_TARGETS"
|
|
;;
|
|
esac
|
|
fi
|
|
|
|
if [ "$IMAGEFORMAT" = none ]; then
|
|
rm -f config/hooks/*.binary*
|
|
fi
|
|
;;
|
|
esac
|
|
|
|
case $SUBPROJECT in
|
|
buildd)
|
|
cp -af /usr/share/livecd-rootfs/live-build/buildd/* config/
|
|
;;
|
|
esac
|
|
|
|
if [ "$EXTRA_PPAS" ]; then
|
|
rm -f config/archives/extra-ppas.list.chroot \
|
|
config/archives/extra-ppas.pref.chroot \
|
|
config/archives/extra-ppas.key.chroot
|
|
gpg_tmpdir="$(mktemp -d)"
|
|
run_gpg () {
|
|
gpg --no-default-keyring --no-options --homedir "$gpg_tmpdir" \
|
|
--secret-keyring "$gpg_tmpdir/secring.gpg" \
|
|
--keyserver hkp://keyserver.ubuntu.com:80/ \
|
|
"$@"
|
|
}
|
|
for extra_ppa in $EXTRA_PPAS; do
|
|
extra_ppa_pin=''
|
|
extra_ppa_origin=''
|
|
case $extra_ppa in
|
|
*:*)
|
|
extra_ppa_pin=${extra_ppa#*:}
|
|
extra_ppa=${extra_ppa%:*}
|
|
;;
|
|
esac
|
|
extra_ppa_fingerprint="$(/usr/share/livecd-rootfs/get-ppa-fingerprint "$extra_ppa")"
|
|
|
|
cat >> config/archives/extra-ppas.list.chroot <<EOF
|
|
deb http://ppa.launchpad.net/$extra_ppa/ubuntu @DISTRIBUTION@ main
|
|
deb-src http://ppa.launchpad.net/$extra_ppa/ubuntu @DISTRIBUTION@ main
|
|
EOF
|
|
|
|
if [ -n "$extra_ppa_pin" ]; then
|
|
extra_ppa_origin="LP-PPA-$(echo $extra_ppa | sed -e 's,/ppa$,,' -e 's,/,-,')"
|
|
echo "Package: *" >> config/archives/extra-ppas.pref.chroot
|
|
echo "Pin: release o=$extra_ppa_origin" >> config/archives/extra-ppas.pref.chroot
|
|
echo "Pin-Priority: $extra_ppa_pin" >> config/archives/extra-ppas.pref.chroot
|
|
echo "" >> config/archives/extra-ppas.pref.chroot
|
|
fi
|
|
run_gpg --keyring "$gpg_tmpdir/pubring.gpg" \
|
|
--recv "$extra_ppa_fingerprint"
|
|
run_gpg --keyring "$gpg_tmpdir/pubring.gpg" \
|
|
--output "$gpg_tmpdir/export.gpg" \
|
|
--export "$extra_ppa_fingerprint"
|
|
got_fingerprint="$(
|
|
run_gpg --keyring "$gpg_tmpdir/export.gpg" \
|
|
--fingerprint --batch --with-colons |
|
|
grep '^fpr:' | cut -d: -f10)"
|
|
if [ "$got_fingerprint" != "$extra_ppa_fingerprint" ]; then
|
|
echo "Fingerprints do not match. Got:" >&2
|
|
echo "$got_fingerprint" | sed 's/^/ /' >&2
|
|
echo "Expected:" >&2
|
|
echo " $extra_ppa_fingerprint" >&2
|
|
exit 1
|
|
fi
|
|
cat "$gpg_tmpdir/export.gpg" >> config/archives/extra-ppas.key.chroot
|
|
rm -f "$gpg_tmpdir/export.gpg"
|
|
done
|
|
rm -rf "$gpg_tmpdir"
|
|
cp -a config/archives/extra-ppas.list.chroot \
|
|
config/archives/extra-ppas.list.binary
|
|
cp -a config/archives/extra-ppas.key.chroot \
|
|
config/archives/extra-ppas.key.binary
|
|
if [ -f config/archives/extra-ppas.pref.chroot ]; then
|
|
cp -a config/archives/extra-ppas.pref.chroot \
|
|
config/archives/extra-ppas.pref.binary
|
|
fi
|
|
fi
|
|
|
|
if [ "$PREINSTALLED" = "true" ]; then
|
|
if [ -n "$PREINSTALL_POOL_SEEDS" ]; then
|
|
UNWANTED_SEEDS="${LIVE_TASK:+$LIVE_TASK }boot installer required"
|
|
for i in $UNWANTED_SEEDS; do
|
|
UNWANTED_SEEDS="${UNWANTED_SEEDS:+$UNWANTED_SEEDS }$(inheritance $i)"
|
|
done
|
|
|
|
for i in $PREINSTALL_POOL_SEEDS; do
|
|
PREINSTALL_POOL_SEEDS="${PREINSTALL_POOL_SEEDS:+$PREINSTALL_POOL_SEEDS }$(inheritance $i)"
|
|
done
|
|
|
|
for i in $PREINSTALL_POOL_SEEDS; do
|
|
case " $UNWANTED_SEEDS " in
|
|
*" $i "*)
|
|
;;
|
|
*)
|
|
PPS_EXP="${PPS_EXP:+$PPS_EXP }$i"
|
|
;;
|
|
esac
|
|
done
|
|
|
|
for i in $PPS_EXP; do
|
|
PREINSTALL_POOL="$PREINSTALL_POOL $(awk '{print $1}' \
|
|
config/germinate-output/$i | egrep -v '^-|^Package|^\|' | tr '\n' ' ')"
|
|
done
|
|
fi
|
|
if [ -n "$PREINSTALL_POOL" ]; then
|
|
mkdir -p config/gnupg
|
|
mkdir -p config/indices
|
|
for component in $COMPONENTS; do
|
|
(cd config/indices && \
|
|
wget $MIRROR/indices/override.$SUITE.$component && \
|
|
wget $MIRROR/indices/override.$SUITE.extra.$component \
|
|
)
|
|
done
|
|
cat > config/hooks/100-preinstall-pool.chroot <<EOF
|
|
#! /bin/sh
|
|
mkdir -p /var/lib/preinstalled-pool/pool/
|
|
cd /var/lib/preinstalled-pool/pool/
|
|
apt-get -y download $PREINSTALL_POOL
|
|
EOF
|
|
fi
|
|
fi
|