#[[
	Interface libraries for each backend, including their source files and linking requirements.

	Every time a new backend gets added or its target name is modified, please update
	the list of available backends found in OptionsLists.cmake
]]

add_library(rmlui_backend_common_headers INTERFACE)
target_include_directories(rmlui_backend_common_headers INTERFACE "${CMAKE_CURRENT_LIST_DIR}")
target_sources(rmlui_backend_common_headers INTERFACE
	"${CMAKE_CURRENT_LIST_DIR}/RmlUi_Backend.h"
)

if(RMLUI_BACKEND_SIMULATE_TOUCH)
	set(RMLUI_BACKEND_SIMULATE_TOUCH_SUPPORTED
		"SDL_GL2"
		"SDL_GL3"
		"SDL_VK"
		"SDL_SDLrenderer"
		"SDL_GPU"
	)
	if(NOT RMLUI_BACKEND IN_LIST RMLUI_BACKEND_SIMULATE_TOUCH_SUPPORTED)
		message(WARNING "RMLUI_BACKEND_SIMULATE_TOUCH enabled but not supported on selected backend ${RMLUI_BACKEND}")
	else()
		target_compile_definitions(rmlui_backend_common_headers INTERFACE "RMLUI_BACKEND_SIMULATE_TOUCH")
	endif()
endif()

add_library(rmlui_backend_Win32_GL2 INTERFACE)
target_sources(rmlui_backend_Win32_GL2 INTERFACE
	"${CMAKE_CURRENT_LIST_DIR}/RmlUi_Platform_Win32.cpp"
	"${CMAKE_CURRENT_LIST_DIR}/RmlUi_Renderer_GL2.cpp"
	"${CMAKE_CURRENT_LIST_DIR}/RmlUi_Backend_Win32_GL2.cpp"
	"${CMAKE_CURRENT_LIST_DIR}/RmlUi_Platform_Win32.h"
	"${CMAKE_CURRENT_LIST_DIR}/RmlUi_Renderer_GL2.h"
	"${CMAKE_CURRENT_LIST_DIR}/RmlUi_Include_Windows.h"
)
target_link_libraries(rmlui_backend_Win32_GL2 INTERFACE rmlui_backend_common_headers OpenGL::GL)

add_library(rmlui_backend_Win32_VK INTERFACE)
target_sources(rmlui_backend_Win32_VK INTERFACE
	"${CMAKE_CURRENT_LIST_DIR}/RmlUi_Platform_Win32.cpp"
	"${CMAKE_CURRENT_LIST_DIR}/RmlUi_Renderer_VK.cpp"
	"${CMAKE_CURRENT_LIST_DIR}/RmlUi_Backend_Win32_VK.cpp"
	"${CMAKE_CURRENT_LIST_DIR}/RmlUi_Platform_Win32.h"
	"${CMAKE_CURRENT_LIST_DIR}/RmlUi_Renderer_VK.h"
	"${CMAKE_CURRENT_LIST_DIR}/RmlUi_Include_Vulkan.h"
	"${CMAKE_CURRENT_LIST_DIR}/RmlUi_Vulkan/ShadersCompiledSPV.h"
)
target_link_libraries(rmlui_backend_Win32_VK INTERFACE rmlui_backend_common_headers)

add_library(rmlui_backend_Win32_DX12 INTERFACE)
target_sources(rmlui_backend_Win32_DX12 INTERFACE
	"${CMAKE_CURRENT_LIST_DIR}/RmlUi_Platform_Win32.cpp"
	"${CMAKE_CURRENT_LIST_DIR}/RmlUi_Renderer_DX12.cpp"
	"${CMAKE_CURRENT_LIST_DIR}/RmlUi_Backend_Win32_DX12.cpp"
	"${CMAKE_CURRENT_LIST_DIR}/RmlUi_Platform_Win32.h"
	"${CMAKE_CURRENT_LIST_DIR}/RmlUi_Renderer_DX12.h"
	"${CMAKE_CURRENT_LIST_DIR}/RmlUi_Include_DirectX_12.h"
)
target_link_libraries(rmlui_backend_Win32_DX12 INTERFACE rmlui_backend_common_headers)

