cmake_minimum_required(VERSION 3.16)
project(animia LANGUAGES CXX)
set(SRC_FILES
	# any non-platform-specific files go here
	src/animia.cc
	src/player.cc
	src/util.cc
	src/strategist.cc
	src/fd.cc
	src/win.cc
)

include(CheckLanguage)

set(LIBRARIES)
set(INCLUDE_DIRS)
set(DEFINES)

if(APPLE)
	list(APPEND DEFINES MACOSX)
	list(APPEND SRC_FILES
		# xnu stuff
		src/fd/xnu.cc
		src/util/osx.cc
	)

	include(CheckIncludeFile)
	check_include_file("CoreFoundation/CoreFoundation.h" HAVE_COREFOUNDATION)
	# If you're building on OS X, you most likely do have this file, but we
	# check anyway.
	if (HAVE_COREFOUNDATION)
		list(APPEND DEFINES HAVE_COREFOUNDATION)
	endif()

	check_language(OBJCXX)
	if(CMAKE_OBJCXX_COMPILER)
		enable_language(OBJCXX)
		list(APPEND SRC_FILES
			src/win/quartz.mm
		)
		find_library(FOUNDATION_LIBRARY Foundation)
		find_library(COREGRAPHICS_LIBRARY CoreGraphics)
		find_library(APPKIT_LIBRARY AppKit)
		list(APPEND LIBRARIES ${FOUNDATION_LIBRARY} ${COREGRAPHICS_LIBRARY} ${APPKIT_LIBRARY})
	else() # NOT CMAKE_OBJCXX_COMPILER
		message(WARNING "An Objective-C++ compiler couldn't be found! Window enumeration support will not be compiled.")
	endif() # CMAKE_OBJCXX_COMPILER
elseif(WIN32)
	list(APPEND DEFINES WIN32)
	list(APPEND SRC_FILES
		# win32
		src/fd/win32.cc
		src/win/win32.cc
		src/util/win32.cc
	)
else() # NOT WIN32 AND NOT APPLE
	if(LINUX)
		list(APPEND DEFINES LINUX)
		list(APPEND SRC_FILES
			# linux
			src/fd/linux.cc
		)
	endif() # LINUX

	# X11
	find_package(X11 COMPONENTS X11)
	if(X11_FOUND)
		list(APPEND DEFINES X11)
		list(APPEND SRC_FILES
			src/win/x11.cc
		)
		list(APPEND INCLUDE_DIRS
			${X11_INCLUDE_DIRS}
		)
		list(APPEND LIBRARIES
			${X11_LIBRARIES}
		)
	else() # NOT X11_FOUND
		# For some systems, i.e. Debian, FindX11 fails to find X11, so we have
		# to use pkg_config as a fallback
		find_package(PkgConfig)
		if(PKG_CONFIG_FOUND)
			pkg_check_modules(X11 x11)
			if(X11_FOUND)
				list(APPEND DEFINES X11)
				list(APPEND SRC_FILES
					src/win/x11.cc
				)
				list(APPEND INCLUDE_DIRS
					${X11_INCLUDE_DIRS}
				)
				list(APPEND LIBRARIES
					${X11_LIBRARIES}
				)
			endif() # X11_FOUND
		endif() # PKG_CONFIG_FOUND
	endif() # X11_FOUND
endif() # WIN32 AND APPLE

add_library(animia SHARED ${SRC_FILES})
set_target_properties(animia PROPERTIES
	PUBLIC_HEADER include/animia.h
	CXX_STANDARD 17
)

target_compile_definitions(animia PUBLIC ${DEFINES})
target_include_directories(animia PRIVATE include PUBLIC ${INCLUDE_DIRS})
target_link_libraries(animia PUBLIC ${LIBRARIES})
