Skip site navigation (1)Skip section navigation (2)
Date:      Sat, 9 May 2015 21:08:13 +0000 (UTC)
From:      Glen Barber <gjb@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org
Subject:   svn commit: r282693 - in head: etc/etc.arm release release/arm release/tools release/tools/arm sys/arm/conf
Message-ID:  <201505092108.t49L8DTi026601@svn.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: gjb
Date: Sat May  9 21:08:12 2015
New Revision: 282693
URL: https://svnweb.freebsd.org/changeset/base/282693

Log:
  Merge ^/projects/release-arm-redux into ^/head.
  
  Of note:
  
  - This commit adds native FreeBSD/arm release build support without
    requiring out-of-tree utilities.
  
  - Part of this merge removes the WANDBOARD-{SOLO,DUAL,QUAD} kernel
    configuration files, for which the IMX6 kernel configuration file
    should be used instead.
  
  - The resulting images have a 'freebsd' user (password 'freebsd'),
    to allow ssh(1) access when console access is not available (VGA
    or serial).  The default 'root' user password is set to 'root'.
  
  - The /etc/ttys file for arm images now enable both ttyv0 and ttyu0
    by default.
  
  Help from:	many (boot testing, feedback, etc.)
  Sponsored by:	The FreeBSD Foundation

Added:
  head/release/arm/WANDBOARD.conf
     - copied, changed from r282656, projects/release-arm-redux/release/arm/WANDBOARD.conf
  head/release/tools/arm.subr
     - copied, changed from r282566, projects/release-arm-redux/release/tools/arm.subr
Deleted:
  head/release/arm/WANDBOARD-QUAD.conf
  head/release/arm/ZEDBOARD.conf
  head/release/arm/release.sh
  head/release/tools/arm/
  head/sys/arm/conf/WANDBOARD-DUAL
  head/sys/arm/conf/WANDBOARD-QUAD
  head/sys/arm/conf/WANDBOARD-SOLO
Modified:
  head/etc/etc.arm/ttys
  head/release/arm/BEAGLEBONE.conf
  head/release/arm/PANDABOARD.conf
  head/release/arm/RPI-B.conf
  head/release/arm/RPI2.conf
  head/release/release.sh
Directory Properties:
  head/   (props changed)

Modified: head/etc/etc.arm/ttys
==============================================================================
--- head/etc/etc.arm/ttys	Sat May  9 20:26:32 2015	(r282692)
+++ head/etc/etc.arm/ttys	Sat May  9 21:08:12 2015	(r282693)
@@ -29,7 +29,7 @@
 # when going to single-user mode.
 console	none				unknown	off secure
 #
-ttyv0	"/usr/libexec/getty Pc"		xterm	off  secure
+ttyv0	"/usr/libexec/getty Pc"		xterm	onifconsole  secure
 # Virtual terminals
 ttyv1	"/usr/libexec/getty Pc"		xterm	off  secure
 ttyv2	"/usr/libexec/getty Pc"		xterm	off  secure
@@ -41,7 +41,7 @@ ttyv7	"/usr/libexec/getty Pc"		xterm	off
 #ttyv8	"/usr/local/bin/xdm -nodaemon"	xterm	off secure
 # Serial terminals
 # The 'dialup' keyword identifies dialin lines to login, fingerd etc.
-ttyu0	"/usr/libexec/getty 3wire"	vt100	on  secure
+ttyu0	"/usr/libexec/getty 3wire"	vt100	onifconsole  secure
 ttyu1	"/usr/libexec/getty std.9600"	dialup	off secure
 ttyu2	"/usr/libexec/getty std.9600"	dialup	off secure
 ttyu3	"/usr/libexec/getty std.9600"	dialup	off secure

Modified: head/release/arm/BEAGLEBONE.conf
==============================================================================
--- head/release/arm/BEAGLEBONE.conf	Sat May  9 20:26:32 2015	(r282692)
+++ head/release/arm/BEAGLEBONE.conf	Sat May  9 21:08:12 2015	(r282693)
@@ -3,36 +3,35 @@
 # $FreeBSD$
 #
 
-# Global variables.
-export SVNROOT="svn://svn.FreeBSD.org/"
-export SRCBRANCH="base/head@rHEAD"
-export DOCBRANCH="doc/head@rHEAD"
-export PORTBRANCH="ports/head@rHEAD"
-export NODOC=yes
-export WORLD_FLAGS="-j $(sysctl -n hw.ncpu)"
-export KERNEL_FLAGS="-j $(( $(( $(sysctl -n hw.ncpu) + 1 )) / 2 ))"
-export CHROOTDIR="/scratch"
-export EMBEDDEDBUILD=1
-export EMBEDDEDPORTS="sysutils/u-boot-beaglebone"
+EMBEDDEDBUILD=1
+EMBEDDED_TARGET="arm"
+EMBEDDED_TARGET_ARCH="armv6"
+EMBEDDEDPORTS="sysutils/u-boot-beaglebone"
+KERNEL="BEAGLEBONE"
+WORLD_FLAGS="${WORLD_FLAGS} UBLDR_LOADADDR=0x88000000"
+IMAGE_SIZE="1G"
+PART_SCHEME="MBR"
+FAT_SIZE="2m"
+FAT_TYPE="12"
+MD_ARGS="-x 63 -y 255"
+NODOC=1
 
