Skip site navigation (1)Skip section navigation (2)
Date:      Tue, 15 Jul 2025 05:12:55 GMT
From:      Lexi Winter <ivy@FreeBSD.org>
To:        src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-main@FreeBSD.org
Subject:   git: d9c11f0799b5 - main - packages: handle dependencies in ucl
Message-ID:  <202507150512.56F5CtCM079768@gitrepo.freebsd.org>

next in thread | raw e-mail | index | archive | help
The branch main has been updated by ivy:

URL: https://cgit.FreeBSD.org/src/commit/?id=d9c11f0799b546e8a244af2125ded27aa1ce05b8

commit d9c11f0799b546e8a244af2125ded27aa1ce05b8
Author:     Lexi Winter <ivy@FreeBSD.org>
AuthorDate: 2025-07-07 13:38:23 +0000
Commit:     Lexi Winter <ivy@FreeBSD.org>
CommitDate: 2025-07-15 05:12:44 +0000

    packages: handle dependencies in ucl
    
    For packages with specific dependencies, add the dependencies in their
    UCL files instead of listing them in generate-ucl.sh.
    
    generate-ucl.sh has logic to add automatic subpackage dependencies, so
    e.g. "FreeBSD-foo-dev" depends on "FreeBSD-foo".  Move this into
    generate-ucl.lua instead.
    
    This means we no longer need to pre-process the UCL in generate-ucl.sh,
    and we can undo the hack where it calls generate-ucl.lua with the same
    filename as both input and output file.
    
    Reviewed by:    des, bapt
    Approved by:    des (mentor)
    Differential Revision:  https://reviews.freebsd.org/D50283
---
 release/packages/generate-ucl.lua | 70 ++++++++++++++++++++++++++++++++++++++-
 release/packages/generate-ucl.sh  | 56 +------------------------------
 release/packages/ucl/certctl.ucl  | 12 +++++++
 release/packages/ucl/clang.ucl    | 11 ++++++
 release/packages/ucl/periodic.ucl |  6 ++++
 release/packages/ucl/rcmds.ucl    |  8 +++++
 6 files changed, 107 insertions(+), 56 deletions(-)

diff --git a/release/packages/generate-ucl.lua b/release/packages/generate-ucl.lua
index 0d18e1dc0120..0557e8e8cc23 100755
--- a/release/packages/generate-ucl.lua
+++ b/release/packages/generate-ucl.lua
@@ -14,6 +14,42 @@ template.ucl.
 
 local ucl = require("ucl")
 
+-- Hardcode a list of packages which don't get the automatic pkggenname
+-- dependency because the base package doesn't exist.  We should have a better
+-- way to handle this.
+local no_gen_deps = {
+	["libcompat-dev"] = true,
+	["libcompat-dev-lib32"] = true,
+	["libcompat-man"] = true,
+	["libcompiler_rt-dev"] = true,
+	["libcompiler_rt-dev-lib32"] = true,
+	["liby-dev"] = true,
+	["liby-dev-lib32"] = true,
+}
+
+-- Return true if the package 'pkgname' should have a dependency on the package
+-- pkggenname.
+function add_gen_dep(pkgname, pkggenname)
+	if pkgname == pkggenname then
+		return false
+	end
+	if pkgname == nil or pkggenname == nil then
+		return false
+	end
+	if no_gen_deps[pkgname] ~= nil then
+		return false
+	end
+	if pkggenname == "kernel" then
+		return false
+	end
+
+	return true
+end
+
+local pkgname = nil
+local pkggenname = nil
+local pkgprefix = nil
+local pkgversion = nil
 local comment_suffix = nil
 local desc_suffix = nil
 
@@ -31,10 +67,18 @@ for i = 2, #arg - 2, 2 do
 	local varname = arg[i - 1]
 	local varvalue = arg[i]
 
