concat, targetnamesof. deps is now handled more consistently (treated the same

as ins but not passed in as inputs).
This commit is contained in:
David Given 2016-07-14 23:53:34 +02:00
parent f70c12fad5
commit cdbd605803
2 changed files with 51 additions and 9 deletions

View file

@ -53,6 +53,16 @@ local function asstring(o)
end
end
local function concat(...)
local r = {}
for _, t in ipairs({...}) do
for _, v in ipairs(t) do
r[#r+1] = v
end
end
return r
end
local function concatpath(...)
local p = table.concat({...}, "/")
return p:gsub("/+", "/"):gsub("^%./", ""):gsub("/%./", "/")
@ -85,6 +95,27 @@ local function filenamesof(targets, pattern)
return f
end
local function targetnamesof(targets)
local f = {}
if targets then
if targets.is then
targets = {targets}
end
for _, r in pairs(targets) do
if (type(r) == "table") and r.is then
f[#f+1] = r.fullname
elseif (type(r) == "string") then
f[#f+1] = r
else
error(string.format("list of targets contains a %s which isn't a target",
type(r)))
end
end
end
return f
end
local function dotocollection(collection, callback)
if (type(collection) == "string") then
return callback(collection)
@ -389,25 +420,28 @@ local function definerule(rulename, types, cb)
end
args.environment = environment
args.fullname = cwd.."+"..args.name
args.rulecwd = rulecwd
if not args.cwd then
args.cwd = cwd
end
args.fullname = args.cwd.."+"..args.name
local oldcwd = cwd
cwd = rulecwd
local result = cb(args) or {}
cwd = oldcwd
result.is = result.is or {}
result.is[rulename] = true
result.fullname = args.fullname
if targets[arg.fullname] and (targets[arg.fullname] ~= result) then
error(string.format("target '%s' is already defined", args.fullname))
end
targets[result.fullname] = result
return result
end
if rulename then
if rules[rulename] then
error(string.format("rule '%s' is already defined", rulename))
end
rules[rulename] = rule
end
return rule
@ -498,12 +532,15 @@ definerule("simplerule",
{
ins = { type="targets" },
outs = { type="strings" },
deps = { type="targets", default={} },
label = { type="string", optional=true },
commands = { type="strings" },
vars = { type="table", default={} },
},
function (e)
e.environment:rule(e.fullname, filenamesof(e.ins), e.outs)
e.environment:rule(e.fullname,
concat(filenamesof(e.ins), filenamesof(e.deps)),
e.outs)
e.environment:label(e.fullname, " ", e.label or "")
local vars = inherit(e.vars, {
@ -611,6 +648,7 @@ globals = {
abspath = abspath,
asstring = asstring,
basename = basename,
concat = concat,
concatpath = concatpath,
cwd = function() return cwd end,
definerule = definerule,
@ -618,12 +656,13 @@ globals = {
emit = emit,
environment = environment,
filenamesof = filenamesof,
fpairs = fpairs,
include = loadbuildfile,
inherit = inherit,
replace = replace,
selectof = selectof,
startswith = startswith,
fpairs = fpairs,
targetnamesof = targetnamesof,
uniquify = uniquify,
}
setmetatable(globals,

View file

@ -5,6 +5,7 @@ end
definerule("normalrule",
{
ins = { type="targets" },
deps = { type="targets", default={} },
outleaves = { type="strings" },
label = { type="string", optional=true },
objdir = { type="string", optional=true },
@ -25,6 +26,7 @@ definerule("normalrule",
local result = simplerule {
name = e.name,
ins = e.ins,
deps = e.deps,
outs = realouts,
label = e.label,
commands = e.commands,
@ -69,7 +71,8 @@ definerule("cfile",
return normalrule {
name = e.name,
cwd = e.cwd,
ins = {csrcs[1], unpack(hsrcs)},
ins = {csrcs[1]},
deps = e.deps,
outleaves = {outleaf},
label = e.label,
commands = e.commands,
@ -127,7 +130,6 @@ definerule("clibrary",
},
function (e)
local csrcs = filenamesof(e.srcs, "%.c$")
local hsrcs = filenamesof(e.srcs, "%.h$")
local ins = {}
@ -203,6 +205,7 @@ definerule("cprogram",
return normalrule {
name = e.name,
cwd = e.cwd,
deps = e.deps,
ins = libs,
outleaves = { e.name },
commands = e.commands,