ack/plat/build.lua
2022-07-18 16:48:14 +02:00

158 lines
3.5 KiB
Lua

include("mach/proto/as/build.lua")
include("mach/proto/cg/build.lua")
include("mach/proto/ncg/build.lua")
include("mach/proto/mcg/build.lua")
include("mach/proto/top/build.lua")
definerule("ackfile",
{
srcs = { type="targets" },
deps = { type="targets", default={} },
suffix = { type="string", optional=true },
},
function (e)
local em = (e.vars.plat or ""):find("^em")
local suffix = e.suffix or (em and ".m" or ".o")
local c = "-c"..suffix
local plat = e.vars.plat
return cfile {
name = e.name,
srcs = e.srcs,
deps = {
"lang/b/compiler+pkg",
"lang/basic/src+pkg",
"lang/cem/cemcom.ansi+pkg",
"lang/cem/cpp.ansi+pkg",
"lang/m2/comp+pkg",
"lang/pc/comp+pkg",
"plat/"..plat.."+tools",
"util/ack+pkg",
"util/ego+pkg",
"util/misc+pkg",
e.deps
},
suffix = suffix,
commands = {
"ACKDIR=$(INSDIR) $(INSDIR)/bin/ack -m%{plat} "..c.." -o %{outs} %{ins} %{hdrpaths} %{ackcflags}"
}
}
end
)
definerule("acklibrary",
{
srcs = { type="targets", default={} },
hdrs = { type="targets", default={} },
deps = { type="targets", default={} },
},
function (e)
local em = (e.vars.plat or ""):find("^em")
local function splitter(srcs, num, cmd)
local commands = {
}
local t = {}
local function flush()
commands[#commands+1] = cmd:gsub("%%%%", asstring(t))
t = {}
end
for _, target in ipairs(srcs) do
t[#t+1] = target
if #t == num then
flush()
end
end
if #t ~= 0 then
flush()
end
return table.concat(commands, " && ")
end
return clibrary {
name = e.name,
srcs = e.srcs,
hdrs = e.hdrs,
deps = {
"util/arch+pkg",
e.deps
},
vars = {
splitter = splitter
},
_cfile = ackfile,
suffix = em and ".m" or ".o",
commands = {
"rm -f %{outs[1]}",
"%{splitter(ins, 100, 'ACKDIR=$(INSDIR) $(INSDIR)/bin/aal qc '..tostring(outs[1])..' %%')}"
}
}
end
)
definerule("ackprogram",
{
srcs = { type="targets", default={} },
deps = { type="targets", default={} },
},
function (e)
-- This bit is a hack. We *don't* want to link the language libraries here,
-- because the ack driver is going to pick the appropriate library itself and
-- we don't want more than one. But we still need to depend on them, so we use
-- a nasty hack.
local platstamp = normalrule {
name = e.name.."/platstamp",
ins = { "plat/"..e.vars.plat.."+pkg" },
outleaves = { "stamp" },
commands = { "touch %{outs}" }
}
return cprogram {
name = e.name,
srcs = e.srcs,
deps = {
platstamp,
"util/ack+pkg",
"util/led+pkg",
e.deps
},
_clibrary = acklibrary,
commands = {
"ACKDIR=$(INSDIR) $(INSDIR)/bin/ack -m%{plat} -.%{lang} -o %{outs} %{ins} %{ackldflags}"
}
}
end
)
definerule("build_plat_libs",
{
arch = { type="string" },
plat = { type="string" },
em = { type="boolean", default=false },
},
function(e)
local installmap = {
"lang/b/lib+pkg_"..e.plat,
"lang/basic/lib+pkg_"..e.plat,
"lang/cem/libcc.ansi+pkg_"..e.plat,
"lang/m2/libm2+pkg_"..e.plat,
"lang/pc/libpc+pkg_"..e.plat,
"lang/b/lib+pkg_"..e.plat,
["$(PLATIND)/"..e.plat.."/libem.a"] = "mach/"..e.arch.."/libem+lib_"..e.plat,
["$(PLATIND)/"..e.plat.."/libend.a"] = "mach/"..e.arch.."/libend+lib_"..e.plat,
}
-- For now, only cpm uses software floating-point.
if e.plat == "cpm" then
installmap[#installmap+1] = "mach/proto/fp+pkg_"..e.plat
end
return installable {
name = e.name,
map = installmap,
}
end
)