-# Build chroot configuration
-load_chroot_env() {
-	# Avoid collision with TARGET and XDEV.
-	unset XDEV XDEV_ARCH KERNEL
-	export TARGET="amd64"
-	export TARGET_ARCH="amd64"
-}
-
-# Build target configuration
-load_target_env() {
-	# Avoid collision with TARGET and XDEV.
-	unset TARGET TARGET_ARCH
-	export EMBEDDEDPORTS="lang/python textproc/gsed"
-	export XDEV="arm"
-	export XDEV_ARCH="armv6"
-	export XDEV_FLAGS="WITH_GCC=1 WITH_GCC_BOOTSTRAP=1 WITHOUT_CLANG_IS_CC=1"
-	export XDEV_FLAGS="${XDEV_FLAGS} MK_TESTS=no"
-	export KERNEL="BEAGLEBONE"
-	export CROCHETSRC="https://github.com/freebsd/crochet"
-	export CROCHETBRANCH="trunk@rHEAD"
+arm_install_uboot() {
+	UBOOT_DIR="/usr/local/share/u-boot/u-boot-beaglebone"
+	FATMOUNT="${DESTDIR%${KERNEL}}/fat"
+	UFSMOUNT="${DESTDIR%${KERNEL}}/ufs"
+	chroot ${CHROOTDIR} mkdir -p "${FATMOUNT}" "${UFSMOUNT}"
+	chroot ${CHROOTDIR} mount_msdosfs /dev/${mddev}s1 ${FATMOUNT}
+	chroot ${CHROOTDIR} mount /dev/${mddev}s2a ${UFSMOUNT}
+	chroot ${CHROOTDIR} cp -p ${UBOOT_DIR}/MLO  ${FATMOUNT}/MLO
+	chroot ${CHROOTDIR} cp -p ${UBOOT_DIR}/u-boot.img ${FATMOUNT}/u-boot.img
+	chroot ${CHROOTDIR} cp -p ${UFSMOUNT}/boot/ubldr ${FATMOUNT}/ubldr
+	chroot ${CHROOTDIR} touch ${UFSMOUNT}/firstboot
+	sync
+	umount_loop ${CHROOTDIR}/${FATMOUNT}
+	umount_loop ${CHROOTDIR}/${UFSMOUNT}
+	chroot ${CHROOTDIR} rmdir ${FATMOUNT}
+	chroot ${CHROOTDIR} rmdir ${UFSMOUNT}
+	
+	return 0
 }

Modified: head/release/arm/PANDABOARD.conf
==============================================================================
--- head/release/arm/PANDABOARD.conf	Sat May  9 20:26:32 2015	(r282692)
+++ head/release/arm/PANDABOARD.conf	Sat May  9 21:08:12 2015	(r282693)
@@ -3,35 +3,35 @@
 # $FreeBSD$
 #
 
-# Global variables.
-export SVNROOT="svn://svn.FreeBSD.org/"
-export SRCBRANCH="base/head@rHEAD"
-export DOCBRANCH="doc/head@rHEAD"
-export PORTBRANCH="ports/head@rHEAD"
-export NODOC=yes
-export WORLD_FLAGS="-j $(sysctl -n hw.ncpu)"
-export KERNEL_FLAGS="-j $(( $(( $(sysctl -n hw.ncpu) + 1 )) / 2 ))"
-export CHROOTDIR="/scratch"
-export EMBEDDEDBUILD=1
-export EMBEDDEDPORTS="lang/python textproc/gsed"
+EMBEDDEDBUILD=1
+EMBEDDED_TARGET="arm"
+EMBEDDED_TARGET_ARCH="armv6"
+EMBEDDEDPORTS="sysutils/u-boot-pandaboard"
+KERNEL="PANDABOARD"
+NODOC=1
+WORLD_FLAGS="${WORLD_FLAGS} UBLDR_LOADADDR=0x88000000"
+IMAGE_SIZE="1G"
+PART_SCHEME="MBR"
+FAT_SIZE="2m"
+FAT_TYPE="12"
+MD_ARGS="-x 63 -y 255"
 
-# Build chroot configuration
-load_chroot_env() {
-	# Avoid collision with TARGET and XDEV.
-	unset XDEV XDEV_ARCH KERNEL
-	export TARGET="amd64"
-	export TARGET_ARCH="amd64"
-}
-
-# Build target configuration
-load_target_env() {
-	# Avoid collision with TARGET and XDEV.
-	unset TARGET TARGET_ARCH
-	export XDEV="arm"
-	export XDEV_ARCH="armv6"
-	export XDEV_FLAGS="WITH_GCC=1 WITH_GCC_BOOTSTRAP=1 WITHOUT_CLANG_IS_CC=1"
-	export XDEV_FLAGS="${XDEV_FLAGS} MK_TESTS=no"
-	export KERNEL="PANDABOARD"
-	export CROCHETSRC="https://github.com/freebsd/crochet"
-	export CROCHETBRANCH="trunk@rHEAD"
+arm_install_uboot() {
+	UBOOT_DIR="/usr/local/share/u-boot/u-boot-pandaboard"
+	FATMOUNT="${DESTDIR%${KERNEL}}/fat"
+	UFSMOUNT="${DESTDIR%${KERNEL}}/ufs"
+	chroot ${CHROOTDIR} mkdir -p "${FATMOUNT}" "${UFSMOUNT}"
+	chroot ${CHROOTDIR} mount_msdosfs /dev/${mddev}s1 ${FATMOUNT}
+	chroot ${CHROOTDIR} mount /dev/${mddev}s2a ${UFSMOUNT}
+	chroot ${CHROOTDIR} cp -p ${UBOOT_DIR}/MLO ${FATMOUNT}/MLO
+	chroot ${CHROOTDIR} cp -p ${UBOOT_DIR}/u-boot.img ${FATMOUNT}/u-boot.img
+	chroot ${CHROOTDIR} cp -p ${UFSMOUNT}/boot/ubldr ${FATMOUNT}/ubldr
+	chroot ${CHROOTDIR} touch ${UFSMOUNT}/firstboot
+	sync
+	umount_loop ${CHROOTDIR}/${FATMOUNT}
+	umount_loop ${CHROOTDIR}/${UFSMOUNT}
+	chroot ${CHROOTDIR} rmdir ${FATMOUNT}
+	chroot ${CHROOTDIR} rmdir ${UFSMOUNT}
+	
+	return 0
 }

Modified: head/release/arm/RPI-B.conf
==============================================================================
--- head/release/arm/RPI-B.conf	Sat May  9 20:26:32 2015	(r282692)
+++ head/release/arm/RPI-B.conf	Sat May  9 21:08:12 2015	(r282693)
@@ -3,38 +3,41 @@
 # $FreeBSD$
 #
 
-# Global variables.
-export SVNROOT="svn://svn.FreeBSD.org/"
-export SRCBRANCH="base/head@rHEAD"
-export DOCBRANCH="doc/head@rHEAD"
-export PORTBRANCH="ports/head@rHEAD"
-export NODOC=yes
-export WORLD_FLAGS="-j $(sysctl -n hw.ncpu)"
-export KERNEL_FLAGS="-j $(( $(( $(sysctl -n hw.ncpu) + 1 )) / 2 ))"
-export CHROOTDIR="/scratch"
-export EMBEDDEDBUILD=1
-export EMBEDDEDPORTS="lang/python textproc/gsed"
+EMBEDDEDBUILD=1
+EMBEDDED_TARGET="arm"
+EMBEDDED_TARGET_ARCH="armv6"
+EMBEDDEDPORTS="sysutils/u-boot-rpi"
+KERNEL="RPI-B"
+WORLD_FLAGS="${WORLD_FLAGS} UBLDR_LOADADDR=0x2000000"
+IMAGE_SIZE="1G"
+PART_SCHEME="MBR"
+FAT_SIZE="17m"
+FAT_TYPE="16"
+MD_ARGS="-x 63 -y 255"
+NODOC=1
 
-# Build chroot configuration
-load_chroot_env() {
-	# Avoid collision with TARGET and XDEV.
-	unset XDEV XDEV_ARCH KERNEL
-	export TARGET="amd64"
-	export TARGET_ARCH="amd64"
-}
-
-# Build target configuration
-load_target_env() {
-	# Avoid collision with TARGET and XDEV.
-	unset TARGET TARGET_ARCH
-	export XDEV="arm"
-	export XDEV_ARCH="armv6"
-	export XDEV_FLAGS="WITH_GCC=1 WITH_GCC_BOOTSTRAP=1 WITHOUT_CLANG_IS_CC=1"
-	export XDEV_FLAGS="${XDEV_FLAGS} MK_TESTS=no"
-	export KERNEL="RPI-B"
-	export CROCHETSRC="https://github.com/freebsd/crochet"
-	export CROCHETBRANCH="trunk@rHEAD"
-	export UBOOTSRC="https://github.com/gonzoua/u-boot-pi"
-	export UBOOTBRANCH="trunk"
-	export UBOOTDIR="/tmp/crochet/u-boot-rpi"
+arm_install_uboot() {
+	UBOOT_DIR="/usr/local/share/u-boot/u-boot-rpi"
+	UBOOT_FILES="bootcode.bin config.txt fixup.dat fixup_cd.dat \
+		start.elf start_cd.elf u-boot.img"
+	FATMOUNT="${DESTDIR%${KERNEL}}/fat"
+	UFSMOUNT="${DESTDIR%${KERNEL}}/ufs"
+	chroot ${CHROOTDIR} mkdir -p "${FATMOUNT}" "${UFSMOUNT}"
+	chroot ${CHROOTDIR} mount_msdosfs /dev/${mddev}s1 ${FATMOUNT}
+	chroot ${CHROOTDIR} mount /dev/${mddev}s2a ${UFSMOUNT}
+	for _UF in ${UBOOT_FILES}; do
+		chroot ${CHROOTDIR} cp -p ${UBOOT_DIR}/${_UF} \
+			${FATMOUNT}/${_UF}
+	done
+	chroot ${CHROOTDIR} cp -p ${UFSMOUNT}/boot/ubldr ${FATMOUNT}/ubldr
+	chroot ${CHROOTDIR} cp -p ${UFSMOUNT}/boot/dtb/rpi.dtb \
+		${FATMOUNT}/rpi.dtb
+	chroot ${CHROOTDIR} touch ${UFSMOUNT}/firstboot
+	sync
+	umount_loop ${CHROOTDIR}/${FATMOUNT}
+	umount_loop ${CHROOTDIR}/${UFSMOUNT}
+	chroot ${CHROOTDIR} rmdir ${FATMOUNT}
+	chroot ${CHROOTDIR} rmdir ${UFSMOUNT}
+	
+	return 0
 }

Modified: head/release/arm/RPI2.conf
==============================================================================
--- head/release/arm/RPI2.conf	Sat May  9 20:26:32 2015	(r282692)
+++ head/release/arm/RPI2.conf	Sat May  9 21:08:12 2015	(r282693)
@@ -3,36 +3,41 @@
 # $FreeBSD$
 #
 
-# Global variables.
-export SVNROOT="svn://svn.FreeBSD.org/"
-export SRCBRANCH="base/head@rHEAD"
-export DOCBRANCH="doc/head@rHEAD"
-export PORTBRANCH="ports/head@rHEAD"
-export NODOC=yes
-export WORLD_FLAGS="-j $(sysctl -n hw.ncpu)"
-export KERNEL_FLAGS="-j $(( $(( $(sysctl -n hw.ncpu) + 1 )) / 2 ))"
-export CHROOTDIR="/scratch"
-export EMBEDDEDBUILD=1
-export EMBEDDEDPORTS="sysutils/u-boot-rpi2"
+EMBEDDEDBUILD=1
+EMBEDDED_TARGET="arm"
+EMBEDDED_TARGET_ARCH="armv6"
+EMBEDDEDPORTS="sysutils/u-boot-rpi2"
+KERNEL="RPI2"
+NODOC=1
+WORLD_FLAGS="${WORLD_FLAGS} UBLDR_LOADADDR=0x2000000"
+IMAGE_SIZE="1G"
+PART_SCHEME="MBR"
+FAT_SIZE="50m"
+FAT_TYPE="16"
+MD_ARGS="-x 63 -y 255"
 
-# Build chroot configuration
-load_chroot_env() {
-	# Avoid collision with TARGET and XDEV.
-	unset XDEV XDEV_ARCH KERNEL
-	export TARGET="amd64"
-	export TARGET_ARCH="amd64"
+arm_install_uboot() {
+	UBOOT_DIR="/usr/local/share/u-boot/u-boot-rpi2"
+	UBOOT_FILES="bootcode.bin config.txt fixup.dat fixup_cd.dat \
+		fixup_x.dat start.elf start_cd.elf start_x.elf u-boot.bin"
+	FATMOUNT="${DESTDIR%${KERNEL}}/fat"
+	UFSMOUNT="${DESTDIR%${KERNEL}}/ufs"
+	chroot ${CHROOTDIR} mkdir -p "${FATMOUNT}" "${UFSMOUNT}"
+	chroot ${CHROOTDIR} mount_msdosfs /dev/${mddev}s1 ${FATMOUNT}
+	chroot ${CHROOTDIR} mount /dev/${mddev}s2a ${UFSMOUNT}
+	for _UF in ${UBOOT_FILES}; do
+		chroot ${CHROOTDIR} cp -p ${UBOOT_DIR}/${_UF} \
+			${FATMOUNT}/${_UF}
+	done
+	chroot ${CHROOTDIR} cp -p ${UFSMOUNT}/boot/ubldr ${FATMOUNT}/ubldr
+	chroot ${CHROOTDIR} cp -p ${UFSMOUNT}/boot/dtb/rpi2.dtb \
+		${FATMOUNT}/rpi2.dtb
+	chroot ${CHROOTDIR} touch ${UFSMOUNT}/firstboot
+	sync
+	umount_loop ${CHROOTDIR}/${FATMOUNT}
+	umount_loop ${CHROOTDIR}/${UFSMOUNT}
+	chroot ${CHROOTDIR} rmdir ${FATMOUNT}
+	chroot ${CHROOTDIR} rmdir ${UFSMOUNT}
+	
+	return 0
 }
-
-# Build target configuration
-load_target_env() {
-	# Avoid collision with TARGET and XDEV.
-	unset TARGET TARGET_ARCH
-	export XDEV="arm"
-	export XDEV_ARCH="armv6"
-	export XDEV_FLAGS="WITH_GCC=1 WITH_GCC_BOOTSTRAP=1 WITHOUT_CLANG_IS_CC=1"
-	export XDEV_FLAGS="${XDEV_FLAGS} MK_TESTS=no"
-	export KERNEL="RPI2"
-	export CROCHETSRC="https://github.com/freebsd/crochet"
-	export CROCHETBRANCH="trunk@rHEAD"
-}
-

Copied and modified: head/release/arm/WANDBOARD.conf (from r282656, projects/release-arm-redux/release/arm/WANDBOARD.conf)
==============================================================================
--- projects/release-arm-redux/release/arm/WANDBOARD.conf	Fri May  8 18:55:09 2015	(r282656, copy source)
+++ head/release/arm/WANDBOARD.conf	Sat May  9 21:08:12 2015	(r282693)
@@ -17,26 +17,25 @@ MD_ARGS="-x 63 -y 255"
 NODOC=1
 
 arm_install_uboot() {
-	UBOOT_DIR="${CHROOTDIR}/usr/local/share/u-boot/u-boot-wandboard"
+	UBOOT_DIR="/usr/local/share/u-boot/u-boot-wandboard"
 	UBOOT_FILES="u-boot.imx"
-	FATMOUNT="${DESTDIR##${KERNEL}}/fat"
-	UFSMOUNT="${DESTDIR##${KERNEL}}/ufs"
-	chroot ${CHROOTDIR} dd if=${UBOOT_DIR##${CHROOTDIR}}/${UBOOT_FILES} \
+	FATMOUNT="${DESTDIR%${KERNEL}}/fat"
+	UFSMOUNT="${DESTDIR%${KERNEL}}/ufs"
+	chroot ${CHROOTDIR} dd if=${UBOOT_DIR}/${UBOOT_FILES} \
 		of=/dev/${mddev} bs=512 seek=2
 	chroot ${CHROOTDIR} mkdir -p "${FATMOUNT}" "${UFSMOUNT}"
 	chroot ${CHROOTDIR} mount_msdosfs /dev/${mddev}s1 ${FATMOUNT}
 	chroot ${CHROOTDIR} mount /dev/${mddev}s2a ${UFSMOUNT}
-	cp -p ${CHROOTDIR}/${UFSMOUNT}/boot/ubldr \
-		${CHROOTDIR}/${FATMOUNT}/ubldr
-	chroot ${CHROOTDIR} echo \
-		'setenv fdt_file wandboard-quad.dtb; fatload mmc 0:1 11000000 ubldr; bootelf 11000000;' \
-		> ${FATMOUNT}/boot.txt
-	touch ${CHROOTDIR}/${UFSMOUNT}/firstboot
+	chroot ${CHROOTDIR} cp -p ${UFSMOUNT}/boot/ubldr ${FATMOUNT}/ubldr
+	chroot ${CHROOTDIR} /bin/sh -c 'echo \
+		setenv fdt_file wandboard-quad.dtb\; fatload mmc 0:1 11000000 ubldr\; bootelf 11000000\; \
+		> ${FATMOUNT}/boot.txt'
+	chroot ${CHROOTDIR} touch ${UFSMOUNT}/firstboot
 	sync
 	umount_loop ${CHROOTDIR}/${FATMOUNT}
 	umount_loop ${CHROOTDIR}/${UFSMOUNT}
-	rmdir ${CHROOTDIR}/${FATMOUNT}
-	rmdir ${CHROOTDIR}/${UFSMOUNT}
+	chroot ${CHROOTDIR} rmdir ${FATMOUNT}
+	chroot ${CHROOTDIR} rmdir ${UFSMOUNT}
 	
 	return 0
 }

Modified: head/release/release.sh
==============================================================================
--- head/release/release.sh	Sat May  9 20:26:32 2015	(r282692)
+++ head/release/release.sh	Sat May  9 21:08:12 2015	(r282693)
@@ -36,257 +36,359 @@
 # $FreeBSD$
 #
 
-PATH="/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin"
-export PATH
+export PATH="/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin"
+
+VERSION=2
 
 # Prototypes that can be redefined per-chroot or per-target.
 load_chroot_env() { }
 load_target_env() { }
 buildenv_setup() { }
 
-# The directory within which the release will be built.
-CHROOTDIR="/scratch"
-RELENGDIR="$(realpath $(dirname $(basename ${0})))"
-
-# The default version control system command to obtain the sources.
-VCSCMD="svn checkout"
-
-# The default svn checkout server, and svn branches for src/, doc/,
-# and ports/.
-SVNROOT="svn://svn.FreeBSD.org/"
-SRCBRANCH="base/head@rHEAD"
-DOCBRANCH="doc/head@rHEAD"
-PORTBRANCH="ports/head@rHEAD"
-
-# Set for embedded device builds.
-EMBEDDEDBUILD=
-
-# Sometimes one needs to checkout src with --force svn option.
-# If custom kernel configs copied to src tree before checkout, e.g.
-SRC_FORCE_CHECKOUT=
-
-# The default make.conf and src.conf to use.  Set to /dev/null
-# by default to avoid polluting the chroot(8) environment with
-# non-default settings.
-MAKE_CONF="/dev/null"
-SRC_CONF="/dev/null"
-
-# The number of make(1) jobs, defaults to the number of CPUs available for
-# buildworld, and half of number of CPUs available for buildkernel.
-WORLD_FLAGS="-j$(sysctl -n hw.ncpu)"
-KERNEL_FLAGS="-j$(( $(( $(sysctl -n hw.ncpu) + 1 )) / 2))"
-
-MAKE_FLAGS="-s"
-
-# The name of the kernel to build, defaults to GENERIC.
-KERNEL="GENERIC"
-
-# Set to non-empty value to disable checkout of doc/ and/or ports/.  Disabling
-# ports/ checkout also forces NODOC to be set.
-NODOC=
-NOPORTS=
-
-# Set to non-empty value to build dvd1.iso as part of the release.
-WITH_DVD=
-WITH_COMPRESSED_IMAGES=
-
-# Set to non-empty value to build virtual machine images as part of
-# the release.
-WITH_VMIMAGES=
-WITH_COMPRESSED_VMIMAGES=
-XZ_THREADS=0
-
-# Set to non-empty value to build virtual machine images for various
-# cloud providers as part of the release.
-WITH_CLOUDWARE=
-
 usage() {
 	echo "Usage: $0 [-c release.conf]"
 	exit 1
 }
 
-while getopts c: opt; do
-	case ${opt} in
-	c)
-		RELEASECONF="${OPTARG}"
-		if [ ! -e "${RELEASECONF}" ]; then
-			echo "ERROR: Configuration file ${RELEASECONF} does not exist."
-			exit 1
-		fi
-		# Source the specified configuration file for overrides
-		. ${RELEASECONF}
-		;;
-	\?)
-		usage
-		;;
-	esac
-done
-shift $(($OPTIND - 1))
+# env_setup(): Set up the default build environment variables, such as the
+# CHROOTDIR, VCSCMD, SVNROOT, etc.  This is called before the release.conf
+# file is sourced, if '-c <release.conf>' is specified.
+env_setup() {
+	# The directory within which the release will be built.
+	CHROOTDIR="/scratch"
+	RELENGDIR="$(dirname $(realpath ${0}))"
+
+	# The default version control system command to obtain the sources.
+	for _dir in /usr/bin /usr/local/bin; do
+		for _svn in svn svnlite; do
+			[ -x "${_dir}/${_svn}" ] && VCSCMD="${_dir}/${_svn}"
+			[ ! -z "${VCSCMD}" ] && break 2
+		done
+	done
+	VCSCMD="${VCSCMD} checkout"
+
+	# The default svn checkout server, and svn branches for src/, doc/,
+	# and ports/.
+	SVNROOT="svn://svn.FreeBSD.org/"
+	SRCBRANCH="base/head@rHEAD"
+	DOCBRANCH="doc/head@rHEAD"
+	PORTBRANCH="ports/head@rHEAD"
+
+	# Set for embedded device builds.
+	EMBEDDEDBUILD=
+
+	# Sometimes one needs to checkout src with --force svn option.
+	# If custom kernel configs copied to src tree before checkout, e.g.
+	SRC_FORCE_CHECKOUT=
+
+	# The default make.conf and src.conf to use.  Set to /dev/null
+	# by default to avoid polluting the chroot(8) environment with
+	# non-default settings.
+	MAKE_CONF="/dev/null"
+	SRC_CONF="/dev/null"
+
+	# The number of make(1) jobs, defaults to the number of CPUs available
+	# for buildworld, and half of number of CPUs available for buildkernel.
+	WORLD_FLAGS="-j$(sysctl -n hw.ncpu)"
+	KERNEL_FLAGS="-j$(( $(( $(sysctl -n hw.ncpu) + 1 )) / 2))"
+
+	MAKE_FLAGS="-s"
+
+	# The name of the kernel to build, defaults to GENERIC.
+	KERNEL="GENERIC"
+
+	# Set to non-empty value to disable checkout of doc/ and/or ports/.
+	# Disabling ports/ checkout also forces NODOC to be set.
+	NODOC=
+	NOPORTS=
 
-# Fix for backwards-compatibility with release.conf that does not have the
-# trailing '/'.
-case ${SVNROOT} in
-	*svn*)
-		SVNROOT="${SVNROOT}/"
-		;;
-	*)
-		;;
-esac
-
-# Prefix the branches with the SVNROOT for the full checkout URL.
-SRCBRANCH="${SVNROOT}${SRCBRANCH}"
-DOCBRANCH="${SVNROOT}${DOCBRANCH}"
-PORTBRANCH="${SVNROOT}${PORTBRANCH}"
-
-if [ -n "${EMBEDDEDBUILD}" ]; then
+	# Set to non-empty value to build dvd1.iso as part of the release.
 	WITH_DVD=
 	WITH_COMPRESSED_IMAGES=
-	NODOC=yes
-fi
 
-# If PORTS is set and NODOC is unset, force NODOC=yes because the ports tree
-# is required to build the documentation set.
-if [ -n "${NOPORTS}" ] && [ -z "${NODOC}" ]; then
-	echo "*** NOTICE: Setting NODOC=1 since ports tree is required"
-	echo "            and NOPORTS is set."
-	NODOC=yes
-fi
-
-# If NOPORTS and/or NODOC are unset, they must not pass to make as variables.
-# The release makefile verifies definedness of NOPORTS/NODOC variables
-# instead of their values.
-DOCPORTS=
-if [ -n "${NOPORTS}" ]; then
-	DOCPORTS="NOPORTS=yes "
-fi
-if [ -n "${NODOC}" ]; then
-	DOCPORTS="${DOCPORTS}NODOC=yes"
-fi
-
-# The aggregated build-time flags based upon variables defined within
-# this file, unless overridden by release.conf.  In most cases, these
-# will not need to be changed.
-CONF_FILES="__MAKE_CONF=${MAKE_CONF} SRCCONF=${SRC_CONF}"
-if [ -n "${TARGET}" ] && [ -n "${TARGET_ARCH}" ]; then
-	ARCH_FLAGS="TARGET=${TARGET} TARGET_ARCH=${TARGET_ARCH}"
-else
-	ARCH_FLAGS=
-fi
-load_chroot_env
-CHROOT_MAKEENV="${CHROOT_MAKEENV} MAKEOBJDIRPREFIX=${CHROOTDIR}/tmp/obj"
-CHROOT_WMAKEFLAGS="${MAKE_FLAGS} ${WORLD_FLAGS} ${CONF_FILES}"
-CHROOT_IMAKEFLAGS="${CONF_FILES}"
-CHROOT_DMAKEFLAGS="${CONF_FILES}"
-RELEASE_WMAKEFLAGS="${MAKE_FLAGS} ${WORLD_FLAGS} ${ARCH_FLAGS} ${CONF_FILES}"
-RELEASE_KMAKEFLAGS="${MAKE_FLAGS} ${KERNEL_FLAGS} KERNCONF=\"${KERNEL}\" ${ARCH_FLAGS} ${CONF_FILES}"
-RELEASE_RMAKEFLAGS="${ARCH_FLAGS} KERNCONF=\"${KERNEL}\" ${CONF_FILES} \
-	${DOCPORTS} WITH_DVD=${WITH_DVD} WITH_VMIMAGES=${WITH_VMIMAGES} \
-	WITH_CLOUDWARE=${WITH_CLOUDWARE} XZ_THREADS=${XZ_THREADS}"
-
-# Force src checkout if configured
-FORCE_SRC_KEY=
-if [ -n "${SRC_FORCE_CHECKOUT}" ]; then
-	FORCE_SRC_KEY="--force"
-fi
+	# Set to non-empty value to build virtual machine images as part of
+	# the release.
+	WITH_VMIMAGES=
+	WITH_COMPRESSED_VMIMAGES=
+	XZ_THREADS=0
+
+	# Set to non-empty value to build virtual machine images for various
+	# cloud providers as part of the release.
+	WITH_CLOUDWARE=
+
+	return 0
+} # env_setup()
+
+# env_check(): Perform sanity tests on the build environment, such as ensuring
+# files/directories exist, as well as adding backwards-compatibility hacks if
+# necessary.  This is called unconditionally, and overrides the defaults set
+# in env_setup() if '-c <release.conf>' is specified.
+env_check() {
+	chroot_build_release_cmd="chroot_build_release"
+	# Fix for backwards-compatibility with release.conf that does not have
+	# the trailing '/'.
+	case ${SVNROOT} in
+		*svn*)
+			SVNROOT="${SVNROOT}/"
+			;;
+		*)
+			;;
+	esac
 
