This section describes the general procedures producing FreeBSD development snapshots and releases.
This section describes the build scripts used by FreeBSD Release Engineering Team to produce development snapshots and releases.
Prior to FreeBSD 9.0-RELEASE,
	src/release/Makefile was updated to
	support bsdinstall(8), and the
	src/release/generate-release.sh script
	was introduced as a wrapper to automate invoking the
	release(7) targets.
Prior to FreeBSD 9.2-RELEASE,
	src/release/release.sh was introduced,
	which heavily based on
	src/release/generate-release.sh included
	support to specify configuration files to override various
	options and environment variables.  Support for configuration
	files provided support for cross building each architecture
	for a release by specifying a separate configuration file for
	each invocation.
As a brief example of using
	src/release/release.sh to build a single
	release in /scratch:
#/bin/sh /usr/src/release/release.sh
As a brief example of using
	src/release/release.sh to build a single,
	cross-built release using a different target directory, create
	a custom release.conf containing:
# release.sh configuration for powerpc/powerpc64 CHROOTDIR="/scratch-powerpc64" TARGET="powerpc" TARGET_ARCH="powerpc64" KERNEL="GENERIC64"
Then invoke src/release/release.sh
	as:
#/bin/sh /usr/src/release/release.sh -c$HOME/release.conf
See release(7) and
	src/release/release.conf.sample for more
	details and example usage.
In order to make cross building the full set of
	architectures supported on a given branch faster, easier, and
	reduce human error factors, a wrapper script around
	src/release/release.sh was written to
	iterate through the various combinations of architectures and
	invoke src/release/release.sh using
	a configuration file specific to that architecture.
The wrapper script is called
	thermite.sh, which is available in the
	FreeBSD Subversion repository at
	svn://svn.freebsd.org/base/user/gjb/thermite/,
	in addition to configuration files used to build
	head/ and stable/ development
	snapshots.12/
Using thermite.sh is covered in Section 7.2, “Building FreeBSD Development Snapshots” and Section 7.3, “Building FreeBSD Releases”.
Each architecture and individual kernel have their own
	configuration file used by release.sh.
	Each branch has its own defaults-X.conf
	configuration which contains entries common throughout each
	architecture, where overrides or special variables are set
	and/or overridden in the per-build files.
The per-build configuration file naming scheme is in the
	form of
	${revision}-${TARGET_ARCH}-${KERNCONF}-${type}.conf,
	where the uppercase variables are equivalent to what
	make(1) uses in the build system, and lowercase variables
	are set within the configuration files, mapping to the major
	version of the respective branch.
Each branch also has its own
	builds-X.conf configuration, which is
	used by thermite.sh.  The
	thermite.sh script iterates through each
	${revision}, ${TARGET_ARCH},
	${KERNCONF}, and ${type} value, creating
	a master list of what to build.  However, a given
	combination from the list will only be built if the
	respective configuration file exists, which is where the
	naming scheme above is relevant.
There are two paths of file sourcing:
builds-
	    -> 12.confmain.conf
This controls thermite.sh
	    behavior
	    ->
	    12-amd64-GENERIC-snap.confdefaults-
	    -> 12.confmain.conf
This controls release/release.sh
	    behavior within the build chroot(8)
The
	  builds-,
	  12.confdefaults-,
	  and 12.confmain.conf configuration files exist
	  to reduce repetition between the various per-build
	  files.
The official release build machines have a specific
      filesystem layout, which using ZFS,
      thermite.sh takes heavy advantage of with
      clones and snapshots, ensuring a pristine build
      environment.
The build scripts reside in /releng/scripts-snapshot/scripts
      or /releng/scripts-release/scripts
      respectively, to avoid collisions between an
      RC build from a releng branch versus
      a STABLE snapshot from the respective stable
      branch.
A separate dataset exists for the final build images,
      /snap/ftp.  This
      directory contains both snapshots and releases directories.
      They are only used if the EVERYTHINGISFINE
      variable is defined in main.conf.
The EVERYTHINGISFINE variable name was
	chosen to avoid colliding with a variable that might be
	possibly set in the user environment, accidentally enabling
	the behavior that depends on it being defined.
As thermite.sh iterates through the
      master list of combinations and locates the per-build
      configuration file, a ZFS dataset is created
      under /releng, such as
      /releng/12-amd64-GENERIC-snap.
      The src/, ports/, and
      doc/ trees are checked out to separate
      ZFS datasets, such as /releng/12-src-snap, which are
      then cloned and mounted into the respective build datasets.
      This is done to avoid checking out a given tree more than
      once.
Assuming these filesystem paths,
      thermite.sh would be invoked as:
#cd /releng/scripts-snapshot/scripts#./setrev.sh -bstable/12/#./zfs-cleanup.sh -c ./builds-12.conf#./thermite.sh -c ./builds-12.conf
Once the builds have completed, additional helper scripts
      are available to generate development snapshot emails which are
      sent to the freebsd-snapshots@freebsd.org
      mailing list:
#cd /releng/scripts-snapshot/scripts#./get-checksums.sh -c ./builds-12.conf | ./generate-email.pl > snapshot-12-mail
The generated output should be double-checked for correctness, and the email itself should be PGP signed, in-line.
These helper scripts only apply to development snapshot builds. Announcements during the release cycle (excluding the final release announcement) are created from an email template. A sample of the email template currently used can be found here.
Similar to building FreeBSD development snapshots,
      thermite.sh would be invoked the same way.
      The difference between development snapshots and release builds,
      BETA and RC included, is
      that the chroot(8) configuration files must be named with
      release instead of snap as
      the "type", as mentioned above.
In addition, the BUILDTYPE and
      types must be changed from
      snap to release in
      defaults-
      and
      12.confbuilds-,
      respectively.12.conf
When building BETA,
      RC, and the final RELEASE,
      also statically set BUILDSVNREV to the
      revision on the branch reflecting the name change,
      BUILDDATE to the date the builds are started
      in YYYYMMDD format.  If the
      doc/ and ports/ trees have
      been tagged, also set PORTBRANCH and
      DOCBRANCH to the relevant tag path in the
      Subversion repository, replacing HEAD with
      the last changed revision.  Also set
      releasesrc in
      builds-
      to the relevant branch, such as 12.confstable/ or
      12/releng/.12.0/
During the release cycle, a copy of
      CHECKSUM.SHA512 and
      CHECKSUM.SHA256 for each architecture are
      stored in the FreeBSD Release Engineering Team internal repository in addition to being
      included in the various announcement emails.  Each
      MANIFEST containing the hashes of
      base.txz, kernel.txz,
      etc. are added to
      misc/freebsd-release-manifests in the Ports
      Collection, as well.
In preparation for the release build, several files need to be updated:
| File to Edit | What to Change | 
|---|---|
sys/conf/newvers.sh | Update the BRANCH value to
	      RELEASE | 
UPDATING | Add the anticipated announcement date | 
lib/csu/common/crtbrand.c | Replace __FreeBSD_version with
	      the value in
	      sys/sys/param.h | 
After building the final RELEASE, the
      releng/ branch is tagged as 12.0/release/ using the
      revision from which the 12.0.0/RELEASE was built.
      Similar to creating the stable/ and 12/releng/
      branches, this is done with 12.0/svn cp.  From the
      repository root:
%svn cp ^/releng/@r12.0/306420release/12.0.0/%svn commitrelease/12.0.0/
All FreeBSD documents are available for download at https://download.freebsd.org/ftp/doc/
Questions that are not answered by the
    documentation may be
    sent to <freebsd-questions@FreeBSD.org>.
    Send questions about this document to <freebsd-doc@FreeBSD.org>.