add_library(rmlui_backend_X11_GL2 INTERFACE)
target_sources(rmlui_backend_X11_GL2 INTERFACE
	"${CMAKE_CURRENT_LIST_DIR}/RmlUi_Platform_X11.cpp"
	"${CMAKE_CURRENT_LIST_DIR}/RmlUi_Renderer_GL2.cpp"
	"${CMAKE_CURRENT_LIST_DIR}/RmlUi_Backend_X11_GL2.cpp"
	"${CMAKE_CURRENT_LIST_DIR}/RmlUi_Platform_X11.h"
	"${CMAKE_CURRENT_LIST_DIR}/RmlUi_Renderer_GL2.h"
	"${CMAKE_CURRENT_LIST_DIR}/RmlUi_Include_Xlib.h"
)

# RMLUI_CMAKE_MINIMUM_VERSION_RAISE_NOTICE:
# Once the minimum CMake version is CMake >= 3.14, "${X11_LIBRARIES}" should
# be substituted by "X11:X11" in addition to any of the other imported that might
# be required. More info:
# https://cmake.org/cmake/help/latest/module/FindX11.html
target_link_libraries(rmlui_backend_X11_GL2 INTERFACE rmlui_backend_common_headers OpenGL::GL ${X11_LIBRARIES})

add_library(rmlui_backend_SDL_GL2 INTERFACE)
target_sources(rmlui_backend_SDL_GL2 INTERFACE
	"${CMAKE_CURRENT_LIST_DIR}/RmlUi_Platform_SDL.cpp"
	"${CMAKE_CURRENT_LIST_DIR}/RmlUi_Renderer_GL2.cpp"
	"${CMAKE_CURRENT_LIST_DIR}/RmlUi_Backend_SDL_GL2.cpp"
	"${CMAKE_CURRENT_LIST_DIR}/RmlUi_Platform_SDL.h"
	"${CMAKE_CURRENT_LIST_DIR}/RmlUi_Renderer_GL2.h"
)
target_link_libraries(rmlui_backend_SDL_GL2 INTERFACE rmlui_backend_common_headers OpenGL::GL SDL::SDL SDL_image::SDL_image)

add_library(rmlui_backend_SDL_GL3 INTERFACE)
target_sources(rmlui_backend_SDL_GL3 INTERFACE
	"${CMAKE_CURRENT_LIST_DIR}/RmlUi_Platform_SDL.cpp"
	"${CMAKE_CURRENT_LIST_DIR}/RmlUi_Renderer_GL3.cpp"
	"${CMAKE_CURRENT_LIST_DIR}/RmlUi_Backend_SDL_GL3.cpp"
	"${CMAKE_CURRENT_LIST_DIR}/RmlUi_Platform_SDL.h"
	"${CMAKE_CURRENT_LIST_DIR}/RmlUi_Renderer_GL3.h"
	"${CMAKE_CURRENT_LIST_DIR}/RmlUi_Include_GL3.h"
)
target_link_libraries(rmlui_backend_SDL_GL3 INTERFACE rmlui_backend_common_headers SDL::SDL SDL_image::SDL_image)
if(UNIX)
	# The OpenGL 3 renderer implementation uses dlopen/dlclose
	# This is required in some UNIX and UNIX-like operating systems to load shared object files at runtime
	target_link_libraries(rmlui_backend_SDL_GL3 INTERFACE ${CMAKE_DL_LIBS})
endif()
if(EMSCRIPTEN)
	# Only Emscripten requires linking to OpenGL::GL, for other platforms we use 'glad' as an OpenGL loader.
	target_link_libraries(rmlui_backend_SDL_GL3 INTERFACE OpenGL::GL)
endif()