-if [ -z "${CHROOTDIR}" ]; then
-	echo "Please set CHROOTDIR."
-	exit 1
-fi
+	# Prefix the branches with the SVNROOT for the full checkout URL.
+	SRCBRANCH="${SVNROOT}${SRCBRANCH}"
+	DOCBRANCH="${SVNROOT}${DOCBRANCH}"
+	PORTBRANCH="${SVNROOT}${PORTBRANCH}"
+
+	if [ -n "${EMBEDDEDBUILD}" ]; then
+		WITH_DVD=
+		WITH_COMPRESSED_IMAGES=
+		NODOC=yes
+		case ${EMBEDDED_TARGET}:${EMBEDDED_TARGET_ARCH} in
+			arm:armv6)
+				chroot_build_release_cmd="chroot_arm_armv6_build_release"
+				;;
+			*)
+		esac
+	fi
 
-if [ $(id -u) -ne 0 ]; then
-	echo "Needs to be run as root."
-	exit 1
-fi
+	# If PORTS is set and NODOC is unset, force NODOC=yes because the ports
+	# tree is required to build the documentation set.
+	if [ -n "${NOPORTS}" ] && [ -z "${NODOC}" ]; then
+		echo "*** NOTICE: Setting NODOC=1 since ports tree is required"
+		echo "            and NOPORTS is set."
+		NODOC=yes
+	fi
 
