162fed16cSGlen Barber#!/bin/sh 262fed16cSGlen Barber#- 333f38c8aSGlen Barber# Copyright (c) 2020-2021 Rubicon Communications, LLC (netgate.com) 4bee3d446SGlen Barber# Copyright (c) 2013-2019 The FreeBSD Foundation 562fed16cSGlen Barber# Copyright (c) 2013 Glen Barber 662fed16cSGlen Barber# Copyright (c) 2011 Nathan Whitehorn 762fed16cSGlen Barber# All rights reserved. 862fed16cSGlen Barber# 99bb84a63SGlen Barber# Portions of this software were developed by Glen Barber 109bb84a63SGlen Barber# under sponsorship from the FreeBSD Foundation. 119bb84a63SGlen Barber# 1262fed16cSGlen Barber# Redistribution and use in source and binary forms, with or without 1362fed16cSGlen Barber# modification, are permitted provided that the following conditions 1462fed16cSGlen Barber# are met: 1562fed16cSGlen Barber# 1. Redistributions of source code must retain the above copyright 1662fed16cSGlen Barber# notice, this list of conditions and the following disclaimer. 1762fed16cSGlen Barber# 2. Redistributions in binary form must reproduce the above copyright 1862fed16cSGlen Barber# notice, this list of conditions and the following disclaimer in the 1962fed16cSGlen Barber# documentation and/or other materials provided with the distribution. 2062fed16cSGlen Barber# 2162fed16cSGlen Barber# THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 2262fed16cSGlen Barber# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 2362fed16cSGlen Barber# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 2462fed16cSGlen Barber# ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 2562fed16cSGlen Barber# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 2662fed16cSGlen Barber# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 2762fed16cSGlen Barber# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 2862fed16cSGlen Barber# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 2962fed16cSGlen Barber# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 3062fed16cSGlen Barber# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 3162fed16cSGlen Barber# SUCH DAMAGE. 3262fed16cSGlen Barber# 3362fed16cSGlen Barber# release.sh: check out source trees, and build release components with 3462fed16cSGlen Barber# totally clean, fresh trees. 3562fed16cSGlen Barber# Based on release/generate-release.sh written by Nathan Whitehorn 3662fed16cSGlen Barber# 3762fed16cSGlen Barber 385dbf38dcSGlen Barberexport PATH="/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin" 3962fed16cSGlen Barber 4066fe2befSGlen BarberVERSION=3 4162fed16cSGlen Barber 4295d901dbSGlen Barber# Prototypes that can be redefined per-chroot or per-target. 4395d901dbSGlen Barberload_chroot_env() { } 4495d901dbSGlen Barberload_target_env() { } 456b1cf1b2SGlen Barberbuildenv_setup() { } 4695d901dbSGlen Barber 47fb539361SGlen Barberusage() { 48fb539361SGlen Barber echo "Usage: $0 [-c release.conf]" 49fb539361SGlen Barber exit 1 50fb539361SGlen Barber} 51fb539361SGlen Barber 52a12fa249SGlen Barber# env_setup(): Set up the default build environment variables, such as the 5366fe2befSGlen Barber# CHROOTDIR, VCSCMD, GITROOT, etc. This is called before the release.conf 54a12fa249SGlen Barber# file is sourced, if '-c <release.conf>' is specified. 55fb539361SGlen Barberenv_setup() { 5662fed16cSGlen Barber # The directory within which the release will be built. 5762fed16cSGlen Barber CHROOTDIR="/scratch" 585fb8eca8SGlen Barber if [ -z "${RELENGDIR}" ]; then 595fb8eca8SGlen Barber export RELENGDIR="$(dirname $(realpath ${0}))" 605fb8eca8SGlen Barber fi 6162fed16cSGlen Barber 629bb84a63SGlen Barber # The default version control system command to obtain the sources. 635dbf38dcSGlen Barber for _dir in /usr/bin /usr/local/bin; do 6466fe2befSGlen Barber [ -x "${_dir}/git" ] && VCSCMD="/${_dir}/git" 655dbf38dcSGlen Barber [ ! -z "${VCSCMD}" ] && break 2 665dbf38dcSGlen Barber done 679bb84a63SGlen Barber 6891ce4699SGlen Barber if [ -z "${VCSCMD}" -a -z "${NOGIT}" ]; then 6966fe2befSGlen Barber echo "*** The devel/git port/package is required." 7066fe2befSGlen Barber exit 1 7166fe2befSGlen Barber fi 7286e5b137SGlen Barber VCSCMD="/usr/local/bin/git clone -q" 7366fe2befSGlen Barber 7466fe2befSGlen Barber # The default git checkout server, and branches for src/, doc/, 7562fed16cSGlen Barber # and ports/. 7670e64ba4SGlen Barber GITROOT="https://git.FreeBSD.org/" 7766fe2befSGlen Barber SRCBRANCH="main" 783f25cfeaSGlen Barber PORTBRANCH="main" 7966fe2befSGlen Barber GITSRC="src.git" 8066fe2befSGlen Barber GITPORTS="ports.git" 8162fed16cSGlen Barber 8234d63eb5SGlen Barber # Set for embedded device builds. 8334d63eb5SGlen Barber EMBEDDEDBUILD= 8434d63eb5SGlen Barber 8562fed16cSGlen Barber # The default make.conf and src.conf to use. Set to /dev/null 8662fed16cSGlen Barber # by default to avoid polluting the chroot(8) environment with 8762fed16cSGlen Barber # non-default settings. 8862fed16cSGlen Barber MAKE_CONF="/dev/null" 8962fed16cSGlen Barber SRC_CONF="/dev/null" 9062fed16cSGlen Barber 917290c839SGlen Barber # The number of make(1) jobs, defaults to the number of CPUs available 922c01e189SColin Percival # for buildworld, and half of number of CPUs available for buildkernel 932c01e189SColin Percival # and 'make release'. 942e314957SGlen Barber WORLD_FLAGS="-j$(sysctl -n hw.ncpu)" 952e314957SGlen Barber KERNEL_FLAGS="-j$(( $(( $(sysctl -n hw.ncpu) + 1 )) / 2))" 962c01e189SColin Percival RELEASE_FLAGS="-j$(( $(( $(sysctl -n hw.ncpu) + 1 )) / 2))" 972e314957SGlen Barber 9862fed16cSGlen Barber MAKE_FLAGS="-s" 9962fed16cSGlen Barber 10062fed16cSGlen Barber # The name of the kernel to build, defaults to GENERIC. 10162fed16cSGlen Barber KERNEL="GENERIC" 10262fed16cSGlen Barber 1037290c839SGlen Barber # Set to non-empty value to disable checkout of doc/ and/or ports/. 10462fed16cSGlen Barber NOPORTS= 10562fed16cSGlen Barber 106c6750673SRenato Botelho # Set to non-empty value to disable distributing source tree. 107c6750673SRenato Botelho NOSRC= 108c6750673SRenato Botelho 1091d75f174SGlen Barber # Set to non-empty value to build dvd1.iso as part of the release. 1101d75f174SGlen Barber WITH_DVD= 111cbc0e08aSGlen Barber WITH_COMPRESSED_IMAGES= 1121d75f174SGlen Barber 113a9278c16SGlen Barber # Set to non-empty value to build virtual machine images as part of 114a9278c16SGlen Barber # the release. 115a9278c16SGlen Barber WITH_VMIMAGES= 116a9278c16SGlen Barber WITH_COMPRESSED_VMIMAGES= 1171db29719SGlen Barber XZ_THREADS=0 118a9278c16SGlen Barber 11921f93dedSGlen Barber # Set to non-empty value to build virtual machine images for various 12021f93dedSGlen Barber # cloud providers as part of the release. 12121f93dedSGlen Barber WITH_CLOUDWARE= 12221f93dedSGlen Barber 123*d03c82c2SDoug Rabson # Set to non-empty to build OCI images as part of the release 124*d03c82c2SDoug Rabson WITH_OCIIMAGES= 125*d03c82c2SDoug Rabson 126fb539361SGlen Barber return 0 127fb539361SGlen Barber} # env_setup() 12862fed16cSGlen Barber 129a12fa249SGlen Barber# env_check(): Perform sanity tests on the build environment, such as ensuring 130a12fa249SGlen Barber# files/directories exist, as well as adding backwards-compatibility hacks if 131a12fa249SGlen Barber# necessary. This is called unconditionally, and overrides the defaults set 132a12fa249SGlen Barber# in env_setup() if '-c <release.conf>' is specified. 133fb539361SGlen Barberenv_check() { 1349056dae9SGlen Barber chroot_build_release_cmd="chroot_build_release" 1359362e2bcSGlen Barber 13666fe2befSGlen Barber # Prefix the branches with the GITROOT for the full checkout URL. 13766fe2befSGlen Barber SRC="${GITROOT}${GITSRC}" 1383f25cfeaSGlen Barber PORT="${GITROOT}${GITPORTS}" 1399bb84a63SGlen Barber 140e0436612SGlen Barber if [ -n "${EMBEDDEDBUILD}" ]; then 14134d63eb5SGlen Barber WITH_DVD= 142cbc0e08aSGlen Barber WITH_COMPRESSED_IMAGES= 1439056dae9SGlen Barber case ${EMBEDDED_TARGET}:${EMBEDDED_TARGET_ARCH} in 14486635d49SMitchell Horne arm:arm*|arm64:aarch64|riscv:riscv64*) 145751c20d8SGlen Barber chroot_build_release_cmd="chroot_arm_build_release" 1469056dae9SGlen Barber ;; 1479056dae9SGlen Barber *) 148751c20d8SGlen Barber ;; 1499056dae9SGlen Barber esac 15034d63eb5SGlen Barber fi 15134d63eb5SGlen Barber 152f61e92caSGlen Barber # If NOSRC and/or NOPORTS are unset, they must not pass to make 153c6750673SRenato Botelho # as variables. The release makefile verifies definedness of the 154f61e92caSGlen Barber # NOPORTS variable instead of its value. 155f61e92caSGlen Barber SRCPORTS= 156e0436612SGlen Barber if [ -n "${NOPORTS}" ]; then 157f61e92caSGlen Barber SRCPORTS="NOPORTS=yes" 158c6750673SRenato Botelho fi 159c6750673SRenato Botelho if [ -n "${NOSRC}" ]; then 160f61e92caSGlen Barber SRCPORTS="${SRCPORTS}${SRCPORTS:+ }NOSRC=yes" 16174e0b3f1SGlen Barber fi 16274e0b3f1SGlen Barber 16362fed16cSGlen Barber # The aggregated build-time flags based upon variables defined within 16462fed16cSGlen Barber # this file, unless overridden by release.conf. In most cases, these 16562fed16cSGlen Barber # will not need to be changed. 16662fed16cSGlen Barber CONF_FILES="__MAKE_CONF=${MAKE_CONF} SRCCONF=${SRC_CONF}" 1670af8a2dbSGlen Barber NOCONF_FILES="__MAKE_CONF=/dev/null SRCCONF=/dev/null" 168e0436612SGlen Barber if [ -n "${TARGET}" ] && [ -n "${TARGET_ARCH}" ]; then 16962fed16cSGlen Barber ARCH_FLAGS="TARGET=${TARGET} TARGET_ARCH=${TARGET_ARCH}" 170a1020436SGlen Barber else 171a1020436SGlen Barber ARCH_FLAGS= 172a1020436SGlen Barber fi 17362fed16cSGlen Barber 174e0436612SGlen Barber if [ -z "${CHROOTDIR}" ]; then 17562fed16cSGlen Barber echo "Please set CHROOTDIR." 17662fed16cSGlen Barber exit 1 17762fed16cSGlen Barber fi 17862fed16cSGlen Barber 17962fed16cSGlen Barber if [ $(id -u) -ne 0 ]; then 18062fed16cSGlen Barber echo "Needs to be run as root." 18162fed16cSGlen Barber exit 1 18262fed16cSGlen Barber fi 18362fed16cSGlen Barber 184afac3ed6SGlen Barber # Unset CHROOTBUILD_SKIP if the chroot(8) does not appear to exist. 185afac3ed6SGlen Barber if [ ! -z "${CHROOTBUILD_SKIP}" -a ! -e ${CHROOTDIR}/bin/sh ]; then 186afac3ed6SGlen Barber CHROOTBUILD_SKIP= 187afac3ed6SGlen Barber fi 188afac3ed6SGlen Barber 1893ddb84b3SGlen Barber CHROOT_MAKEENV="${CHROOT_MAKEENV} \ 1903ddb84b3SGlen Barber MAKEOBJDIRPREFIX=${CHROOTDIR}/tmp/obj" 1910af8a2dbSGlen Barber CHROOT_WMAKEFLAGS="${MAKE_FLAGS} ${WORLD_FLAGS} ${NOCONF_FILES}" 1920af8a2dbSGlen Barber CHROOT_IMAKEFLAGS="${WORLD_FLAGS} ${NOCONF_FILES}" 1930af8a2dbSGlen Barber CHROOT_DMAKEFLAGS="${WORLD_FLAGS} ${NOCONF_FILES}" 1943ddb84b3SGlen Barber RELEASE_WMAKEFLAGS="${MAKE_FLAGS} ${WORLD_FLAGS} ${ARCH_FLAGS} \ 1953ddb84b3SGlen Barber ${CONF_FILES}" 1963ddb84b3SGlen Barber RELEASE_KMAKEFLAGS="${MAKE_FLAGS} ${KERNEL_FLAGS} \ 1973ddb84b3SGlen Barber KERNCONF=\"${KERNEL}\" ${ARCH_FLAGS} ${CONF_FILES}" 1982c01e189SColin Percival RELEASE_RMAKEFLAGS="${ARCH_FLAGS} ${RELEASE_FLAGS} \ 199f61e92caSGlen Barber KERNCONF=\"${KERNEL}\" ${CONF_FILES} ${SRCPORTS} \ 2003ddb84b3SGlen Barber WITH_DVD=${WITH_DVD} WITH_VMIMAGES=${WITH_VMIMAGES} \ 201*d03c82c2SDoug Rabson WITH_CLOUDWARE=${WITH_CLOUDWARE} WITH_OCIIMAGES=${WITH_OCIIMAGES} \ 202*d03c82c2SDoug Rabson XZ_THREADS=${XZ_THREADS}" 20362fed16cSGlen Barber 204fb539361SGlen Barber return 0 205fb539361SGlen Barber} # env_check() 20662fed16cSGlen Barber 207a12fa249SGlen Barber# chroot_setup(): Prepare the build chroot environment for the release build. 208fb539361SGlen Barberchroot_setup() { 209fb539361SGlen Barber load_chroot_env 21062fed16cSGlen Barber mkdir -p ${CHROOTDIR}/usr 21162fed16cSGlen Barber 2123e64b4c5SGlen Barber if [ -z "${SRC_UPDATE_SKIP}" ]; then 2138ea469ebSGlen Barber if [ -d "${CHROOTDIR}/usr/src/.git" ]; then 2145f1198f3SGlen Barber git -C ${CHROOTDIR}/usr/src pull -q 21591edfc6cSGlen Barber else 21666fe2befSGlen Barber ${VCSCMD} ${SRC} -b ${SRCBRANCH} ${CHROOTDIR}/usr/src 2173e64b4c5SGlen Barber fi 21891edfc6cSGlen Barber fi 2193e64b4c5SGlen Barber if [ -z "${NOPORTS}" ] && [ -z "${PORTS_UPDATE_SKIP}" ]; then 220fb6e261cSGlen Barber if [ -d "${CHROOTDIR}/usr/ports/.git" ]; then 221fb6e261cSGlen Barber git -C ${CHROOTDIR}/usr/ports pull -q 222c0dbc49aSGlen Barber else 223c0dbc49aSGlen Barber ${VCSCMD} ${PORT} -b ${PORTBRANCH} ${CHROOTDIR}/usr/ports 22462fed16cSGlen Barber fi 22591edfc6cSGlen Barber fi 22662fed16cSGlen Barber 227e0436612SGlen Barber if [ -z "${CHROOTBUILD_SKIP}" ]; then 22862fed16cSGlen Barber cd ${CHROOTDIR}/usr/src 2296a1456ccSJulio Merino env ${CHROOT_MAKEENV} make ${CHROOT_WMAKEFLAGS} buildworld 2306a1456ccSJulio Merino env ${CHROOT_MAKEENV} make ${CHROOT_IMAKEFLAGS} installworld \ 2316a1456ccSJulio Merino DESTDIR=${CHROOTDIR} 2326a1456ccSJulio Merino env ${CHROOT_MAKEENV} make ${CHROOT_DMAKEFLAGS} distribution \ 2336a1456ccSJulio Merino DESTDIR=${CHROOTDIR} 234e0436612SGlen Barber fi 23562fed16cSGlen Barber 236fb539361SGlen Barber return 0 237fb539361SGlen Barber} # chroot_setup() 238fb539361SGlen Barber 239a12fa249SGlen Barber# extra_chroot_setup(): Prepare anything additional within the build 240a12fa249SGlen Barber# necessary for the release build. 241fb539361SGlen Barberextra_chroot_setup() { 242befaadd5SGlen Barber mkdir -p ${CHROOTDIR}/dev 2433c9143a8SGlen Barber mount -t devfs devfs ${CHROOTDIR}/dev 244d294a524SGlen Barber [ -e /etc/resolv.conf -a ! -e ${CHROOTDIR}/etc/resolv.conf ] && \ 245d294a524SGlen Barber cp /etc/resolv.conf ${CHROOTDIR}/etc/resolv.conf 2463c9143a8SGlen Barber # Run ldconfig(8) in the chroot directory so /var/run/ld-elf*.so.hints 2473c9143a8SGlen Barber # is created. This is needed by ports-mgmt/pkg. 2483c9143a8SGlen Barber eval chroot ${CHROOTDIR} /etc/rc.d/ldconfig forcerestart 2493c9143a8SGlen Barber 2507290c839SGlen Barber # If MAKE_CONF and/or SRC_CONF are set and not character devices 2517290c839SGlen Barber # (/dev/null), copy them to the chroot. 25213f89623SGlen Barber if [ -e ${MAKE_CONF} ] && [ ! -c ${MAKE_CONF} ]; then 25313f89623SGlen Barber mkdir -p ${CHROOTDIR}/$(dirname ${MAKE_CONF}) 25413f89623SGlen Barber cp ${MAKE_CONF} ${CHROOTDIR}/${MAKE_CONF} 25513f89623SGlen Barber fi 25613f89623SGlen Barber if [ -e ${SRC_CONF} ] && [ ! -c ${SRC_CONF} ]; then 25713f89623SGlen Barber mkdir -p ${CHROOTDIR}/$(dirname ${SRC_CONF}) 25813f89623SGlen Barber cp ${SRC_CONF} ${CHROOTDIR}/${SRC_CONF} 25913f89623SGlen Barber fi 26013f89623SGlen Barber 261eade3535SGlen Barber _gitcmd="$(which git)" 2626baddb6bSColin Percival if [ -z "${NOGIT}" -a -z "${_gitcmd}" ]; then 2636baddb6bSColin Percival # Install git from ports if the ports tree is available; 2646baddb6bSColin Percival # otherwise install the pkg. 2656baddb6bSColin Percival if [ -d ${CHROOTDIR}/usr/ports ]; then 26666fe2befSGlen Barber # Trick the ports 'run-autotools-fixup' target to do the right 26766fe2befSGlen Barber # thing. 26866fe2befSGlen Barber _OSVERSION=$(chroot ${CHROOTDIR} /usr/bin/uname -U) 26966fe2befSGlen Barber REVISION=$(chroot ${CHROOTDIR} make -C /usr/src/release -V REVISION) 27066fe2befSGlen Barber BRANCH=$(chroot ${CHROOTDIR} make -C /usr/src/release -V BRANCH) 27166fe2befSGlen Barber UNAME_r=${REVISION}-${BRANCH} 27266fe2befSGlen Barber GITUNSETOPTS="CONTRIB CURL CVS GITWEB GUI HTMLDOCS" 27366fe2befSGlen Barber GITUNSETOPTS="${GITUNSETOPTS} ICONV NLS P4 PERL" 27466fe2befSGlen Barber GITUNSETOPTS="${GITUNSETOPTS} SEND_EMAIL SUBTREE SVN" 27566fe2befSGlen Barber GITUNSETOPTS="${GITUNSETOPTS} PCRE PCRE2" 2766462113bSGlen Barber PBUILD_FLAGS="OSVERSION=${_OSVERSION} BATCH=yes" 2776462113bSGlen Barber PBUILD_FLAGS="${PBUILD_FLAGS} UNAME_r=${UNAME_r}" 2786462113bSGlen Barber PBUILD_FLAGS="${PBUILD_FLAGS} OSREL=${REVISION}" 2796462113bSGlen Barber PBUILD_FLAGS="${PBUILD_FLAGS} WRKDIRPREFIX=/tmp/ports" 2806462113bSGlen Barber PBUILD_FLAGS="${PBUILD_FLAGS} DISTDIR=/tmp/distfiles" 281bee3d446SGlen Barber eval chroot ${CHROOTDIR} env OPTIONS_UNSET=\"${GITUNSETOPTS}\" \ 2826462113bSGlen Barber ${PBUILD_FLAGS} \ 28364f0728eSGlen Barber make -C /usr/ports/devel/git FORCE_PKG_REGISTER=1 \ 28466fe2befSGlen Barber WRKDIRPREFIX=/tmp/ports \ 28566fe2befSGlen Barber DISTDIR=/tmp/distfiles \ 28666fe2befSGlen Barber install clean distclean 2878f82b5d4SGlen Barber else 2888f82b5d4SGlen Barber eval chroot ${CHROOTDIR} env ASSUME_ALWAYS_YES=yes \ 2898f82b5d4SGlen Barber pkg install -y devel/git 2908f82b5d4SGlen Barber eval chroot ${CHROOTDIR} env ASSUME_ALWAYS_YES=yes \ 2918f82b5d4SGlen Barber pkg clean -y 29266fe2befSGlen Barber fi 29391ce4699SGlen Barber fi 29462fed16cSGlen Barber 295*d03c82c2SDoug Rabson if [ ! -z "${WITH_OCIIMAGES}" ]; then 296*d03c82c2SDoug Rabson # Install buildah and skopeo from ports if the ports tree is available; 297*d03c82c2SDoug Rabson # otherwise install the pkg. 298*d03c82c2SDoug Rabson if [ -d ${CHROOTDIR}/usr/ports ]; then 299*d03c82c2SDoug Rabson # Trick the ports 'run-autotools-fixup' target to do the right 300*d03c82c2SDoug Rabson # thing. 301*d03c82c2SDoug Rabson _OSVERSION=$(chroot ${CHROOTDIR} /usr/bin/uname -U) 302*d03c82c2SDoug Rabson REVISION=$(chroot ${CHROOTDIR} make -C /usr/src/release -V REVISION) 303*d03c82c2SDoug Rabson BRANCH=$(chroot ${CHROOTDIR} make -C /usr/src/release -V BRANCH) 304*d03c82c2SDoug Rabson UNAME_r=${REVISION}-${BRANCH} 305*d03c82c2SDoug Rabson GITUNSETOPTS="CONTRIB CURL CVS GITWEB GUI HTMLDOCS" 306*d03c82c2SDoug Rabson GITUNSETOPTS="${GITUNSETOPTS} ICONV NLS P4 PERL" 307*d03c82c2SDoug Rabson GITUNSETOPTS="${GITUNSETOPTS} SEND_EMAIL SUBTREE SVN" 308*d03c82c2SDoug Rabson GITUNSETOPTS="${GITUNSETOPTS} PCRE PCRE2" 309*d03c82c2SDoug Rabson PBUILD_FLAGS="OSVERSION=${_OSVERSION} BATCH=yes" 310*d03c82c2SDoug Rabson PBUILD_FLAGS="${PBUILD_FLAGS} UNAME_r=${UNAME_r}" 311*d03c82c2SDoug Rabson PBUILD_FLAGS="${PBUILD_FLAGS} OSREL=${REVISION}" 312*d03c82c2SDoug Rabson PBUILD_FLAGS="${PBUILD_FLAGS} WRKDIRPREFIX=/tmp/ports" 313*d03c82c2SDoug Rabson PBUILD_FLAGS="${PBUILD_FLAGS} DISTDIR=/tmp/distfiles" 314*d03c82c2SDoug Rabson for _PORT in sysutils/buildah sysutils/skopeo; do 315*d03c82c2SDoug Rabson eval chroot ${CHROOTDIR} env ${PBUILD_FLAGS} make -C \ 316*d03c82c2SDoug Rabson /usr/ports/${_PORT} \ 317*d03c82c2SDoug Rabson FORCE_PKG_REGISTER=1 deinstall install clean distclean 318*d03c82c2SDoug Rabson done 319*d03c82c2SDoug Rabson else 320*d03c82c2SDoug Rabson eval chroot ${CHROOTDIR} env ASSUME_ALWAYS_YES=yes \ 321*d03c82c2SDoug Rabson pkg install -y sysutils/buildah sysutils/skopeo 322*d03c82c2SDoug Rabson eval chroot ${CHROOTDIR} env ASSUME_ALWAYS_YES=yes \ 323*d03c82c2SDoug Rabson pkg clean -y 324*d03c82c2SDoug Rabson fi 325*d03c82c2SDoug Rabson # Use the vfs storage driver so that this works whether or not 326*d03c82c2SDoug Rabson # the build directory is on ZFS. The images are small so the 327*d03c82c2SDoug Rabson # performance difference is negligible. 328*d03c82c2SDoug Rabson eval chroot ${CHROOTDIR} sed -I .bak -e '/^driver/s/zfs/vfs/' /usr/local/etc/containers/storage.conf 329*d03c82c2SDoug Rabson # Remove any stray images from previous builds 330*d03c82c2SDoug Rabson eval chroot ${CHROOTDIR} buildah rmi -af 331*d03c82c2SDoug Rabson fi 332*d03c82c2SDoug Rabson 333a0312883SGlen Barber if [ ! -z "${EMBEDDEDPORTS}" ]; then 334256bf412SGlen Barber _OSVERSION=$(chroot ${CHROOTDIR} /usr/bin/uname -U) 335256bf412SGlen Barber REVISION=$(chroot ${CHROOTDIR} make -C /usr/src/release -V REVISION) 336256bf412SGlen Barber BRANCH=$(chroot ${CHROOTDIR} make -C /usr/src/release -V BRANCH) 3376462113bSGlen Barber UNAME_r=${REVISION}-${BRANCH} 338256bf412SGlen Barber PBUILD_FLAGS="OSVERSION=${_OSVERSION} BATCH=yes" 339256bf412SGlen Barber PBUILD_FLAGS="${PBUILD_FLAGS} UNAME_r=${UNAME_r}" 340256bf412SGlen Barber PBUILD_FLAGS="${PBUILD_FLAGS} OSREL=${REVISION}" 34130ba43e1SGlen Barber PBUILD_FLAGS="${PBUILD_FLAGS} WRKDIRPREFIX=/tmp/ports" 34230ba43e1SGlen Barber PBUILD_FLAGS="${PBUILD_FLAGS} DISTDIR=/tmp/distfiles" 343a0312883SGlen Barber for _PORT in ${EMBEDDEDPORTS}; do 34430ba43e1SGlen Barber eval chroot ${CHROOTDIR} env ${PBUILD_FLAGS} make -C \ 34530ba43e1SGlen Barber /usr/ports/${_PORT} \ 3468608db1eSEmmanuel Vadot FORCE_PKG_REGISTER=1 deinstall install clean distclean 347a0312883SGlen Barber done 348a0312883SGlen Barber fi 349a0312883SGlen Barber 3506b1cf1b2SGlen Barber buildenv_setup 35157dbde2cSGlen Barber 352fb539361SGlen Barber return 0 353fb539361SGlen Barber} # extra_chroot_setup() 354fb539361SGlen Barber 355a12fa249SGlen Barber# chroot_build_target(): Build the userland and kernel for the build target. 356fb539361SGlen Barberchroot_build_target() { 35795d901dbSGlen Barber load_target_env 358cf582ac5SGlen Barber if [ ! -z "${EMBEDDEDBUILD}" ]; then 359cf582ac5SGlen Barber RELEASE_WMAKEFLAGS="${RELEASE_WMAKEFLAGS} \ 360cf582ac5SGlen Barber TARGET=${EMBEDDED_TARGET} \ 361cf582ac5SGlen Barber TARGET_ARCH=${EMBEDDED_TARGET_ARCH}" 362cf582ac5SGlen Barber RELEASE_KMAKEFLAGS="${RELEASE_KMAKEFLAGS} \ 363cf582ac5SGlen Barber TARGET=${EMBEDDED_TARGET} \ 364cf582ac5SGlen Barber TARGET_ARCH=${EMBEDDED_TARGET_ARCH}" 365cf582ac5SGlen Barber fi 36674e0b3f1SGlen Barber eval chroot ${CHROOTDIR} make -C /usr/src ${RELEASE_WMAKEFLAGS} buildworld 36774e0b3f1SGlen Barber eval chroot ${CHROOTDIR} make -C /usr/src ${RELEASE_KMAKEFLAGS} buildkernel 368*d03c82c2SDoug Rabson if [ ! -z "${WITH_OCIIMAGES}" ]; then 369*d03c82c2SDoug Rabson eval chroot ${CHROOTDIR} make -C /usr/src ${RELEASE_WMAKEFLAGS} packages 370*d03c82c2SDoug Rabson fi 371fb539361SGlen Barber 3728501ddabSGlen Barber return 0 3738501ddabSGlen Barber} # chroot_build_target 3748501ddabSGlen Barber 3758501ddabSGlen Barber# chroot_build_release(): Invoke the 'make release' target. 3768501ddabSGlen Barberchroot_build_release() { 3778501ddabSGlen Barber load_target_env 378a312aae5SGlen Barber if [ ! -z "${WITH_VMIMAGES}" ]; then 379a312aae5SGlen Barber if [ -z "${VMFORMATS}" ]; then 380a312aae5SGlen Barber VMFORMATS="$(eval chroot ${CHROOTDIR} \ 381a312aae5SGlen Barber make -C /usr/src/release -V VMFORMATS)" 382a312aae5SGlen Barber fi 383a312aae5SGlen Barber if [ -z "${VMSIZE}" ]; then 384a312aae5SGlen Barber VMSIZE="$(eval chroot ${CHROOTDIR} \ 385ed807f7bSColin Percival make -C /usr/src/release ${ARCH_FLAGS} -V VMSIZE)" 386a312aae5SGlen Barber fi 38723839787SGlen Barber RELEASE_RMAKEFLAGS="${RELEASE_RMAKEFLAGS} \ 38823839787SGlen Barber VMFORMATS=\"${VMFORMATS}\" VMSIZE=${VMSIZE}" 389a312aae5SGlen Barber fi 3908501ddabSGlen Barber eval chroot ${CHROOTDIR} make -C /usr/src/release \ 3918501ddabSGlen Barber ${RELEASE_RMAKEFLAGS} release 3928501ddabSGlen Barber eval chroot ${CHROOTDIR} make -C /usr/src/release \ 3938501ddabSGlen Barber ${RELEASE_RMAKEFLAGS} install DESTDIR=/R \ 3948501ddabSGlen Barber WITH_COMPRESSED_IMAGES=${WITH_COMPRESSED_IMAGES} \ 395a9278c16SGlen Barber WITH_COMPRESSED_VMIMAGES=${WITH_COMPRESSED_VMIMAGES} 396fb539361SGlen Barber 397fb539361SGlen Barber return 0 398fb539361SGlen Barber} # chroot_build_release() 399fb539361SGlen Barber 40043e289dfSEmmanuel Vadotefi_boot_name() 40143e289dfSEmmanuel Vadot{ 40243e289dfSEmmanuel Vadot case $1 in 40343e289dfSEmmanuel Vadot arm) 40443e289dfSEmmanuel Vadot echo "bootarm.efi" 40543e289dfSEmmanuel Vadot ;; 40643e289dfSEmmanuel Vadot arm64) 40743e289dfSEmmanuel Vadot echo "bootaa64.efi" 40843e289dfSEmmanuel Vadot ;; 40943e289dfSEmmanuel Vadot amd64) 4103163f6aaSEmmanuel Vadot echo "bootx64.efi" 41143e289dfSEmmanuel Vadot ;; 41286635d49SMitchell Horne riscv) 41386635d49SMitchell Horne echo "bootriscv64.efi" 41486635d49SMitchell Horne ;; 41543e289dfSEmmanuel Vadot esac 41643e289dfSEmmanuel Vadot} 41743e289dfSEmmanuel Vadot 418751c20d8SGlen Barber# chroot_arm_build_release(): Create arm SD card image. 419751c20d8SGlen Barberchroot_arm_build_release() { 4209056dae9SGlen Barber load_target_env 421751c20d8SGlen Barber case ${EMBEDDED_TARGET} in 42286635d49SMitchell Horne arm|arm64|riscv) 423751c20d8SGlen Barber if [ -e "${RELENGDIR}/tools/arm.subr" ]; then 424751c20d8SGlen Barber . "${RELENGDIR}/tools/arm.subr" 4259056dae9SGlen Barber fi 426751c20d8SGlen Barber ;; 427751c20d8SGlen Barber *) 428751c20d8SGlen Barber ;; 429751c20d8SGlen Barber esac 43088feae84SGlen Barber [ ! -z "${RELEASECONF}" ] && . "${RELEASECONF}" 431bb0c3a6bSGlen Barber export MAKE_FLAGS="${MAKE_FLAGS} TARGET=${EMBEDDED_TARGET}" 432bb0c3a6bSGlen Barber export MAKE_FLAGS="${MAKE_FLAGS} TARGET_ARCH=${EMBEDDED_TARGET_ARCH}" 433c1f64992SGlen Barber export MAKE_FLAGS="${MAKE_FLAGS} ${CONF_FILES}" 434bb0c3a6bSGlen Barber eval chroot ${CHROOTDIR} env WITH_UNIFIED_OBJDIR=1 make ${MAKE_FLAGS} -C /usr/src/release obj 435bb0c3a6bSGlen Barber export WORLDDIR="$(eval chroot ${CHROOTDIR} make ${MAKE_FLAGS} -C /usr/src/release -V WORLDDIR)" 436bb0c3a6bSGlen Barber export OBJDIR="$(eval chroot ${CHROOTDIR} env WITH_UNIFIED_OBJDIR=1 make ${MAKE_FLAGS} -C /usr/src/release -V .OBJDIR)" 437bb0c3a6bSGlen Barber export DESTDIR="${OBJDIR}/${KERNEL}" 4383d62046dSEmmanuel Vadot export IMGBASE="${CHROOTDIR}/${OBJDIR}/${BOARDNAME}.img" 439bb0c3a6bSGlen Barber export OSRELEASE="$(eval chroot ${CHROOTDIR} make ${MAKE_FLAGS} -C /usr/src/release \ 440b3e7a59bSGlen Barber TARGET=${EMBEDDED_TARGET} TARGET_ARCH=${EMBEDDED_TARGET_ARCH} \ 441b3e7a59bSGlen Barber -V OSRELEASE)" 44288feae84SGlen Barber chroot ${CHROOTDIR} mkdir -p ${DESTDIR} 44388feae84SGlen Barber chroot ${CHROOTDIR} truncate -s ${IMAGE_SIZE} ${IMGBASE##${CHROOTDIR}} 44488feae84SGlen Barber export mddev=$(chroot ${CHROOTDIR} \ 44588feae84SGlen Barber mdconfig -f ${IMGBASE##${CHROOTDIR}} ${MD_ARGS}) 4464ad8b75dSGlen Barber arm_create_disk 4474ad8b75dSGlen Barber arm_install_base 44843e289dfSEmmanuel Vadot arm_install_boot 4494ad8b75dSGlen Barber arm_install_uboot 450ac1401b2SGlen Barber mdconfig -d -u ${mddev} 45188feae84SGlen Barber chroot ${CHROOTDIR} rmdir ${DESTDIR} 4523d62046dSEmmanuel Vadot mv ${IMGBASE} ${CHROOTDIR}/${OBJDIR}/${OSRELEASE}-${BOARDNAME}.img 45399cf2362SGlen Barber chroot ${CHROOTDIR} mkdir -p /R 4543d62046dSEmmanuel Vadot chroot ${CHROOTDIR} cp -p ${OBJDIR}/${OSRELEASE}-${BOARDNAME}.img \ 4553d62046dSEmmanuel Vadot /R/${OSRELEASE}-${BOARDNAME}.img 4563d62046dSEmmanuel Vadot chroot ${CHROOTDIR} xz -T ${XZ_THREADS} /R/${OSRELEASE}-${BOARDNAME}.img 45734187a08SGlen Barber cd ${CHROOTDIR}/R && sha512 ${OSRELEASE}* \ 45834187a08SGlen Barber > CHECKSUM.SHA512 4599fcdd5a3SGlen Barber cd ${CHROOTDIR}/R && sha256 ${OSRELEASE}* \ 4609fcdd5a3SGlen Barber > CHECKSUM.SHA256 4619056dae9SGlen Barber 4629056dae9SGlen Barber return 0 463751c20d8SGlen Barber} # chroot_arm_build_release() 4649056dae9SGlen Barber 465a12fa249SGlen Barber# main(): Start here. 466fb539361SGlen Barbermain() { 467fb539361SGlen Barber set -e # Everything must succeed 468fb539361SGlen Barber env_setup 469fb539361SGlen Barber while getopts c: opt; do 470fb539361SGlen Barber case ${opt} in 471fb539361SGlen Barber c) 472dae40fc1SGlen Barber RELEASECONF="$(realpath ${OPTARG})" 473fb539361SGlen Barber ;; 474fb539361SGlen Barber \?) 475fb539361SGlen Barber usage 476fb539361SGlen Barber ;; 477fb539361SGlen Barber esac 478fb539361SGlen Barber done 479fb539361SGlen Barber shift $(($OPTIND - 1)) 48081cfc284SGlen Barber if [ ! -z "${RELEASECONF}" ]; then 48181cfc284SGlen Barber if [ -e "${RELEASECONF}" ]; then 48281cfc284SGlen Barber . ${RELEASECONF} 48381cfc284SGlen Barber else 48481cfc284SGlen Barber echo "Nonexistent configuration file: ${RELEASECONF}" 48581cfc284SGlen Barber echo "Using default build environment." 48681cfc284SGlen Barber fi 48781cfc284SGlen Barber fi 488fb539361SGlen Barber env_check 48943eee075SGlen Barber trap "umount ${CHROOTDIR}/dev" EXIT # Clean up devfs mount on exit 490fb539361SGlen Barber chroot_setup 491fb539361SGlen Barber extra_chroot_setup 492fb539361SGlen Barber chroot_build_target 4939056dae9SGlen Barber ${chroot_build_release_cmd} 494fb539361SGlen Barber 495fb539361SGlen Barber return 0 496fb539361SGlen Barber} # main() 497fb539361SGlen Barber 498fb539361SGlen Barbermain "${@}" 499