--
-- globals.lua
-- Global tables and variables, replacements and extensions to Lua's global functions.
-- Copyright (c) 2002-2009 Jason Perkins and the Premake project
--


-- A top-level namespace for support functions

	premake = { }


-- The list of supported platforms; also update list in cmdline.lua

	premake.platforms =
	{
		Native =
		{
			cfgsuffix       = "",
		},
		x32 =
		{
			cfgsuffix       = "32",
		},
		x64 =
		{
			cfgsuffix       = "64",
		},
		Universal =
		{
			cfgsuffix       = "univ",
		},
		Universal32 =
		{
			cfgsuffix       = "univ32",
		},
		Universal64 =
		{
			cfgsuffix       = "univ64",
		},
		PS3 =
		{
			cfgsuffix       = "ps3",
			iscrosscompiler = true,
			nosharedlibs    = true,
			namestyle       = "PS3",
		},
		WiiDev =
		{
			cfgsuffix       = "wii",
			iscrosscompiler = true,
			namestyle       = "PS3",
		},
		Xbox360 =
		{
			cfgsuffix       = "xbox360",
			iscrosscompiler = true,
			namestyle       = "windows",
		},
		PowerPC =
		{
			cfgsuffix       = "ppc",
			iscrosscompiler = true,
		},
		ARM =
		{
			cfgsuffix       = "ARM",
			iscrosscompiler = true,
		},
		ARM64 =
		{
			cfgsuffix       = "ARM64",
			iscrosscompiler = true,
		},
		Orbis =
		{
			cfgsuffix       = "orbis",
			iscrosscompiler = true,
			namestyle       = "Orbis",
		},
		Durango =
		{
			cfgsuffix       = "durango",
			iscrosscompiler = true,
			nosharedlibs    = true,
			namestyle       = "windows",
		},
		TegraAndroid =
		{
			cfgsuffix       = "tegraandroid",
			iscrosscompiler = true,
			namestyle       = "TegraAndroid",
		},
		NX32 =
		{
			cfgsuffix       = "nx32",
			iscrosscompiler = true,
			namestyle       = "NX",
		},
		NX64 =
		{
			cfgsuffix       = "nx64",
			iscrosscompiler = true,
			namestyle       = "NX",
		},
		Emscripten =
		{
			cfgsuffix       = "emscripten",
			iscrosscompiler = true,
			nosharedlibs    = true,
			namestyle       = "Emscripten",
		},
		["gdk-desktop"] =
		{
			cfgsuffix       = "gdk-desktop",
			namestyle       = "windows",
		},
		["gdk-xboxone"] =
		{
			cfgsuffix       = "gdk-xboxone",
			namestyle       = "windows",
		},
		["gdk-scarlett"] =
		{
			cfgsuffix       = "gdk-scarlett",
			namestyle       = "windows",
		},
	}


--
-- A replacement for Lua's built-in dofile() function, this one sets the
-- current working directory to the script's location, enabling script-relative
-- referencing of other files and resources.
--

	local builtin_dofile = dofile
	function dofile(fname)
		-- remember the current working directory and file; I'll restore it shortly
		local oldcwd = os.getcwd()
		local oldfile = _SCRIPT

		-- if the file doesn't exist, check the search path
		if (not os.isfile(fname)) then
			local path = os.pathsearch(fname, _OPTIONS["scripts"], os.getenv("PREMAKE_PATH"))
			if (path) then
				fname = path.."/"..fname
			end
		end

		-- use the absolute path to the script file, to avoid any file name
		-- ambiguity if an error should arise
		_SCRIPT = path.getabsolute(fname)

		-- switch the working directory to the new script location
		local newcwd = path.getdirectory(_SCRIPT)
		os.chdir(newcwd)

		-- run the chunk. How can I catch variable return values?
		local a, b, c, d, e, f = builtin_dofile(_SCRIPT)

		-- restore the previous working directory when done
		_SCRIPT = oldfile
		os.chdir(oldcwd)
		return a, b, c, d, e, f
	end



--
-- "Immediate If" - returns one of the two values depending on the value of expr.
--

	function iif(expr, trueval, falseval)
		if (expr) then
			return trueval
		else
			return falseval
		end
	end



--
-- A shortcut for including another build file, often used for projects.
--

	function include(fname)
		local dir, name = premake.findDefaultScript(fname, false)
		if dir ~= nil then
			return dofile(dir .. "/" .. name)
		end

		return nil
	end



--
-- A shortcut for printing formatted output.
--

	function printf(msg, ...)
		local arg={...}
		print(string.format(msg, table.unpack(arg)))
	end



--
-- An extended type API to identify project object types by reading the
-- "__type" field from the metatable.
--

	function typex(t)
		local mt = getmetatable(t)
		if (mt) then
			if (mt.__type) then
				return mt.__type
			end
		end
		return type(t)
	end