-set -e # Everything must succeed
+	# If NOPORTS and/or NODOC are unset, they must not pass to make as
+	# variables.  The release makefile verifies definedness of the
+	# NOPORTS/NODOC variables instead of their values.
+	DOCPORTS=
+	if [ -n "${NOPORTS}" ]; then
+		DOCPORTS="NOPORTS=yes "
+	fi
+	if [ -n "${NODOC}" ]; then
+		DOCPORTS="${DOCPORTS}NODOC=yes"
+	fi
 
-mkdir -p ${CHROOTDIR}/usr
+	# The aggregated build-time flags based upon variables defined within
+	# this file, unless overridden by release.conf.  In most cases, these
+	# will not need to be changed.
+	CONF_FILES="__MAKE_CONF=${MAKE_CONF} SRCCONF=${SRC_CONF}"
+	if [ -n "${TARGET}" ] && [ -n "${TARGET_ARCH}" ]; then
+		ARCH_FLAGS="TARGET=${TARGET} TARGET_ARCH=${TARGET_ARCH}"
+	else
+		ARCH_FLAGS=
+	fi
+	# Force src checkout if configured
+	FORCE_SRC_KEY=
+	if [ -n "${SRC_FORCE_CHECKOUT}" ]; then
+		FORCE_SRC_KEY="--force"
+	fi
 
