#
# CMake Buildsystem for agartest.
#
if(${CMAKE_CURRENT_SOURCE_DIR} STREQUAL ${CMAKE_CURRENT_BINARY_DIR})
	message(FATAL_ERROR "Prevented in-tree build. Please create a build directory outside of the agartest source code and run \"cmake -S ${CMAKE_SOURCE_DIR} -B .\" from there")
endif()
cmake_minimum_required(VERSION 3.12.0)

project(AGARTEST
	VERSION 1.7.1
	DESCRIPTION "Test Suite for the Agar GUI System"
	HOMEPAGE_URL "https://libagar.org"
	LANGUAGES C CXX OBJC)
#
# Standard CMake tests.
#
include(CheckLibraryExists)
include(CheckIncludeFiles)
include(CheckIncludeFile)
include(CheckSymbolExists)
include(CheckCSourceCompiles)
include(CheckCSourceRuns)
include(CheckCCompilerFlag)
include(CheckCXXCompilerFlag)
include(CheckOBJCSourceCompiles)
include(CheckTypeSize)
include(CheckStructHasMember)
include(CMakeDependentOption)
include(FindPkgConfig)
include(GNUInstallDirs)
#
# Imported BSDBuild tests.
#
set(CMAKE_MODULE_PATH "${AGARTEST_SOURCE_DIR}")
set(CONFIG_DIR "${AGARTEST_BINARY_DIR}/config")
file(MAKE_DIRECTORY ${CONFIG_DIR})
include("${AGARTEST_SOURCE_DIR}/../CMakeChecks.cmake")

# Detect known platforms.
BB_Detect_Platform()

message(STATUS "    _       _       _     ___")
message(STATUS "  / _ \\   / _ \\   / _ \\  |  _ \\")
message(STATUS " | |_| | | (_| | | |_| | | |_) |")
message(STATUS " |_| |_|  \\__, | |_| |_| |_| |_|")
message(STATUS "          |___/                 ")
message(STATUS "")
message(STATUS "agartest version ${AGARTEST_VERSION} in ${AGARTEST_SOURCE_DIR}")

option(AGARTEST_WARNINGS "Use recommended compiler warnings" OFF)
option(AGARTEST_NLS "Enable internationalization and localization" OFF)

BB_Save_Define_Value(VERSION ${AGARTEST_VERSION})

set(ORIG_CMAKE_REQUIRED_FLAGS ${CMAKE_REQUIRED_FLAGS})

#
# agartest sources.
#
set(SOURCE_FILES
	${AGARTEST_SOURCE_DIR}/agartest.c
	${AGARTEST_SOURCE_DIR}/buttons.c
	${AGARTEST_SOURCE_DIR}/charsets.c
	${AGARTEST_SOURCE_DIR}/checkbox.c
	${AGARTEST_SOURCE_DIR}/compositing.c
	${AGARTEST_SOURCE_DIR}/configsettings.c
	${AGARTEST_SOURCE_DIR}/console.c
	${AGARTEST_SOURCE_DIR}/customwidget.c
	${AGARTEST_SOURCE_DIR}/customwidget_mywidget.c
	${AGARTEST_SOURCE_DIR}/fixedres.c
	${AGARTEST_SOURCE_DIR}/focusing.c
	${AGARTEST_SOURCE_DIR}/fonts.c
	${AGARTEST_SOURCE_DIR}/fspaths.c
	${AGARTEST_SOURCE_DIR}/glview.c
	${AGARTEST_SOURCE_DIR}/imageloading.c
	${AGARTEST_SOURCE_DIR}/keyevents.c
	${AGARTEST_SOURCE_DIR}/loader.c
	${AGARTEST_SOURCE_DIR}/maximized.c
	${AGARTEST_SOURCE_DIR}/minimal.c
	${AGARTEST_SOURCE_DIR}/network.c
	${AGARTEST_SOURCE_DIR}/objsystem.c
	${AGARTEST_SOURCE_DIR}/objsystem_animal.c
	${AGARTEST_SOURCE_DIR}/objsystem_mammal.c
	${AGARTEST_SOURCE_DIR}/pane.c
	${AGARTEST_SOURCE_DIR}/palette.c
	${AGARTEST_SOURCE_DIR}/radio.c
	${AGARTEST_SOURCE_DIR}/rendertosurface.c
	${AGARTEST_SOURCE_DIR}/scrollbar.c
	${AGARTEST_SOURCE_DIR}/scrollview.c
	${AGARTEST_SOURCE_DIR}/sockets.c
	${AGARTEST_SOURCE_DIR}/surface.c
	${AGARTEST_SOURCE_DIR}/table.c
	${AGARTEST_SOURCE_DIR}/textbox.c
	${AGARTEST_SOURCE_DIR}/textdlg.c
	${AGARTEST_SOURCE_DIR}/threads.c
	${AGARTEST_SOURCE_DIR}/timeouts.c
	${AGARTEST_SOURCE_DIR}/unitconv.c
	${AGARTEST_SOURCE_DIR}/user.c
	${AGARTEST_SOURCE_DIR}/widgets.c
	${AGARTEST_SOURCE_DIR}/windows.c)