add_library(rmlui_backend_SDL_VK INTERFACE)
target_sources(rmlui_backend_SDL_VK INTERFACE
	"${CMAKE_CURRENT_LIST_DIR}/RmlUi_Platform_SDL.cpp"
	"${CMAKE_CURRENT_LIST_DIR}/RmlUi_Renderer_VK.cpp"
	"${CMAKE_CURRENT_LIST_DIR}/RmlUi_Backend_SDL_VK.cpp"
	"${CMAKE_CURRENT_LIST_DIR}/RmlUi_Platform_SDL.h"
	"${CMAKE_CURRENT_LIST_DIR}/RmlUi_Renderer_VK.h"
	"${CMAKE_CURRENT_LIST_DIR}/RmlUi_Include_Vulkan.h"
	"${CMAKE_CURRENT_LIST_DIR}/RmlUi_Vulkan/ShadersCompiledSPV.h"
)
target_link_libraries(rmlui_backend_SDL_VK INTERFACE rmlui_backend_common_headers SDL::SDL)
if(UNIX)
	# The Vulkan renderer implementation uses dlopen/dlclose
	# This is required in some UNIX and UNIX-like operating systems to load shared object files at runtime
	target_link_libraries(rmlui_backend_SDL_VK INTERFACE ${CMAKE_DL_LIBS})
endif()

add_library(rmlui_backend_SDL_DX12 INTERFACE)
target_sources(rmlui_backend_SDL_DX12 INTERFACE
	"${CMAKE_CURRENT_LIST_DIR}/RmlUi_Platform_SDL.cpp"
	"${CMAKE_CURRENT_LIST_DIR}/RmlUi_Renderer_DX12.cpp"
	"${CMAKE_CURRENT_LIST_DIR}/RmlUi_Backend_SDL_DX12.cpp"
	"${CMAKE_CURRENT_LIST_DIR}/RmlUi_Platform_SDL.h"
	"${CMAKE_CURRENT_LIST_DIR}/RmlUi_Renderer_DX12.h"
	"${CMAKE_CURRENT_LIST_DIR}/RmlUi_Include_DirectX_12.h"
)
target_link_libraries(rmlui_backend_SDL_DX12 INTERFACE rmlui_backend_common_headers SDL::SDL SDL_image::SDL_image)

add_library(rmlui_backend_SDL_SDLrenderer INTERFACE)
target_sources(rmlui_backend_SDL_SDLrenderer INTERFACE
	"${CMAKE_CURRENT_LIST_DIR}/RmlUi_Renderer_SDL.cpp"
	"${CMAKE_CURRENT_LIST_DIR}/RmlUi_Platform_SDL.cpp"
	"${CMAKE_CURRENT_LIST_DIR}/RmlUi_Backend_SDL_SDLrenderer.cpp"
	"${CMAKE_CURRENT_LIST_DIR}/RmlUi_Platform_SDL.h"
	"${CMAKE_CURRENT_LIST_DIR}/RmlUi_Renderer_SDL.h"
)
target_link_libraries(rmlui_backend_SDL_SDLrenderer INTERFACE rmlui_backend_common_headers SDL::SDL SDL_image::SDL_image)

add_library(rmlui_backend_SDL_GPU INTERFACE)
target_sources(rmlui_backend_SDL_GPU INTERFACE
	"${CMAKE_CURRENT_LIST_DIR}/RmlUi_Renderer_SDL_GPU.cpp"
	"${CMAKE_CURRENT_LIST_DIR}/RmlUi_Platform_SDL.cpp"
	"${CMAKE_CURRENT_LIST_DIR}/RmlUi_Backend_SDL_GPU.cpp"
	"${CMAKE_CURRENT_LIST_DIR}/RmlUi_Platform_SDL.h"
	"${CMAKE_CURRENT_LIST_DIR}/RmlUi_Renderer_SDL_GPU.h"
)
target_link_libraries(rmlui_backend_SDL_GPU INTERFACE rmlui_backend_common_headers SDL::SDL SDL_image::SDL_image)

