cit_util/src/generics.tmpl


/* generic template generator. */
/* commands: gmodule, ginterface, gimplementation. */
/* other commands: build_generic_module. */

/* $Id: generics.tmpl,v 1.3 2008-01-28 23:10:59 wagner Exp $ */

if defined("TOP")
  _M3TMPLHACK = TOP & "/m3tmplhack/" & BUILD_DIR & "/m3tmplhack"
else
  _M3TMPLHACK = BIN_INSTALL & SL & "m3tmplhack"
end

readonly proc Build_generic_module(nam, gen, args1, args2) is
        build_generic_intf(nam, gen, args1, VISIBLE)
        build_generic_impl(nam, gen, args2)
end

readonly proc build_generic_module(nam, gen, args1, args2) is
        build_generic_intf(nam, gen, args1, HIDDEN)
        build_generic_impl(nam, gen, args2)
end

readonly proc Build_generic_interface(nam, gen, args) is
	build_generic_intf(nam, gen, args, VISIBLE)
end

readonly proc build_generic_interface(nam, gen, args) is
	build_generic_intf(nam, gen, args, HIDDEN)
end

build_generic_implementation = build_generic_impl
Build_generic_implementation = build_generic_impl

readonly proc _exec(cmd) is
        %local ret = exec(cmd)
        write (cmd, CR)
	exec(cmd)
        %if not equal(ret, 0) error("command failed with error code: ", ret) end
end

readonly proc derived_template(nm) is
	template("../" & BUILD_DIR & "/" & nm)
end

readonly proc _check_clean(g) is
	if defined("_clean")
		write("delete " & g, CR)
		/* deleting this file causes staleness,
			which is desired effect of clean. */
		delete_file(g)
	end
end

/*
assumption: templates need only be generated when m3makefile changes.
extra cleaning required if these commands are used
in a template imported by m3makefile!
*/

readonly proc gmodule_template(nm) is
	local makefile = path_of("m3makefile")
	local f = nm & ".tmpl"
	local g = nm & ".generate_tmpl"
	local intf = path_of(nm & ".ig")
	local impl = path_of(nm & ".mg")
	local sources = [makefile, intf, impl]
	if stale(f, sources) or stale(g, sources)
		> g in
			write("module", CR)
			write(intf, CR)
			write(impl, CR)
		end
		_exec([_M3TMPLHACK,g])
	end
	_check_clean(g)
	derived_template(nm)
end

readonly proc gother_template(nm,kind) is
	local makefile = path_of("m3makefile")
	local base = nm & "_" & kind
	local f = base & ".tmpl"
	local g = base & ".generate_tmpl"
	local source = path_of(nm & ".ig")
	local sources = [makefile, source]
	if stale(f, sources) or stale(g, sources)
		> g in
			write(kind, CR)
			write(source, CR)
		end
		_exec([_M3TMPLHACK,g])
	end
	_check_clean(g)
	derived_template(base)
end

readonly proc gmodule(nm) is
	generic_module(nm)
	gmodule_template(nm)
end

readonly proc Gmodule(nm) is
	Generic_module(nm)
	gmodule_template(nm)
end

readonly proc ginterface(nm) is
	generic_interface(nm)
	gother_template(nm, "interface")
end

readonly proc Ginterface(nm) is
	Generic_interface(nm)
	gother_template(nm, "interface")
end

readonly proc gimplementation(nm) is
	generic_implementation(nm)
	gother_template(nm, "implementation")
end

readonly proc Gimplementation(nm) is
	Generic_implementation(nm)
	gother_template(nm, "implementation")
end