xref: /freebsd/release/packages/generate-set-ucl.lua (revision 9e6cea12abdadb9f81dc13c2d3eb4ff8f0a19e99)
166f36c36SLexi Winter#!/usr/libexec/flua
266f36c36SLexi Winter
366f36c36SLexi Winter--[[ usage:
4*9e6cea12SJose Luis Durangenerate-set-ucl.lua <template> [<variablename> <variablevalue>]
566f36c36SLexi Winter
666f36c36SLexi WinterGenerate the UCL for a set metapackage.  The variables provided will be
766f36c36SLexi Wintersubstituted as UCL variables.
866f36c36SLexi Winter]]--
966f36c36SLexi Winter
1066f36c36SLexi Winterlocal ucl = require("ucl")
1166f36c36SLexi Winter
1266f36c36SLexi Winter-- This parser is the output UCL we want to build.
1366f36c36SLexi Winterlocal parser = ucl.parser()
1466f36c36SLexi Winter
1566f36c36SLexi Winterif #arg < 1 then
1666f36c36SLexi Winter	io.stderr:write(arg[0] .. ": missing template filename\n")
1766f36c36SLexi Winter	os.exit(1)
1866f36c36SLexi Winterend
1966f36c36SLexi Winter
2066f36c36SLexi Winterlocal template = table.remove(arg, 1)
2166f36c36SLexi Winter
2266f36c36SLexi Winter-- Set any $VARIABLES from the command line in the parser.  This causes ucl to
2366f36c36SLexi Winter-- automatically replace them when we load the source ucl.
2466f36c36SLexi Winterif #arg % 2 ~= 0 then
2566f36c36SLexi Winter	io.stderr:write(arg[0] .. ": expected an even number of arguments, "
2666f36c36SLexi Winter	    .. "got " .. #arg .. "\n")
2766f36c36SLexi Winter	os.exit(1)
2866f36c36SLexi Winterend
2966f36c36SLexi Winter
3066f36c36SLexi Winterlocal pkgprefix = nil
3166f36c36SLexi Winterlocal pkgversion = nil
3266f36c36SLexi Winterlocal pkgdeps = ""
3366f36c36SLexi Winter
3466f36c36SLexi Winterfor i = 2, #arg, 2 do
3566f36c36SLexi Winter	local varname = arg[i - 1]
3666f36c36SLexi Winter	local varvalue = arg[i]
3766f36c36SLexi Winter
3866f36c36SLexi Winter	if varname == "PKG_NAME_PREFIX" and #varvalue > 0 then
3966f36c36SLexi Winter		pkgprefix = varvalue
4066f36c36SLexi Winter	elseif varname == "VERSION" and #varvalue > 0 then
4166f36c36SLexi Winter		pkgversion = varvalue
4266f36c36SLexi Winter	elseif varname == "SET_DEPENDS" and #varvalue > 0 then
4366f36c36SLexi Winter		pkgdeps = varvalue
4466f36c36SLexi Winter	end
4566f36c36SLexi Winter
4666f36c36SLexi Winter	parser:register_variable(varname, varvalue)
4766f36c36SLexi Winterend
4866f36c36SLexi Winter
4966f36c36SLexi Winter-- Load the source template.
5066f36c36SLexi Winterlocal res,err = parser:parse_file(template)
5166f36c36SLexi Winterif not res then
5266f36c36SLexi Winter	io.stderr:write(arg[0] .. ": fail to parse(" .. template .. "): "
5366f36c36SLexi Winter	    .. err .. "\n")
5466f36c36SLexi Winter	os.exit(1)
5566f36c36SLexi Winterend
5666f36c36SLexi Winter
5766f36c36SLexi Winterlocal obj = parser:get_object()
5866f36c36SLexi Winter
5966f36c36SLexi Winter-- Dependency handling.
6066f36c36SLexi Winterobj["deps"] = obj["deps"] or {}
6166f36c36SLexi Winter
6266f36c36SLexi Winter-- If PKG_NAME_PREFIX is provided, rewrite the names of dependency packages.
6366f36c36SLexi Winter-- We can't do this in UCL since variable substitution doesn't work in array
6466f36c36SLexi Winter-- keys.  Note that this only applies to dependencies from the set UCL files,
6566f36c36SLexi Winter-- because SET_DEPENDS already have the correct prefix.
6666f36c36SLexi Winterif pkgprefix ~= nil then
6766f36c36SLexi Winter	newdeps = {}
6866f36c36SLexi Winter	for dep, opts in pairs(obj["deps"]) do
6966f36c36SLexi Winter		local newdep = pkgprefix .. "-" .. dep
7066f36c36SLexi Winter		newdeps[newdep] = opts
7166f36c36SLexi Winter	end
7266f36c36SLexi Winter	obj["deps"] = newdeps
7366f36c36SLexi Winterend
7466f36c36SLexi Winter
7566f36c36SLexi Winter-- Add dependencies from SET_DEPENDS.
7666f36c36SLexi Winterfor dep in string.gmatch(pkgdeps, "[^%s]+") do
7766f36c36SLexi Winter	obj["deps"][dep] = {
7866f36c36SLexi Winter		["origin"] = "base"
7966f36c36SLexi Winter	}
8066f36c36SLexi Winterend
8166f36c36SLexi Winter
8266f36c36SLexi Winter-- Add a version key to all dependencies, otherwise pkg doesn't like it.
8366f36c36SLexi Winterfor dep, opts in pairs(obj["deps"]) do
8466f36c36SLexi Winter	if obj["deps"][dep]["version"] == nil then
8566f36c36SLexi Winter		obj["deps"][dep]["version"] = pkgversion
8666f36c36SLexi Winter	end
8766f36c36SLexi Winterend
8866f36c36SLexi Winter
8966f36c36SLexi Winter-- If there are no dependencies, remove the deps key, otherwise pkg raises an
9066f36c36SLexi Winter-- error trying to read the manifest.
9166f36c36SLexi Winterif next(obj["deps"]) == nil then
9266f36c36SLexi Winter	obj["deps"] = nil
9366f36c36SLexi Winterend
9466f36c36SLexi Winter
9566f36c36SLexi Winter-- Write the output.
9666f36c36SLexi Winterio.stdout:write(ucl.to_format(obj, 'ucl', true))
97