add_library(rmlui_backend_SFML_GL2 INTERFACE)
target_sources(rmlui_backend_SFML_GL2 INTERFACE
	"${CMAKE_CURRENT_LIST_DIR}/RmlUi_Platform_SFML.cpp"
	"${CMAKE_CURRENT_LIST_DIR}/RmlUi_Renderer_GL2.cpp"
	"${CMAKE_CURRENT_LIST_DIR}/RmlUi_Backend_SFML_GL2.cpp"
	"${CMAKE_CURRENT_LIST_DIR}/RmlUi_Platform_SFML.h"
	"${CMAKE_CURRENT_LIST_DIR}/RmlUi_Renderer_GL2.h"
)
target_link_libraries(rmlui_backend_SFML_GL2 INTERFACE
	rmlui_backend_common_headers OpenGL::GL SFML::Graphics SFML::Window SFML::System
)

add_library(rmlui_backend_GLFW_GL2 INTERFACE)
target_sources(rmlui_backend_GLFW_GL2 INTERFACE
	"${CMAKE_CURRENT_LIST_DIR}/RmlUi_Platform_GLFW.cpp"
	"${CMAKE_CURRENT_LIST_DIR}/RmlUi_Renderer_GL2.cpp"
	"${CMAKE_CURRENT_LIST_DIR}/RmlUi_Backend_GLFW_GL2.cpp"
	"${CMAKE_CURRENT_LIST_DIR}/RmlUi_Platform_GLFW.h"
	"${CMAKE_CURRENT_LIST_DIR}/RmlUi_Renderer_GL2.h"
)
target_link_libraries(rmlui_backend_GLFW_GL2 INTERFACE rmlui_backend_common_headers OpenGL::GL glfw)

add_library(rmlui_backend_GLFW_GL3 INTERFACE)
target_sources(rmlui_backend_GLFW_GL3 INTERFACE
	"${CMAKE_CURRENT_LIST_DIR}/RmlUi_Platform_GLFW.cpp"
	"${CMAKE_CURRENT_LIST_DIR}/RmlUi_Renderer_GL3.cpp"
	"${CMAKE_CURRENT_LIST_DIR}/RmlUi_Backend_GLFW_GL3.cpp"
	"${CMAKE_CURRENT_LIST_DIR}/RmlUi_Platform_GLFW.h"
	"${CMAKE_CURRENT_LIST_DIR}/RmlUi_Renderer_GL3.h"
	"${CMAKE_CURRENT_LIST_DIR}/RmlUi_Include_GL3.h"
)
target_link_libraries(rmlui_backend_GLFW_GL3 INTERFACE rmlui_backend_common_headers glfw)
if(UNIX)
	# The OpenGL 3 renderer implementation uses dlopen/dlclose
	# This is required in some UNIX and UNIX-like operating systems to load shared object files at runtime
	target_link_libraries(rmlui_backend_GLFW_GL3 INTERFACE ${CMAKE_DL_LIBS})
endif()

add_library(rmlui_backend_GLFW_VK INTERFACE)
target_sources(rmlui_backend_GLFW_VK INTERFACE
	"${CMAKE_CURRENT_LIST_DIR}/RmlUi_Platform_GLFW.cpp"
	"${CMAKE_CURRENT_LIST_DIR}/RmlUi_Renderer_VK.cpp"
	"${CMAKE_CURRENT_LIST_DIR}/RmlUi_Backend_GLFW_VK.cpp"
	"${CMAKE_CURRENT_LIST_DIR}/RmlUi_Platform_GLFW.h"
	"${CMAKE_CURRENT_LIST_DIR}/RmlUi_Renderer_VK.h"
	"${CMAKE_CURRENT_LIST_DIR}/RmlUi_Include_Vulkan.h"
	"${CMAKE_CURRENT_LIST_DIR}/RmlUi_Vulkan/ShadersCompiledSPV.h"
)
target_link_libraries(rmlui_backend_GLFW_VK INTERFACE rmlui_backend_common_headers glfw)
if(UNIX)
	# The Vulkan renderer implementation uses dlopen/dlclose
	# This is required in some UNIX and UNIX-like operating systems to load shared object files at runtime
	target_link_libraries(rmlui_backend_GLFW_VK INTERFACE ${CMAKE_DL_LIBS})