set(DATA_FILES
	${AGARTEST_SOURCE_DIR}/agar.png
	${AGARTEST_SOURCE_DIR}/agar64.png
	${AGARTEST_SOURCE_DIR}/agar-index.png
	${AGARTEST_SOURCE_DIR}/agar.bmp
	${AGARTEST_SOURCE_DIR}/agar-1.bmp
	${AGARTEST_SOURCE_DIR}/agar-2.bmp
	${AGARTEST_SOURCE_DIR}/agar-3.bmp
	${AGARTEST_SOURCE_DIR}/agar-4.bmp
	${AGARTEST_SOURCE_DIR}/axe.bmp
	${AGARTEST_SOURCE_DIR}/axe.png
	${AGARTEST_SOURCE_DIR}/helmet.png
	${AGARTEST_SOURCE_DIR}/helmet.bmp
	${AGARTEST_SOURCE_DIR}/helmet-socket.bmp
	${AGARTEST_SOURCE_DIR}/loss.txt
	${AGARTEST_SOURCE_DIR}/menubg.bmp
	${AGARTEST_SOURCE_DIR}/pepe.jpg
	${AGARTEST_SOURCE_DIR}/sword.bmp
	${AGARTEST_SOURCE_DIR}/sword-socket.bmp
	${AGARTEST_SOURCE_DIR}/sq-agar.bmp
	${AGARTEST_SOURCE_DIR}/sq-agar.png
	${AGARTEST_SOURCE_DIR}/champden.png
	${AGARTEST_SOURCE_DIR}/parrot.png)

#
# Specify the installation directories.
#
set(AGARTEST_PREFIX ${CMAKE_INSTALL_PREFIX})
set(AGARTEST_DATADIR "${AGARTEST_PREFIX}/share/agartest")
set(AGARTEST_LOCALEDIR "${AGARTEST_DATADIR}/locale")

BB_Save_Define_Value(PREFIX ${AGARTEST_PREFIX})
BB_Save_Define_Value(DATADIR ${AGARTEST_DATADIR})
BB_Save_Define_Value(LOCALEDIR ${AGARTEST_LOCALEDIR})

# Check for a C compiler (and extended compiler attributes).
Check_Cc()

# Check for the Agar library.
Check_Agar()
if(NOT HAVE_AGAR)
	message(FATAL_ERROR "The Agar library was not found.")
endif()
if(NOT HAVE_AGAR_AU)
	BB_Save_Undef(HAVE_PORTAUDIO)
endif()

# Check for the rand48() function.
Check_rand48()

if(AGARTEST_NLS)
	Check_Gettext()
	if(HAVE_GETTEXT)
		BB_Save_Define(ENABLE_NLS)
	else()
		BB_Save_Undef(ENABLE_NLS)
	endif()
else()
	Disable_Gettext()
	BB_Save_Undef(ENABLE_NLS)
endif()

if(HAVE_AGAR_MATH)
	set(SOURCE_FILES ${SOURCE_FILES}
		${AGARTEST_SOURCE_DIR}/bezier.c
		${AGARTEST_SOURCE_DIR}/bezier_widget.c
		${AGARTEST_SOURCE_DIR}/math.c
		${AGARTEST_SOURCE_DIR}/plotting.c
		${AGARTEST_SOURCE_DIR}/string.c)
endif()

if(HAVE_AGAR_AU)
	set(SOURCE_FILES ${SOURCE_FILES}
		${AGARTEST_SOURCE_DIR}/audio.c)
endif()

message(STATUS "")
message(STATUS "agartest build successfully configured with the following options:")
message(STATUS "")
message(STATUS "Platform:     ${CMAKE_SYSTEM}")
message(STATUS "Compiler:     ${CMAKE_C_COMPILER}")

if("${CMAKE_BUILD_TYPE}" STREQUAL "Debug")
	message(STATUS "Build Type:   DEBUG")
	message(STATUS "")
	message(STATUS "CMAKE_C_FLAGS_DEBUG:   ${CMAKE_C_FLAGS_DEBUG}")
	message(STATUS "CMAKE_CXX_FLAGS_DEBUG: ${CMAKE_CXX_FLAGS_DEBUG}")
else()
	message(STATUS "Build Type:   RELEASE")
	message(STATUS "")
