-- Copyright (C) 1997-2015 Sam Lantinga <slouken@libsdl.org>
--
-- This software is provided 'as-is', without any express or implied
-- warranty.  In no event will the authors be held liable for any damages
-- arising from the use of this software.
--
-- Permission is granted to anyone to use this software for any purpose,
-- including commercial applications, and to alter it and redistribute it
-- freely.
--
-- Meta-build system using premake created and maintained by
-- Benjamin Henning <b.henning@digipen.edu>

--[[
sdl_dependency_checkers.lua

	This script contains a bunch of functions which determine whether certain
	dependencies exist on the current platform. These functions are able to use
	any and all available utilities for trying to determine both whether the
	dependency is available on this platform, and how to build to the dependency.
	There are a few limitations with these functions, but many of the limitations
	can be mitigated by using the dependency definition functions in the project
	definition files.
	
	Each function in this file, in order to be a valid dependency function, must
	return a table with the following entries:
	
	'found' = boolean value indicating whether the dependency was found
	'incDirs' = table of include directory strings, or nil if none are needed
	'libDirs' = table of library directory strings, or nil if none are needed
	'libs' = table of libraries to link to, or nil if none are needed
	
	All functions must be properly registered with the project definition system
	in order to be properly referenced by projects.
]]

-- dependency functions must return the following:
-- table with an element found, incDirs, libDirs, and libs
function openGLDep()
	print("Checking OpenGL dependencies...")
	if SDL_getos() == "macosx" then
		-- mac should always have support for OpenGL...
		return { found = true, libs = { "OpenGL.framework" } }
	elseif SDL_getos() == "ios" then
		--...unless on iOS
		print("Desktop OpenGL is not supported on iOS targets.")
		return { found = false, libs = { "OpenGL.framework" } }
	elseif SDL_getos() == "cygwin" then
		print("OpenGL is not currently supported on Cygwin.")
		return { found = false, libDirs = { }, libs = { "OpenGL32" } }
	end
	local libpath = nil
  local libname = nil
	if SDL_getos() == "windows" or SDL_getos() == "mingw" then
		libpath = os.findlib("OpenGL32")
		libname = "OpenGL32"
	else -- *nix
		libpath = os.findlib("libGL")
		libname = "GL"
	end
	local foundLib = libpath ~= nil
	-- another way to possibly find the dependency on windows
	--if not foundLib then
	--	foundLib, libpath = find_dependency_dir_windows(nil, "C:/Program Files (x86);C:/Program Files", "Microsoft SDKs", "Lib")
	--end
	if not foundLib then return { found = false } end
	if SDL_getos() == "mingw" then
		libpath = libpath:gsub("\\", "/"):gsub("//", "/")
	end
	return { found = foundLib, libDirs = { }, libs = { libname } }
end

function directXDep()
	print("Checking DirectX dependencies...")
	-- enable this for more correct searching, but it's much slower
	local searchPath = nil --os.getenvpath("ProgramFiles", "ProgramFiles(x86)")
	local foundInc, incpath = find_dependency_dir_windows("DXSDK_DIR", searchPath, "DirectX", "Include")
	local foundLib, libpath = find_dependency_dir_windows("DXSDK_DIR", searchPath, "DirectX", "Lib/x86")
	if not foundInc or not foundLib then return { found = false } end
	-- XXX: hacked mingw check...
	if foundInc and SDL_getos() == "mingw" then
		incpath = incpath:gsub("%$%(DXSDK_DIR%)", os.getenv("DXSDK_DIR")):gsub("\\", "/"):gsub("//", "/")
		libpath = libpath:gsub("%$%(DXSDK_DIR%)", os.getenv("DXSDK_DIR")):gsub("\\", "/"):gsub("//", "/")
	end
	if SDL_getos() == "mingw" then
		print("DirectX is not currently supported on MinGW targets.")
		return { found = false, incDirs = { incpath }, libDirs = { libpath } }
	end
	if SDL_getos() == "cygwin" then
		print("DirectX is not currently supported on Cygwin targets.")
		return { found = false, incDirs = { incpath }, libDirs = { libpath } }
	end
	return { found = true, incDirs = { incpath }, libDirs = { libpath } }