-if [ -z "${SRC_UPDATE_SKIP}" ]; then
-	${VCSCMD} ${FORCE_SRC_KEY} ${SRCBRANCH} ${CHROOTDIR}/usr/src
-fi
-if [ -z "${NODOC}" ] && [ -z "${DOC_UPDATE_SKIP}" ]; then
-	${VCSCMD} ${DOCBRANCH} ${CHROOTDIR}/usr/doc
-fi
-if [ -z "${NOPORTS}" ] && [ -z "${PORTS_UPDATE_SKIP}" ]; then
-	${VCSCMD} ${PORTBRANCH} ${CHROOTDIR}/usr/ports
-fi
-
-if [ -z "${CHROOTBUILD_SKIP}" ]; then
-	cd ${CHROOTDIR}/usr/src
-	env ${CHROOT_MAKEENV} make ${CHROOT_WMAKEFLAGS} buildworld
-	env ${CHROOT_MAKEENV} make ${CHROOT_IMAKEFLAGS} installworld \
-		DESTDIR=${CHROOTDIR}
-	env ${CHROOT_MAKEENV} make ${CHROOT_DMAKEFLAGS} distribution \
-		DESTDIR=${CHROOTDIR}
-fi
-mount -t devfs devfs ${CHROOTDIR}/dev
-cp /etc/resolv.conf ${CHROOTDIR}/etc/resolv.conf
-trap "umount ${CHROOTDIR}/dev" EXIT # Clean up devfs mount on exit
-
-# If MAKE_CONF and/or SRC_CONF are set and not character devices (/dev/null),
-# copy them to the chroot.
-if [ -e ${MAKE_CONF} ] && [ ! -c ${MAKE_CONF} ]; then
-	mkdir -p ${CHROOTDIR}/$(dirname ${MAKE_CONF})
-	cp ${MAKE_CONF} ${CHROOTDIR}/${MAKE_CONF}
-fi
-if [ -e ${SRC_CONF} ] && [ ! -c ${SRC_CONF} ]; then
-	mkdir -p ${CHROOTDIR}/$(dirname ${SRC_CONF})
-	cp ${SRC_CONF} ${CHROOTDIR}/${SRC_CONF}
-fi
+	if [ -z "${CHROOTDIR}" ]; then
+		echo "Please set CHROOTDIR."
+		exit 1
+	fi
 
