ack/first/build.lua

240 lines
4.3 KiB
Lua
Raw Normal View History

2016-06-12 18:59:43 +00:00
local function objdir(e)
2016-06-29 11:58:38 +00:00
return concatpath("$(OBJDIR)", e.cwd, e.name)
2016-06-12 18:59:43 +00:00
end
2016-06-07 02:13:56 +00:00
definerule("normalrule",
{
ins = { type="targets" },
deps = { type="targets", default={} },
2016-06-07 02:13:56 +00:00
outleaves = { type="strings" },
label = { type="string", optional=true },
2016-06-12 18:59:43 +00:00
objdir = { type="string", optional=true },
2016-06-07 02:13:56 +00:00
commands = { type="strings" },
},
function (e)
2016-06-12 18:59:43 +00:00
local dir = e.objdir or objdir(e)
2016-06-07 02:13:56 +00:00
local realouts = {}
for k, v in pairs(e.outleaves) do
2016-06-12 18:59:43 +00:00
realouts[k] = concatpath(dir, v)
2016-06-07 02:13:56 +00:00
end
local vars = inherit(e.vars, {
2016-06-12 18:59:43 +00:00
dir = dir
})
local result = simplerule {
2016-06-07 02:13:56 +00:00
name = e.name,
ins = e.ins,
deps = e.deps,
2016-06-07 02:13:56 +00:00
outs = realouts,
label = e.label,
commands = e.commands,
vars = vars,
2016-06-07 02:13:56 +00:00
}
2016-06-12 18:59:43 +00:00
result.dir = dir
return result
2016-06-07 02:13:56 +00:00
end
)
definerule("cfile",
{
srcs = { type="targets" },
deps = { type="targets", default={} },
commands = {
type="strings",
default={
2016-06-12 18:59:43 +00:00
"$(CC) -c -o %{outs[1]} %{ins[1]} %{hdrpaths} %{cflags}"
},
}
},
function (e)
local hdrpaths = {}
2016-06-30 11:27:47 +00:00
for _, t in pairs(e.deps) do
if t.dir then
hdrpaths[#hdrpaths+1] = "-I"..t.dir
end
end
hdrpaths = uniquify(hdrpaths)
2016-06-07 02:13:56 +00:00
local outleaf = basename(e.name)..".o"
return normalrule {
name = e.name,
2016-06-29 11:58:38 +00:00
cwd = e.cwd,
ins = e.srcs,
deps = e.deps,
outleaves = {outleaf},
label = e.label,
commands = e.commands,
vars = {
2016-06-12 18:59:43 +00:00
hdrpaths = hdrpaths,
}
}
end
)
2016-06-06 22:10:22 +00:00
definerule("cppfile",
{
srcs = { type="targets" },
deps = { type="targets", default={} },
outleaf = { type="string" },
commands = {
type="strings",
default={
"$(CC) -E -P -o %{outs[1]} %{hdrpaths} %{cflags} -x c %{ins}"
}
},
},
function (e)
if (#e.srcs ~= 1) then
error("you must have exactly one input file")
end
local hdrpaths = {}
for _, t in pairs(e.deps) do
hdrpaths[#hdrpaths+1] = "-I"..t.dir
end
hdrpaths = uniquify(hdrpaths)
return normalrule {
name = e.name,
cwd = e.cwd,
ins = e.srcs,
deps = e.deps,
outleaves = {e.outleaf},
label = e.label,
commands = e.commands,
vars = {
hdrpaths = hdrpaths,
}
}
end
)
definerule("bundle",
{
srcs = { type="targets" },
commands = {
type="strings",
default={
"tar cf - %{ins} | (cd %{dir} && tar xf -)"
}
}
},
function (e)
local outleaves = {}
local commands = {}
2016-06-12 18:59:43 +00:00
for _, f in fpairs(e.srcs) do
local localf = basename(f)
outleaves[#outleaves+1] = localf
commands[#commands+1] = "cp "..f.." %{dir}/"..localf
end
2016-06-07 02:20:08 +00:00
return normalrule {
name = e.name,
2016-06-29 11:58:38 +00:00
cwd = e.cwd,
ins = e.srcs,
outleaves = outleaves,
label = e.label,
commands = commands
}
end
)
2016-06-07 02:20:08 +00:00
definerule("clibrary",
{
srcs = { type="targets", default={} },
2016-06-29 11:28:45 +00:00
hdrs = { type="targets", default={} },
deps = { type="targets", default={} },
commands = {
type="strings",
default={
2016-06-29 11:28:45 +00:00
"rm -f %{outs[1]}",
"$(AR) cqs %{outs[1]} %{ins}",
},
}
},
function (e)
local csrcs = filenamesof(e.srcs, "%.c$")
local hsrcs = filenamesof(e.srcs, "%.h$")
local ins = {}
2016-06-12 18:59:43 +00:00
for _, csrc in fpairs(csrcs) do
local n = basename(csrc):gsub("%.%w*$", "")
ins[#ins+1] = cfile {
name = e.name.."/"..n,
2016-06-29 11:58:38 +00:00
cwd = e.cwd,
srcs = {csrc, unpack(hsrcs)},
deps = e.deps,
vars = {
["+cflags"] = { "-I"..e.cwd, },
2016-06-12 18:59:43 +00:00
},
}
end
2016-06-30 11:27:47 +00:00
local hdrs = filenamesof(e.hdrs)
2016-06-29 11:28:45 +00:00
local commands = {}
for _, s in ipairs(e.commands) do
commands[#commands+1] = s
end
if (#hdrs > 0) then
commands[#commands+1] = "cp %{hdrs} %{dir}"
end
return normalrule {
name = e.name,
2016-06-29 11:58:38 +00:00
cwd = e.cwd,
ins = ins,
deps = concat(e.hdrs, e.deps),
2016-06-29 11:28:45 +00:00
outleaves = { e.name..".a", unpack(basename(hdrs)) },
label = e.label,
2016-06-29 11:28:45 +00:00
commands = commands,
vars = {
hdrs = hdrs
}
}
end
)
2016-06-09 05:14:41 +00:00
definerule("cprogram",
{
srcs = { type="targets", default={} },
deps = { type="targets", default={} },
commands = {
type="strings",
default={
"$(CC) -o %{outs[1]} -Wl,--start-group %{ins} -Wl,--end-group"
2016-06-09 05:14:41 +00:00
},
}
},
2016-06-09 05:14:41 +00:00
function (e)
local libs = filenamesof(e.deps, "%.a$")
if (#e.srcs > 0) then
for _, f in pairs(filenamesof(
{
clibrary {
name = e.name .. "/main",
2016-06-29 11:58:38 +00:00
cwd = e.cwd,
2016-06-09 05:14:41 +00:00
srcs = e.srcs,
2016-06-29 11:28:45 +00:00
deps = e.deps,
2016-06-09 05:14:41 +00:00
}
},
"%.a$"
)) do
libs[#libs+1] = f
2016-06-06 22:10:22 +00:00
end
end
2016-06-09 05:14:41 +00:00
return normalrule {
name = e.name,
2016-06-29 11:58:38 +00:00
cwd = e.cwd,
deps = e.deps,
2016-06-09 05:14:41 +00:00
ins = libs,
outleaves = { e.name },
commands = e.commands,
2016-06-06 22:10:22 +00:00
}
end
2016-06-09 05:14:41 +00:00
)
2016-06-06 22:10:22 +00:00