-	if varname == "COMMENT_SUFFIX" and #varvalue > 0 then
+	if varname == "PKGNAME" and #varvalue > 0 then
+		pkgname = varvalue
+	elseif varname == "PKGGENNAME" and #varvalue > 0 then
+		pkggenname = varvalue
+	elseif varname == "VERSION" and #varvalue > 0 then
+		pkgversion = varvalue
+	elseif varname == "COMMENT_SUFFIX" and #varvalue > 0 then
 		comment_suffix = varvalue
 	elseif varname == "DESC_SUFFIX" and #varvalue > 0 then
 		desc_suffix = varvalue
+	elseif varname == "PKG_NAME_PREFIX" and #varvalue > 0 then
+		pkgprefix = varvalue
 	end
 
 	parser:register_variable(varname, varvalue)
@@ -49,6 +93,30 @@ end
 
 local obj = parser:get_object()
 
+-- If pkgname is different from pkggenname, add a dependency on pkggenname.
+-- This means that e.g. -dev packages depend on their respective base package.
+if add_gen_dep(pkgname, pkggenname) then
+	if obj["deps"] == nil then
+		obj["deps"] = {}
+	end
+	obj["deps"][pkggenname] = {
+		["version"] = pkgversion,
+		["origin"] = "base"
+	}
+end
+
+-- 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.
+if pkgprefix ~= nil and obj["deps"] ~= nil then
+	newdeps = {}
+	for dep, opts in pairs(obj["deps"]) do
+		local newdep = pkgprefix .. "-" .. dep
+		newdeps[newdep] = opts
+	end
+	obj["deps"] = newdeps
+end
+
 -- Add comment and desc suffix.
 if comment_suffix ~= nil then
 	obj["comment"] = obj["comment"] .. comment_suffix
diff --git a/release/packages/generate-ucl.sh b/release/packages/generate-ucl.sh
index 3d3f67ed365c..57fe181ec5bb 100755
--- a/release/packages/generate-ucl.sh
+++ b/release/packages/generate-ucl.sh
@@ -59,81 +59,40 @@ main() {
 	shift $(( ${OPTIND} - 1 ))
 
 	case "${outname}" in
-		bootloader)
-			pkgdeps=""
-			;;
-		certctl)
-			pkgdeps="caroot openssl"
-			;;
-		clang)
-			pkgdeps="lld libcompiler_rt-dev"
-			;;
-		periodic)
-			pkgdeps="cron"
-			;;
-		rcmds)
-			# the RPC daemons require rpcbind
-			pkgdeps="utilities"
-			;;
-
-		# -dev packages that have no corresponding non-dev package
-		# as a dependency.
-		libcompat-dev|libcompiler_rt-dev|liby-dev)
-			outname=${outname%%-dev}
-			comment_suffix="$devcx"
-			desc_suffix="$devdx"
-			;;
-		libcompat-dev-lib32|libcompiler_rt-dev-lib32|liby-dev-lib32)
-			outname=${outname%%-dev-lib32}
-			comment_suffix="$dev32cx"
-			desc_suffix="$dev32dx"
-			;;
-		libcompat-man|libelftc-man)
-			outname=${outname%%-man}
-			comment_suffix="$mancx"
-			desc_suffix="$mandx"
-			;;
 		*-dev)
 			outname="${outname%%-dev}"
 			comment_suffix="$devcx"
 			desc_suffix="$devdx"
-			pkgdeps="${outname}"
 			;;
 		*-dbg)
 			outname="${outname%%-dbg}"
 			comment_suffix="$dbgcx"
 			desc_suffix="$dbgdx"
-			pkgdeps="${outname}"
 			;;
 		*-dev-lib32)
 			outname="${outname%%-dev-lib32}"
 			comment_suffix="$dev32cx"
 			desc_suffix="$dev32dx"
-			pkgdeps="${outname}"
 			;;
 		*-dbg-lib32)
 			outname="${outname%%-dbg-lib32}"
 			comment_suffix="$dbg32cx"
 			desc_suffix="$dbg32dx"
