include("mach/proto/as/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={} },
	},
	function (e)
		local plat = e.vars.plat

		return cfile {
			name = e.name,
			srcs = e.srcs,
			deps = {
				"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
			},
			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)
		return clibrary {
			name = e.name,
			srcs = e.srcs,
			hdrs = e.hdrs,
			deps = {
				"util/arch+pkg",
				e.deps
			},
			_cfile = ackfile,
			commands = {
				"rm -f %{outs[1]}",
				"ACKDIR=$(INSDIR) $(INSDIR)/bin/aal qc %{outs[1]} %{ins}"
			}
		}
	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}"
			}
		}
	end
)

definerule("build_plat_libs",
	{
		arch = { type="string" },
		plat = { type="string" },
	},
	function(e)
		return installable {
			name = e.name,
			map = {
				"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,
				["$(PLATIND)/"..e.plat.."/libem.a"] = "mach/"..e.arch.."/libem+lib_"..e.plat,
				["$(PLATIND)/"..e.plat.."/libend.a"] = "mach/"..e.arch.."/libend+lib_"..e.plat,
			}
		}
	end
)