-- $Id$
-- $Source$
-- $State$

include "first/c.pm"
include "first/yacc.pm"
include "first/llgen.pm"
include "config.pm"
include "first/ack.pm"
include "first/ack-custom.pm"

CINCLUDES = {
	ROOTDIR.."h",
	ROOTDIR.."modules/h",
	HEADERDIR,
}

-- Load the pmfiles for the various modules.

include "util/data/pmfile"

include "util/LLgen/pmfile-ack"

include "modules/src/alloc/pmfile"
include "modules/src/assert/pmfile"
include "modules/src/system/pmfile"
include "modules/src/string/pmfile"
include "modules/src/read_em/pmfile"
include "modules/src/em_code/pmfile"
include "modules/src/em_mes/pmfile"
include "modules/src/print/pmfile"
include "modules/src/object/pmfile"
include "modules/src/idf/pmfile"
include "modules/src/input/pmfile"
include "modules/src/flt_arith/pmfile"

include "util/amisc/pmfile"
include "util/cmisc/pmfile"
include "util/ack/pmfile"
include "util/arch/pmfile"
-- include "util/cpp/pmfile"
include "lang/cem/cpp.ansi/pmfile"
include "util/cgg/pmfile"
include "util/ncgg/pmfile"
-- include "util/ceg/pmfile"
include "util/misc/pmfile"
include "util/opt/pmfile"
include "util/ego/pmfile"
include "util/topgen/pmfile"
include "util/led/pmfile"

include "lang/cem/pmfile"
include "lang/pc/pmfile"
include "lang/m2/pmfile"
-- include "lang/occam/pmfile"
-- include "lang/basic/pmfile"

include "mach/proto/pmfile"

--[[
include "mach/i386/pmfile"
include "mach/6500/pmfile"
include "mach/6800/pmfile"
include "mach/6805/pmfile"
include "mach/6809/pmfile"
include "mach/arm/pmfile"
include "mach/i80/pmfile"
include "mach/m68020/pmfile"
include "mach/m68k2/pmfile"
include "mach/m68k4/pmfile"
include "mach/ns/pmfile"
include "mach/pdp/pmfile"
include "mach/s2650/pmfile"
include "mach/vax4/pmfile"
include "mach/z80/pmfile"
include "mach/z8000/pmfile"
--]]

-- This is the list of language runtimes that is built for each architecture.

lang_runtimes = group {
--	lang_cem_runtime,        -- K&R C (obsolete and useless)
	lang_cem_ansi_runtime,   -- ANSI C
	lang_pc_runtime,         -- Pascal
	lang_m2_runtime,         -- Modula-2
--	lang_occam_runtime,      -- Occam 1 (obsolete and useless)
--	lang_basic_runtime,      -- Basic
}

-- Include the platform descriptions.

include "mach/i86/pmfile"              -- generic i86
include "plat/pc86/pmfile"             -- PC standalone

include "mach/i386/pmfile"             -- generic i386
include "plat/linux386/pmfile"         -- Linux executables

include "mach/powerpc/pmfile"          -- generic PowerPC
include "plat/linuxppc/pmfile"         -- Linux executables

include "mach/m68020/pmfile"           -- generic M68k
include "plat/linux68k/pmfile"         -- Linux executables

include "mach/i80/pmfile"              -- generic 8080
include "plat/cpm/pmfile"              -- CP/M