-			pkgdeps="${outname}"
 			;;
 		*-man-lib32)
 			outname="${outname%%-man-lib32}"
 			comment_suffix="$lib32mancx"
 			desc_suffix="$lib32mandx"
-			pkgdeps="${outname}"
 			;;
 		*-lib32)
 			outname="${outname%%-lib32}"
 			comment_suffix="$lib32cx"
 			desc_suffix="$lib32dx"
-			pkgdeps="${outname}"
 			;;
 		*-man)
 			outname="${outname%%-man}"
 			comment_suffix="$mancx"
 			desc_suffix="$mandx"
-			pkgdeps="${outname}"
 			;;
 		${origname})
 			;;
@@ -163,19 +122,6 @@ main() {
 		echo ""
 	fi
 
-	cp "${uclsource}" "${uclfile}"
-	if [ -n "${pkgdeps}" ]; then
-		echo 'deps: {' >> ${uclfile}
-		for dep in ${pkgdeps}; do
-			cat <<EOF >> ${uclfile}
-	${PKG_NAME_PREFIX}-${dep}: {
-		origin: "base",
-		version: "${PKG_VERSION}"
-	}
-EOF
-		done
-		echo '}' >> ${uclfile}
-	fi
 	cap_arg="$( make -f ${srctree}/share/mk/bsd.endian.mk -VCAP_MKDB_ENDIAN )"
 	${srctree}/release/packages/generate-ucl.lua \
 		VERSION "${PKG_VERSION}" \
@@ -188,7 +134,7 @@ EOF
 		PKG_WWW "${PKG_WWW}" \
 		PKG_MAINTAINER "${PKG_MAINTAINER}" \
 		UCLFILES "${srctree}/release/packages/ucl" \
-		${uclfile} ${uclfile}
+		${uclsource} ${uclfile}
 
 	return 0
 }
diff --git a/release/packages/ucl/certctl.ucl b/release/packages/ucl/certctl.ucl
index 664a6d139585..300aa55fabda 100644
--- a/release/packages/ucl/certctl.ucl
+++ b/release/packages/ucl/certctl.ucl
@@ -1,3 +1,15 @@
+deps {
+	"caroot": {
+		version = "${VERSION}"
+		origin = "base"
+	}
+
+	"openssl": {
+		version = "${VERSION}"
+		origin = "base"
+	}
+}
+
 scripts: {
 	# XXX If pkg picks up a mechanism to detect in the post-install script
 	# files being added or removed, we should use it instead to gate the
diff --git a/release/packages/ucl/clang.ucl b/release/packages/ucl/clang.ucl
new file mode 100644
index 000000000000..956b769a1ee7
--- /dev/null
+++ b/release/packages/ucl/clang.ucl
@@ -0,0 +1,11 @@
+deps {
+	"lld" {
+		version = "${VERSION}"
+		origin = "base"
+	}
+
+	"libcompiler_rt-dev" {
+		version = "${VERSION}"
+		origin = "base"
+	}
+}
diff --git a/release/packages/ucl/periodic.ucl b/release/packages/ucl/periodic.ucl
new file mode 100644
index 000000000000..6f85d2ab744b
--- /dev/null
+++ b/release/packages/ucl/periodic.ucl
@@ -0,0 +1,6 @@
+deps {
+	"cron" {
+		version = "${VERSION}"
+		origin = "base"
+	}
+}
diff --git a/release/packages/ucl/rcmds.ucl b/release/packages/ucl/rcmds.ucl
new file mode 100644
index 000000000000..88a4916675dc
--- /dev/null
+++ b/release/packages/ucl/rcmds.ucl
@@ -0,0 +1,8 @@
+deps {
+	# The RPC daemons require rpcbind.
+	"utilities" {
+		version = "${VERSION}"
+		origin = "base"
+	}
+}
+



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