#! /bin/sh set -e rm -rf config echo "Building on $(hostname --fqdn)" SUITENUM=$(distro-info --series="$SUITE" -r | awk '{ print $1 }') HWE_SUFFIX="hwe-${SUITENUM}" SEEDMIRROR=http://people.canonical.com/~ubuntu-archive/seeds/ if [ -z "$MIRROR" ]; then case $(hostname --fqdn) in *.0c3.net) case $ARCH in i386|amd64) MIRROR=http://mirrors.0c3.net/ubuntu/ ;; *) MIRROR=http://mirrors.0c3.net/ubuntu-ports/ ;; esac ;; *.ubuntu.com) MIRROR=http://ftpmaster.internal/ubuntu/ SEEDMIRROR=http://archive-team.internal/seeds/ ;; *.buildd|lp-*) 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/snap-seed-parse.py config/snap-seed-parse mkdir -p config/package-lists add_task () { local pass="$1" shift local task # The removal of direct task installation support from live-build # poses some problems. If the chroot has multiarch configured - for # example, if we're building for amd64 - then dumpavail will show # foreign-architecture packages which will have their own Task # lines, but which we don't want to install. (Compare # PackageContainerInterface::FromTask in apt, which restricts task # expansion to the native architecture.) We therefore restrict our # search to stanzas with Architecture: $ARCH or all. # # However, even this may not be accurate enough. At the moment I # have no idea what happens if an Architecture: all package has # different Task fields on different architectures. This is # probably a lurking timebomb that we need to fix. In the meantime, # the Architecture restriction at least saves us from abject # failure. for task; do if [ "$task" = "ubuntu-budgie-desktop" ]; then filter="| grep -v '^linux.*tools'" else filter="" fi if [ -n "$HWE" ]; then # If HWE is set, we strip out drivers not available in the # HWE stack, then sed the rest with their HWE suffixes: filter="$filter | sed -e 's/xserver-xorg.*/&-${HWE_SUFFIX}/'" fi # We need a ridiculous number of backslashes to protect # parentheses from eval. echo "!chroot chroot apt-cache dumpavail | grep-dctrl -nsPackage \\\\\\( -XFArchitecture $ARCH -o -XFArchitecture all \\\\\\) -a -wFTask $task $filter" >> "config/package-lists/livecd-rootfs.list.chroot_$pass" done } add_package () { local pass="$1" shift local pkg for pkg; do echo "$pkg" >> "config/package-lists/livecd-rootfs.list.chroot_$pass" done } 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 " add_chroot_hook () { CHROOT_HOOKS="${CHROOT_HOOKS:+$CHROOT_HOOKS }$1" } add_binary_hook () { BINARY_HOOKS="${BINARY_HOOKS:+$BINARY_HOOKS }$1" } if [ -z "${IMAGEFORMAT:-}" ]; then case $PROJECT:${SUBPROJECT:-} in ubuntu-cpc:*|ubuntu:desktop-preinstalled) if [ "$SUBARCH" = "raspi3" ]; then # For now only raspi3, but others are soon to follow IMAGEFORMAT=ubuntu-image else IMAGEFORMAT=ext4 fi ;; ubuntu-server:live) IMAGEFORMAT=plain ;; 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 case ${SUBPROJECT:-} in wubi) add_package install lupin-support COMPONENTS='main restricted universe multiverse' ;; *) case $PROJECT:${SUBPROJECT:-} in ubuntu-base:buildd) ;; ubuntu-cpc:*) ;; *) add_package live jasper ;; esac ;; esac ;; plain) case $PROJECT:${SUBPROJECT:-} in ubuntu-server:live) touch config/universe-enabled ;; *) PREINSTALLED=true ;; esac OPTS="${OPTS:+$OPTS }--initramfs none --chroot-filesystem $IMAGEFORMAT" ;; ubuntu-image) UBUNTU_IMAGE_ARGS="" BRAND_ID="canonical" case "$ARCH+${SUBARCH:-}" in # Handle appliance images *+appliance-*) BRAND_ID="ubuntu" MODEL="${SUBARCH#appliance-}" APPLIANCE=1 ;; amd64+*) MODEL=pc-amd64 ;; i386+*) MODEL=pc-i386 ;; arm64+snapdragon) MODEL=dragonboard ;; armhf+raspi3) MODEL=pi ;; arm64+raspi3) MODEL=pi-arm64 ;; armhf+imx6) MODEL=nitrogen6x ;; *) 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 case $MODEL in pc-amd64|pc-i386) [ -z "${SUBARCH:-}" ] \ && UBUNTU_IMAGE_ARGS="$UBUNTU_IMAGE_ARGS --image-size 3700M" ;; # Some appliances need different snap tracks lxd-core18*) EXTRA_SNAPS="lxd=4.0" ;; esac case $SUITE in xenial) # Ubuntu Core 16 ;; *) # Ubuntu Core 18 [ -z "${APPLIANCE:-}" ] \ && MODEL="ubuntu-core-18-${MODEL#pc-}" ;; esac case "$ARCH+${SUBARCH:-}" in amd64+kassel) 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="$BRAND_ID" > "$PREFIX".model-assertion echo "Configured ubuntu-image for the following model assertion:" cat "$PREFIX".model-assertion echo "----------------------------------------------------------" else # classic images # Certain models have different names but are built from the same source gadget tree case $MODEL in pi-arm64|pi) # XXX: Temporarily this is still built from the pi3 tree, # but eventually we'll use the pi one. MODEL=pi3 ;; esac UBUNTU_IMAGE_ARGS="$UBUNTU_IMAGE_ARGS${PROPOSED:+ --with-proposed}" UBUNTU_IMAGE_ARGS="$UBUNTU_IMAGE_ARGS${EXTRA_PPAS:+ --extra-ppas \"$EXTRA_PPAS\"}" git clone git://git.launchpad.net/~canonical-foundations/snap-$MODEL/+git/github-mirror -b classic config/$PREFIX-gadget echo "IMAGEFORMAT=$IMAGEFORMAT" >> config/common echo "SUITE=$SUITE" >> config/common echo "UBUNTU_IMAGE_ARGS=\"$UBUNTU_IMAGE_ARGS\"" >> config/common echo "Configured ubuntu-image for the following gadget model: $MODEL" fi # Fake finished configuration for lb build mkdir -p .build touch .build/config exit 0 ;; none) OPTS="${OPTS:+$OPTS }--chroot-filesystem $IMAGEFORMAT" ;; *) case $PROJECT in ubuntu-server|ubuntu-touch|ubuntu-touch-custom) ;; *) add_package live lupin-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-server) add_package live oem-config-debconf ubiquity-frontend-debconf ;; ubuntu-core|ubuntu-base|base|ubuntu-touch|ubuntu-touch-custom|ubuntu-cpc|ubuntu-desktop-next) ;; 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 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 # cribbed from cdimage, perhaps this should be a small helper script in germinate? add_inheritance () { case " $inherit " in *" $1 "*) ;; *) inherit="${inherit:+$inherit }$1" ;; esac } expand_inheritance () { for seed in $(grep "^$1:" config/germinate-output/structure | cut -d: -f2); do expand_inheritance "$seed" done add_inheritance "$1" } inheritance () { inherit= expand_inheritance "$1" echo "$inherit" } mkdir -p config/germinate-output case $PROJECT in kubuntu-active*) SEED=kubuntu-active.$SUITE ;; kubuntu*) SEED=kubuntu.$SUITE ;; xubuntu*) SEED=xubuntu.$SUITE ;; ubuntu-mate*) SEED=ubuntu-mate.$SUITE ;; lubuntu*) SEED=lubuntu.$SUITE ;; ubuntu-budgie*) SEED=ubuntu-budgie.$SUITE ;; ubuntukylin*) SEED=ubuntukylin.$SUITE ;; ubuntustudio*) SEED=ubuntustudio.$SUITE ;; *) SEED=ubuntu.$SUITE ;; esac if ! [ -e config/germinate-output/structure ]; then echo "Running germinate..." (cd config/germinate-output && germinate --no-rdepends --no-installer \ -S $SEEDMIRROR -m $MIRROR -d $SUITE -s $SEED \ ${COMPONENTS:+-c "$COMPONENTS"} -a $ARCH) fi case $PROJECT in base|edubuntu|edubuntu-dvd|kubuntu|kubuntu-active|kubuntu-dvd|kubuntu-plasma5|lubuntu|lubuntu-next|mythbuntu|ubuntu|ubuntu-budgie|ubuntu-desktop-next|ubuntu-dvd|ubuntu-gnome|ubuntu-mate|ubuntu-netbook|ubuntukylin|ubuntustudio-dvd|xubuntu) INITRAMFS_COMPRESSION="lzma" ;; esac case $PROJECT in ubuntu|ubuntu-dvd) HWE="yes" KERNEL_FLAVOURS="generic${HWE:+-$HWE_SUFFIX}" add_task install minimal standard ubuntu-desktop LIVE_TASK='ubuntu-live' case $ARCH in amd64) add_package live linux-signed-$KERNEL_FLAVOURS ;; esac ;; ubuntu-desktop-next) add_task install minimal standard ubuntu-desktop-next ubuntu-sdk-libs COMPONENTS='main restricted universe' LIVE_TASK='ubuntu-touch-live' KERNEL_FLAVOURS="generic${HWE:+-$HWE_SUFFIX}" case $ARCH in amd64) add_package live linux-signed-$KERNEL_FLAVOURS ;; esac # system image snappy desktop next image # mvo: This is for cron.daily-preinstalled # CDIMAGE_PREINSTALLED is not passed from build.py # and PREINSTALLED means something different. So # we use SUBPROJECT to pass on the information if [ "${SUBPROJECT:-}" = "system-image" ]; then OPTS="${OPTS:+$OPTS }--linux-packages=linux-image" fi ;; kubuntu|kubuntu-dvd) HWE="yes" KERNEL_FLAVOURS="generic${HWE:+-$HWE_SUFFIX}" add_task install minimal standard add_task install kubuntu-desktop LIVE_TASK='kubuntu-live' case $ARCH in amd64) add_package live linux-signed-$KERNEL_FLAVOURS ;; esac COMPONENTS='main restricted universe' add_chroot_hook remove-gnome-icon-cache ;; kubuntu-active) add_task install minimal standard kubuntu-active LIVE_TASK='kubuntu-active-live' COMPONENTS='main restricted universe' 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' COMPONENTS='main restricted universe' add_chroot_hook remove-gnome-icon-cache ;; edubuntu|edubuntu-dvd) KERNEL_FLAVOURS="generic${HWE:+-$HWE_SUFFIX}" add_task install minimal standard ubuntu-desktop edubuntu-desktop-gnome LIVE_TASK='edubuntu-live' case $ARCH in amd64) add_package live linux-signed-$KERNEL_FLAVOURS ;; esac COMPONENTS='main restricted universe' ;; xubuntu) HWE="yes" KERNEL_FLAVOURS="generic${HWE:+-$HWE_SUFFIX}" add_task install minimal standard xubuntu-desktop add_package install xterm LIVE_TASK='xubuntu-live' case $ARCH in amd64) add_package live linux-signed-$KERNEL_FLAVOURS ;; esac COMPONENTS='main restricted universe multiverse' ;; ubuntu-netbook) add_task install minimal standard ubuntu-netbook LIVE_TASK='netbook-live' ;; mythbuntu) KERNEL_FLAVOURS="generic${HWE:+-$HWE_SUFFIX}" add_task install minimal standard mythbuntu-desktop LIVE_TASK='mythbuntu-live' case $ARCH in amd64) add_package live linux-signed-$KERNEL_FLAVOURS ;; esac COMPONENTS='main restricted universe multiverse' ;; lubuntu) HWE="yes" KERNEL_FLAVOURS="generic${HWE:+-$HWE_SUFFIX}" add_task install minimal standard lubuntu-gtk-core lubuntu-desktop # Installing the lubuntu-gtk-core task explicitly appears # to make dbus-user-session not get installed anymore: add_package install dbus-user-session # These themes also get dropped, maybe worth looking closer: add_package install humanity-icon-theme gnome-icon-theme adwaita-icon-theme LIVE_TASK='lubuntu-live' case $ARCH in amd64) add_package live linux-signed-$KERNEL_FLAVOURS ;; esac COMPONENTS='main restricted universe multiverse' # The Lubuntu STRUCTURE file has "feature # no-follow-recommends". Mirror this. APT_OPTIONS="${APT_OPTIONS} --no-install-recommends" ;; lubuntu-next) KERNEL_FLAVOURS="generic${HWE:+-$HWE_SUFFIX}" add_task install minimal standard lubuntu-qt-desktop LIVE_TASK='lubuntu-live-qt' case $ARCH in amd64) add_package live linux-signed-$KERNEL_FLAVOURS ;; esac COMPONENTS='main restricted universe multiverse' # The Lubuntu STRUCTURE file has "feature # no-follow-recommends". Mirror this. APT_OPTIONS="${APT_OPTIONS} --no-install-recommends" ;; ubuntu-gnome) KERNEL_FLAVOURS="generic${HWE:+-$HWE_SUFFIX}" add_task install minimal standard ubuntu-gnome-desktop LIVE_TASK='ubuntu-gnome-live' case $ARCH in amd64) add_package live linux-signed-$KERNEL_FLAVOURS ;; esac COMPONENTS='main restricted universe' ;; ubuntu-budgie) HWE="yes" KERNEL_FLAVOURS="generic${HWE:+-$HWE_SUFFIX}" add_task install minimal standard ubuntu-budgie-desktop LIVE_TASK='ubuntu-budgie-live' case $ARCH in amd64) add_package live linux-signed-$KERNEL_FLAVOURS ;; esac COMPONENTS='main restricted universe' ;; ubuntu-mate) HWE="yes" KERNEL_FLAVOURS="generic${HWE:+-$HWE_SUFFIX}" add_task install minimal standard ubuntu-mate-core ubuntu-mate-desktop LIVE_TASK='ubuntu-mate-live' case $ARCH in amd64) add_package live linux-signed-$KERNEL_FLAVOURS ;; esac COMPONENTS='main restricted universe multiverse' ;; ubuntustudio-dvd) KERNEL_FLAVOURS="lowlatency${HWE:+-$HWE_SUFFIX}" add_task install minimal standard ubuntustudio-desktop ubuntustudio-audio ubuntustudio-fonts ubuntustudio-graphics ubuntustudio-video ubuntustudio-publishing ubuntustudio-photography COMPONENTS='main restricted universe multiverse' ;; ubuntukylin) HWE="yes" KERNEL_FLAVOURS="generic${HWE:+-$HWE_SUFFIX}" add_task install minimal standard ubuntukylin-desktop add_package install ubuntukylin-default-settings LIVE_TASK='ubuntukylin-live' case $ARCH in amd64) add_package live linux-signed-$KERNEL_FLAVOURS ;; esac COMPONENTS='main restricted universe' ;; base) add_task install minimal standard ;; ubuntu-server) add_task install minimal case ${SUBPROJECT:-} in live) add_task install standard add_task install server add_package install cloud-init ;; esac COMPONENTS='main' PREINSTALL_POOL_SEEDS='server-ship' ;; ubuntu-core) OPTS="${OPTS:+$OPTS }--apt-recommends false" # some workarounds because the seeds are not quite # corrent at the moment add_package install dbus add_package install isc-dhcp-client add_package install libpam-systemd add_package install ppp add_package install watchdog # no Task: header yet add_package install snapd add_package install ubuntu-core-snapd-units add_package install nplan # we want all arches to have u-boot-tools add_package install u-boot-tools # no minimal as we want to be really minimal #add_task install minimal add_task install ubuntu-core # more packages are pulled in via the seed. # (important to remember when comparing to the # livecd-rootfs from ppa:snappy-dev/image) case $ARCH in i386) # efi support can go once the task # header is available for grub-efi-ia32-bin add_package install grub-efi-ia32-bin ;; esac # generic kernel etc KERNEL_FLAVOURS=none case $ARCH in i386) add_package install grub-pc ;; amd64) add_package install grub-pc add_package install shim-signed ;; esac OPTS="${OPTS:+$OPTS }--linux-packages=none --initramfs=none" # contains the framework definition add_package install ubuntu-core-libs # universe needed for 'system-image-cli' and multiverse for firmware COMPONENTS='main restricted universe multiverse' OPTS="${OPTS:+$OPTS }--bootstrap-flavour=minimal" ;; ubuntu-base) OPTS="${OPTS:+$OPTS }--bootstrap-flavour=minimal" ;; ubuntu-touch|ubuntu-touch-custom) HINTS="packagekit ubuntu-system-settings" case $ARCH in amd64|i386) HINTS="$HINTS qml-module-ubuntu-components-gles unity8" ;; esac add_package install ubuntu-minimal ubuntu-touch $HINTS COMPONENTS='main restricted universe' BOOTAPPEND_LIVE='hostname=ubuntu-phablet username=ubuntu' export LB_BOOTSTRAP_INCLUDE='apt-transport-https gnupg' OPTS="${OPTS:+$OPTS }--apt-recommends false" OPTS="${OPTS:+$OPTS }--compression gzip" OPTS="${OPTS:+$OPTS }--system normal" OPTS="${OPTS:+$OPTS }--zsync false" # TODO cjwatson 2014-07-17: This is a bit of an abuse of # SUBPROJECT, but it's a handy thing that launchpad-buildd # already passes through to us that we weren't otherwise # using here. case ${SUBPROJECT:-} in ubuntu-rtm/dogfood) MIRROR=http://derived-archive.dogfood.content.paddev.net/ubuntu-rtm/ OPTS="${OPTS:+$OPTS }--apt-secure false" OPTS="${OPTS:+$OPTS }--mirror-chroot-security ${MIRROR}" OPTS="${OPTS:+$OPTS }--mirror-binary-security ${MIRROR}" OPTS="${OPTS:+$OPTS }--mirror-binary ${MIRROR}" ;; ubuntu-rtm) MIRROR=http://derived.archive.canonical.com/ubuntu-rtm/ OPTS="${OPTS:+$OPTS }--mirror-chroot-security ${MIRROR}" OPTS="${OPTS:+$OPTS }--mirror-binary-security ${MIRROR}" OPTS="${OPTS:+$OPTS }--mirror-binary ${MIRROR}" ;; esac ;; ubuntu-cpc) if [ "${SUBPROJECT:-}" = minimized ]; then add_task install cloud-image add_package install sudo # linux-kvm currently only exists in xenial, not in # non-LTS suites. Fall back to virtual flavor, which # may or may not boot initramfsless but enables us to # test building and possibly build derivative images # using other kernel flavors. # If you enable an extra ppa, it is assumed that # linux-kvm is available since you control the # archive and can provide this metapackage as # necessary. if [ "$ARCH" = "amd64" ] && ([ -n "$EXTRA_PPAS" ] || [ "$SUITE" = xenial ] || [ "$SUITE" = bionic ]); then KERNEL_FLAVOURS=kvm else KERNEL_FLAVOURS=virtual fi else add_task install minimal standard cloud-image add_package install ubuntu-minimal KERNEL_FLAVOURS=virtual case $ARCH in armhf|arm64|ppc64el|powerpc) add_task install server ;; esac fi BINARY_REMOVE_LINUX=false OPTS="${OPTS:+$OPTS }--initramfs=none" case $ARCH in armhf) KERNEL_FLAVOURS=generic-lpae add_package install flash-kernel ;; arm64) add_package install flash-kernel ;; 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" COMPONENTS='main restricted universe multiverse' 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 tzdata add_package install fakeroot add_package install build-essential # Needed for LXD-based builds. add_package install init 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:*|kubuntu*:*|xubuntu*:*|ubuntu-mate*:*|ubuntustudio*:*|ubuntukylin*:*|ubuntu-budgie*:*) BASE_SEED='desktop' ;; lubuntu-next:*) BASE_SEED='desktop-qt' ;; lubuntu:*) BASE_SEED='desktop-gtk' ;; ubuntu-server:live) BASE_SEED='server' # subiquity is seeded but in a separate squashfs via hooks; set HOOK_SNAPS and ALL_SNAPS. HOOK_SNAPS='subiquity' ALL_SNAPS='' ;; esac if [ -n "${BASE_SEED}" ]; then SEEDS_EXPANDED=$(inheritance ${BASE_SEED}) for seed in ${SEEDS_EXPANDED}; do echo "snap: considering ${seed}" file=config/germinate-output/${seed}.snaps [ -e "${file}" ] || continue # extract the first column (snap package name) from germinate's output # translate the human-readable "foo (classic)" into a # more machine readable "foo/classic" seed_snaps=$(sed -rn '1,/-----/d;/-----/,$d; s/(.*) \|.*/\1/; s, \(classic\),/classic,; p' "${file}") for snap in ${seed_snaps}; do echo "snap: found ${snap}" # Reorder gtk-common-themes first due to LP: #1772844 if [ "${snap}" = "gtk-common-themes" ]; then ALL_SNAPS="${snap}${ALL_SNAPS:+ ${ALL_SNAPS}}" else ALL_SNAPS="${ALL_SNAPS:+${ALL_SNAPS} }${snap}" fi done done if [ -n "${ALL_SNAPS}" ] || [ -n "${HOOK_SNAPS}" ]; then echo "${ALL_SNAPS}" > config/seeded-snaps fi 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" ] && [ "$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 in armel|armhf|arm64) KERNEL_FLAVOURS="${SUBARCH:-$KERNEL_FLAVOURS}" case $SUBARCH in dove) BINARY_REMOVE_LINUX=false ;; omap) add_package install u-boot-linaro-omap3-beagle u-boot-tools BINARY_REMOVE_LINUX=false ;; omap4) case $PROJECT in ubuntu-server|ubuntu-core|base) add_package install u-boot-linaro-omap4-panda u-boot-tools ;; *) add_package install u-boot-linaro-omap4-panda u-boot-tools pvr-omap4 ;; esac BINARY_REMOVE_LINUX=false ;; mx5) COMPONENTS='main restricted universe' KERNEL_FLAVOURS=linaro-lt-mx5 add_package install flash-kernel u-boot-linaro-mx53loco u-boot-tools BINARY_REMOVE_LINUX=false ;; ac100) COMPONENTS='main restricted universe multiverse' add_package install zram-config abootimg add_package live ac100-tarball-installer BINARY_REMOVE_LINUX=false ;; raspi2) COMPONENTS='main restricted universe multiverse' add_package install linux-firmware-raspi2 u-boot-rpi flash-kernel u-boot-tools wpasupplicant BINARY_REMOVE_LINUX=false ;; raspi3) COMPONENTS='main restricted universe multiverse' KERNEL_FLAVOURS=raspi-hwe-18.04 add_package install linux-firmware-raspi2 u-boot-rpi flash-kernel u-boot-tools wpasupplicant BINARY_REMOVE_LINUX=false ;; imx6) COMPONENTS='main restricted universe multiverse' KERNEL_FLAVOURS=generic add_package install flash-kernel u-boot-tools wpasupplicant BINARY_REMOVE_LINUX=false ;; esac ;; esac case $PROJECT:${SUBPROJECT:-} in ubuntu-server:*|ubuntu-base:*|ubuntu-touch:*|ubuntu-touch-custom:*) 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 ;; esac case ${SUBPROJECT:-} in wubi) add_binary_hook build-wubildr ;; 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 \ "$@" echo "LB_CHROOT_HOOKS=\"$CHROOT_HOOKS\"" >> config/chroot echo "SUBPROJECT=\"${SUBPROJECT:-}\"" >> config/chroot echo "LB_DISTRIBUTION=\"$SUITE\"" >> config/chroot 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 "IMAGEFORMAT=\"$IMAGEFORMAT\"" >> config/chroot echo "SUBARCH=\"$SUBARCH\"" >> config/chroot case $ARCH+$SUBARCH in armhf+raspi2|armhf+raspi3|arm64+raspi3) cat > config/hooks/01-firmware-directory.chroot_early < config/hooks/999-raspi2-fixes.chroot <> /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 < 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 < 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 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-touch:*|ubuntu-touch-custom:*|ubuntu-core:system-image|ubuntu-desktop-next:system-image|ubuntu-cpc:*|ubuntu-server:live|ubuntu:desktop-preinstalled) # 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" ]; 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 <> 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 case ${SUBPROJECT:-} in ubuntu-rtm|ubuntu-rtm/*) # debootstrap doesn't know about ubuntu-rtm series directly. Rather # than having to teach it, we employ a few hacks to make it use the # Ubuntu script instead. mkdir -p config/fake_debootstrap_dir/scripts ln -s /usr/share/debootstrap/devices.tar.gz \ config/fake_debootstrap_dir/ ln -s /usr/share/debootstrap/functions config/fake_debootstrap_dir/ ln -s /usr/share/debootstrap/scripts/gutsy \ "config/fake_debootstrap_dir/scripts/$SUITE" echo 'export DEBOOTSTRAP_DIR="$PWD/config/fake_debootstrap_dir"' \ >> config/bootstrap ;; esac 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 <