endif()

add_library(rmlui_backend_GLFW_DX12 INTERFACE)
target_sources(rmlui_backend_GLFW_DX12 INTERFACE
	"${CMAKE_CURRENT_LIST_DIR}/RmlUi_Platform_GLFW.cpp"
	"${CMAKE_CURRENT_LIST_DIR}/RmlUi_Renderer_DX12.cpp"
	"${CMAKE_CURRENT_LIST_DIR}/RmlUi_Backend_GLFW_DX12.cpp"
	"${CMAKE_CURRENT_LIST_DIR}/RmlUi_Platform_GLFW.h"
	"${CMAKE_CURRENT_LIST_DIR}/RmlUi_Renderer_DX12.h"
	"${CMAKE_CURRENT_LIST_DIR}/RmlUi_Include_DirectX_12.h"
)
target_link_libraries(rmlui_backend_GLFW_DX12 INTERFACE rmlui_backend_common_headers glfw)

add_library(rmlui_backend_BackwardCompatible_GLFW_GL2 INTERFACE)
target_sources(rmlui_backend_BackwardCompatible_GLFW_GL2 INTERFACE
	"${CMAKE_CURRENT_LIST_DIR}/RmlUi_Platform_GLFW.cpp"
	"${CMAKE_CURRENT_LIST_DIR}/RmlUi_Platform_GLFW.h"
	"${CMAKE_CURRENT_LIST_DIR}/RmlUi_BackwardCompatible/RmlUi_Renderer_BackwardCompatible_GL2.cpp"
	"${CMAKE_CURRENT_LIST_DIR}/RmlUi_BackwardCompatible/RmlUi_Renderer_BackwardCompatible_GL2.h"
	"${CMAKE_CURRENT_LIST_DIR}/RmlUi_BackwardCompatible/RmlUi_Backend_BackwardCompatible_GLFW_GL2.cpp"
)
target_link_libraries(rmlui_backend_BackwardCompatible_GLFW_GL2 INTERFACE rmlui_backend_common_headers OpenGL::GL glfw)

add_library(rmlui_backend_BackwardCompatible_GLFW_GL3 INTERFACE)
target_sources(rmlui_backend_BackwardCompatible_GLFW_GL3 INTERFACE
	"${CMAKE_CURRENT_LIST_DIR}/RmlUi_Platform_GLFW.cpp"
	"${CMAKE_CURRENT_LIST_DIR}/RmlUi_Platform_GLFW.h"
	"${CMAKE_CURRENT_LIST_DIR}/RmlUi_BackwardCompatible/RmlUi_Renderer_BackwardCompatible_GL3.cpp"
	"${CMAKE_CURRENT_LIST_DIR}/RmlUi_BackwardCompatible/RmlUi_Renderer_BackwardCompatible_GL3.h"
	"${CMAKE_CURRENT_LIST_DIR}/RmlUi_BackwardCompatible/RmlUi_Backend_BackwardCompatible_GLFW_GL3.cpp"
)
target_link_libraries(rmlui_backend_BackwardCompatible_GLFW_GL3 INTERFACE rmlui_backend_common_headers glfw)
if(UNIX)
	# The OpenGL 3 renderer implementation uses dlopen/dlclose
	# This is required in some UNIX and UNIX-like operating systems to load shared object files at runtime
	target_link_libraries(rmlui_backend_BackwardCompatible_GLFW_GL3 INTERFACE ${CMAKE_DL_LIBS})
endif()

if(RMLUI_IS_ROOT_PROJECT)
	install(DIRECTORY "./"
		DESTINATION "${CMAKE_INSTALL_DATADIR}/Backends"
	)
endif()