-# Embedded builds do not use the 'make release' target.
-if [ -n "${EMBEDDEDBUILD}" ]; then
-	buildenv_setup
-	# If a crochet configuration file exists in *this* checkout of
-	# release/, copy it to the /tmp/external directory within the chroot.
-	# This allows building embedded releases without relying on updated
-	# scripts and/or configurations to exist in the branch being built.
-	load_target_env
-	if [ -e ${RELENGDIR}/tools/${XDEV}/crochet-${KERNEL}.conf ] && \
-		[ -e ${RELENGDIR}/${XDEV}/release.sh ]; then
-			mkdir -p ${CHROOTDIR}/tmp/external/${XDEV}/
-			cp ${RELENGDIR}/tools/${XDEV}/crochet-${KERNEL}.conf \
-				${CHROOTDIR}/tmp/external/${XDEV}/crochet-${KERNEL}.conf
-			/bin/sh ${RELENGDIR}/${XDEV}/release.sh
-	fi
-	# If the script does not exist for this architecture, exit.
-	# This probably should be checked earlier, but allowing the rest
-	# of the build process to get this far will at least set up the
-	# chroot environment for testing.
-	exit 0
-else
-	# Not embedded.
-	continue
-fi
+	if [ $(id -u) -ne 0 ]; then
+		echo "Needs to be run as root."
+		exit 1
+	fi
+
+	CHROOT_MAKEENV="${CHROOT_MAKEENV} \
+		MAKEOBJDIRPREFIX=${CHROOTDIR}/tmp/obj"
+	CHROOT_WMAKEFLAGS="${MAKE_FLAGS} ${WORLD_FLAGS} ${CONF_FILES}"
+	CHROOT_IMAKEFLAGS="${CONF_FILES}"
+	CHROOT_DMAKEFLAGS="${CONF_FILES}"
+	RELEASE_WMAKEFLAGS="${MAKE_FLAGS} ${WORLD_FLAGS} ${ARCH_FLAGS} \
+		${CONF_FILES}"
+	RELEASE_KMAKEFLAGS="${MAKE_FLAGS} ${KERNEL_FLAGS} \
+		KERNCONF=\"${KERNEL}\" ${ARCH_FLAGS} ${CONF_FILES}"
+	RELEASE_RMAKEFLAGS="${ARCH_FLAGS} \
+		KERNCONF=\"${KERNEL}\" ${CONF_FILES} ${DOCPORTS} \
+		WITH_DVD=${WITH_DVD} WITH_VMIMAGES=${WITH_VMIMAGES} \
+		WITH_CLOUDWARE=${WITH_CLOUDWARE} XZ_THREADS=${XZ_THREADS}"
+
+	return 0
+} # env_check()
+
+# chroot_setup(): Prepare the build chroot environment for the release build.
+chroot_setup() {
+	load_chroot_env
+	mkdir -p ${CHROOTDIR}/usr
+
+	if [ -z "${SRC_UPDATE_SKIP}" ]; then
+		${VCSCMD} ${FORCE_SRC_KEY} ${SRCBRANCH} ${CHROOTDIR}/usr/src
+	fi
+	if [ -z "${NODOC}" ] && [ -z "${DOC_UPDATE_SKIP}" ]; then
+		${VCSCMD} ${DOCBRANCH} ${CHROOTDIR}/usr/doc
+	fi
+	if [ -z "${NOPORTS}" ] && [ -z "${PORTS_UPDATE_SKIP}" ]; then
+		${VCSCMD} ${PORTBRANCH} ${CHROOTDIR}/usr/ports
+	fi
+
+	if [ -z "${CHROOTBUILD_SKIP}" ]; then
+		cd ${CHROOTDIR}/usr/src
+		env ${CHROOT_MAKEENV} make ${CHROOT_WMAKEFLAGS} buildworld
+		env ${CHROOT_MAKEENV} make ${CHROOT_IMAKEFLAGS} installworld \
+			DESTDIR=${CHROOTDIR}
+		env ${CHROOT_MAKEENV} make ${CHROOT_DMAKEFLAGS} distribution \
+			DESTDIR=${CHROOTDIR}
+	fi
 
-if [ -d ${CHROOTDIR}/usr/ports ]; then
+	return 0
+} # chroot_setup()
+
+# extra_chroot_setup(): Prepare anything additional within the build
+# necessary for the release build.
+extra_chroot_setup() {
+	mkdir -p ${CHROOTDIR}/dev
+	mount -t devfs devfs ${CHROOTDIR}/dev
+	[ -e /etc/resolv.conf ] && cp /etc/resolv.conf \
+		${CHROOTDIR}/etc/resolv.conf
 	# Run ldconfig(8) in the chroot directory so /var/run/ld-elf*.so.hints
 	# is created.  This is needed by ports-mgmt/pkg.
-	chroot ${CHROOTDIR} /etc/rc.d/ldconfig forcerestart
+	eval chroot ${CHROOTDIR} /etc/rc.d/ldconfig forcerestart
+
+	# If MAKE_CONF and/or SRC_CONF are set and not character devices
+	# (/dev/null), copy them to the chroot.
+	if [ -e ${MAKE_CONF} ] && [ ! -c ${MAKE_CONF} ]; then
+		mkdir -p ${CHROOTDIR}/$(dirname ${MAKE_CONF})
+		cp ${MAKE_CONF} ${CHROOTDIR}/${MAKE_CONF}
+	fi
+	if [ -e ${SRC_CONF} ] && [ ! -c ${SRC_CONF} ]; then
+		mkdir -p ${CHROOTDIR}/$(dirname ${SRC_CONF})
+		cp ${SRC_CONF} ${CHROOTDIR}/${SRC_CONF}
+	fi
+
+	if [ -d ${CHROOTDIR}/usr/ports ]; then
+		# Trick the ports 'run-autotools-fixup' target to do the right
+		# thing.
+		_OSVERSION=$(chroot ${CHROOTDIR} /usr/bin/uname -U)
+		REVISION=$(chroot ${CHROOTDIR} make -C /usr/src/release -V REVISION)
+		BRANCH=$(chroot ${CHROOTDIR} make -C /usr/src/release -V BRANCH)
+		UNAME_r=${REVISION}-${BRANCH}
+		if [ -d ${CHROOTDIR}/usr/doc ] && [ -z "${NODOC}" ]; then
+			PBUILD_FLAGS="OSVERSION=${_OSVERSION} BATCH=yes"
+			PBUILD_FLAGS="${PBUILD_FLAGS} UNAME_r=${UNAME_r}"
+			PBUILD_FLAGS="${PBUILD_FLAGS} OSREL=${REVISION}"
+			chroot ${CHROOTDIR} make -C /usr/ports/textproc/docproj \
+				${PBUILD_FLAGS} OPTIONS_UNSET="FOP IGOR" \
+				install clean distclean
+		fi
+	fi
+
+	if [ ! -z "${EMBEDDEDPORTS}" ]; then
+		for _PORT in ${EMBEDDEDPORTS}; do
+			eval chroot ${CHROOTDIR} make -C /usr/ports/${_PORT} \
+				BATCH=1 FORCE_PKG_REGISTER=1 install clean distclean
+		done
+	fi
+
+	buildenv_setup
+
+	return 0
+} # extra_chroot_setup()
+
+# chroot_build_target(): Build the userland and kernel for the build target.
+chroot_build_target() {
+	load_target_env
+	if [ ! -z "${EMBEDDEDBUILD}" ]; then
+		RELEASE_WMAKEFLAGS="${RELEASE_WMAKEFLAGS} \
+			TARGET=${EMBEDDED_TARGET} \
+			TARGET_ARCH=${EMBEDDED_TARGET_ARCH}"
+		RELEASE_KMAKEFLAGS="${RELEASE_KMAKEFLAGS} \
+			TARGET=${EMBEDDED_TARGET} \
+			TARGET_ARCH=${EMBEDDED_TARGET_ARCH}"
+	fi
+	eval chroot ${CHROOTDIR} make -C /usr/src ${RELEASE_WMAKEFLAGS} buildworld
+	eval chroot ${CHROOTDIR} make -C /usr/src ${RELEASE_KMAKEFLAGS} buildkernel
+
+	return 0
+} # chroot_build_target
+
+# chroot_build_release(): Invoke the 'make release' target.
+chroot_build_release() {
+	load_target_env
+	eval chroot ${CHROOTDIR} make -C /usr/src/release \
+		${RELEASE_RMAKEFLAGS} release
+	eval chroot ${CHROOTDIR} make -C /usr/src/release \
+		${RELEASE_RMAKEFLAGS} install DESTDIR=/R \
+		WITH_COMPRESSED_IMAGES=${WITH_COMPRESSED_IMAGES} \
+		WITH_COMPRESSED_VMIMAGES=${WITH_COMPRESSED_VMIMAGES}
+
+	return 0
+} # chroot_build_release()
+
+# chroot_arm_armv6_build_release(): Create arm/armv6 SD card image.
+chroot_arm_armv6_build_release() {
+	load_target_env
+	eval chroot ${CHROOTDIR} make -C /usr/src/release obj
+	if [ -e "${RELENGDIR}/tools/${EMBEDDED_TARGET}.subr" ]; then
+		. "${RELENGDIR}/tools/${EMBEDDED_TARGET}.subr"
+	fi
+	[ ! -z "${RELEASECONF}" ] && . "${RELEASECONF}"
+	WORLDDIR="$(eval chroot ${CHROOTDIR} make -C /usr/src/release -V WORLDDIR)"
+	OBJDIR="$(eval chroot ${CHROOTDIR} make -C /usr/src/release -V .OBJDIR)"
+	DESTDIR="${OBJDIR}/${KERNEL}"
+	IMGBASE="${CHROOTDIR}/${OBJDIR}/${KERNEL}.img"
+	OSRELEASE="$(eval chroot ${CHROOTDIR} make -C /usr/src/release \
+		TARGET=${EMBEDDED_TARGET} TARGET_ARCH=${EMBEDDED_TARGET_ARCH} \
+		-V OSRELEASE)"
+	chroot ${CHROOTDIR} mkdir -p ${DESTDIR}
+	chroot ${CHROOTDIR} truncate -s ${IMAGE_SIZE} ${IMGBASE##${CHROOTDIR}}
+	export mddev=$(chroot ${CHROOTDIR} \
+		mdconfig -f ${IMGBASE##${CHROOTDIR}} ${MD_ARGS})
+	arm_create_disk
+	arm_install_base
+	arm_install_uboot
+	mdconfig -d -u ${mddev}
+	chroot ${CHROOTDIR} rmdir ${DESTDIR}
+	mv ${IMGBASE} ${CHROOTDIR}/${OBJDIR}/${OSRELEASE}-${KERNEL}.img
+	chroot ${CHROOTDIR} mkdir -p /R
+	chroot ${CHROOTDIR} cp -p ${OBJDIR}/${OSRELEASE}-${KERNEL}.img \
+		/R/${OSRELEASE}-${KERNEL}.img
+	chroot ${CHROOTDIR} xz -T ${XZ_THREADS} /R/${OSRELEASE}-${KERNEL}.img
+	cd ${CHROOTDIR}/R && sha256 ${OSRELEASE}* \
+		> CHECKSUM.SHA256
+	cd ${CHROOTDIR}/R && md5 ${OSRELEASE}* \
+		> CHECKSUM.MD5
+
+	return 0
+} # chroot_arm_armv6_build_release()
+
+# main(): Start here.
+main() {
+	set -e # Everything must succeed
+	env_setup
+	while getopts c: opt; do
+		case ${opt} in
+			c)
+				RELEASECONF="${OPTARG}"
+				;;
+			\?)
+				usage
+				;;
+		esac
+	done
+	shift $(($OPTIND - 1))
+	if [ ! -z "${RELEASECONF}" ]; then
+		if [ -e "${RELEASECONF}" ]; then
+			. ${RELEASECONF}
+		else
+			echo "Nonexistent configuration file: ${RELEASECONF}"
+			echo "Using default build environment."
+		fi
+	fi
+	env_check
+	trap "umount ${CHROOTDIR}/dev" EXIT # Clean up devfs mount on exit
+	chroot_setup
+	extra_chroot_setup
+	chroot_build_target
+	${chroot_build_release_cmd}
+
+	return 0
+} # main()
 
-	## Trick the ports 'run-autotools-fixup' target to do the right thing.
-	_OSVERSION=$(sysctl -n kern.osreldate)
-	REVISION=$(chroot ${CHROOTDIR} make -C /usr/src/release -V REVISION)
-	BRANCH=$(chroot ${CHROOTDIR} make -C /usr/src/release -V BRANCH)
-	UNAME_r=${REVISION}-${BRANCH}
-	if [ -d ${CHROOTDIR}/usr/doc ] && [ -z "${NODOC}" ]; then
-		PBUILD_FLAGS="OSVERSION=${_OSVERSION} BATCH=yes"
-		PBUILD_FLAGS="${PBUILD_FLAGS} UNAME_r=${UNAME_r}"
-		PBUILD_FLAGS="${PBUILD_FLAGS} OSREL=${REVISION}"
-		chroot ${CHROOTDIR} make -C /usr/ports/textproc/docproj \
-			${PBUILD_FLAGS} OPTIONS_UNSET="FOP IGOR" \
-			install clean distclean
-	fi
-fi
-
-buildenv_setup
-load_target_env
-eval chroot ${CHROOTDIR} make -C /usr/src ${RELEASE_WMAKEFLAGS} buildworld
-eval chroot ${CHROOTDIR} make -C /usr/src ${RELEASE_KMAKEFLAGS} buildkernel
-eval chroot ${CHROOTDIR} make -C /usr/src/release ${RELEASE_RMAKEFLAGS} \
-	release
-eval chroot ${CHROOTDIR} make -C /usr/src/release ${RELEASE_RMAKEFLAGS} \
-	install DESTDIR=/R WITH_COMPRESSED_IMAGES=${WITH_COMPRESSED_IMAGES} \
-	WITH_COMPRESSED_VMIMAGES=${WITH_COMPRESSED_VMIMAGES}
+main "${@}"

Copied and modified: head/release/tools/arm.subr (from r282566, projects/release-arm-redux/release/tools/arm.subr)
==============================================================================
--- projects/release-arm-redux/release/tools/arm.subr	Wed May  6 19:58:12 2015	(r282566, copy source)
+++ head/release/tools/arm.subr	Sat May  9 21:08:12 2015	(r282693)
@@ -64,52 +64,68 @@ umount_loop() {
 
 arm_create_disk() {
 	# Create the target raw file and temporary work directory.
-	gpart create -s ${PART_SCHEME} ${IMGBASE}
-	gpart add -t '\!12' -a 63 -s ${FAT_SIZE} ${mddev}
-	gpart set -a active -i 1 ${mddev}
-	newfs_msdos -L msdosboot -F ${FAT_TYPE} /dev/${mddev}s1
-	gpart add -t freebsd ${mddev}
-	gpart create -s bsd ${mddev}s2
-	gpart add -t freebsd-ufs -a 64k /dev/${mddev}s2
-	newfs -U -L rootfs /dev/${mddev}s2a
-	tunefs -j enable -N enable /dev/${mddev}s2a
+	chroot ${CHROOTDIR} gpart create -s ${PART_SCHEME} ${mddev}
+	chroot ${CHROOTDIR} gpart add -t '!12' -a 63 -s ${FAT_SIZE} ${mddev}
+	chroot ${CHROOTDIR} gpart set -a active -i 1 ${mddev}
+	chroot ${CHROOTDIR} newfs_msdos -L msdosboot -F ${FAT_TYPE} /dev/${mddev}s1
+	chroot ${CHROOTDIR} gpart add -t freebsd ${mddev}
+	chroot ${CHROOTDIR} gpart create -s bsd ${mddev}s2
+	chroot ${CHROOTDIR} gpart add -t freebsd-ufs -a 64k /dev/${mddev}s2
+	chroot ${CHROOTDIR} newfs -U -L rootfs /dev/${mddev}s2a
+	chroot ${CHROOTDIR} tunefs -j enable -N enable /dev/${mddev}s2a
+
+	return 0
+}
+
+arm_create_user() {
+	# Create a default user account 'freebsd' with the password 'freebsd',
+	# and set the default password for the 'root' user to 'root'.
+	chroot ${CHROOTDIR} /usr/sbin/pw groupadd freebsd -g 1001
+	chroot ${CHROOTDIR} /usr/sbin/pw useradd freebsd \
+		-m -M 0755 -w yes -n freebsd -u 1001 -g 1001 -G 0 \
+		-c 'FreeBSD User' -d '/home/freebsd' -s '/bin/csh'
+	chroot ${CHROOTDIR} /usr/sbin/pw usermod root -w yes
 
 	return 0
 }
 
 arm_install_base() {
-	mount /dev/${mddev}s2a ${DESTDIR}
-	cd ${WORLDDIR} && \
-		eval make TARGET=${EMBEDDED_TARGET} \
-			TARGET_ARCH=${EMBEDDED_TARGET_ARCH} \
-			DESTDIR=${DESTDIR} KERNCONF=${KERNEL} \
-			installworld installkernel distribution
+	chroot ${CHROOTDIR} mount /dev/${mddev}s2a ${DESTDIR}
+	eval chroot ${CHROOTDIR} make -C ${WORLDDIR} \
+		TARGET=${EMBEDDED_TARGET} \
+		TARGET_ARCH=${EMBEDDED_TARGET_ARCH} \
+		DESTDIR=${DESTDIR} KERNCONF=${KERNEL} \
+		installworld installkernel distribution
+	chroot ${CHROOTDIR} mkdir -p ${DESTDIR}/boot/msdos
+
+	arm_create_user
 
 	echo '# Custom /etc/fstab for FreeBSD embedded images' \
-		> ${DESTDIR}/etc/fstab
-	echo "/dev/msdosfs/MSDOSBOOT /boot/msdos msdosfs rw,noatime 0 0" \

*** DIFF OUTPUT TRUNCATED AT 1000 LINES ***



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201505092108.t49L8DTi026601>