xref: /freebsd/release/packages/generate-set-ucl.lua (revision 66f36c3686762d9a6e48b0453fc7221be36a0eb8)
1*66f36c36SLexi Winter#!/usr/libexec/flua
2*66f36c36SLexi Winter
3*66f36c36SLexi Winter--[[ usage:
4*66f36c36SLexi Wintergenerare-set-ucl.lua <template> [<variablename> <variablevalue>]
5*66f36c36SLexi Winter
6*66f36c36SLexi WinterGenerate the UCL for a set metapackage.  The variables provided will be
7*66f36c36SLexi Wintersubstituted as UCL variables.
8*66f36c36SLexi Winter]]--
9*66f36c36SLexi Winter
10*66f36c36SLexi Winterlocal ucl = require("ucl")
11*66f36c36SLexi Winter
12*66f36c36SLexi Winter-- This parser is the output UCL we want to build.
13*66f36c36SLexi Winterlocal parser = ucl.parser()
14*66f36c36SLexi Winter
15*66f36c36SLexi Winterif #arg < 1 then
16*66f36c36SLexi Winter	io.stderr:write(arg[0] .. ": missing template filename\n")
17*66f36c36SLexi Winter	os.exit(1)
18*66f36c36SLexi Winterend
19*66f36c36SLexi Winter
20*66f36c36SLexi Winterlocal template = table.remove(arg, 1)
21*66f36c36SLexi Winter
22*66f36c36SLexi Winter-- Set any $VARIABLES from the command line in the parser.  This causes ucl to
23*66f36c36SLexi Winter-- automatically replace them when we load the source ucl.
24*66f36c36SLexi Winterif #arg % 2 ~= 0 then
25*66f36c36SLexi Winter	io.stderr:write(arg[0] .. ": expected an even number of arguments, "
26*66f36c36SLexi Winter	    .. "got " .. #arg .. "\n")
27*66f36c36SLexi Winter	os.exit(1)
28*66f36c36SLexi Winterend
29*66f36c36SLexi Winter
30*66f36c36SLexi Winterlocal pkgprefix = nil
31*66f36c36SLexi Winterlocal pkgversion = nil
32*66f36c36SLexi Winterlocal pkgdeps = ""
33*66f36c36SLexi Winter
34*66f36c36SLexi Winterfor i = 2, #arg, 2 do
35*66f36c36SLexi Winter	local varname = arg[i - 1]
36*66f36c36SLexi Winter	local varvalue = arg[i]
37*66f36c36SLexi Winter
38*66f36c36SLexi Winter	if varname == "PKG_NAME_PREFIX" and #varvalue > 0 then
39*66f36c36SLexi Winter		pkgprefix = varvalue
40*66f36c36SLexi Winter	elseif varname == "VERSION" and #varvalue > 0 then
41*66f36c36SLexi Winter		pkgversion = varvalue
42*66f36c36SLexi Winter	elseif varname == "SET_DEPENDS" and #varvalue > 0 then
43*66f36c36SLexi Winter		pkgdeps = varvalue
44*66f36c36SLexi Winter	end
45*66f36c36SLexi Winter
46*66f36c36SLexi Winter	parser:register_variable(varname, varvalue)
47*66f36c36SLexi Winterend
48*66f36c36SLexi Winter
49*66f36c36SLexi Winter-- Load the source template.
50*66f36c36SLexi Winterlocal res,err = parser:parse_file(template)
51*66f36c36SLexi Winterif not res then
52*66f36c36SLexi Winter	io.stderr:write(arg[0] .. ": fail to parse(" .. template .. "): "
53*66f36c36SLexi Winter	    .. err .. "\n")
54*66f36c36SLexi Winter	os.exit(1)
55*66f36c36SLexi Winterend
56*66f36c36SLexi Winter
57*66f36c36SLexi Winterlocal obj = parser:get_object()
58*66f36c36SLexi Winter
59*66f36c36SLexi Winter-- Dependency handling.
60*66f36c36SLexi Winterobj["deps"] = obj["deps"] or {}
61*66f36c36SLexi Winter
62*66f36c36SLexi Winter-- If PKG_NAME_PREFIX is provided, rewrite the names of dependency packages.
63*66f36c36SLexi Winter-- We can't do this in UCL since variable substitution doesn't work in array
64*66f36c36SLexi Winter-- keys.  Note that this only applies to dependencies from the set UCL files,
65*66f36c36SLexi Winter-- because SET_DEPENDS already have the correct prefix.
66*66f36c36SLexi Winterif pkgprefix ~= nil then
67*66f36c36SLexi Winter	newdeps = {}
68*66f36c36SLexi Winter	for dep, opts in pairs(obj["deps"]) do
69*66f36c36SLexi Winter		local newdep = pkgprefix .. "-" .. dep
70*66f36c36SLexi Winter		newdeps[newdep] = opts
71*66f36c36SLexi Winter	end
72*66f36c36SLexi Winter	obj["deps"] = newdeps
73*66f36c36SLexi Winterend
74*66f36c36SLexi Winter
75*66f36c36SLexi Winter-- Add dependencies from SET_DEPENDS.
76*66f36c36SLexi Winterfor dep in string.gmatch(pkgdeps, "[^%s]+") do
77*66f36c36SLexi Winter	obj["deps"][dep] = {
78*66f36c36SLexi Winter		["origin"] = "base"
79*66f36c36SLexi Winter	}
80*66f36c36SLexi Winterend
81*66f36c36SLexi Winter
82*66f36c36SLexi Winter-- Add a version key to all dependencies, otherwise pkg doesn't like it.
83*66f36c36SLexi Winterfor dep, opts in pairs(obj["deps"]) do
84*66f36c36SLexi Winter	if obj["deps"][dep]["version"] == nil then
85*66f36c36SLexi Winter		obj["deps"][dep]["version"] = pkgversion
86*66f36c36SLexi Winter	end
87*66f36c36SLexi Winterend
88*66f36c36SLexi Winter
89*66f36c36SLexi Winter-- If there are no dependencies, remove the deps key, otherwise pkg raises an
90*66f36c36SLexi Winter-- error trying to read the manifest.
91*66f36c36SLexi Winterif next(obj["deps"]) == nil then
92*66f36c36SLexi Winter	obj["deps"] = nil
93*66f36c36SLexi Winterend
94*66f36c36SLexi Winter
95*66f36c36SLexi Winter-- Write the output.
96*66f36c36SLexi Winterio.stdout:write(ucl.to_format(obj, 'ucl', true))
97