default = group {
	-- Lots of things use LLgen, so we need to build it first.
	
	tool_LLgen,
	
	-- Some of the dependency management across modules isn't entirely
	-- complete, for simplicity; as a result, the order here is important.
	-- In particular, referencing a library does not cause the library to
	-- be built, hence the reason why the modules must be built first. Also,
	-- some of these generate header files...
	
	module_em_data,
	module_system,
	module_alloc,
	module_assert,
	module_string,
	module_em_code,
	module_read_em,	
	module_em_mes,
	module_print,
	module_object,
	module_idf,
	module_print,
	module_input,
	module_flt_arith,

	tool_tabgen,
	tool_aal,
	tool_ack,
--	tool_cpp,                -- K&R C
	tool_cpp_ansi,           -- ANSI C
	tool_cgg,
	tool_ncgg,
--	tool_ceg,
	tool_em_decode,
	tool_em_encode,
	tool_esize,
	tool_opt,
	tool_ego,
	tool_topgen,
	tool_led,
	tool_anm,
	tool_ashow,
	tool_asize,
	tool_astrip,
	tool_aslod,
	tool_aelflod,

--	lang_cem_compiler,
	lang_cem_ansi_compiler,
	lang_pc_compiler,
	lang_m2_compiler,
--	lang_occam_compiler,
--	lang_basic_compiler,

	-- Build the code generators and the architecture-independent
	-- libraries.
	
--[[
	mach_6500,
	lang_runtimes { ARCH="6500", OPTIMISATION="-O" },

	mach_6800,
	mach_6805,
	mach_6809,
	mach_arm,      lang_runtimes { ARCH="arm", OPTIMISATION="-O" },

	mach_m68020,   lang_runtimes { ARCH="m68020", OPTIMISATION="-O" },
--	mach_m68k2,    lang_runtimes { ARCH="m68k2", OPTIMISATION="-O" },
--	mach_m68k4,    lang_runtimes { ARCH="m68k4", OPTIMISATION="-O" },
	mach_ns,       lang_runtimes { ARCH="ns", OPTIMISATION="-O" },
--	mach_pdp,      lang_runtimes { ARCH="pdp", OPTIMISATION="-O" },
	mach_s2650,
--	mach_vax4,     lang_runtimes { ARCH="vax4", OPTIMISATION="-O" },
	mach_z80,      lang_runtimes { ARCH="z80", OPTIMISATION="-O" },
	mach_z8000,    lang_runtimes { ARCH="z8000", OPTIMISATION="-O" },
--]]

	-- Build the platforms.
	
	platform_pc86,
	platform_linux386,
--	platform_linuxppc,
	platform_linux68k,
	platform_cpm,
}

-- Ensure that the work directories exist.

posix.mkdir(TEMPDIR)
posix.mkdir(HEADERDIR)

-- When doing the build, we want to ensure that the ACK looks in the staging
-- area for its files, and not in the final installation directory (because
-- we haven't been installed yet).

posix.putenv("ACKDIR="..BINDIR)

-- Build the configuration headers, rather crudely. FIXME.

configure = simple {
	outputs = {HEADERDIR.."local.h", HEADERDIR.."em_path.h"},
	command = "",
	__dobuild = function(self, inputs, outputs)
		-- Build 'local.h', rather crudely
		
		local f = io.open(HEADERDIR.."local.h", "w")
		f:write("#define VERSION 3\n") -- EM byte-code version
		f:write("#define ACKM \"", DEFAULT_PLATFORM, "\"\n")
		f:write("#define BIGMACHINE 1\n") -- No, we don't have a 16-bit architecture
		f:write("#define SYS_5\n")
		f:close()
		
		-- Build 'em_path.h', rather crudely
		
		local f = io.open(HEADERDIR.."em_path.h", "w")
		f:write("#define TMP_DIR \"", ACK_TEMP_DIR, "\"\n")
		f:write("#define EM_DIR \"", PREFIX, "\"\n")
		f:write("#define ACK_PATH \"", PLATIND, "/descr\"\n")
		f:close()
	end
}

-- Once built, do the installation, rather crudely. FIXME.

install = simple {
	outputs = {"dummy"},
	command = "",
	__dobuild = function(self, inputs, outputs)
		os.execute("mkdir -p "..PREFIX)
		os.execute("(cd "..BINDIR.." && tar chf - .) | (cd "..PREFIX.." && tar xvf -)")
	end
}