aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLexi Winter <ivy@FreeBSD.org>2025-09-12 20:59:25 +0000
committerLexi Winter <ivy@FreeBSD.org>2025-09-12 20:59:25 +0000
commit66f36c3686762d9a6e48b0453fc7221be36a0eb8 (patch)
tree104ade6c44551301d12f04f27201520ef9365b9d
parent163f8625c4df3ccdfab0717cf8b8d13a163e22eb (diff)
packages: Add meta-package sets
Add several metapackages which contain no files themselves, but depend on other packages. This allows the user to install a system by using a set like "FreeBSD-set-minimal" instead of having to know which specific packages are required, and it means if we add more package in the future, existing installations will get them automatically as long as they were installed using a set. The defined sets are significantly less granular than the actual packages; the assumption is that users who want a very specific set of packages installed can do that manually, while sets are intended more for typical users who just want to install FreeBSD. The following sets are defined: * minimal: the set of packages required to boot the system and bring up a multi-user UNIX system. This includes hardware support, networking (wireless, DHCP), basic functionality like syslogd, cron and periodic. It does not include a kernel, because the kernels are quite large and the user might want to use a custom kernel. sendmail and DMA are not included in minimal. Since we provide two MTAs, the user should select which one they want, or install one from ports. sshd is not included because it's not required for the base system, and the user might want to install it from ports. Some other significant subsystems (e.g. NFS, Kerberos) are also not included. The minimal set does not include any libraries itself, since we rely on dependencies to pull these in. This implies it doesn't include library manpages, which is fine, since users won't want manpages for libraries unless they've also installed the development packages. * devel: the compiler toolchain for building software, along with all "-dev" packages which include header files and static libraries. * lib32: 32-bit compatibility packages. This includes both runtime and development packages. * kernels: the kernel packages. For freebsd.org builds, this will be GENERIC, GENERIC-DEBUG, etc., for custom builds it will be whatever was set in $KERNCONF. * base: everything else; this includes the entire base system. For each set, also generate a <setname>-dbg set containing the debug packages for the set. The sets are built along with the rest of the packages using a new script called create-sets.sh, which examines the "set" annotation in each package and puts it in the appropriate set. This is in anticipation of the later "groups" feature appearing in pkg itself, at which point we can simply replace the set annotation with the group. MFC after: 3 days Reviewed by: imp, bapt Differential Revision: https://reviews.freebsd.org/D52412
-rw-r--r--Makefile.inc130
-rwxr-xr-xrelease/packages/create-sets.sh45
-rwxr-xr-xrelease/packages/generate-set-ucl.lua96
-rwxr-xr-xrelease/packages/generate-ucl.lua34
-rw-r--r--release/packages/set-template.ucl15
-rw-r--r--release/packages/sets/base-dbg.ucl16
-rw-r--r--release/packages/sets/base.ucl16
-rw-r--r--release/packages/sets/devel-dbg.ucl13
-rw-r--r--release/packages/sets/devel.ucl13
-rw-r--r--release/packages/sets/kernels-dbg.ucl6
-rw-r--r--release/packages/sets/kernels.ucl6
-rw-r--r--release/packages/sets/lib32-dbg.ucl6
-rw-r--r--release/packages/sets/lib32.ucl6
-rw-r--r--release/packages/sets/minimal-dbg.ucl6
-rw-r--r--release/packages/sets/minimal.ucl6
-rw-r--r--release/packages/template.ucl33
-rw-r--r--release/packages/ucl/README21
-rw-r--r--release/packages/ucl/at-all.ucl4
-rw-r--r--release/packages/ucl/bmake-all.ucl5
-rw-r--r--release/packages/ucl/bootloader-all.ucl4
-rw-r--r--release/packages/ucl/caroot-all.ucl4
-rw-r--r--release/packages/ucl/certctl-all.ucl4
-rw-r--r--release/packages/ucl/clang-all.ucl4
-rw-r--r--release/packages/ucl/clibs-all.ucl5
-rw-r--r--release/packages/ucl/cron-all.ucl4
-rw-r--r--release/packages/ucl/ctf-tools-all.ucl5
-rw-r--r--release/packages/ucl/devd-all.ucl5
-rw-r--r--release/packages/ucl/devmatch-all.ucl11
-rw-r--r--release/packages/ucl/dhclient-all.ucl5
-rw-r--r--release/packages/ucl/dtb-all.ucl5
-rw-r--r--release/packages/ucl/fetch-all.ucl10
-rw-r--r--release/packages/ucl/firmware-iwm-all.ucl10
-rw-r--r--release/packages/ucl/fwget-all.ucl10
-rw-r--r--release/packages/ucl/geom-all.ucl11
-rw-r--r--release/packages/ucl/hyperv-tools-all.ucl10
-rw-r--r--release/packages/ucl/inetd-all.ucl9
-rw-r--r--release/packages/ucl/kernel-all.ucl5
-rw-r--r--release/packages/ucl/lld-all.ucl4
-rw-r--r--release/packages/ucl/lldb-all.ucl4
-rw-r--r--release/packages/ucl/locales-all.ucl5
-rw-r--r--release/packages/ucl/mtree-all.ucl5
-rw-r--r--release/packages/ucl/newsyslog-all.ucl10
-rw-r--r--release/packages/ucl/nuageinit-all.ucl5
-rw-r--r--release/packages/ucl/periodic-all.ucl11
-rw-r--r--release/packages/ucl/pkg-bootstrap-all.ucl11
-rw-r--r--release/packages/ucl/ppp-all.ucl5
-rw-r--r--release/packages/ucl/rc-all.ucl11
-rw-r--r--release/packages/ucl/rdma-all.ucl3
-rw-r--r--release/packages/ucl/rescue-all.ucl11
-rw-r--r--release/packages/ucl/resolvconf-all.ucl11
-rw-r--r--release/packages/ucl/runtime-all.ucl10
-rw-r--r--release/packages/ucl/runtime.ucl1
-rw-r--r--release/packages/ucl/syslogd-all.ucl10
-rw-r--r--release/packages/ucl/toolchain-all.ucl5
-rw-r--r--release/packages/ucl/ufs-all.ucl5
-rw-r--r--release/packages/ucl/utilities-all.ucl5
-rw-r--r--release/packages/ucl/vi-all.ucl10
-rw-r--r--release/packages/ucl/vt-data-all.ucl5
-rw-r--r--release/packages/ucl/wpa-all.ucl5
-rw-r--r--release/packages/ucl/zfs-all.ucl5
-rw-r--r--release/packages/ucl/zoneinfo-all.ucl4
61 files changed, 619 insertions, 40 deletions
diff --git a/Makefile.inc1 b/Makefile.inc1
index 98059640daab..97a0b00cc517 100644
--- a/Makefile.inc1
+++ b/Makefile.inc1
@@ -2097,6 +2097,14 @@ create-packages-world: _pkgbootstrap _repodir .PHONY
DESTDIR=${WSTAGEDIR} \
PKG_VERSION=${PKG_VERSION} create-world-packages
+.ORDER: create-packages-world create-packages-sets
+.ORDER: create-packages-kernel create-packages-sets
+create-packages-sets: _pkgbootstrap _repodir .PHONY
+ ${_+_}@cd ${.CURDIR}; \
+ ${MAKE} -f Makefile.inc1 \
+ DESTDIR=${WSTAGEDIR} \
+ PKG_VERSION=${PKG_VERSION} create-sets-packages
+
create-packages-kernel: _pkgbootstrap _repodir .PHONY
${_+_}@cd ${.CURDIR}; \
${MAKE} -f Makefile.inc1 \
@@ -2109,6 +2117,8 @@ create-packages-kernel-repo: .PHONY create-packages-kernel sign-packages
create-packages-world-repo: .PHONY create-packages-world sign-packages
+create-packages-sets-repo: .PHONY create-packages-sets sign-packages
+
create-packages-source: _pkgbootstrap _repodir .PHONY
${_+_}@cd ${.CURDIR}; \
${MAKE} -f Makefile.inc1 \
@@ -2117,7 +2127,7 @@ create-packages-source: _pkgbootstrap _repodir .PHONY
SOURCE_DATE_EPOCH=${SOURCE_DATE_EPOCH} \
create-source-packages
-create-packages: .PHONY create-packages-world create-packages-kernel create-packages-source
+create-packages: .PHONY create-packages-world create-packages-kernel create-packages-source create-packages-sets
create-source-src-package: _pkgbootstrap .PHONY
rm -f ${SSTAGEDIR}/src.plist 2>/dev/null || :
@@ -2214,6 +2224,24 @@ create-world-package-${pkgname}: .PHONY
-o ${REPODIR}/${PKG_ABI}/${PKG_OUTPUT_DIR}
.endfor
+create-sets-packages-jobs: .PHONY create-sets-packages
+create-sets-packages: .PHONY
+ @echo "==> Creating set metapackages."
+ sh "${SRCDIR}/release/packages/create-sets.sh" "${SRCDIR}" \
+ "${WSTAGEDIR}" "${REPODIR}/${PKG_ABI}/${PKG_OUTPUT_DIR}" \
+ VERSION "${PKG_VERSION}" \
+ PKG_NAME_PREFIX "${PKG_NAME_PREFIX}" \
+ PKG_MAINTAINER "${PKG_MAINTAINER}" \
+ PKG_WWW "${PKG_WWW}"
+ @for manifest in ${WSTAGEDIR}/set-*.ucl; do \
+ echo "--> Processing manifest: $$manifest"; \
+ ${PKG_CMD} -o ABI=${PKG_ABI} -o OSVERSION="${SRCRELDATE}" \
+ create -f ${PKG_FORMAT} ${PKG_CLEVEL} \
+ -M $$manifest \
+ -o "${REPODIR}/${PKG_ABI}/${PKG_OUTPUT_DIR}" \
+ || exit 1; \
+ done
+
_default_flavor= -default
.if make(*package*) && exists(${KSTAGEDIR}/kernel.meta)
. if ${MK_DEBUG_FILES} != "no"
diff --git a/release/packages/create-sets.sh b/release/packages/create-sets.sh
new file mode 100755
index 000000000000..6c034834672e
--- /dev/null
+++ b/release/packages/create-sets.sh
@@ -0,0 +1,45 @@
+#! /bin/sh
+
+# Generate metapackage sets. We do this by examining the annotations field
+# of the packages we previously built.
+
+set -e
+
+if [ $# -lt 3 ]; then
+ printf >&2 'usage: %s <srcdir> <wstagedir> <repodir>\n' "$0"
+ exit 1
+fi
+
+srcdir="$1"; shift
+wstagedir="$1"; shift
+repodir="$1"; shift
+# Everything after the first three arguments is UCL variables we pass to
+# generate-set-ucl.lua.
+UCL_VARS="$@"
+
+for pkg in "$repodir"/*.pkg; do
+ # If the package name doesn't containing a '-', then it's
+ # probably data.pkg or packagesite.pkg, which are not real
+ # packages.
+ { echo "$pkg" | grep -q '-'; } || continue
+
+ set -- $(pkg query -F "$pkg" '%At %n %Av' | grep '^set ')
+ pkgname="$2"
+ set="$3"
+ SETS="$SETS $set"
+ setvar="$(echo "$set" | tr - _)"
+ eval PKGS_${setvar}=\"\$PKGS_${setvar} $pkgname\"
+done
+
+for set in $(echo $SETS | tr ' ' '\n' | sort | uniq); do
+ setvar="$(echo "$set" | tr - _)"
+ eval deps=\"\$PKGS_${setvar}\"
+
+ "${srcdir}/release/packages/generate-set-ucl.lua" \
+ "${srcdir}/release/packages/set-template.ucl" \
+ PKGNAME "$set" \
+ SET_DEPENDS "$deps" \
+ UCLFILES "${srcdir}/release/packages/sets" \
+ $UCL_VARS \
+ > "${wstagedir}/set-${set}.ucl"
+done
diff --git a/release/packages/generate-set-ucl.lua b/release/packages/generate-set-ucl.lua
new file mode 100755
index 000000000000..b1b70053b02a
--- /dev/null
+++ b/release/packages/generate-set-ucl.lua
@@ -0,0 +1,96 @@
+#!/usr/libexec/flua
+
+--[[ usage:
+generare-set-ucl.lua <template> [<variablename> <variablevalue>]
+
+Generate the UCL for a set metapackage. The variables provided will be
+substituted as UCL variables.
+]]--
+
+local ucl = require("ucl")
+
+-- This parser is the output UCL we want to build.
+local parser = ucl.parser()
+
+if #arg < 1 then
+ io.stderr:write(arg[0] .. ": missing template filename\n")
+ os.exit(1)
+end
+
+local template = table.remove(arg, 1)
+
+-- Set any $VARIABLES from the command line in the parser. This causes ucl to
+-- automatically replace them when we load the source ucl.
+if #arg % 2 ~= 0 then
+ io.stderr:write(arg[0] .. ": expected an even number of arguments, "
+ .. "got " .. #arg .. "\n")
+ os.exit(1)
+end
+
+local pkgprefix = nil
+local pkgversion = nil
+local pkgdeps = ""
+
+for i = 2, #arg, 2 do
+ local varname = arg[i - 1]
+ local varvalue = arg[i]
+
+ if varname == "PKG_NAME_PREFIX" and #varvalue > 0 then
+ pkgprefix = varvalue
+ elseif varname == "VERSION" and #varvalue > 0 then
+ pkgversion = varvalue
+ elseif varname == "SET_DEPENDS" and #varvalue > 0 then
+ pkgdeps = varvalue
+ end
+
+ parser:register_variable(varname, varvalue)
+end
+
+-- Load the source template.
+local res,err = parser:parse_file(template)
+if not res then
+ io.stderr:write(arg[0] .. ": fail to parse(" .. template .. "): "
+ .. err .. "\n")
+ os.exit(1)
+end
+
+local obj = parser:get_object()
+
+-- Dependency handling.
+obj["deps"] = obj["deps"] or {}
+
+-- If PKG_NAME_PREFIX is provided, rewrite the names of dependency packages.
+-- We can't do this in UCL since variable substitution doesn't work in array
+-- keys. Note that this only applies to dependencies from the set UCL files,
+-- because SET_DEPENDS already have the correct prefix.
+if pkgprefix ~= nil then
+ newdeps = {}
+ for dep, opts in pairs(obj["deps"]) do
+ local newdep = pkgprefix .. "-" .. dep
+ newdeps[newdep] = opts
+ end
+ obj["deps"] = newdeps
+end
+
+-- Add dependencies from SET_DEPENDS.
+for dep in string.gmatch(pkgdeps, "[^%s]+") do
+ obj["deps"][dep] = {
+ ["origin"] = "base"
+ }
+end
+
+-- Add a version key to all dependencies, otherwise pkg doesn't like it.
+for dep, opts in pairs(obj["deps"]) do
+ if obj["deps"][dep]["version"] == nil then
+ obj["deps"][dep]["version"] = pkgversion
+ end
+end
+
+-- If there are no dependencies, remove the deps key, otherwise pkg raises an
+-- error trying to read the manifest.
+if next(obj["deps"]) == nil then
+ obj["deps"] = nil
+end
+
+-- Write the output.
+io.stdout:write(ucl.to_format(obj, 'ucl', true))
diff --git a/release/packages/generate-ucl.lua b/release/packages/generate-ucl.lua
index 5637bbd3ad99..47f0a0e9a6a9 100755
--- a/release/packages/generate-ucl.lua
+++ b/release/packages/generate-ucl.lua
@@ -165,6 +165,40 @@ if add_gen_dep(pkgname, pkggenname) then
}
end
+--
+-- Handle the 'set' annotation.
+--
+-- Ensure we have an annotations table to work with.
+obj["annotations"] = obj["annotations"] or {}
+-- If no set is provided, use the default set which is "base".
+set = obj["annotations"]["set"] or "base"
+-- For subpackages, we may need to rewrite the set name. This is done a little
+-- differently from the normal pkg suffix processing, because we don't need sets
+-- to be as a granular as the base packages.
+--
+-- Create a single lib32 set for all lib32 packages. Most users don't need
+-- lib32, so this avoids creating a large number of unnecessary lib32 sets.
+-- However, lib32 debug symbols still go into their own package since they're
+-- quite large.
+if pkgname:match("%-dbg%-lib32$") then
+ set = "lib32-dbg"
+elseif pkgname:match("%-lib32$") then
+ set = "lib32"
+-- If this is a -dev package, put it in a single set called "devel" which
+-- contains all development files. Also include lib*-man packages, which
+-- contain manpages for libraries. Having a separate <set>-dev for every
+-- set is not necessary, because generally you either want development
+-- support or you don't.
+elseif pkgname:match("%-dev$") or pkgname:match("^lib.*%-man$") then
+ set = "devel"
+-- If this is a -dbg package, it goes in <set>-dbg, which means the user can
+-- install debug symbols only for the sets they have installed.
+elseif pkgname:match("%-dbg$") then
+ set = set .. "-dbg"
+end
+-- Put our new set back into the package.
+obj["annotations"]["set"] = set
+
-- If PKG_NAME_PREFIX is provided, rewrite the names of dependency packages.
-- We can't do this in UCL since variable substitution doesn't work in array
-- keys.
diff --git a/release/packages/set-template.ucl b/release/packages/set-template.ucl
new file mode 100644
index 000000000000..b7ea2b830168
--- /dev/null
+++ b/release/packages/set-template.ucl
@@ -0,0 +1,15 @@
+# This is the default set of options applied to the set metapackages.
+# The options are the same as template.ucl, but we don't include any
+# additional UCL files.
+
+name = "${PKG_NAME_PREFIX}-set-${PKGNAME}"
+prefix = "/"
+origin = "base"
+categories = [ base ]
+version = "${VERSION}"
+maintainer = "${PKG_MAINTAINER}"
+www = "${PKG_WWW}"
+licenselogic = "single"
+licenses = [ BSD2CLAUSE ]
+
+.include(try=false,duplicate=merge) "${UCLFILES}/${PKGNAME}.ucl"
diff --git a/release/packages/sets/base-dbg.ucl b/release/packages/sets/base-dbg.ucl
new file mode 100644
index 000000000000..c34e8b575834
--- /dev/null
+++ b/release/packages/sets/base-dbg.ucl
@@ -0,0 +1,16 @@
+comment = "Base system debug symbols (metapackage)"
+
+desc = <<EOD
+This metapackage installs debugging symbols for the complete base system.
+EOD
+
+deps {
+ "set-minimal-dbg" {
+ version = "${VERSION}"
+ origin = "base"
+ },
+ "set-devel-dbg" {
+ version = "${VERSION}"
+ origin = "base"
+ }
+}
diff --git a/release/packages/sets/base.ucl b/release/packages/sets/base.ucl
new file mode 100644
index 000000000000..42dd2095f808
--- /dev/null
+++ b/release/packages/sets/base.ucl
@@ -0,0 +1,16 @@
+comment = "Base system (metapackage)"
+
+desc = <<EOD
+This metapackage installs all packages which are part of the base system.
+EOD
+
+deps {
+ "set-minimal" {
+ version = "${VERSION}"
+ origin = "base"
+ },
+ "set-devel" {
+ version = "${VERSION}"
+ origin = "base"
+ }
+}
diff --git a/release/packages/sets/devel-dbg.ucl b/release/packages/sets/devel-dbg.ucl
new file mode 100644
index 000000000000..5da492b93750
--- /dev/null
+++ b/release/packages/sets/devel-dbg.ucl
@@ -0,0 +1,13 @@
+comment = "Developments tools debugging symbols (metapackage)"
+
+desc = <<EOD
+This metapackage installs debugging symbols for the base system compiler and
+toolchain.
+EOD
+
+deps {
+ "set-minimal-dbg" {
+ version = "${VERSION}"
+ origin = "base"
+ },
+}
diff --git a/release/packages/sets/devel.ucl b/release/packages/sets/devel.ucl
new file mode 100644
index 000000000000..ac6b6bab7ef8
--- /dev/null
+++ b/release/packages/sets/devel.ucl
@@ -0,0 +1,13 @@
+comment = "Developments tools (metapackage)"
+
+desc = <<EOD
+This metapackage installs development support for the base system, including
+compilers, toolchain utilities, header files, and static libraries.
+EOD
+
+deps {
+ "set-minimal" {
+ version = "${VERSION}"
+ origin = "base"
+ },
+}
diff --git a/release/packages/sets/kernels-dbg.ucl b/release/packages/sets/kernels-dbg.ucl
new file mode 100644
index 000000000000..cf789c29d35a
--- /dev/null
+++ b/release/packages/sets/kernels-dbg.ucl
@@ -0,0 +1,6 @@
+comment = "Base system kernels debugging symbols (metapackage)"
+
+desc = <<EOD
+This metapackage installs debugging symbols for the operating system kernels
+provided with the base system.
+EOD
diff --git a/release/packages/sets/kernels.ucl b/release/packages/sets/kernels.ucl
new file mode 100644
index 000000000000..a57bd5f16905
--- /dev/null
+++ b/release/packages/sets/kernels.ucl
@@ -0,0 +1,6 @@
+comment = "Base system kernels (metapackage)"
+
+desc = <<EOD
+This metapackage installs the operating system kernels provided with the
+base system.
+EOD
diff --git a/release/packages/sets/lib32-dbg.ucl b/release/packages/sets/lib32-dbg.ucl
new file mode 100644
index 000000000000..12722510dc94
--- /dev/null
+++ b/release/packages/sets/lib32-dbg.ucl
@@ -0,0 +1,6 @@
+comment = "32-bit compatibility library debugging symbols (metapackage)"
+
+desc = <<EOD
+This metapackage installs debugging symbols for the compatibility libraries
+required for building and running 32-bit applications on a 64-bit host system.
+EOD
diff --git a/release/packages/sets/lib32.ucl b/release/packages/sets/lib32.ucl
new file mode 100644
index 000000000000..c1b921c30b2e
--- /dev/null
+++ b/release/packages/sets/lib32.ucl
@@ -0,0 +1,6 @@
+comment = "32-bit compatibility libraries (metapackage)"
+
+desc = <<EOD
+This metapackage installs compatibility libraries required for building and
+running 32-bit applications on a 64-bit host system.
+EOD
diff --git a/release/packages/sets/minimal-dbg.ucl b/release/packages/sets/minimal-dbg.ucl
new file mode 100644
index 000000000000..606394001696
--- /dev/null
+++ b/release/packages/sets/minimal-dbg.ucl
@@ -0,0 +1,6 @@
+comment = "Basic multi-user system debugging symbols (metapackage)"
+
+desc = <<EOD
+This metapackage installs debugging symbols for the packages required to bring
+up a basic multi-user system.
+EOD
diff --git a/release/packages/sets/minimal.ucl b/release/packages/sets/minimal.ucl
new file mode 100644
index 000000000000..0895f198824e
--- /dev/null
+++ b/release/packages/sets/minimal.ucl
@@ -0,0 +1,6 @@
+comment = "Basic multi-user system (metapackage)"
+
+desc = <<EOD
+This metapackage installs the packages required to bring up a basic multi-user
+system.
+EOD
diff --git a/release/packages/template.ucl b/release/packages/template.ucl
index faa48effe1ad..bf4b1b44bbec 100644
--- a/release/packages/template.ucl
+++ b/release/packages/template.ucl
@@ -1,19 +1,36 @@
-#
-#
+# This is the default set of options applied to all packages, unless overridden
+# in the package-specific manifests.
+# The name of the package. $PKG_NAME_PREFIX is "FreeBSD", or might be replaced
+# by a downstream packager.
name = "${PKG_NAME_PREFIX}-${PKGNAME}"
+
+# Base packages always install to /.
+prefix = "/"
+
+# For base packages, origin is always "base".
origin = "base"
-version = "${VERSION}"
-comment = "${PKGNAME} package"
categories = [ base ]
+
+# $VERSION is the version of the base system being built.
+version = "${VERSION}"
+
+# Maintainer and WWW point to freebsd.org by default. This should not be
+# changed in package-specific manifests even for third-party packages.
maintainer = "${PKG_MAINTAINER}"
www = "${PKG_WWW}"
-prefix = "/"
+
+# Default the license to BSD2CLAUSE since this is the standard license for
+# the base system.
licenselogic = "single"
licenses = [ BSD2CLAUSE ]
-desc = <<EOD
-${PKGNAME} package
-EOD
+
+# By default, packages go in the "base" set which includes everything.
+annotations {
+ set = base
+}
+
+# Include the package-specific UCL.
.include(try=false,duplicate=rewrite) "${UCLFILES}/${PKGGENNAME}-all.ucl"
.include(try=true,duplicate=rewrite) "${UCLFILES}/${PKGNAME}.ucl"
.include(try=true,duplicate=rewrite) "${UCLFILES}/${FORCEINCLUDE}.ucl"
diff --git a/release/packages/ucl/README b/release/packages/ucl/README
new file mode 100644
index 000000000000..85b6130c0488
--- /dev/null
+++ b/release/packages/ucl/README
@@ -0,0 +1,21 @@
+This directory contains package manifests for the base packages in UCL format.
+There are two types of manifest: "<package>.ucl" applies specifically to the
+package called "<package>", and "<package>-all.ucl" applies to all of that
+package's subpackages.
+
+For example, if a Makefile sets PACKAGE=foo, then the build might generate the
+following packages:
+
+ FreeBSD-foo
+ FreeBSD-foo-dev
+ FreeBSD-foo-lib32
+ FreeBSD-foo-man
+
+All of these packages will include "foo-all.ucl", but "foo.ucl" will only be
+included by FreeBSD-foo, "foo-dev.ucl" will only be included by FreeBSD-foo-dev,
+and so on.
+
+In general, dependencies and post-install scripts should be added in the
+package-specific manifests, while comment and description should be set
+in the "-all" manifest.
+
diff --git a/release/packages/ucl/at-all.ucl b/release/packages/ucl/at-all.ucl
index c15642737b36..3e837d781d38 100644
--- a/release/packages/ucl/at-all.ucl
+++ b/release/packages/ucl/at-all.ucl
@@ -2,3 +2,7 @@ comment = "AT Utilities"
desc = <<EOD
AT Utilities
EOD
+
+annotations {
+ set = minimal
+}
diff --git a/release/packages/ucl/bmake-all.ucl b/release/packages/ucl/bmake-all.ucl
index ee8175d1dd8a..3f5a5d9cd879 100644
--- a/release/packages/ucl/bmake-all.ucl
+++ b/release/packages/ucl/bmake-all.ucl
@@ -1,5 +1,10 @@
comment = "Program maintenance utility"
+
desc = <<EOD
make(1) allows programs to be built from source files based on a specification
of the program's dependencies called a Makefile.
EOD
+
+annotations {
+ set = devel
+}
diff --git a/release/packages/ucl/bootloader-all.ucl b/release/packages/ucl/bootloader-all.ucl
index c5690e85c7ba..ea5e94919c96 100644
--- a/release/packages/ucl/bootloader-all.ucl
+++ b/release/packages/ucl/bootloader-all.ucl
@@ -2,3 +2,7 @@ comment = "Bootloader"
desc = <<EOD
Bootloader and configuration files
EOD
+
+annotations {
+ set = minimal
+}
diff --git a/release/packages/ucl/caroot-all.ucl b/release/packages/ucl/caroot-all.ucl
index 151c1f18ae39..f62f4ff2be37 100644
--- a/release/packages/ucl/caroot-all.ucl
+++ b/release/packages/ucl/caroot-all.ucl
@@ -2,3 +2,7 @@ comment = "SSL Certificates"
desc = <<EOD
SSL Certificates
EOD
+
+annotations {
+ set = minimal
+}
diff --git a/release/packages/ucl/certctl-all.ucl b/release/packages/ucl/certctl-all.ucl
index b4bc5ae261c5..0e3dd49d7b00 100644
--- a/release/packages/ucl/certctl-all.ucl
+++ b/release/packages/ucl/certctl-all.ucl
@@ -2,3 +2,7 @@ comment = "SSL Certificate Utility"
desc = <<EOD
SSL Certificate Utility
EOD
+
+annotations {
+ set = minimal
+}
diff --git a/release/packages/ucl/clang-all.ucl b/release/packages/ucl/clang-all.ucl
index 3f79f0acb229..e0fe8f35f40e 100644
--- a/release/packages/ucl/clang-all.ucl
+++ b/release/packages/ucl/clang-all.ucl
@@ -3,3 +3,7 @@ desc = <<EOD
Clang Utilities
EOD
licenses = [ NCSA ]
+
+annotations {
+ set = devel
+}
diff --git a/release/packages/ucl/clibs-all.ucl b/release/packages/ucl/clibs-all.ucl
index 69ae018d4d1f..65353d515403 100644
--- a/release/packages/ucl/clibs-all.ucl
+++ b/release/packages/ucl/clibs-all.ucl
@@ -1,4 +1,9 @@
comment = "Core C Libraries"
+
desc = <<EOD
Core C Libraries
EOD
+
+annotations {
+ set = minimal
+}
diff --git a/release/packages/ucl/cron-all.ucl b/release/packages/ucl/cron-all.ucl
index d9edf6bfde52..39bd69b0ba4b 100644
--- a/release/packages/ucl/cron-all.ucl
+++ b/release/packages/ucl/cron-all.ucl
@@ -2,3 +2,7 @@ comment = "cron(8) and crontab(1)"
desc = <<EOD
cron(8) and crontab(1)
EOD
+
+annotations {
+ set = minimal
+}
diff --git a/release/packages/ucl/ctf-tools-all.ucl b/release/packages/ucl/ctf-tools-all.ucl
index 38ca769f6109..ba092792dea4 100644
--- a/release/packages/ucl/ctf-tools-all.ucl
+++ b/release/packages/ucl/ctf-tools-all.ucl
@@ -1,4 +1,9 @@
comment = "CTF Utilities"
+
desc = <<EOD
CTF Utilities
EOD
+
+annotations {
+ set = devel
+}
diff --git a/release/packages/ucl/devd-all.ucl b/release/packages/ucl/devd-all.ucl
index dc7d162a1930..a78718955f24 100644
--- a/release/packages/ucl/devd-all.ucl
+++ b/release/packages/ucl/devd-all.ucl
@@ -1,4 +1,9 @@
comment = "Devd Utility and scripts"
+
desc = <<EOD
Devd Utility and scripts
EOD
+
+annotations {
+ set = minimal
+}
diff --git a/release/packages/ucl/devmatch-all.ucl b/release/packages/ucl/devmatch-all.ucl
index 02dc903fd422..56e37461a747 100644
--- a/release/packages/ucl/devmatch-all.ucl
+++ b/release/packages/ucl/devmatch-all.ucl
@@ -1,4 +1,11 @@
-comment = "Devmatch Utility"
+comment = "Automatically load kernel drivers for attached hardware"
+
desc = <<EOD
-Devmatch Utility
+The devmatch(8) utility is used to load kernel drivers for hardware attached to
+the running system. devmatch(8) is started at boot by rc(8), and during system
+operation by devd(8) when new hardware is attached to the system.
EOD
+
+annotations {
+ set = minimal
+}
diff --git a/release/packages/ucl/dhclient-all.ucl b/release/packages/ucl/dhclient-all.ucl
index 6785366aea5e..a5035075bf23 100644
--- a/release/packages/ucl/dhclient-all.ucl
+++ b/release/packages/ucl/dhclient-all.ucl
@@ -1,4 +1,9 @@
comment = "DHCP Client"
+
desc = <<EOD
DHCP Client
EOD
+
+annotations {
+ set = minimal
+}
diff --git a/release/packages/ucl/dtb-all.ucl b/release/packages/ucl/dtb-all.ucl
index cc5c1c60f062..5de470796adc 100644
--- a/release/packages/ucl/dtb-all.ucl
+++ b/release/packages/ucl/dtb-all.ucl
@@ -1,4 +1,9 @@
comment = "FreeBSD Devicetree Blobs"
+
desc = <<EOD
FreeBSD Devicetree Blobs
EOD
+
+annotations {
+ set = minimal
+}
diff --git a/release/packages/ucl/fetch-all.ucl b/release/packages/ucl/fetch-all.ucl
index f9a3e03e6fa4..5c488cc1d865 100644
--- a/release/packages/ucl/fetch-all.ucl
+++ b/release/packages/ucl/fetch-all.ucl
@@ -1,4 +1,10 @@
-comment = "Fetch Utility"
+comment = "Retrieve a file from a remote URL"
+
desc = <<EOD
-Fetch Utility
+The fetch(1) utility can be used to retieve files from a remote URL via
+HTTP or FTP.
EOD
+
+annotations {
+ set = minimal
+}
diff --git a/release/packages/ucl/firmware-iwm-all.ucl b/release/packages/ucl/firmware-iwm-all.ucl
index 6fec27c15351..e9952c5f7f56 100644
--- a/release/packages/ucl/firmware-iwm-all.ucl
+++ b/release/packages/ucl/firmware-iwm-all.ucl
@@ -1,4 +1,10 @@
-comment = "iwm(4) firmwares"
+comment = "Firmware for iwm(4) Intel 802.11ac network interfaces"
+
desc = <<EOD
-iwm(4) firmwares
+This firmware is required for Intel 802.11ac wireless network cards supported
+by the iwm(4) driver.
EOD
+
+annotations {
+ set = minimal
+}
diff --git a/release/packages/ucl/fwget-all.ucl b/release/packages/ucl/fwget-all.ucl
index 7a6f9dff5cc9..9ef27df625c3 100644
--- a/release/packages/ucl/fwget-all.ucl
+++ b/release/packages/ucl/fwget-all.ucl
@@ -1,4 +1,10 @@
-comment = "FWGET Utility"
+comment = "Install firmware packages for the running system"
+
desc = <<EOD
-FWGET Utility
+The fwget(8) utility can be used to detect and install firmware packages for
+hardware devices present on a running system.
EOD
+
+annotations {
+ set = minimal
+}
diff --git a/release/packages/ucl/geom-all.ucl b/release/packages/ucl/geom-all.ucl
index 6d80b4458f64..a7b335236048 100644
--- a/release/packages/ucl/geom-all.ucl
+++ b/release/packages/ucl/geom-all.ucl
@@ -1,4 +1,11 @@
-comment = "GEOM Utilitites"
+comment = "GEOM configuration utilities"
+
desc = <<EOD
-GEOM Utilitites
+The geom(4) subsystem provides a modular, generic interface to manage disk
+devices, including disk partitioning, basic RAID, and block-level encryption.
+This package provides the command-line utilities used to manage GEOM.
EOD
+
+annotations {
+ set = minimal
+}
diff --git a/release/packages/ucl/hyperv-tools-all.ucl b/release/packages/ucl/hyperv-tools-all.ucl
index e16fd5b4b053..95c7b6dc0b49 100644
--- a/release/packages/ucl/hyperv-tools-all.ucl
+++ b/release/packages/ucl/hyperv-tools-all.ucl
@@ -1,4 +1,10 @@
-comment = "Microsoft HyperV Utilities"
+comment = "Microsoft Hyper-V utilities"
+
desc = <<EOD
-Microsoft HyperV Utilities
+This package provides utilities used when running on the Microsoft Hyper-V
+virtualisation platform.
EOD
+
+annotations {
+ set = minimal
+}
diff --git a/release/packages/ucl/inetd-all.ucl b/release/packages/ucl/inetd-all.ucl
index 731769bdc399..5a6bb05f1675 100644
--- a/release/packages/ucl/inetd-all.ucl
+++ b/release/packages/ucl/inetd-all.ucl
@@ -1,4 +1,11 @@
comment = "Internet super-server"
+
desc = <<EOD
-Internet super-server
+The inetd(8) server listens for incoming network connections and spawns a
+process to handle the connection based on its configuration file. Some
+built-in servers for basic services are also provided.
EOD
+
+annotations {
+ set = minimal
+}
diff --git a/release/packages/ucl/kernel-all.ucl b/release/packages/ucl/kernel-all.ucl
index 31671602a947..be55373397eb 100644
--- a/release/packages/ucl/kernel-all.ucl
+++ b/release/packages/ucl/kernel-all.ucl
@@ -1,4 +1,9 @@
comment = "FreeBSD ${KERNEL_NAME} Kernel ${KERNEL_FLAVOR}"
+
desc = <<EOD
FreeBSD ${KERNEL_NAME} Kernel ${KERNEL_FLAVOR}
EOD
+
+annotations {
+ set = kernels
+}
diff --git a/release/packages/ucl/lld-all.ucl b/release/packages/ucl/lld-all.ucl
index 03daf1b235e6..4c96d8d7b313 100644
--- a/release/packages/ucl/lld-all.ucl
+++ b/release/packages/ucl/lld-all.ucl
@@ -4,3 +4,7 @@ ld.lld is the ELF linker provided by LLVM.
EOD
licenses = [ NCSA ]
+
+annotations {
+ set = devel
+}
diff --git a/release/packages/ucl/lldb-all.ucl b/release/packages/ucl/lldb-all.ucl
index da481c026981..d6ff16421724 100644
--- a/release/packages/ucl/lldb-all.ucl
+++ b/release/packages/ucl/lldb-all.ucl
@@ -4,3 +4,7 @@ lldb is a source-level debugger from the LLVM project.
EOD
licenses = [ NCSA ]
+
+annotations {
+ set = devel
+}
diff --git a/release/packages/ucl/locales-all.ucl b/release/packages/ucl/locales-all.ucl
index 6fc53ab10fca..78a15501d493 100644
--- a/release/packages/ucl/locales-all.ucl
+++ b/release/packages/ucl/locales-all.ucl
@@ -1,4 +1,9 @@
comment = "Locale definitions"
+
desc = <<EOD
Provides the locale definitions (LC_*) for supported locales.
EOD
+
+annotations {
+ set = minimal
+}
diff --git a/release/packages/ucl/mtree-all.ucl b/release/packages/ucl/mtree-all.ucl
index b921c51a6afb..f7c12f9def88 100644
--- a/release/packages/ucl/mtree-all.ucl
+++ b/release/packages/ucl/mtree-all.ucl
@@ -1,4 +1,9 @@
comment = "MTREE Files"
+
desc = <<EOD
MTREE Files
EOD
+
+annotations {
+ set = devel
+}
diff --git a/release/packages/ucl/newsyslog-all.ucl b/release/packages/ucl/newsyslog-all.ucl
index e52b34dbdcba..824a5d62f587 100644
--- a/release/packages/ucl/newsyslog-all.ucl
+++ b/release/packages/ucl/newsyslog-all.ucl
@@ -1,4 +1,10 @@
-comment = "Newsyslog Utility"
+comment = "Create and rotate system log files"
+
desc = <<EOD
-Newsyslog Utility
+The newsyslog(8) utility, usually run automatically from cron(8), is used to
+create log files in /var/log and periodically rotate existing log files.
EOD
+
+annotations {
+ set = minimal
+}
diff --git a/release/packages/ucl/nuageinit-all.ucl b/release/packages/ucl/nuageinit-all.ucl
index 4d510b799fa7..c3862c52b8ff 100644
--- a/release/packages/ucl/nuageinit-all.ucl
+++ b/release/packages/ucl/nuageinit-all.ucl
@@ -1,4 +1,9 @@
comment = "CloudInit support scripts"
+
desc = <<EOD
CloudInit support scripts
EOD
+
+annotations {
+ set = minimal
+}
diff --git a/release/packages/ucl/periodic-all.ucl b/release/packages/ucl/periodic-all.ucl
index 569bf8d829c4..b1b3e47ec10a 100644
--- a/release/packages/ucl/periodic-all.ucl
+++ b/release/packages/ucl/periodic-all.ucl
@@ -1,4 +1,11 @@
-comment = "Periodic Utility"
+comment = "Run periodic system functions"
+
desc = <<EOD
-Periodic Utility
+The periodic(8) utility, usually run from cron(8), provides a system for
+scheduling regular system maintenance tasks. This package also provides
+the base periodic tasks for the base system.
EOD
+
+annotations {
+ set = minimal
+}
diff --git a/release/packages/ucl/pkg-bootstrap-all.ucl b/release/packages/ucl/pkg-bootstrap-all.ucl
index 9ca6ccd2af58..47b28ba1d374 100644
--- a/release/packages/ucl/pkg-bootstrap-all.ucl
+++ b/release/packages/ucl/pkg-bootstrap-all.ucl
@@ -1,4 +1,11 @@
-comment = "pkg bootstrap Utility"
+comment = "pkg(7) bootstrap utility"
+
desc = <<EOD
-pkg bootstrap Utility
+/usr/sbin/pkg is a minimal bootstrap tool used to install the full pkg(8)
+package management system. This package also contains the PGP keys for
+the FreeBSD.org package repository.
EOD
+
+annotations {
+ set = minimal
+}
diff --git a/release/packages/ucl/ppp-all.ucl b/release/packages/ucl/ppp-all.ucl
index 454e54b7b872..f3206da7cd45 100644
--- a/release/packages/ucl/ppp-all.ucl
+++ b/release/packages/ucl/ppp-all.ucl
@@ -1,5 +1,10 @@
comment = "Userland PPP implementation"
+
desc = <<EOD
ppp(8) is a userland implementations of the Point to Point Protocol for serial
lines and Ethernet (PPPoE).
EOD
+
+annotations {
+ set = minimal
+}
diff --git a/release/packages/ucl/rc-all.ucl b/release/packages/ucl/rc-all.ucl
index 04ed0dafacf0..1d5a1b9b728d 100644
--- a/release/packages/ucl/rc-all.ucl
+++ b/release/packages/ucl/rc-all.ucl
@@ -1,4 +1,11 @@
-comment = "RC Scripts"
+comment = "rc(8) subsystem"
+
desc = <<EOD
-RC Scripts
+The rc(8) subsystem provides a method to start services at system startup and
+stop them at shutdown. This package provides the rc(8) subsystem itself and
+the service scripts for the base system.
EOD
+
+annotations {
+ set = minimal
+}
diff --git a/release/packages/ucl/rdma-all.ucl b/release/packages/ucl/rdma-all.ucl
index 313c2b7d17e0..eb9e39210143 100644
--- a/release/packages/ucl/rdma-all.ucl
+++ b/release/packages/ucl/rdma-all.ucl
@@ -1 +1,4 @@
comment = "RDMA Utilities"
+desc = <<EOD
+RDMA Utilities
+EOD
diff --git a/release/packages/ucl/rescue-all.ucl b/release/packages/ucl/rescue-all.ucl
index da870079bbb7..417ced079a6a 100644
--- a/release/packages/ucl/rescue-all.ucl
+++ b/release/packages/ucl/rescue-all.ucl
@@ -1,4 +1,11 @@
-comment = "Rescue Utilities"
+comment = "Rescue system"
+
desc = <<EOD
-Rescue Utilities
+The rescue system, installed in /rescue, provides a basic set of tools that
+may be used to recover from a system failure which prevents the standard
+utilities from working.
EOD
+
+annotations {
+ set = minimal
+}
diff --git a/release/packages/ucl/resolvconf-all.ucl b/release/packages/ucl/resolvconf-all.ucl
index a2d2e0debfa1..47d7d8232972 100644
--- a/release/packages/ucl/resolvconf-all.ucl
+++ b/release/packages/ucl/resolvconf-all.ucl
@@ -1,4 +1,11 @@
-comment = "Resolvconf Utility and scripts"
+comment = "A framework for managing multiple DNS configurations"
+
desc = <<EOD
-Resolvconf Utility and scripts
+resolvconf(8) is used to manage /etc/resolv.conf for systems which move between
+different networks, such as laptops. It is typically invoked by dhclient(8) to
+provide new nameservers when connecting to a network.
EOD
+
+annotations {
+ set = minimal
+}
diff --git a/release/packages/ucl/runtime-all.ucl b/release/packages/ucl/runtime-all.ucl
index f614a3ef3d43..7635248dd76e 100644
--- a/release/packages/ucl/runtime-all.ucl
+++ b/release/packages/ucl/runtime-all.ucl
@@ -1,4 +1,10 @@
-comment = "FreeBSD Base System"
+comment = "Core system"
+
desc = <<EOD
-FreeBSD Base System
+This is the core system, including utilities, libraries and configuration files
+required for basic multi-user operation.
EOD
+
+annotations {
+ set = minimal
+}
diff --git a/release/packages/ucl/runtime.ucl b/release/packages/ucl/runtime.ucl
index b04bc32f33cc..5f90a1181334 100644
--- a/release/packages/ucl/runtime.ucl
+++ b/release/packages/ucl/runtime.ucl
@@ -1,4 +1,5 @@
vital: true
+
scripts: {
post-install = <<EOD
pwd_mkdb -i -p -d ${PKG_ROOTDIR}/etc ${PKG_ROOTDIR}/etc/master.passwd
diff --git a/release/packages/ucl/syslogd-all.ucl b/release/packages/ucl/syslogd-all.ucl
index 0f82c31fdf0f..0f174ef7401d 100644
--- a/release/packages/ucl/syslogd-all.ucl
+++ b/release/packages/ucl/syslogd-all.ucl
@@ -1,4 +1,10 @@
-comment = "Syslog Daemon"
+comment = "System logging daemon"
+
desc = <<EOD
-Syslog Daemon
+The syslogd(8) daemon receives log messages from local and remote processes and
+writes them to an appropriate log file.
EOD
+
+annotations {
+ set = minimal
+}
diff --git a/release/packages/ucl/toolchain-all.ucl b/release/packages/ucl/toolchain-all.ucl
index dd6517745722..5e89691c6380 100644
--- a/release/packages/ucl/toolchain-all.ucl
+++ b/release/packages/ucl/toolchain-all.ucl
@@ -1,4 +1,9 @@
comment = "Utilities for program development"
+
desc = <<EOD
Utilities for program development.
EOD
+
+annotations {
+ set = devel
+}
diff --git a/release/packages/ucl/ufs-all.ucl b/release/packages/ucl/ufs-all.ucl
index 48f9975e0dbd..87aaf428bae7 100644
--- a/release/packages/ucl/ufs-all.ucl
+++ b/release/packages/ucl/ufs-all.ucl
@@ -1,4 +1,9 @@
comment = "UFS Libraries and Utilities"
+
desc = <<EOD
UFS Libraries and Utilities
EOD
+
+annotations {
+ set = minimal
+}
diff --git a/release/packages/ucl/utilities-all.ucl b/release/packages/ucl/utilities-all.ucl
index aeb82b0cfed5..6e83b6584c02 100644
--- a/release/packages/ucl/utilities-all.ucl
+++ b/release/packages/ucl/utilities-all.ucl
@@ -1,4 +1,9 @@
comment = "Non-vital programs and libraries"
+
desc = <<EOD
Non-vital programs and libraries
EOD
+
+annotations {
+ set = minimal
+}
diff --git a/release/packages/ucl/vi-all.ucl b/release/packages/ucl/vi-all.ucl
index c2ad2f8e95eb..4504281e0549 100644
--- a/release/packages/ucl/vi-all.ucl
+++ b/release/packages/ucl/vi-all.ucl
@@ -1,4 +1,10 @@
-comment = "Vi Editor"
+comment = "Text editor"
+
desc = <<EOD
-Vi Editor
+This package provides ex(1), an extended version of the ed(1) line-oriented
+text editor, and vi(1), a user-friendly full-screen text editor based on ex.
EOD
+
+annotations {
+ set = minimal
+}
diff --git a/release/packages/ucl/vt-data-all.ucl b/release/packages/ucl/vt-data-all.ucl
index 4142b2eeae70..d5e1a36e5b1c 100644
--- a/release/packages/ucl/vt-data-all.ucl
+++ b/release/packages/ucl/vt-data-all.ucl
@@ -1,4 +1,9 @@
comment = "vt(4) fonts and keymaps"
+
desc = <<EOD
Fonts and keymaps for use with the vt(4) video console driver.
EOD
+
+annotations {
+ set = minimal
+}
diff --git a/release/packages/ucl/wpa-all.ucl b/release/packages/ucl/wpa-all.ucl
index e5ad7f36db95..dd2ca13fd4c1 100644
--- a/release/packages/ucl/wpa-all.ucl
+++ b/release/packages/ucl/wpa-all.ucl
@@ -1,4 +1,9 @@
comment = "802.11 Supplicant"
+
desc = <<EOD
802.11 Supplicant
EOD
+
+annotations {
+ set = minimal
+}
diff --git a/release/packages/ucl/zfs-all.ucl b/release/packages/ucl/zfs-all.ucl
index f4178acc481c..51d5a1d8c602 100644
--- a/release/packages/ucl/zfs-all.ucl
+++ b/release/packages/ucl/zfs-all.ucl
@@ -1,4 +1,9 @@
comment = "ZFS Libraries and Utilities"
+
desc = <<EOD
ZFS Libraries and Utilities
EOD
+
+annotations {
+ set = minimal
+}
diff --git a/release/packages/ucl/zoneinfo-all.ucl b/release/packages/ucl/zoneinfo-all.ucl
index ed737c740bee..3fc90fc3f88a 100644
--- a/release/packages/ucl/zoneinfo-all.ucl
+++ b/release/packages/ucl/zoneinfo-all.ucl
@@ -6,3 +6,7 @@ UTC and local timezones.
EOD
licenses = [ "PD" ]
+
+annotations {
+ set = minimal
+}