end

function dbusDep()
	print("Checking for D-Bus support...")
	if not check_include_directories("/usr/include/dbus-1.0", "/usr/lib/x86_64-linux-gnu/dbus-1.0/include") then
		print("Warning: D-Bus unsupported!")
		return { found = false }
	end
	return { found = true, incDirs = { "/usr/include/dbus-1.0", "/usr/lib/x86_64-linux-gnu/dbus-1.0/include" } }
end

function alsaDep()
	print("Checking for ALSA support...")
	if not check_include_files("alsa/asoundlib.h")
			or os.findlib("asound") == nil
			or not check_library_exists_lookup("asound", "snd_pcm_open", "alsa/asoundlib.h")
			or not SDL_assertdepfunc("DLOpen") then
		print("Warning: ALSA unsupported!")
		return { found = false }
	end
	return { found = true }
end

function pulseAudioDep()
	print("Checking for PulseAudio support...")
	if os.findlib("libpulse-simple") == nil
			or not SDL_assertdepfunc("DLOpen") then
		print("Warning: PulseAudio unsupported!")
		return { found = false }
	end
	return { found = true }
end

function esdDep()
	print("Checking for ESD support...")
	if os.findlib("esd") == nil
			or not SDL_assertdepfunc("DLOpen") then
		print("Warning: ESD unsupported!")
		return { found = false }
	end
	return { found = true }
end

function nasDep()
	print("Checking for NAS support...")
	if not check_include_file("audio/audiolib.h")
			or not SDL_assertdepfunc("DLOpen") then
		print("Warning: NAS unsupported!")
		return { found = false }
	end
	return { found = true }
end

function ossDep()
	print("Checking for OSS support...")
	if not check_cxx_source_compiles([[
				#include <sys/soundcard.h>
				int main() { int arg = SNDCTL_DSP_SETFRAGMENT; return 0; }]])
			and not check_cxx_source_compiles([[
				#include <soundcard.h>
				int main() { int arg = SNDCTL_DSP_SETFRAGMENT; return 0; }]]) then
		print("Warning: OSS unsupported!")
		return { found = false }
	end
	return { found = true }
end

function dlOpenDep()
	print("Checking for DLOpen support...")
	if not check_library_exists_multiple("dlopen", "dlfcn.h", "dl", "tdl") then
		print("Warning: DLOpen unsupported!")
		return { found = false }
	end
	return { found = true, libs = { "dl" } }
end

function x11Dep()
	print("Checking for X11 support...")
	for _, v in ipairs { "X11", "Xext", "Xcursor", "Xinerama", "Xi", "Xrandr", "Xrender", "Xss", "Xxf86vm" } do
		if os.findlib(v) == nil then
			print("Warning: X11 unsupported!")
			return { found = false }
		end
	end
	if not check_include_files("X11/Xcursor/Xcursor.h", "X11/extensions/Xinerama.h",
			"X11/extensions/XInput2.h", "X11/extensions/Xrandr.h", "X11/extensions/Xrender.h",
			"X11/extensions/scrnsaver.h", "X11/extensions/shape.h", "X11/Xlib.h",
			"X11/extensions/xf86vmode.h") then
		print("Warning: X11 unsupported!")
		return { found = false }
	end
	if not SDL_assertdepfunc("DLOpen") then
		print("Warning: X11 unsupported!")
		return { found = false }
	end
	-- XXX: shared memory check...
	-- there's a LOT more to check to properly configure X11...
	return { found = true, libs = { "X11" } }
end

-- register all of these dependency functions with the definition system
SDL_registerDependencyChecker("OpenGL", openGLDep)
SDL_registerDependencyChecker("DirectX", directXDep)
SDL_registerDependencyChecker("DBus", dbusDep)
SDL_registerDependencyChecker("ALSA", alsaDep)
SDL_registerDependencyChecker("PulseAudio", pulseAudioDep)
SDL_registerDependencyChecker("ESD", esdDep)
SDL_registerDependencyChecker("NAS", nasDep)
SDL_registerDependencyChecker("OSS", ossDep)
SDL_registerDependencyChecker("DLOpen", dlOpenDep)
SDL_registerDependencyChecker("X11", x11Dep)