endif()
message(STATUS "CFLAGS:         ${CMAKE_C_FLAGS}")
message(STATUS "EXTRA_CFLAGS:   ${EXTRA_CFLAGS}")
message(STATUS "EXTRA_LDFLAGS:  ${EXTRA_LDFLAGS}")
message(STATUS "EXTRA_LIBS:     ${EXTRA_LIBS}")
message(STATUS "")
message(STATUS "AGAR_CFLAGS:         ${AGAR_CFLAGS}")
message(STATUS "AGAR_LIBS:           ${AGAR_LIBS}")
message(STATUS "AGAR_AU_LIBRARIES:   ${AGAR_AU_LIBS}")
message(STATUS "AGAR_MATH_LIBRARIES: ${AGAR_MATH_LIBS}")
message(STATUS "")

set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${EXTRA_CFLAGS}")

add_executable(agartest WIN32 MACOSX_BUNDLE ${SOURCE_FILES})

#
# Definitions, Options and Include Directories.
#
target_compile_definitions(agartest PRIVATE
	_USE_AGAR_STD
	_USE_AGAR_QUEUE
	_USE_AGAR_TYPES
	_USE_AGAR_ATTRIBUTES
	_USE_AGAR_NULLABILITY)

if(CYGWIN)
	set(CMAKE_REQUIRED_FLAGS "${CMAKE_REQUIRED_FLAGS} -mno-cygwin")
	check_c_source_compiles("int main(int argc, char **argv) {}" HAVE_GCC_NO_CYGWIN)
	set(CMAKE_REQUIRED_FLAGS ${ORIG_CMAKE_REQUIRED_FLAGS})
	if(HAVE_GCC_NO_CYGWIN)
		target_compile_options(agartest PRIVATE "-mno-cygwin")
	endif()
	target_include_directories(agartest PRIVATE "/usr/include/mingw")
endif()

target_include_directories(agartest PRIVATE "${AGARTEST_BINARY_DIR}")

if(AGARTEST_WARNINGS)
	target_compile_options(agartest PRIVATE "-Wall" "-Werror" "-Wmissing-prototypes"
	    "-Wno-switch")
	if(DARWIN)
		target_compile_options(agartest PRIVATE "-Wno-deprecated-declarations")
	endif()
endif()

if(WINDOWS_STORE)
	target_compile_definitions(agartest PRIVATE AGARTEST_BUILDING_WINRT=1)
	target_compile_options(agartest PRIVATE "-ZW")
endif()

if(MSVC)
	target_compile_definitions(agartest PRIVATE _CRT_SECURE_NO_WARNINGS)
	target_compile_definitions(agartest PRIVATE _CRT_SECURE_NO_DEPRECATE)
	target_compile_options(agartest PRIVATE "/MP")
endif()

#
# Libraries to link against.
#
target_compile_options(agartest PRIVATE ${AGAR_CFLAGS})
target_link_libraries(agartest LINK_PRIVATE ${AGAR_LIBS})

if(AGARTEST_NLS AND HAVE_GETTEXT)
	target_compile_options(agartest PRIVATE ${GETTEXT_CFLAGS})
	target_link_libraries(agartest LINK_PRIVATE ${GETTEXT_LIBS})
endif()
if(HAVE_AGAR_MATH)
	target_compile_options(agartest PRIVATE ${AGAR_MATH_CFLAGS})
	target_link_libraries(agartest LINK_PRIVATE ${AGAR_MATH_LIBRARIES})
endif()
if(HAVE_AGAR_AU)
	target_compile_options(agartest PRIVATE ${AGAR_AU_CFLAGS})
	target_link_libraries(agartest LINK_PRIVATE ${AGAR_AU_LIBRARIES})
endif()

#
# Installation.
#
install(PROGRAMS ${AGARTEST_BINARY_DIR}/agartest TYPE BIN)
install(FILES ${DATA_FILES} DESTINATION "${AGARTEST_DATADIR}")
install(FILES ${AGARTEST_SOURCE_DIR}/agartest.1 DESTINATION "${CMAKE_INSTALL_MANDIR}/man1")
install(FILES ${SOURCE_FILES} DESTINATION "${AGARTEST_DATADIR}")

#
# Uninstallation.
#
if(NOT TARGET uninstall)
	configure_file(
		"${AGARTEST_SOURCE_DIR}/cmake_uninstall.cmake.in"
		"${AGARTEST_BINARY_DIR}/cmake_uninstall.cmake"
		IMMEDIATE @ONLY)
	add_custom_target(uninstall
		COMMAND ${CMAKE_COMMAND} -P ${AGARTEST_BINARY_DIR}/cmake_uninstall.cmake)
endif()
