#
# CMake Buildsystem for Agar.
#
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 Agar source code and run \"cmake -S ${CMAKE_SOURCE_DIR} -B .\" from there")
endif()
cmake_minimum_required(VERSION 3.12.0)

project(AGAR
	VERSION 1.7.1
	DESCRIPTION "Agar GUI System"
	HOMEPAGE_URL "https://libagar.org"
	LANGUAGES C CXX OBJC)

set(AGAR_RELEASE_NAME "Ancient Egypt")
set(AGAR_LIBRARY_VERSION_MAJOR 8)
set(AGAR_LIBRARY_VERSION "${AGAR_LIBRARY_VERSION_MAJOR}.0.0")

add_library(agar-build-options INTERFACE)
target_compile_definitions(agar-build-options INTERFACE _AGAR_INTERNAL)
target_compile_definitions(agar-build-options INTERFACE _DEFAULT_SOURCE)
target_compile_definitions(agar-build-options INTERFACE _BSD_SOURCE)

if(APPLE)
	target_compile_definitions(agar-build-options INTERFACE _DARWIN_C_SOURCE)
endif()
if(WINDOWS_STORE)
	target_compile_definitions(agar-build-options INTERFACE AGAR_BUILDING_WINRT=1)
	target_compile_options(agar-build-options INTERFACE "-ZW")
endif()
if(MSVC)
	target_compile_definitions(agar-build-options INTERFACE _CRT_SECURE_NO_WARNINGS)
	target_compile_definitions(agar-build-options INTERFACE _CRT_SECURE_NO_DEPRECATE)
	target_compile_options(agar-build-options INTERFACE "/MP")
endif()

#
# Standard CMake libraries
#
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 (generated by "make configure").
#
set(CMAKE_MODULE_PATH "${AGAR_SOURCE_DIR}")
set(CONFIG_DIR "${AGAR_BINARY_DIR}/include/agar/config")
include("${CMAKE_CURRENT_SOURCE_DIR}/CMakeChecks.cmake")

# Detect known platforms.
BB_Detect_Platform()

message(STATUS "    _       _       _     ___")
message(STATUS "  / _ \\   / _ \\   / _ \\  |  _ \\")
message(STATUS " | |_| | | (_| | | |_| | | |_) |")
message(STATUS " |_| |_|  \\__, | |_| |_| |_| |_|")
message(STATUS "          |___/                 ")
message(STATUS "")
message(STATUS "Agar version ${AGAR_VERSION} (\"${AGAR_RELEASE_NAME}\") in ${AGAR_SOURCE_DIR}")

#
# Agar build option defaults
#
set(SIZEOF_VOIDP ${CMAKE_SIZEOF_VOID_P})
if(CMAKE_SIZEOF_VOID_P EQUAL 8)
	set(ARCH_64 TRUE)
	#
	# Default to the Large memory model on 64-bit. It is still possible for
	# 64-bit platforms to use the Medium model (e.g., for lower memory utilization).
	#
	set(AGAR_DEFAULT_MEMORY_MODEL "L")
else()
	set(ARCH_64 FALSE)
	#
	# Default to the Medium memory model on 32-bit. It is still possible for
	# 32-bit platforms to use the Large model (e.g., for Deep Color support).
	#
	set(AGAR_DEFAULT_MEMORY_MODEL "M")
endif()

set(AGAR_SHARED_ENABLED_BY_DEFAULT ON)
set(AGAR_STATIC_ENABLED_BY_DEFAULT ON)
set(AGAR_THREADS_ENABLED_BY_DEFAULT ON)

set(AGAR_GUI_ENABLED_BY_DEFAULT ON)

if(AGAR_MINIMAL)
	foreach(agar_lib_def AU MAP MATH NET SG SK VG)
		set(AGAR_${agar_lib_def}_ENABLED_BY_DEFAULT OFF)
	endforeach()
else()
	foreach(agar_lib_def AU MAP MATH NET SG SK VG)
		set(AGAR_${agar_lib_def}_ENABLED_BY_DEFAULT ON)
	endforeach()
endif()


if(EMSCRIPTEN)
	set(AGAR_SHARED_ENABLED_BY_DEFAULT OFF)
	#
	# Emscripten threads are not yet supported on all browsers.
	# Default to OFF for and expect the user to set it if needed.
	#
	set(AGAR_THREADS_ENABLED_BY_DEFAULT OFF)
endif()

if(VITA OR PSP)
	set(AGAR_SHARED_ENABLED_BY_DEFAULT OFF)
endif()

if(NOT DEFINED AGAR_SHARED_ENABLED_BY_DEFAULT)
	set(AGAR_SHARED_ENABLED_BY_DEFAULT OFF)
	if(NOT DEFINED BUILD_SHARED_LIBS)
		set(AGAR_SHARED_ENABLED_BY_DEFAULT ON)
	elseif(BUILD_SHARED_LIBS)
		set(AGAR_SHARED_ENABLED_BY_DEFAULT ON)
		set(AGAR_STATIC_ENABLED_BY_DEFAULT OFF)
	endif()
endif()

set(AGAR_GLOBAL_CFLAGS "")
set(AGAR_GLOBAL_LIBS "")
set(AGAR_CORE_CFLAGS "")
set(AGAR_CORE_LIBS "")
set(AGAR_GUI_CFLAGS "")
set(AGAR_GUI_LIBS "")
set(AGAR_AU_CFLAGS "")
set(AGAR_AU_LIBS "")
set(AGAR_MAP_CFLAGS "")
set(AGAR_MAP_LIBS "")
set(AGAR_MATH_CFLAGS "")
set(AGAR_MATH_LIBS "")
set(AGAR_NET_CFLAGS "")
set(AGAR_NET_LIBS "")
set(AGAR_SG_CFLAGS "")
set(AGAR_SG_LIBS "")
set(AGAR_SK_CFLAGS "")
set(AGAR_SK_LIBS "")
set(AGAR_VG_CFLAGS "")
set(AGAR_VG_LIBS "")

#
# Which Agar libraries to build?
#
option(AGAR_MINIMAL "Build only Agar-Core and Agar-GUI by default" OFF)
option(AGAR_GUI "Build the Agar-GUI library (the Agar GUI system)" ${AGAR_GUI_ENABLED_BY_DEFAULT})
option(AGAR_AU "Build the Agar-AU library (audio extensions)" ${AGAR_AU_ENABLED_BY_DEFAULT})
option(AGAR_MAP "Build the Agar-MAP library (2D/3D tile engine)" ${AGAR_MAP_ENABLED_BY_DEFAULT})
option(AGAR_MATH "Build the Agar-Math library (math extensions)" ${AGAR_MATH_ENABLED_BY_DEFAULT})
option(AGAR_NET "Build the Agar-Net library (network access methods)" ${AGAR_NET_ENABLED_BY_DEFAULT})
option(AGAR_SG "Build the Agar-SG library (3D scene-graph engine)" ${AGAR_SG_ENABLED_BY_DEFAULT})
option(AGAR_SK "Build the Agar-SK library (sketching engine)" ${AGAR_SK_ENABLED_BY_DEFAULT})
option(AGAR_VG "Build the Agar-VG library (vector graphics extensions)" ${AGAR_VG_ENABLED_BY_DEFAULT})
#
# Global Agar build options.
#
set(AGAR_MEMORY_MODEL ${AGAR_DEFAULT_MEMORY_MODEL} CACHE STRING "Agar memory model (S|M|L)")
option(AGAR_FLOAT "Floating-point support" ON)
option(AGAR_SHARED "Build a shared version of the library" ${AGAR_SHARED_ENABLED_BY_DEFAULT})
option(AGAR_STATIC "Build a static version of the library" ${AGAR_STATIC_ENABLED_BY_DEFAULT})
option(AGAR_STATIC_PIC "Build the static library as Position Independent Code" OFF)
option(AGAR_WARNINGS "Use recommended compiler warnings" OFF)
option(AGAR_TYPE_SAFETY "Run-time type safety checks (implied by Debug)" OFF)
option(AGAR_DEBUG_SURFACES "Trace AG_Surface operations (expensive)" OFF)
option(AGAR_LEGACY "Enable obsolete and deprecated interfaces" ON)
option(AGAR_THREADS "Thread safety and multithreading support" ${AGAR_THREADS_ENABLED_BY_DEFAULT})
option(AGAR_ATTRIBUTES "Enable compiler attributes and annotations" ON)
option(AGAR_INLINE_FUNCTIONS "Enable inline functions as appropriate" ON)
option(AGAR_NLS "Enable internationalization and localization" OFF)
#
# Options specific to Agar-Core.
#
option(AGAR_DB_BDB "Berkeley DB (hash and btree) support in AG_Db(3)" OFF)
option(AGAR_DB_MYSQL "MySQL client support in AG_Db(3)" OFF)
option(AGAR_ENABLE_ANSI_COLOR "Support for ANSI color output" ON)
option(AGAR_ENABLE_DSO "Dynamically-loaded modules and object classes" ON)
option(AGAR_ENABLE_EXEC "The AG_Execute(3) interface" ON)
option(AGAR_ENABLE_EVENT_LOOP "The standard AG_EventLoop(3) routine" ON)
option(AGAR_ENABLE_NAMESPACES "Support for AG_Object namespaces" ON)
option(AGAR_ENABLE_NAMED_ARGS "Support for named AG_Event arguments" ON)
option(AGAR_ENABLE_SERIALIZATION "Support for file and I/O serialization" ON)
option(AGAR_ENABLE_STRING "The AG_Printf(3) formatting engine" ON)
option(AGAR_ENABLE_TIMERS "The AG_Timer(3) interface" ON)
option(AGAR_ENABLE_UNICODE "Support for Unicode" ON)
option(AGAR_ENABLE_USER "The AG_User(3) interface" ON)
option(AGAR_ENABLE_VERBOSITY "Verbose error messages" ON)

#
# Options specific to Agar-GUI.
#
option(AGAR_ENABLE_WIDGETS "Build the set of standard GUI widgets" ON)
option(AGAR_ENABLE_WM_HINTS "Enable interaction with Window Managers" ON)
option(AGAR_GUI_SDL "SDL 1.2 support in GUI (sdlfb, sdlgl drivers)" ON)
option(AGAR_GUI_SDL2 "SDL 2.0 support in GUI (sdl2fb, sdl2gl and sdl2mw drivers)" ON)
option(AGAR_GUI_OPENGL "OpenGL support in GUI (recommended)" ON)
option(AGAR_GUI_X11 "X Windows support in GUI (glx driver)" ON)
option(AGAR_GUI_XINERAMA "Support Xinerama extension in glx driver" ON)
option(AGAR_GUI_COCOA "MacOS X Cocoa support (cocoa driver)" ON)
option(AGAR_GUI_FREETYPE "Use the FreeType font engine (recommended)" ON)
option(AGAR_GUI_FONTCONFIG "Use fontconfig library to access system fonts" ON)
option(AGAR_GUI_JPEG "Support for image files in JPEG format" ON)
option(AGAR_GUI_PNG "Support for image files in PNG format" ON)

#
# Options specific to Agar-Math.
#
option(AGAR_MATH_SSE "Enable inline SSE/SSE2/SSE3 optimizations" OFF)
set(AGAR_MATH_PRECISION "DOUBLE" CACHE STRING "Precision of M_Real type (SINGLE|DOUBLE|QUAD)")

#
# Options specific to Agar-Net.
#
option(AGAR_NET_WEB "Enable HTTP application server in Agar-Net" OFF)

BB_Save_Define_Value(VERSION ${AGAR_VERSION})
BB_Save_Define_Value(RELEASE ${AGAR_RELEASE_NAME})

#
# Select the Agar memory model.
#
if("${AGAR_MEMORY_MODEL}" STREQUAL "S")
	BB_Save_Define_Value_Bare(AG_MODEL "AG_SMALL")
	BB_Save_MakeVar(MEMORY_MODEL "SMALL")
elseif("${AGAR_MEMORY_MODEL}" STREQUAL "M")
	BB_Save_Define_Value_Bare(AG_MODEL "AG_MEDIUM")
	BB_Save_MakeVar(MEMORY_MODEL "MEDIUM")
else()
	BB_Save_Define_Value_Bare(AG_MODEL "AG_LARGE")
	BB_Save_MakeVar(MEMORY_MODEL "LARGE")
endif()

#
# Set recommended compiler warnings.
#
if(AGAR_WARNINGS)
	list(APPEND AGAR_GLOBAL_CFLAGS "-Wall -Werror -Wmissing-prototypes -Wno-switch")
	if(DARWIN)
		list(APPEND AGAR_GLOBAL_CFLAGS "-Wno-deprecated-declarations")
	endif()
endif()

#
# Set build definitions from the requested options.
#
if("${CMAKE_BUILD_TYPE}" STREQUAL "Debug")
	BB_Save_Define(AG_DEBUG)
	BB_Save_Define(AG_TYPE_SAFETY)
else()
	BB_Save_Undef(AG_DEBUG)
	if(AGAR_TYPE_SAFETY)
		BB_Save_Define(AG_TYPE_SAFETY)
	else()
		BB_Save_Undef(AG_TYPE_SAFETY)
	endif()
endif()
if(AGAR_DEBUG_SURFACES)
	list(APPEND AGAR_GUI_CFLAGS "-DDEBUG_SURFACES")
endif()

if(AGAR_ENABLE_ANSI_COLOR)
	BB_Save_Define(AG_ANSI_COLOR)
else()
	BB_Save_Undef(AG_ANSI_COLOR)
endif()

if(AGAR_ENABLE_DSO)
	BB_Save_Define(AG_ENABLE_DSO)
else()
	BB_Save_Undef(AG_ENABLE_DSO)
endif()

if(AGAR_ENABLE_EXEC)
	BB_Save_Define(AG_ENABLE_EXEC)
else()
	BB_Save_Undef(AG_ENABLE_EXEC)
endif()

if(AGAR_ENABLE_EVENT_LOOP)
	BB_Save_Define(AG_EVENT_LOOP)
else()
	BB_Save_Undef(AG_EVENT_LOOP)
endif()

if(AGAR_ENABLE_NAMESPACES)
	BB_Save_Define(AG_NAMESPACES)
else()
	BB_Save_Undef(AG_NAMESPACES)
endif()

if(AGAR_ENABLE_NAMED_ARGS)
	BB_Save_Define(AG_NAMED_ARGS)
else()
	BB_Save_Undef(AG_NAMED_ARGS)
endif()

if(AGAR_ENABLE_SERIALIZATION)
	BB_Save_Define(AG_SERIALIZATION)
else()
	BB_Save_Undef(AG_SERIALIZATION)
endif()

if(AGAR_ENABLE_STRING)
	BB_Save_Define(AG_ENABLE_STRING)
else()
	BB_Save_Undef(AG_ENABLE_STRING)
endif()

if(AGAR_ENABLE_TIMERS)
	BB_Save_Define(AG_TIMERS)
else()
	BB_Save_Undef(AG_TIMERS)
endif()

if(AGAR_ENABLE_UNICODE)
	BB_Save_Define(AG_UNICODE)
else()
	BB_Save_Undef(AG_UNICODE)
endif()

if(AGAR_ENABLE_USER)
	BB_Save_Define(AG_USER)
else()
	BB_Save_Undef(AG_USER)
endif()

if(AGAR_ENABLE_VERBOSITY)
	BB_Save_Define(AG_VERBOSITY)
else()
	BB_Save_Undef(AG_VERBOSITY)
endif()

if(AGAR_ENABLE_WIDGETS)
	BB_Save_Define(AG_WIDGETS)
else()
	BB_Save_Undef(AG_WIDGETS)
endif()

if(AGAR_ENABLE_WM_HINTS)
	BB_Save_Define(AG_WM_HINTS)
else()
	BB_Save_Undef(AG_WM_HINTS)
endif()

if(AGAR_LEGACY)
	BB_Save_Define(AG_LEGACY)
else()
	BB_Save_Undef(AG_LEGACY)
endif()

#
# C Include Preparation.
#
message(STATUS "Preprocessing C includes files")
file(MAKE_DIRECTORY "${AGAR_BINARY_DIR}/include")
file(MAKE_DIRECTORY "${AGAR_BINARY_DIR}/include/agar")
file(MAKE_DIRECTORY "${AGAR_BINARY_DIR}/include/agar/config")
foreach(agar_include_subdir core au gui map math net sg sk vg)
	file(MAKE_DIRECTORY "${AGAR_BINARY_DIR}/include/agar/${agar_include_subdir}")
endforeach()

include(FindPerl)
if(PERL_EXECUTABLE)
	#
	# If we have a perl, preprocess include files such that declarations enclosed in
	# __BEGIN_DECLS and __END_DECLS are automatically tagged with platform-specific
	# keywords as needed.
	#
	execute_process(COMMAND ${PERL_EXECUTABLE}
	    "${AGAR_SOURCE_DIR}/mk/gen-includes.pl"
	    "${AGAR_BINARY_DIR}/include/agar"
	    WORKING_DIRECTORY ${AGAR_SOURCE_DIR}
	    COMMAND_ERROR_IS_FATAL ANY)
else()
	#
	# If perl is unavailable, copy include files as-is.
	#
	foreach(agar_include_subdir core au gui map math net sg sk vg)
		file(GLOB agar_include_files ${AGAR_SOURCE_DIR}/${agar_include_subdir}/*.h)
		foreach(agar_include_file ${agar_include_files})
			file(COPY ${agar_include_file}
			    DESTINATION ${AGAR_BINARY_DIR}/include/agar/${agar_include_subdir})
		endforeach()
	endforeach()
endif()

foreach(agar_incl core au gui map net sg sk vg)
	file(COPY_FILE ${AGAR_BINARY_DIR}/include/agar/${agar_incl}/${agar_incl}_pub.h
	    ${AGAR_BINARY_DIR}/include/agar/${agar_incl}.h)
endforeach()

set(AGAR_CMAKE_DEBUG_POSTFIX "d" CACHE STRING "Name suffix for debug builds")
mark_as_advanced(CMAKE_IMPORT_LIBRARY_SUFFIX AGAR_CMAKE_DEBUG_POSTFIX)

set(LIBRARY_OUTPUT_DIRECTORY "build")

if(WINDOWS)
	set(CMAKE_SHARED_LIBRARY_PREFIX "")
endif()

set(ORIG_CMAKE_REQUIRED_FLAGS ${CMAKE_REQUIRED_FLAGS})

# On Cygwin, build without Cygwin dependencies.
if(CYGWIN)
	target_include_directories(agar-build-options INTERFACE "/usr/include/mingw")
	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)
		list(APPEND AGAR_GLOBAL_CFLAGS "-mno-cygwin")
		list(APPEND EXTRA_LDFLAGS "-mno-cygwin")
	endif()
	list(APPEND AGAR_GLOBAL_CFLAGS "-I/usr/include/mingw")
endif()

# Use our generated C includes.
target_include_directories(agar-build-options BEFORE INTERFACE "${AGAR_BINARY_DIR}/include")

#
# Agar-Core Sources.
#
set(SOURCE_FILES_CORE
	${AGAR_SOURCE_DIR}/core/byteswap.c
	${AGAR_SOURCE_DIR}/core/config.c
	${AGAR_SOURCE_DIR}/core/core.c
	${AGAR_SOURCE_DIR}/core/cpuinfo.c
	${AGAR_SOURCE_DIR}/core/crc32.c
	${AGAR_SOURCE_DIR}/core/data_source.c
	${AGAR_SOURCE_DIR}/core/db.c
	${AGAR_SOURCE_DIR}/core/dir.c
	${AGAR_SOURCE_DIR}/core/dso.c
	${AGAR_SOURCE_DIR}/core/error.c
	${AGAR_SOURCE_DIR}/core/event.c
	${AGAR_SOURCE_DIR}/core/exec.c
	${AGAR_SOURCE_DIR}/core/file.c
	${AGAR_SOURCE_DIR}/core/getopt.c
	${AGAR_SOURCE_DIR}/core/load_integral.c
	${AGAR_SOURCE_DIR}/core/load_real.c
	${AGAR_SOURCE_DIR}/core/load_string.c
	${AGAR_SOURCE_DIR}/core/load_version.c
	${AGAR_SOURCE_DIR}/core/object.c
	${AGAR_SOURCE_DIR}/core/string.c
	${AGAR_SOURCE_DIR}/core/tbl.c
	${AGAR_SOURCE_DIR}/core/text.c
	${AGAR_SOURCE_DIR}/core/time.c
	${AGAR_SOURCE_DIR}/core/time_dummy.c
	${AGAR_SOURCE_DIR}/core/timeout.c
	${AGAR_SOURCE_DIR}/core/threads.c
	${AGAR_SOURCE_DIR}/core/vasprintf.c
	${AGAR_SOURCE_DIR}/core/vsnprintf.c
	${AGAR_SOURCE_DIR}/core/user.c
	${AGAR_SOURCE_DIR}/core/user_dummy.c
	${AGAR_SOURCE_DIR}/core/user_getenv.c
	${AGAR_SOURCE_DIR}/core/variable.c
	${AGAR_SOURCE_DIR}/core/vec.c)

#
# Agar-GUI Sources.
#
set(SOURCE_FILES_GUI
	${AGAR_SOURCE_DIR}/gui/box.c
	${AGAR_SOURCE_DIR}/gui/button.c
	${AGAR_SOURCE_DIR}/gui/checkbox.c
	${AGAR_SOURCE_DIR}/gui/colors.c
	${AGAR_SOURCE_DIR}/gui/combo.c
	${AGAR_SOURCE_DIR}/gui/console.c
	${AGAR_SOURCE_DIR}/gui/controller.c
	${AGAR_SOURCE_DIR}/gui/cursors.c
	${AGAR_SOURCE_DIR}/gui/debugger.c
	${AGAR_SOURCE_DIR}/gui/dev_browser.c
	${AGAR_SOURCE_DIR}/gui/dev_classinfo.c
	${AGAR_SOURCE_DIR}/gui/dev_config.c
	${AGAR_SOURCE_DIR}/gui/dev_fonts.c
	${AGAR_SOURCE_DIR}/gui/dev_object_edit.c
	${AGAR_SOURCE_DIR}/gui/dev_timer_inspector.c
	${AGAR_SOURCE_DIR}/gui/dev_unicode_browser.c
	${AGAR_SOURCE_DIR}/gui/dir_dlg.c
	${AGAR_SOURCE_DIR}/gui/drv.c
	${AGAR_SOURCE_DIR}/gui/drv_dummy.c
	${AGAR_SOURCE_DIR}/gui/drv_mw.c
	${AGAR_SOURCE_DIR}/gui/drv_sw.c
	${AGAR_SOURCE_DIR}/gui/editable.c
	${AGAR_SOURCE_DIR}/gui/file_dlg.c
	${AGAR_SOURCE_DIR}/gui/fixed.c
	${AGAR_SOURCE_DIR}/gui/fixed_plotter.c
	${AGAR_SOURCE_DIR}/gui/font_selector.c
	${AGAR_SOURCE_DIR}/gui/font.c
	${AGAR_SOURCE_DIR}/gui/font_bf.c
	${AGAR_SOURCE_DIR}/gui/geometry.c
	${AGAR_SOURCE_DIR}/gui/global_keys.c
	${AGAR_SOURCE_DIR}/gui/glview.c
	${AGAR_SOURCE_DIR}/gui/graph.c
	${AGAR_SOURCE_DIR}/gui/gui.c
	${AGAR_SOURCE_DIR}/gui/hsvpal.c
	${AGAR_SOURCE_DIR}/gui/icon.c
	${AGAR_SOURCE_DIR}/gui/iconmgr.c
	${AGAR_SOURCE_DIR}/gui/input_device.c
	${AGAR_SOURCE_DIR}/gui/joystick.c
	${AGAR_SOURCE_DIR}/gui/keyboard.c
	${AGAR_SOURCE_DIR}/gui/keymap.c
	${AGAR_SOURCE_DIR}/gui/keymap_compose.c
	${AGAR_SOURCE_DIR}/gui/keymap_latin1.c
	${AGAR_SOURCE_DIR}/gui/keysyms.c
	${AGAR_SOURCE_DIR}/gui/label.c
	${AGAR_SOURCE_DIR}/gui/load_bmp.c
	${AGAR_SOURCE_DIR}/gui/load_color.c
	${AGAR_SOURCE_DIR}/gui/load_jpg.c
	${AGAR_SOURCE_DIR}/gui/load_png.c
	${AGAR_SOURCE_DIR}/gui/load_surface.c
	${AGAR_SOURCE_DIR}/gui/menu.c
	${AGAR_SOURCE_DIR}/gui/menu_view.c
	${AGAR_SOURCE_DIR}/gui/mfspinbutton.c
	${AGAR_SOURCE_DIR}/gui/mouse.c
	${AGAR_SOURCE_DIR}/gui/mpane.c
	${AGAR_SOURCE_DIR}/gui/mspinbutton.c
	${AGAR_SOURCE_DIR}/gui/notebook.c
	${AGAR_SOURCE_DIR}/gui/numerical.c
	${AGAR_SOURCE_DIR}/gui/objsel.c
	${AGAR_SOURCE_DIR}/gui/packedpixel.c
	${AGAR_SOURCE_DIR}/gui/pane.c
	${AGAR_SOURCE_DIR}/gui/pixmap.c
	${AGAR_SOURCE_DIR}/gui/primitive.c
	${AGAR_SOURCE_DIR}/gui/progress_bar.c
	${AGAR_SOURCE_DIR}/gui/radio.c
	${AGAR_SOURCE_DIR}/gui/scrollbar.c
	${AGAR_SOURCE_DIR}/gui/scrollview.c
	${AGAR_SOURCE_DIR}/gui/separator.c
	${AGAR_SOURCE_DIR}/gui/slider.c
	${AGAR_SOURCE_DIR}/gui/socket.c
	${AGAR_SOURCE_DIR}/gui/statusbar.c
	${AGAR_SOURCE_DIR}/gui/style_editor.c
	${AGAR_SOURCE_DIR}/gui/stylesheet.c
	${AGAR_SOURCE_DIR}/gui/surface.c
	${AGAR_SOURCE_DIR}/gui/table.c
	${AGAR_SOURCE_DIR}/gui/text.c
	${AGAR_SOURCE_DIR}/gui/text_cache.c
	${AGAR_SOURCE_DIR}/gui/textbox.c
	${AGAR_SOURCE_DIR}/gui/time_sdl.c
	${AGAR_SOURCE_DIR}/gui/titlebar.c
	${AGAR_SOURCE_DIR}/gui/tlist.c
	${AGAR_SOURCE_DIR}/gui/toolbar.c
	${AGAR_SOURCE_DIR}/gui/treetbl.c
	${AGAR_SOURCE_DIR}/gui/ucombo.c
	${AGAR_SOURCE_DIR}/gui/units.c
	${AGAR_SOURCE_DIR}/gui/widget.c
	${AGAR_SOURCE_DIR}/gui/window.c)

#
# Agar-AU Sources.
#
set(SOURCE_FILES_AU
	${AGAR_SOURCE_DIR}/au/au.c
	${AGAR_SOURCE_DIR}/au/au_wave.c
	${AGAR_SOURCE_DIR}/au/au_dev_out.c)

#
# Agar-Map Sources.
#
set(SOURCE_FILES_MAP
	${AGAR_SOURCE_DIR}/map/fill.c
	${AGAR_SOURCE_DIR}/map/flip.c
	${AGAR_SOURCE_DIR}/map/invert.c
	${AGAR_SOURCE_DIR}/map/map.c
	${AGAR_SOURCE_DIR}/map/mapview.c
	${AGAR_SOURCE_DIR}/map/nodesel.c
	${AGAR_SOURCE_DIR}/map/tool.c
	${AGAR_SOURCE_DIR}/map/insert.c
	${AGAR_SOURCE_DIR}/map/insert_obj.c
	${AGAR_SOURCE_DIR}/map/eraser.c
	${AGAR_SOURCE_DIR}/map/rg_tileset.c
	${AGAR_SOURCE_DIR}/map/rg_tileview.c
	${AGAR_SOURCE_DIR}/map/rg_tile.c
	${AGAR_SOURCE_DIR}/map/rg_feature.c
	${AGAR_SOURCE_DIR}/map/rg_fill.c
	${AGAR_SOURCE_DIR}/map/rg_pixmap.c
	${AGAR_SOURCE_DIR}/map/rg_prim.c
	${AGAR_SOURCE_DIR}/map/rg_texture.c
	${AGAR_SOURCE_DIR}/map/rg_transform.c
	${AGAR_SOURCE_DIR}/map/map_object.c
	${AGAR_SOURCE_DIR}/map/map_tile.c
	${AGAR_SOURCE_DIR}/map/map_img.c
	${AGAR_SOURCE_DIR}/map/map_link.c)

#
# Agar-Math Sources.
#
set(SOURCE_FILES_MATH
	${AGAR_SOURCE_DIR}/math/m_math.c
	${AGAR_SOURCE_DIR}/math/m_complex.c
	${AGAR_SOURCE_DIR}/math/m_quaternion.c
	${AGAR_SOURCE_DIR}/math/m_vector.c
	${AGAR_SOURCE_DIR}/math/m_vectorz.c
	${AGAR_SOURCE_DIR}/math/m_vector_fpu.c
	${AGAR_SOURCE_DIR}/math/m_vector2_fpu.c
	${AGAR_SOURCE_DIR}/math/m_vector3_fpu.c
	${AGAR_SOURCE_DIR}/math/m_vector4_fpu.c
	${AGAR_SOURCE_DIR}/math/m_vector3_sse.c
	${AGAR_SOURCE_DIR}/math/m_matrix.c
	${AGAR_SOURCE_DIR}/math/m_matrix_fpu.c
	${AGAR_SOURCE_DIR}/math/m_matrix44_fpu.c
	${AGAR_SOURCE_DIR}/math/m_matrix44_sse.c
	${AGAR_SOURCE_DIR}/math/m_gui.c
	${AGAR_SOURCE_DIR}/math/m_plotter.c
	${AGAR_SOURCE_DIR}/math/m_matview.c
	${AGAR_SOURCE_DIR}/math/m_line.c
	${AGAR_SOURCE_DIR}/math/m_circle.c
	${AGAR_SOURCE_DIR}/math/m_triangle.c
	${AGAR_SOURCE_DIR}/math/m_rectangle.c
	${AGAR_SOURCE_DIR}/math/m_polygon.c
	${AGAR_SOURCE_DIR}/math/m_plane.c
	${AGAR_SOURCE_DIR}/math/m_coordinates.c
	${AGAR_SOURCE_DIR}/math/m_heapsort.c
	${AGAR_SOURCE_DIR}/math/m_mergesort.c
	${AGAR_SOURCE_DIR}/math/m_qsort.c
	${AGAR_SOURCE_DIR}/math/m_radixsort.c
	${AGAR_SOURCE_DIR}/math/m_point_set.c
	${AGAR_SOURCE_DIR}/math/m_color.c
	${AGAR_SOURCE_DIR}/math/m_sphere.c
	${AGAR_SOURCE_DIR}/math/m_polyhedron.c
	${AGAR_SOURCE_DIR}/math/m_matrix_sparse.c
	${AGAR_SOURCE_DIR}/math/m_sparse_allocate.c
	${AGAR_SOURCE_DIR}/math/m_sparse_build.c
	${AGAR_SOURCE_DIR}/math/m_sparse_eda.c
	${AGAR_SOURCE_DIR}/math/m_sparse_factor.c
	${AGAR_SOURCE_DIR}/math/m_sparse_output.c
	${AGAR_SOURCE_DIR}/math/m_sparse_solve.c
	${AGAR_SOURCE_DIR}/math/m_sparse_utils.c
	${AGAR_SOURCE_DIR}/math/m_bezier.c
	${AGAR_SOURCE_DIR}/math/m_bezier_primitives.c)

#
# Agar-Net Sources.
#
set(SOURCE_FILES_NET
	${AGAR_SOURCE_DIR}/net/net.c
	${AGAR_SOURCE_DIR}/net/net_dummy.c)

#
# Agar-SG Sources.
#
set(SOURCE_FILES_SG
	${AGAR_SOURCE_DIR}/sg/sg.c
	${AGAR_SOURCE_DIR}/sg/sg_node.c
	${AGAR_SOURCE_DIR}/sg/sg_view.c
	${AGAR_SOURCE_DIR}/sg/sg_camera.c
	${AGAR_SOURCE_DIR}/sg/sg_gui.c
	${AGAR_SOURCE_DIR}/sg/sg_edit.c
	${AGAR_SOURCE_DIR}/sg/sg_dummy.c
	${AGAR_SOURCE_DIR}/sg/sg_point.c
	${AGAR_SOURCE_DIR}/sg/sg_light.c
	${AGAR_SOURCE_DIR}/sg/sg_plane.c
	${AGAR_SOURCE_DIR}/sg/sg_object.c
	${AGAR_SOURCE_DIR}/sg/sg_texture.c
	${AGAR_SOURCE_DIR}/sg/sg_voxel.c
	${AGAR_SOURCE_DIR}/sg/sg_program.c
	${AGAR_SOURCE_DIR}/sg/sg_load_ply.c
	${AGAR_SOURCE_DIR}/sg/sg_image.c
	${AGAR_SOURCE_DIR}/sg/sg_script.c
	${AGAR_SOURCE_DIR}/sg/sg_line.c
	${AGAR_SOURCE_DIR}/sg/sg_geom.c
	${AGAR_SOURCE_DIR}/sg/sg_circle.c
	${AGAR_SOURCE_DIR}/sg/sg_polygon.c
	${AGAR_SOURCE_DIR}/sg/sg_triangle.c
	${AGAR_SOURCE_DIR}/sg/sg_rectangle.c
	${AGAR_SOURCE_DIR}/sg/sg_sphere.c
	${AGAR_SOURCE_DIR}/sg/sg_polyball.c
	${AGAR_SOURCE_DIR}/sg/sg_polybox.c
	${AGAR_SOURCE_DIR}/sg/sg_action.c
	${AGAR_SOURCE_DIR}/sg/sg_widget.c)

#
# Agar-SK Sources.
#
set(SOURCE_FILES_SK
	${AGAR_SOURCE_DIR}/sk/sk.c
	${AGAR_SOURCE_DIR}/sk/sk_view.c
	${AGAR_SOURCE_DIR}/sk/sk_tool.c
	${AGAR_SOURCE_DIR}/sk/sk_edit.c
	${AGAR_SOURCE_DIR}/sk/sk_select.c
	${AGAR_SOURCE_DIR}/sk/sk_solve.c
	${AGAR_SOURCE_DIR}/sk/sk_group.c
	${AGAR_SOURCE_DIR}/sk/sk_intersect.c
	${AGAR_SOURCE_DIR}/sk/sk_dummy.c
	${AGAR_SOURCE_DIR}/sk/sk_point.c
	${AGAR_SOURCE_DIR}/sk/sk_line.c
	${AGAR_SOURCE_DIR}/sk/sk_circle.c
	${AGAR_SOURCE_DIR}/sk/sk_arc.c
	${AGAR_SOURCE_DIR}/sk/sk_placement.c
	${AGAR_SOURCE_DIR}/sk/sk_annot.c
	${AGAR_SOURCE_DIR}/sk/sk_dimension.c
	${AGAR_SOURCE_DIR}/sk/sk_measure.c
	${AGAR_SOURCE_DIR}/sk/sk_geometry.c
	${AGAR_SOURCE_DIR}/sk/sk_pixmap.c
	${AGAR_SOURCE_DIR}/sk/sk_polygon.c
	${AGAR_SOURCE_DIR}/sk/sk_gui.c)

#
# Agar-VG Sources.
#
set(SOURCE_FILES_VG
	${AGAR_SOURCE_DIR}/vg/vg.c
	${AGAR_SOURCE_DIR}/vg/vg_circle.c
	${AGAR_SOURCE_DIR}/vg/vg_arc.c
	${AGAR_SOURCE_DIR}/vg/vg_line.c
	${AGAR_SOURCE_DIR}/vg/vg_point.c
	${AGAR_SOURCE_DIR}/vg/vg_snap.c
	${AGAR_SOURCE_DIR}/vg/vg_tables.c
	${AGAR_SOURCE_DIR}/vg/vg_text.c
	${AGAR_SOURCE_DIR}/vg/vg_polygon.c
	${AGAR_SOURCE_DIR}/vg/vg_view.c
	${AGAR_SOURCE_DIR}/vg/vg_tool.c
	${AGAR_SOURCE_DIR}/vg/vg_circle_tool.c
	${AGAR_SOURCE_DIR}/vg/vg_line_tool.c
	${AGAR_SOURCE_DIR}/vg/vg_point_tool.c
	${AGAR_SOURCE_DIR}/vg/vg_proximity_tool.c
	${AGAR_SOURCE_DIR}/vg/vg_text_tool.c
	${AGAR_SOURCE_DIR}/vg/vg_arc_tool.c
	${AGAR_SOURCE_DIR}/vg/vg_polygon_tool.c
	${AGAR_SOURCE_DIR}/vg/vg_select_tool.c)

#
# Specify the installation directories.
#
set(AGAR_PREFIX ${CMAKE_INSTALL_PREFIX})
set(AGAR_LIBDIR "${CMAKE_INSTALL_PREFIX}/${CMAKE_INSTALL_LIBDIR}")
set(AGAR_DATADIR "${AGAR_PREFIX}/share/agar")
set(AGAR_LOCALEDIR "${AGAR_DATADIR}/locale")
set(AGAR_TTFDIR "${AGAR_DATADIR}/fonts")
set(AGAR_INCLDIR "${AGAR_PREFIX}/include/agar")

BB_Save_Define_Value(PREFIX ${AGAR_PREFIX})
BB_Save_Define_Value(DATADIR ${AGAR_DATADIR})
BB_Save_Define_Value(LOCALEDIR ${AGAR_LOCALEDIR})
BB_Save_Define_Value(TTFDIR ${AGAR_TTFDIR})
BB_Save_Define_Value(INCLDIR ${AGAR_INCLDIR})

# Check for a C compiler (and extended compiler attributes).
Check_Cc()
if(AGAR_ATTRIBUTES)
	Check_Cc_Attributes()
	BB_Save_Define(AG_USE_ATTRIBUTES)
else()
	Disable_Cc_Attributes()
	BB_Save_Undef(AG_USE_ATTRIBUTES)
endif()

# Check for the host byte order.
Check_ByteOrder()

# Enable or disable inlining of specific families of Agar functions.
if(AGAR_INLINE_FUNCTIONS)
	foreach(flag_var
	    AG_INLINE_BYTESWAP AG_INLINE_ERROR AG_INLINE_IO AG_INLINE_OBJECT AG_INLINE_STRING
	    AG_INLINE_TBL AG_INLINE_THREADS AG_INLINE_VARIABLE AG_INLINE_SURFACE AG_INLINE_WIDGET)
		BB_Save_Define(${flag_var})
	endforeach()
else()
	foreach(flag_var
	    AG_INLINE_BYTESWAP AG_INLINE_ERROR AG_INLINE_IO AG_INLINE_OBJECT AG_INLINE_STRING
	    AG_INLINE_TBL AG_INLINE_THREADS AG_INLINE_VARIABLE AG_INLINE_SURFACE AG_INLINE_WIDGET)
		BB_Save_Undef(${flag_var})
	endforeach()
endif()

# Check for system headers, calls and APIs that we can use.
Check_Sys_Types_h()
Check_Sys_Stat_h()
Check_Stdlib_h()
Check_Unistd_h()
Check_Limits_h()
Check_Float_h()
Check_Math()
Check_Math_C99()
Check_Fdclose()
Check_Getpwuid()
Check_Getpwnam_r()
Check_Getenv()
Check_Getuid()
Check_Strsep()
Check_Asprintf()
Check_Snprintf()
Check_Vsnprintf()
Check_Vasprintf()
Check_Signal()
Check_Strtoll()
Check_Strtold()
Check_Dlopen()
Check_Dyld()
Check_Shl_load()
Check_Gettimeofday()
Check_Select()
Check_Glob()
Check_Getopt()
Check_Execvp()
Check_Clock_gettime()
Check_Clock_win32()
Check_Nanosleep()
Check_Kqueue()
Check_Timerfd()
Check_Csidl()
Check_Xbox()
Check_Mprotect()
Check_Dirfd()

# Disable floating-point support if an integer-only build is requested.
if(NOT AGAR_FLOAT)
	BB_Save_Undef(HAVE_FLOAT)
	BB_Save_Undef(HAVE_LONG_DOUBLE)
endif()

##
## Agar-Core Library.
##

# Check for Berkeley DB (for AG_Db "hash" and "btree" support).
if(AGAR_DB_BDB)
	Check_Db4()
	if(HAVE_DB4)
		list(APPEND AGAR_CORE_CFLAGS ${DB4_CFLAGS})
		list(APPEND AGAR_CORE_LIBS ${DB4_LIBS})
	endif()
else()
	Disable_Db4()
endif()

# Check for MySQL (for AG_Db "mysql" support).
if(AGAR_DB_MYSQL)
	Check_Mysql()
	if(HAVE_MYSQL)
		list(APPEND AGAR_CORE_CFLAGS ${MYSQL_CFLAGS})
		list(APPEND AGAR_CORE_LIBS ${MYSQL_LIBS})
	endif()
else()
	Disable_Mysql()
endif()

# Check for threads support.
if(AGAR_THREADS)
	Check_Pthreads()
	if(HAVE_PTHREADS)
		BB_Save_Define(AG_THREADS)
		list(APPEND AGAR_CORE_CFLAGS ${PTHREADS_CFLAGS})
		list(APPEND AGAR_CORE_LIBS ${PTHREADS_LIBS})
	else()
		BB_Save_Undef(AG_THREADS)

		if (AGAR_WARNINGS)
			#
			# Lock macros expand to no-ops and cause unused variables
			# to appear in unthreaded builds.
			#
			list(APPEND AGAR_GLOBAL_CFLAGS "-Wno-unused")
		endif()
	endif()
else()
	Disable_Pthreads()
	BB_Save_Undef(AG_THREADS)
endif()

# Check for libiconv.
Check_Iconv()
if(HAVE_ICONV)
	if(ICONV_CFLAGS)
		list(APPEND AGAR_CORE_CFLAGS ${ICONV_CFLAGS})
	endif()
	if(ICONV_LIBS)
		list(APPEND AGAR_CORE_LIBS ${ICONV_LIBS})
	endif()
endif()

# Check for libintl / gettext.
if(AGAR_NLS)
	Check_Gettext()
	if(HAVE_GETTEXT)
		BB_Save_Define(ENABLE_NLS)
		if(GETTEXT_CFLAGS)
			list(APPEND AGAR_CORE_CFLAGS ${GETTEXT_CFLAGS})
		endif()
		if(GETTEXT_LIBS)
			list(APPEND AGAR_CORE_LIBS ${GETTEXT_LIBS})
		endif()
	else()
		BB_Save_Undef(ENABLE_NLS)
	endif()
else()
	Disable_Gettext()
	BB_Save_Undef(ENABLE_NLS)
endif()

##
## Agar-GUI Library.
##
if(AGAR_GUI)
	BB_Save_Define(ENABLE_GUI)

	# Check for SDL 2.0.
	if(AGAR_GUI_SDL2)
		Check_Sdl2()
		if(SDL2_CFLAGS)
			list(APPEND AGAR_GUI_CFLAGS ${SDL2_CFLAGS})
		endif()
		if(SDL2_LIBS)
			list(APPEND AGAR_GUI_LIBS ${SDL2_LIBS})
		endif()
	else()
		Disable_Sdl2()
	endif()

	# Fallback to SDL 1.2 (which conflicts with SDL2).
	if(AGAR_GUI_SDL AND NOT HAVE_SDL2)
		Check_Sdl()
		if(SDL_CFLAGS)
			list(APPEND AGAR_GUI_CFLAGS ${SDL_CFLAGS})
		endif()
		if(SDL_LIBS)
			list(APPEND AGAR_GUI_LIBS ${SDL_LIBS})
		endif()
	else()
		Disable_Sdl()
	endif()

	# Check for the FreeType font engine.
	if(AGAR_GUI_FREETYPE)
		Check_FreeType()
		if(FREETYPE_CFLAGS)
			list(APPEND AGAR_GUI_CFLAGS ${FREETYPE_CFLAGS})
		endif()
		if(FREETYPE_LIBS)
			list(APPEND AGAR_GUI_LIBS ${FREETYPE_LIBS})
		endif()
	else()
		Disable_FreeType()
	endif()

	# Check for the Fontconfig library.
	if(AGAR_GUI_FONTCONFIG)
		Check_Fontconfig()
		if(FONTCONFIG_CFLAGS)
			list(APPEND AGAR_GUI_CFLAGS ${FONTCONFIG_CFLAGS})
		endif()
		if(FONTCONFIG_LIBS)
			list(APPEND AGAR_GUI_LIBS ${FONTCONFIG_LIBS})
		endif()
	else()
		Disable_Fontconfig()
	endif()


	# Check for OpenGL (and extensions such as GLX and WGL).
	if(AGAR_GUI_OPENGL)
		Check_OpenGL()
		if(OPENGL_CFLAGS)
			list(APPEND AGAR_GUI_CFLAGS ${OPENGL_CFLAGS})
		endif()
		if(OPENGL_LIBS)
			list(APPEND AGAR_GUI_LIBS ${OPENGL_LIBS})
		endif()
	else()
		Disable_OpenGL()
	endif()

	# Check for X Windows and the Xinerama extension.
	if(AGAR_GUI_X11)
		Check_X11()
		if(X11_CFLAGS)
			list(APPEND AGAR_GUI_CFLAGS ${X11_CFLAGS})
		endif()
		if(X11_LIBS)
			list(APPEND AGAR_GUI_LIBS ${X11_LIBS})
		endif()
		if(XINERAMA_CFLAGS)
			list(APPEND AGAR_GUI_CFLAGS ${XINERAMA_CFLAGS})
		endif()
		if(XINERAMA_LIBS)
			list(APPEND AGAR_GUI_LIBS ${XINERAMA_LIBS})
		endif()
	else()
		Disable_X11()

		set(HAVE_GLX OFF)
		BB_Save_Undef(HAVE_GLX)
	endif()

	# Check for Cocoa on MacOS X.
	if(AGAR_GUI_COCOA)
		Check_Cocoa()
		if(COCOA_CFLAGS)
			list(APPEND AGAR_GUI_CFLAGS ${COCOA_CFLAGS})
		endif()
		if(COCOA_LIBS)
			list(APPEND AGAR_GUI_LIBS ${COCOA_LIBS})
		endif()
	else()
		Disable_Cocoa()
	endif()

	# Check for libjpeg.
	if(AGAR_GUI_JPEG)
		Check_Jpeg()
		if(JPEG_CFLAGS)
			list(APPEND AGAR_GUI_CFLAGS ${JPEG_CFLAGS})
		endif()
		if(JPEG_LIBS)
			list(APPEND AGAR_GUI_LIBS ${JPEG_LIBS})
		endif()
	else()
		Disable_Jpeg()
	endif()

	# Check for libpng.
	if(AGAR_GUI_PNG)
		Check_Png()
		if(PNG_CFLAGS)
			list(APPEND AGAR_GUI_CFLAGS ${PNG_CFLAGS})
		endif()
		if(PNG_LIBS)
			list(APPEND AGAR_GUI_LIBS ${PNG_LIBS})
		endif()
	else()
		Disable_Png()
	endif()

	# Use the math library.
	list(APPEND AGAR_GUI_CFLAGS ${MATH_CFLAGS})
	list(APPEND AGAR_GUI_LIBS ${MATH_LIBS})

else()
	BB_Save_Undef(ENABLE_GUI)
	Disable_Sdl2()
	Disable_Sdl()
	Disable_FreeType()
	Disable_Fontconfig()
	Disable_OpenGL()
	Disable_X11()
	Disable_Cocoa()
	Disable_Jpeg()
	Disable_Png()
endif()

##
## Agar-AU Library.
##
if(AGAR_AU)
	BB_Save_Define(ENABLE_AU)

	Check_Sndfile()
	if(HAVE_SNDFILE)
		list(APPEND AGAR_AU_CFLAGS ${SNDFILE_CFLAGS})
		list(APPEND AGAR_AU_LIBS ${SNDFILE_LIBS})
	endif()

	Check_Portaudio()
	if(HAVE_PORTAUDIO)
		list(APPEND AGAR_AU_CFLAGS ${PORTAUDIO_CFLAGS})
		list(APPEND AGAR_AU_LIBS ${PORTAUDIO_LIBS})
	endif()
else()
	BB_Save_Undef(ENABLE_AU)

	Disable_Sndfile()
	Disable_Portaudio()
endif()

##
## Agar-Map Library.
##
if(AGAR_MAP)
	BB_Save_Define(ENABLE_MAP)
else()
	BB_Save_Undef(ENABLE_MAP)
endif()

##
## Agar-Math Library.
##
if(AGAR_MATH)
	BB_Save_Define(ENABLE_MATH)

	list(APPEND AGAR_MATH_CFLAGS ${MATH_CFLAGS})
	list(APPEND AGAR_MATH_LIBS ${MATH_LIBS})

	if(HAVE_CC_ASM)
		# SSE Extensions.
		Check_SSE()
		if(HAVE_SSE)
			list(APPEND AGAR_MATH_CFLAGS "-msse")
		endif()
		if(HAVE_SSE2)
			list(APPEND AGAR_MATH_CFLAGS "-msse2")
		endif()
		if(HAVE_SSE3)
			list(APPEND AGAR_MATH_CFLAGS "-msse3")
		endif()
		if(AGAR_MATH_SSE)
			BB_Save_Define(INLINE_SSE)
		else()
			BB_Save_Undef(INLINE_SSE)
		endif()

		# Altivec Extensions.
		Check_Altivec()
		if(HAVE_ALTIVEC)
			list(APPEND AGAR_MATH_CFLAGS "-maltivec")
		endif()
		if(AGAR_MATH_ALTIVEC)
			BB_Save_Define(INLINE_ALTIVEC)
		else()
			BB_Save_Undef(INLINE_ALTIVEC)
		endif()

		# Select the natural precision of the Agar-Math M_Real type.
		if(AGAR_MATH_PRECISION STREQUAL "SINGLE" AND NOT HAVE_MATH_C99)
			message(WARNING "Forcing AGAR_MATH_PRECISION to DOUBLE due to missing C99 math extensions.")
			set(AGAR_MATH_PRECISION "DOUBLE")
		elseif(AGAR_MATH_PRECISION STREQUAL "QUAD")
			if(NOT HAVE_LONG_DOUBLE)
				message(WARNING "Forcing AGAR_MATH_PRECISION to DOUBLE due to missing long double type.")
				set(AGAR_MATH_PRECISION "DOUBLE")
			endif()
			if(NOT HAVE_MATH_C99)
				message(WARNING "Forcing AGAR_MATH_PRECISION to DOUBLE due to missing C99 math extensions.")
				set(AGAR_MATH_PRECISION "DOUBLE")
			endif()
		endif()
		if(AGAR_MATH_PRECISION STREQUAL "SINGLE")
			BB_Save_Define(SINGLE_PRECISION)
			BB_Save_Undef(DOUBLE_PRECISION)
			BB_Save_Undef(QUAD_PRECISION)
		elseif(AGAR_MATH_PRECISION STREQUAL "QUAD")
			BB_Save_Undef(SINGLE_PRECISION)
			BB_Save_Undef(DOUBLE_PRECISION)
			BB_Save_Define(QUAD_PRECISION)
		else()
			BB_Save_Undef(SINGLE_PRECISION)
			BB_Save_Define(DOUBLE_PRECISION)
			BB_Save_Undef(QUAD_PRECISION)
		endif()

	else()
		Disable_SSE()
		Disable_Altivec()
		BB_Save_Undef(INLINE_SSE)
		BB_Save_Undef(INLINE_ALTIVEC)
		BB_Save_Undef(SINGLE_PRECISION)
		BB_Save_Undef(DOUBLE_PRECISION)
		BB_Save_Undef(QUAD_PRECISION)
	endif()
else()
	BB_Save_Undef(ENABLE_MATH)
	BB_Save_Undef(INLINE_SSE)
	BB_Save_Undef(INLINE_ALTIVEC)
endif()

##
## Agar-Net Library.
##
if(AGAR_NET)
	BB_Save_MakeVar(HAVE_NETWORK, "yes")
	BB_Save_Define(AG_NETWORK)

	Check_Getaddrinfo()
	Check_Siocgifconf()
	Check_Setsockopts()
	Check_Winsock()

	if(AGAR_NET_WEB)
		Check_Zlib()
		if(HAVE_ZLIB)
			list(APPEND AGAR_NET_CFLAGS ${ZLIB_CFLAGS})
			list(APPEND AGAR_NET_LIBS ${ZLIB_LIBS})
		endif()

		CHECK_INCLUDE_FILE(sys/uio.h AGAR_NET_HAVE_SYS_UIO_H)
		if (AGAR_NET_HAVE_SYS_UIO_H)
			BB_Save_Define(HAVE_SYS_UIO_H)
		else()
			BB_Save_Undef(HAVE_SYS_UIO_H)
		endif()

		CHECK_INCLUDE_FILE(sys/param.h AGAR_NET_HAVE_SYS_PARAM_H)
		if (AGAR_NET_HAVE_SYS_PARAM_H)
			BB_Save_Define(HAVE_SYS_PARAM_H)
		else()
			BB_Save_Undef(HAVE_SYS_PARAM_H)
		endif()

		BB_Save_MakeVar(HAVE_WEB "yes")
		BB_Save_Define(AG_WEB)
	else()
		Disable_Zlib()

		BB_Save_MakeVar(HAVE_WEB "no")
		BB_Save_Undef(AG_WEB)
	endif()
else()
	BB_Save_MakeVar(HAVE_NETWORK, "no")
	BB_Save_Undef(AG_NETWORK)
	Disable_Setsockopts()
	Disable_Winsock()

	# Disable_Zlib()
	BB_Save_Undef(HAVE_SYS_UIO_H)
	BB_Save_Undef(HAVE_SYS_PARAM_H)
	BB_Save_MakeVar(HAVE_WEB "no")
	BB_Save_Undef(AG_WEB)
endif()

##
## Agar-SG Library.
##
if(AGAR_SG)
	BB_Save_Define(ENABLE_SG)
else()
	BB_Save_Undef(ENABLE_SG)
endif()

##
## Agar-SK Library.
##
if(AGAR_SK)
	BB_Save_Define(ENABLE_SK)
else()
	BB_Save_Undef(ENABLE_SK)
endif()

##
## Agar-VG Library.
##
if(AGAR_VG)
	BB_Save_Define(ENABLE_VG)
else()
	BB_Save_Undef(ENABLE_VG)
endif()

#
# Agar-Core conditionally compiled sources.
#
if(NOT HAVE_SNPRINTF)
	set(SOURCE_FILES_CORE ${SOURCE_FILES_CORE} ${AGAR_SOURCE_DIR}/core/snprintf.c)
endif()
if(HAVE_CLOCK_WIN32)
	set(SOURCE_FILES_CORE ${SOURCE_FILES_CORE} ${AGAR_SOURCE_DIR}/core/time_win32.c)
endif()
if(HAVE_CLOCK_GETTIME)
	if(HAVE_NANOSLEEP)
		set(SOURCE_FILES_CORE ${SOURCE_FILES_CORE} ${AGAR_SOURCE_DIR}/core/time_posix.c)
	endif()
	if(HAVE_PTHREADS)
		set(SOURCE_FILES_CORE ${SOURCE_FILES_CORE} ${AGAR_SOURCE_DIR}/core/time_renderer.c)
	endif()
endif()
if(HAVE_GETTIMEOFDAY AND HAVE_SELECT)
	set(SOURCE_FILES_CORE ${SOURCE_FILES_CORE} ${AGAR_SOURCE_DIR}/core/time_gettimeofday.c)
endif()
if(HAVE_DB4)
	set(SOURCE_FILES_CORE ${SOURCE_FILES_CORE} ${AGAR_SOURCE_DIR}/core/db_bdb.c)
endif()
if(HAVE_MYSQL)
	set(SOURCE_FILES_CORE ${SOURCE_FILES_CORE} ${AGAR_SOURCE_DIR}/core/db_mysql.c)
endif()
if(HAVE_GETPWUID)
	set(SOURCE_FILES_CORE ${SOURCE_FILES_CORE} ${AGAR_SOURCE_DIR}/core/user_posix.c)
endif()
if(HAVE_XBOX)
	set(SOURCE_FILES_CORE ${SOURCE_FILES_CORE} ${AGAR_SOURCE_DIR}/core/user_xbox.c)
	set(SOURCE_FILES_CORE ${SOURCE_FILES_CORE} ${AGAR_SOURCE_DIR}/core/xbox.c)
endif()
if(HAVE_CSIDL)
	set(SOURCE_FILES_CORE ${SOURCE_FILES_CORE} ${AGAR_SOURCE_DIR}/core/user_win32.c)
endif()

#
# Agar-GUI conditionally compiled sources.
#
if(AGAR_GUI)
	if(HAVE_FREETYPE)
		set(SOURCE_FILES_GUI ${SOURCE_FILES_GUI} ${AGAR_SOURCE_DIR}/gui/font_ft.c)
	endif()
	if(HAVE_SDL)
		set(SOURCE_FILES_GUI ${SOURCE_FILES_GUI} ${AGAR_SOURCE_DIR}/gui/drv_sdl_common.c)
		set(SOURCE_FILES_GUI ${SOURCE_FILES_GUI} ${AGAR_SOURCE_DIR}/gui/drv_sdlfb.c)
		if(HAVE_OPENGL)
			set(SOURCE_FILES_GUI ${SOURCE_FILES_GUI} ${AGAR_SOURCE_DIR}/gui/drv_sdlgl.c)
		endif()
	endif()
	if(HAVE_SDL2)
		set(SOURCE_FILES_GUI ${SOURCE_FILES_GUI} ${AGAR_SOURCE_DIR}/gui/drv_sdl2_common.c)
		set(SOURCE_FILES_GUI ${SOURCE_FILES_GUI} ${AGAR_SOURCE_DIR}/gui/drv_sdl_keysyms.c)
		set(SOURCE_FILES_GUI ${SOURCE_FILES_GUI} ${AGAR_SOURCE_DIR}/gui/drv_sdl2fb.c)
		if(HAVE_OPENGL)
			set(SOURCE_FILES_GUI ${SOURCE_FILES_GUI} ${AGAR_SOURCE_DIR}/gui/drv_sdl2gl.c)
			set(SOURCE_FILES_GUI ${SOURCE_FILES_GUI} ${AGAR_SOURCE_DIR}/gui/drv_sdl2mw.c)
		endif()
	endif()
	if(HAVE_COCOA)
		set(SOURCE_FILES_GUI ${SOURCE_FILES_GUI} ${AGAR_SOURCE_DIR}/gui/drv_cocoa.m)
	endif()
	if(HAVE_OPENGL)
		if(HAVE_GLX)
			set(SOURCE_FILES_GUI ${SOURCE_FILES_GUI} ${AGAR_SOURCE_DIR}/gui/drv_glx.c)
		endif()
		if(HAVE_WGL)
			set(SOURCE_FILES_GUI ${SOURCE_FILES_GUI} ${AGAR_SOURCE_DIR}/gui/drv_wgl.c)
		endif()

		set(SOURCE_FILES_GUI ${SOURCE_FILES_GUI} ${AGAR_SOURCE_DIR}/gui/drv_gl_common.c)
	endif()
endif()

#
# Agar-AU conditionally compiled sources.
#
if(AGAR_AU)
	if(HAVE_SNDFILE)
		set(SOURCE_FILES_AU ${SOURCE_FILES_AU} ${AGAR_SOURCE_DIR}/au/au_dev_file.c)
	endif()
	if(HAVE_PORTAUDIO)
		set(SOURCE_FILES_AU ${SOURCE_FILES_AU} ${AGAR_SOURCE_DIR}/au/au_dev_pa.c)
	endif()
endif()

#
# Agar-Net conditionally compiled sources.
#
if(AGAR_NET)
	if(HAVE_WINSOCK1)
		set(SOURCE_FILES_NET ${SOURCE_FILES_NET} ${AGAR_SOURCE_DIR}/net/net_winsock1.c)
	endif()
	if(HAVE_WINSOCK2)
		set(SOURCE_FILES_NET ${SOURCE_FILES_NET} ${AGAR_SOURCE_DIR}/net/net_winsock2.c)
	endif()
	if(HAVE_GETADDRINFO)
		set(SOURCE_FILES_NET ${SOURCE_FILES_NET} ${AGAR_SOURCE_DIR}/net/net_bsd.c)
	endif()
	if(AGAR_NET_WEB)
		set(SOURCE_FILES_NET ${SOURCE_FILES_NET}
		    ${AGAR_SOURCE_DIR}/net/web.c
		    ${AGAR_SOURCE_DIR}/net/web_auth.c
		    ${AGAR_SOURCE_DIR}/net/web_var.c)
	endif()
endif()

#
# Finalize CFLAGS and LIBS.
#
list(REMOVE_DUPLICATES AGAR_CORE_CFLAGS)
list(REMOVE_DUPLICATES AGAR_CORE_LIBS)
list(REMOVE_DUPLICATES AGAR_GUI_CFLAGS)
list(REMOVE_DUPLICATES AGAR_GUI_LIBS)
list(REMOVE_DUPLICATES AGAR_AU_CFLAGS)
list(REMOVE_DUPLICATES AGAR_AU_LIBS)
list(REMOVE_DUPLICATES AGAR_MAP_CFLAGS)
list(REMOVE_DUPLICATES AGAR_MAP_LIBS)
list(REMOVE_DUPLICATES AGAR_MATH_CFLAGS)
list(REMOVE_DUPLICATES AGAR_MATH_LIBS)
list(REMOVE_DUPLICATES AGAR_NET_CFLAGS)
list(REMOVE_DUPLICATES AGAR_NET_LIBS)
list(REMOVE_DUPLICATES AGAR_SG_CFLAGS)
list(REMOVE_DUPLICATES AGAR_SG_LIBS)
list(REMOVE_DUPLICATES AGAR_SK_CFLAGS)
list(REMOVE_DUPLICATES AGAR_SK_LIBS)
list(REMOVE_DUPLICATES AGAR_VG_CFLAGS)
list(REMOVE_DUPLICATES AGAR_VG_LIBS)

message(STATUS "")
message(STATUS "Agar build configured successfully!")
message(STATUS "")
message(STATUS "Platform:     ${CMAKE_SYSTEM}")
message(STATUS "64-bit:       ${ARCH_64}")
message(STATUS "Compiler:     ${CMAKE_C_COMPILER}")
message(STATUS "Agar Version: ${AGAR_VERSION} (Library Version: ${AGAR_LIBRARY_VERSION})")
message(STATUS "Memory Model: ${AGAR_MEMORY_MODEL}")

set(AGAR_LIBS_ENABLED " CORE")
set(AGAR_LIBS_DISABLED "")
if(AGAR_AU)
	set(AGAR_LIBS_ENABLED "${AGAR_LIBS_ENABLED} AU")
else()
	set(AGAR_LIBS_DISABLED "${AGAR_LIBS_DISABLED} AU")
endif()
if(AGAR_GUI)
	set(AGAR_LIBS_ENABLED "${AGAR_LIBS_ENABLED} GUI")
else()
	set(AGAR_LIBS_DISABLED "${AGAR_LIBS_DISABLED} GUI")
endif()
if(AGAR_MAP)
	set(AGAR_LIBS_ENABLED "${AGAR_LIBS_ENABLED} MAP")
else()
	set(AGAR_LIBS_DISABLED "${AGAR_LIBS_DISABLED} MAP")
endif()
if(AGAR_MATH)
	set(AGAR_LIBS_ENABLED "${AGAR_LIBS_ENABLED} MATH")
else()
	set(AGAR_LIBS_DISABLED "${AGAR_LIBS_DISABLED} MATH")
endif()
if(AGAR_NET)
	set(AGAR_LIBS_ENABLED "${AGAR_LIBS_ENABLED} NET")
else()
	set(AGAR_LIBS_DISABLED "${AGAR_LIBS_DISABLED} NET")
endif()
if(AGAR_SG)
	set(AGAR_LIBS_ENABLED "${AGAR_LIBS_ENABLED} SG")
else()
	set(AGAR_LIBS_DISABLED "${AGAR_LIBS_DISABLED} SG")
endif()
if(AGAR_SK)
	set(AGAR_LIBS_ENABLED "${AGAR_LIBS_ENABLED} SK")
else()
	set(AGAR_LIBS_DISABLED "${AGAR_LIBS_DISABLED} SK")
endif()
if(AGAR_VG)
	set(AGAR_LIBS_ENABLED "${AGAR_LIBS_ENABLED} VG")
else()
	set(AGAR_LIBS_DISABLED "${AGAR_LIBS_DISABLED} VG")
endif()

message(STATUS "Enable Libs: ${AGAR_LIBS_ENABLED}")
message(STATUS "Disable Libs:${AGAR_LIBS_DISABLED}")
message(STATUS "Shared Libs:  ${AGAR_SHARED}")
message(STATUS "Static Libs:  ${AGAR_STATIC} (Static PIC: ${AGAR_STATIC_PIC})")

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}")
if(AGAR_GLOBAL_CFLAGS)
	message(STATUS "AGAR_GLOBAL_CFLAGS: ${AGAR_GLOBAL_CFLAGS}")
endif()
if(AGAR_CORE_CFLAGS)
	message(STATUS "AGAR_CORE_CFLAGS:   ${AGAR_CORE_CFLAGS}")
endif()
if(AGAR_CORE_LIBS)
	message(STATUS "AGAR_CORE_LIBS:     ${AGAR_CORE_LIBS}")
endif()
if(AGAR_GUI_CFLAGS)
	message(STATUS "AGAR_GUI_CFLAGS:    ${AGAR_GUI_CFLAGS}")
endif()
if(AGAR_GUI_LIBS)
	message(STATUS "AGAR_GUI_LIBS:      ${AGAR_GUI_LIBS}")
endif()
if(AGAR_AU_CFLAGS)
	message(STATUS "AGAR_AU_CFLAGS:     ${AGAR_AU_CFLAGS}")
endif()
if(AGAR_AU_LIBS)
	message(STATUS "AGAR_AU_LIBS:       ${AGAR_AU_LIBS}")
endif()
if(AGAR_MAP_CFLAGS)
	message(STATUS "AGAR_MAP_CFLAGS:    ${AGAR_MAP_CFLAGS}")
endif()
if(AGAR_MAP_LIBS)
	message(STATUS "AGAR_MAP_LIBS:      ${AGAR_MAP_LIBS}")
endif()
if(AGAR_MATH_CFLAGS)
	message(STATUS "AGAR_MATH_CFLAGS:   ${AGAR_MATH_CFLAGS}")
endif()
if(AGAR_MATH_LIBS)
	message(STATUS "AGAR_MATH_LIBS:     ${AGAR_MATH_LIBS}")
endif()
if(AGAR_NET_CFLAGS)
	message(STATUS "AGAR_NET_CFLAGS:    ${AGAR_NET_CFLAGS}")
endif()
if(AGAR_NET_LIBS)
	message(STATUS "AGAR_NET_LIBS:      ${AGAR_NET_LIBS}")
endif()
if(AGAR_SG_CFLAGS)
	message(STATUS "AGAR_SG_CFLAGS:     ${AGAR_SG_CFLAGS}")
endif()
if(AGAR_SG_LIBS)
	message(STATUS "AGAR_SG_LIBS:       ${AGAR_SG_LIBS}")
endif()
if(AGAR_SK_CFLAGS)
	message(STATUS "AGAR_SK_CFLAGS:     ${AGAR_SK_CFLAGS}")
endif()
if(AGAR_SK_LIBS)
	message(STATUS "AGAR_SK_LIBS:       ${AGAR_SK_LIBS}")
endif()
if(AGAR_VG_CFLAGS)
	message(STATUS "AGAR_VG_CFLAGS:     ${AGAR_VG_CFLAGS}")
endif()
if(AGAR_VG_LIBS)
	message(STATUS "AGAR_VG_LIBS:       ${AGAR_VG_LIBS}")
endif()
message(STATUS "")

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

# Set common platform-specific properties on shared-library targets.
macro(Agar_SetPlatformSpecificShared lib outname)
	set_target_properties(${lib} PROPERTIES VERSION ${AGAR_LIBRARY_VERSION}
	    SOVERSION ${AGAR_LIBRARY_VERSION_MAJOR} OUTPUT_NAME "${outname}")

	if(APPLE)
		set_target_properties(${lib} PROPERTIES MACOSX_RPATH 1)
	endif()
	if(WINDOWS OR CYGWIN)
		set_target_properties(${lib} PROPERTIES DEFINE_SYMBOL DLL_EXPORT)
	endif()
	if(MSVC AND NOT MSVC_CLANG)
		if(NOT WINDOWS_STORE)
			set_target_properties(${lib} PROPERTIES LINK_FLAGS_RELEASE "/NODEFAULTLIB")
			set_target_properties(${lib} PROPERTIES LINK_FLAGS_DEBUG "/NODEFAULTLIB")
		endif()
		set_target_properties(${lib} PROPERTIES STATIC_LIBRARY_FLAGS "/NODEFAULTLIB")
	endif()
endmacro()

# Set common platform-specific properties on static-library targets.
macro(Agar_SetPlatformSpecificStatic lib outname)
	if(NOT AGAR_SHARED OR NOT WIN32 OR MINGW)
		set_target_properties(${lib} PROPERTIES OUTPUT_NAME "${outname}")
	endif()

	set_target_properties(${lib} PROPERTIES POSITION_INDEPENDENT_CODE ${AGAR_STATIC_PIC})

	if(MSVC AND NOT MSVC_CLANG)
		set_target_properties(${lib} PROPERTIES LINK_FLAGS_RELEASE "/NODEFAULTLIB")
		set_target_properties(${lib} PROPERTIES LINK_FLAGS_DEBUG "/NODEFAULTLIB")
		set_target_properties(${lib} PROPERTIES STATIC_LIBRARY_FLAGS "/NODEFAULTLIB")
	endif()
endmacro()

#
# Shared Libraries
#
if(AGAR_SHARED)
	add_library(ag_core SHARED ${SOURCE_FILES_CORE})
	add_library(ag_core::ag_core ALIAS ag_core)
	target_compile_options(ag_core PUBLIC ${AGAR_CORE_CFLAGS})
	target_compile_definitions(ag_core PUBLIC _AGAR_CORE_INTERNAL)
	Agar_SetPlatformSpecificShared(ag_core "ag_core")
	target_link_libraries(ag_core PUBLIC ${AGAR_CORE_LIBS} ${EXTRA_LIBS} ${EXTRA_LDFLAGS})
	target_include_directories(ag_core BEFORE PRIVATE "${AGAR_BINARY_DIR}/include")
	target_include_directories(ag_core PUBLIC "$<BUILD_INTERFACE:${AGAR_BINARY_DIR}/include>;$<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}>;$<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}/agar>")
	target_link_libraries(ag_core PRIVATE $<BUILD_INTERFACE:agar-build-options>)
	set_target_properties(ag_core PROPERTIES DEBUG_POSTFIX "${AGAR_CMAKE_DEBUG_POSTFIX}")

	if(AGAR_GUI)
		add_library(ag_gui SHARED ${SOURCE_FILES_GUI})
		add_library(ag_gui::ag_gui ALIAS ag_gui)
		target_compile_options(ag_gui PUBLIC ${AGAR_CORE_CFLAGS} ${AGAR_GUI_CFLAGS})
		target_compile_definitions(ag_gui PUBLIC _AGAR_GUI_INTERNAL)
		Agar_SetPlatformSpecificShared(ag_gui "ag_gui")
		target_link_libraries(ag_gui PUBLIC ${AGAR_GUI_LIBS} ${AGAR_CORE_LIBS} ${EXTRA_LIBS} ${EXTRA_LDFLAGS})
		target_include_directories(ag_gui BEFORE PRIVATE "${AGAR_BINARY_DIR}/include")
		target_include_directories(ag_gui PUBLIC "$<BUILD_INTERFACE:${AGAR_BINARY_DIR}/include>;$<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}>;$<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}/agar>")
		target_link_libraries(ag_gui PRIVATE $<BUILD_INTERFACE:agar-build-options>)
		set_target_properties(ag_gui PROPERTIES DEBUG_POSTFIX "${AGAR_CMAKE_DEBUG_POSTFIX}")
	endif()

	if(AGAR_AU)
		add_library(ag_au SHARED ${SOURCE_FILES_AU})
		add_library(ag_au::ag_au ALIAS ag_au)
		target_compile_options(ag_au PUBLIC ${AGAR_CORE_CFLAGS} ${AGAR_GUI_CFLAGS} ${AGAR_AU_CFLAGS})
		target_compile_definitions(ag_au PUBLIC _AGAR_AU_INTERNAL)
		Agar_SetPlatformSpecificShared(ag_au "ag_au")
		target_link_libraries(ag_au PUBLIC ${AGAR_AU_LIBS} ${AGAR_GUI_LIBS} ${AGAR_CORE_LIBS} ${EXTRA_LIBS} ${EXTRA_LDFLAGS})
		target_include_directories(ag_au BEFORE PRIVATE "${AGAR_BINARY_DIR}/include")
		target_include_directories(ag_au PUBLIC "$<BUILD_INTERFACE:${AGAR_BINARY_DIR}/include>;$<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}>;$<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}/agar>")
		target_link_libraries(ag_au PRIVATE $<BUILD_INTERFACE:agar-build-options>)
		set_target_properties(ag_au PROPERTIES DEBUG_POSTFIX "${AGAR_CMAKE_DEBUG_POSTFIX}")
	endif()

	if(AGAR_MAP)
		add_library(ag_map SHARED ${SOURCE_FILES_MAP})
		add_library(ag_map::ag_map ALIAS ag_map)
		target_compile_options(ag_map PUBLIC ${AGAR_CORE_CFLAGS} ${AGAR_GUI_CFLAGS} ${AGAR_MAP_CFLAGS})
		target_compile_definitions(ag_map PUBLIC _AGAR_MAP_INTERNAL _AGAR_RG_INTERNAL)
		Agar_SetPlatformSpecificShared(ag_map "ag_map")
		target_link_libraries(ag_map PUBLIC ${AGAR_MAP_LIBS} ${AGAR_GUI_LIBS} ${AGAR_CORE_LIBS} ${EXTRA_LIBS} ${EXTRA_LDFLAGS})
		target_include_directories(ag_map BEFORE PRIVATE "${AGAR_BINARY_DIR}/include")
		target_include_directories(ag_map PUBLIC "$<BUILD_INTERFACE:${AGAR_BINARY_DIR}/include>;$<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}>;$<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}/agar>")
		target_link_libraries(ag_map PRIVATE $<BUILD_INTERFACE:agar-build-options>)
		set_target_properties(ag_map PROPERTIES DEBUG_POSTFIX "${AGAR_CMAKE_DEBUG_POSTFIX}")
	endif()

	if(AGAR_MATH)
		add_library(ag_math SHARED ${SOURCE_FILES_MATH})
		add_library(ag_math::ag_math ALIAS ag_math)
		target_compile_options(ag_math PUBLIC ${AGAR_CORE_CFLAGS} ${AGAR_GUI_CFLAGS} ${AGAR_MATH_CFLAGS})
		if(AGAR_WARNINGS)
			# XXX gcc warnings in m_matrix44_sse.c
			target_compile_options(ag_math PUBLIC "-Wno-uninitialized")
		endif()
		target_compile_definitions(ag_math PUBLIC _AGAR_MATH_INTERNAL)
		Agar_SetPlatformSpecificShared(ag_math "ag_math")
		target_link_libraries(ag_math PUBLIC ${AGAR_MATH_LIBS} ${AGAR_GUI_LIBS} ${AGAR_CORE_LIBS} ${EXTRA_LIBS} ${EXTRA_LDFLAGS})
		target_include_directories(ag_math BEFORE PRIVATE "${AGAR_BINARY_DIR}/include")
		target_include_directories(ag_math PUBLIC "$<BUILD_INTERFACE:${AGAR_BINARY_DIR}/include>;$<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}>;$<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}/agar>")
		target_link_libraries(ag_math PRIVATE $<BUILD_INTERFACE:agar-build-options>)
		set_target_properties(ag_math PROPERTIES DEBUG_POSTFIX "${AGAR_CMAKE_DEBUG_POSTFIX}")
	endif()

	if(AGAR_NET)
		add_library(ag_net SHARED ${SOURCE_FILES_NET})
		add_library(ag_net::ag_net ALIAS ag_net)
		target_compile_options(ag_net PUBLIC ${AGAR_CORE_CFLAGS} ${AGAR_NET_CFLAGS})
		target_compile_definitions(ag_net PUBLIC _AGAR_NET_INTERNAL)
		Agar_SetPlatformSpecificShared(ag_net "ag_net")
		target_link_libraries(ag_net PUBLIC ${AGAR_NET_LIBS} ${AGAR_CORE_LIBS} ${EXTRA_LIBS} ${EXTRA_LDFLAGS})
		target_include_directories(ag_net BEFORE PRIVATE "${AGAR_BINARY_DIR}/include")
		target_include_directories(ag_net PUBLIC "$<BUILD_INTERFACE:${AGAR_BINARY_DIR}/include>;$<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}>;$<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}/agar>")
		target_link_libraries(ag_net PRIVATE $<BUILD_INTERFACE:agar-build-options>)
		set_target_properties(ag_net PROPERTIES DEBUG_POSTFIX "${AGAR_CMAKE_DEBUG_POSTFIX}")
	endif()

	if(AGAR_SG)
		add_library(ag_sg SHARED ${SOURCE_FILES_SG})
		add_library(ag_sg::ag_sg ALIAS ag_sg)
		target_compile_options(ag_sg PUBLIC ${AGAR_CORE_CFLAGS} ${AGAR_GUI_CFLAGS} ${AGAR_MATH_CFLAGS} ${AGAR_SG_CFLAGS})
		target_compile_definitions(ag_sg PUBLIC _AGAR_SG_INTERNAL)
		Agar_SetPlatformSpecificShared(ag_sg "ag_sg")
		target_link_libraries(ag_sg PUBLIC ${AGAR_SG_LIBS} ${AGAR_MATH_LIBS} ${AGAR_GUI_LIBS} ${AGAR_CORE_LIBS} ${EXTRA_LIBS} ${EXTRA_LDFLAGS})
		target_include_directories(ag_sg BEFORE PRIVATE "${AGAR_BINARY_DIR}/include")
		target_include_directories(ag_sg PUBLIC "$<BUILD_INTERFACE:${AGAR_BINARY_DIR}/include>;$<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}>;$<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}/agar>")
		target_link_libraries(ag_sg PRIVATE $<BUILD_INTERFACE:agar-build-options>)
		set_target_properties(ag_sg PROPERTIES DEBUG_POSTFIX "${AGAR_CMAKE_DEBUG_POSTFIX}")
	endif()

	if(AGAR_SK)
		add_library(ag_sk SHARED ${SOURCE_FILES_SK})
		add_library(ag_sk::ag_sk ALIAS ag_sk)
		target_compile_options(ag_sk PUBLIC ${AGAR_CORE_CFLAGS} ${AGAR_GUI_CFLAGS} ${AGAR_MATH_CFLAGS} ${AGAR_SK_CFLAGS})
		target_compile_definitions(ag_sk PUBLIC _AGAR_SK_INTERNAL)
		Agar_SetPlatformSpecificShared(ag_sk "ag_sk")
		target_link_libraries(ag_sk PUBLIC ${AGAR_SK_LIBS} ${AGAR_MATH_LIBS} ${AGAR_GUI_LIBS} ${AGAR_CORE_LIBS} ${EXTRA_LIBS} ${EXTRA_LDFLAGS})
		target_include_directories(ag_sk BEFORE PRIVATE "${AGAR_BINARY_DIR}/include")
		target_include_directories(ag_sk PUBLIC "$<BUILD_INTERFACE:${AGAR_BINARY_DIR}/include>;$<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}>;$<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}/agar>")
		target_link_libraries(ag_sk PRIVATE $<BUILD_INTERFACE:agar-build-options>)
		set_target_properties(ag_sk PROPERTIES DEBUG_POSTFIX "${AGAR_CMAKE_DEBUG_POSTFIX}")
	endif()

	if(AGAR_VG)
		add_library(ag_vg SHARED ${SOURCE_FILES_VG})
		add_library(ag_vg::ag_vg ALIAS ag_vg)
		target_compile_options(ag_vg PUBLIC ${AGAR_CORE_CFLAGS} ${AGAR_GUI_CFLAGS} ${AGAR_VG_CFLAGS})
		target_compile_definitions(ag_vg PUBLIC _AGAR_VG_INTERNAL)
		Agar_SetPlatformSpecificShared(ag_vg "ag_vg")
		target_link_libraries(ag_vg PUBLIC ${AGAR_VG_LIBS} ${AGAR_GUI_LIBS} ${AGAR_CORE_LIBS} ${EXTRA_LIBS} ${EXTRA_LDFLAGS})
		target_include_directories(ag_vg BEFORE PRIVATE "${AGAR_BINARY_DIR}/include")
		target_include_directories(ag_vg PUBLIC "$<BUILD_INTERFACE:${AGAR_BINARY_DIR}/include>;$<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}>;$<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}/agar>")
		target_link_libraries(ag_vg PRIVATE $<BUILD_INTERFACE:agar-build-options>)
		set_target_properties(ag_vg PROPERTIES DEBUG_POSTFIX "${AGAR_CMAKE_DEBUG_POSTFIX}")
	endif()

	BB_Save_MakeVar(LIB_SHARED "Yes")
else()
	BB_Save_MakeVar(LIB_SHARED "No")
endif()

#
# Static Libraries
#
if(AGAR_STATIC)
	set(BUILD_SHARED_LIBS FALSE)

	add_library(ag_core-static STATIC ${SOURCE_FILES_CORE})
	target_compile_options(ag_core-static PUBLIC ${AGAR_CORE_CFLAGS})
	target_compile_definitions(ag_core-static PUBLIC _AGAR_CORE_INTERNAL)
	Agar_SetPlatformSpecificStatic(ag_core-static "ag_core")
	target_link_libraries(ag_core-static PUBLIC ${AGAR_CORE_LIBS} ${EXTRA_LIBS} ${EXTRA_LDFLAGS})
	target_include_directories(ag_core-static BEFORE PRIVATE "${AGAR_BINARY_DIR}/include")
	target_include_directories(ag_core-static PUBLIC "$<BUILD_INTERFACE:${AGAR_BINARY_DIR}/include>" $<INSTALL_INTERFACE:include> $<INSTALL_INTERFACE:include/agar>)
	target_link_libraries(ag_core-static PRIVATE $<BUILD_INTERFACE:agar-build-options>)
	set_target_properties(ag_core-static PROPERTIES DEBUG_POSTFIX "${AGAR_CMAKE_DEBUG_POSTFIX}")

	if(AGAR_GUI)
		add_library(ag_gui-static STATIC ${SOURCE_FILES_GUI})
		target_compile_options(ag_gui-static PUBLIC ${AGAR_CORE_CFLAGS} ${AGAR_GUI_CFLAGS})
		target_compile_definitions(ag_gui-static PUBLIC _AGAR_GUI_INTERNAL)
		Agar_SetPlatformSpecificStatic(ag_gui-static "ag_gui")
		target_link_libraries(ag_gui-static PUBLIC ${AGAR_GUI_LIBS} ${AGAR_CORE_LIBS} ${EXTRA_LIBS} ${EXTRA_LDFLAGS})
		target_include_directories(ag_gui-static BEFORE PRIVATE "${AGAR_BINARY_DIR}/include")
		target_include_directories(ag_gui-static PUBLIC "$<BUILD_INTERFACE:${AGAR_BINARY_DIR}/include>" $<INSTALL_INTERFACE:include> $<INSTALL_INTERFACE:include/agar>)
		target_link_libraries(ag_gui-static PRIVATE $<BUILD_INTERFACE:agar-build-options>)
		set_target_properties(ag_gui-static PROPERTIES DEBUG_POSTFIX "${AGAR_CMAKE_DEBUG_POSTFIX}")
	endif()

	if(AGAR_AU)
		add_library(ag_au-static STATIC ${SOURCE_FILES_AU})
		target_compile_options(ag_au-static PUBLIC ${AGAR_CORE_CFLAGS} ${AGAR_GUI_CFLAGS} ${AGAR_MATH_CFLAGS} ${AGAR_AU_CFLAGS})
		target_compile_definitions(ag_au-static PUBLIC _AGAR_AU_INTERNAL)
		Agar_SetPlatformSpecificStatic(ag_au-static "ag_au")
		target_link_libraries(ag_au-static PUBLIC ${AGAR_AU_LIBS} ${AGAR_MATH_LIBS} ${AGAR_GUI_LIBS} ${AGAR_CORE_LIBS} ${EXTRA_LIBS} ${EXTRA_LDFLAGS})
		target_include_directories(ag_au-static BEFORE PRIVATE "${AGAR_BINARY_DIR}/include")
		target_include_directories(ag_au-static PUBLIC "$<BUILD_INTERFACE:${AGAR_BINARY_DIR}/include>" $<INSTALL_INTERFACE:include> $<INSTALL_INTERFACE:include/agar>)
		target_link_libraries(ag_au-static PRIVATE $<BUILD_INTERFACE:agar-build-options>)
		set_target_properties(ag_au-static PROPERTIES DEBUG_POSTFIX "${AGAR_CMAKE_DEBUG_POSTFIX}")
	endif()

	if(AGAR_MAP)
		add_library(ag_map-static STATIC ${SOURCE_FILES_MAP})
		target_compile_options(ag_map-static PUBLIC ${AGAR_CORE_CFLAGS} ${AGAR_GUI_CFLAGS} ${AGAR_MATH_CFLAGS} ${AGAR_MAP_CFLAGS})
		target_compile_definitions(ag_map-static PUBLIC _AGAR_MAP_INTERNAL _AGAR_RG_INTERNAL)
		Agar_SetPlatformSpecificStatic(ag_map-static "ag_map")
		target_link_libraries(ag_map-static PUBLIC ${AGAR_MAP_LIBS} ${AGAR_MATH_LIBS} ${AGAR_GUI_LIBS} ${AGAR_CORE_LIBS} ${EXTRA_LIBS} ${EXTRA_LDFLAGS})
		target_include_directories(ag_map-static BEFORE PRIVATE "${AGAR_BINARY_DIR}/include")
		target_include_directories(ag_map-static PUBLIC "$<BUILD_INTERFACE:${AGAR_BINARY_DIR}/include>" $<INSTALL_INTERFACE:include> $<INSTALL_INTERFACE:include/agar>)
		target_link_libraries(ag_map-static PRIVATE $<BUILD_INTERFACE:agar-build-options>)
		set_target_properties(ag_map-static PROPERTIES DEBUG_POSTFIX "${AGAR_CMAKE_DEBUG_POSTFIX}")
	endif()

	if(AGAR_MATH)
		add_library(ag_math-static STATIC ${SOURCE_FILES_MATH})
		target_compile_options(ag_math-static PUBLIC ${AGAR_CORE_CFLAGS} ${AGAR_GUI_CFLAGS} ${AGAR_MATH_CFLAGS})
		if(AGAR_WARNINGS)
			# XXX gcc warnings in m_matrix44_sse.c
			target_compile_options(ag_math-static PUBLIC "-Wno-uninitialized")
		endif()
		target_compile_definitions(ag_math-static PUBLIC _AGAR_MATH_INTERNAL)
		Agar_SetPlatformSpecificStatic(ag_math-static "ag_math")
		target_link_libraries(ag_math-static PUBLIC ${AGAR_MATH_LIBS} ${AGAR_GUI_LIBS} ${AGAR_CORE_LIBS} ${EXTRA_LIBS} ${EXTRA_LDFLAGS})
		target_include_directories(ag_math-static BEFORE PRIVATE "${AGAR_BINARY_DIR}/include")
		target_include_directories(ag_math-static PUBLIC "$<BUILD_INTERFACE:${AGAR_BINARY_DIR}/include>" $<INSTALL_INTERFACE:include> $<INSTALL_INTERFACE:include/agar>)
		target_link_libraries(ag_math-static PRIVATE $<BUILD_INTERFACE:agar-build-options>)
		set_target_properties(ag_math-static PROPERTIES DEBUG_POSTFIX "${AGAR_CMAKE_DEBUG_POSTFIX}")
	endif()

	if(AGAR_NET)
		add_library(ag_net-static STATIC ${SOURCE_FILES_NET})
		target_compile_options(ag_net-static PUBLIC ${AGAR_CORE_CFLAGS} ${AGAR_NET_CFLAGS})
		target_compile_definitions(ag_net-static PUBLIC _AGAR_NET_INTERNAL)
		Agar_SetPlatformSpecificStatic(ag_net-static "ag_net")
		target_link_libraries(ag_net-static PUBLIC ${AGAR_NET_LIBS} ${AGAR_CORE_LIBS} ${EXTRA_LIBS} ${EXTRA_LDFLAGS})
		target_include_directories(ag_net-static BEFORE PRIVATE "${AGAR_BINARY_DIR}/include")
		target_include_directories(ag_net-static PUBLIC "$<BUILD_INTERFACE:${AGAR_BINARY_DIR}/include>" $<INSTALL_INTERFACE:include> $<INSTALL_INTERFACE:include/agar>)
		target_link_libraries(ag_net-static PRIVATE $<BUILD_INTERFACE:agar-build-options>)
		set_target_properties(ag_net-static PROPERTIES DEBUG_POSTFIX "${AGAR_CMAKE_DEBUG_POSTFIX}")
	endif()

	if(AGAR_SG)
		add_library(ag_sg-static STATIC ${SOURCE_FILES_SG})
		target_compile_options(ag_sg-static PUBLIC ${AGAR_CORE_CFLAGS} ${AGAR_GUI_CFLAGS} ${AGAR_MATH_CFLAGS} ${AGAR_SG_CFLAGS})
		target_compile_definitions(ag_sg-static PUBLIC _AGAR_SG_INTERNAL)
		Agar_SetPlatformSpecificStatic(ag_sg-static "ag_sg")
		target_link_libraries(ag_sg-static PUBLIC ${AGAR_SG_LIBS} ${AGAR_MATH_LIBS} ${AGAR_GUI_LIBS} ${AGAR_CORE_LIBS} ${EXTRA_LIBS} ${EXTRA_LDFLAGS})
		target_include_directories(ag_sg-static BEFORE PRIVATE "${AGAR_BINARY_DIR}/include")
		target_include_directories(ag_sg-static PUBLIC "$<BUILD_INTERFACE:${AGAR_BINARY_DIR}/include>" $<INSTALL_INTERFACE:include> $<INSTALL_INTERFACE:include/agar>)
		target_link_libraries(ag_sg-static PRIVATE $<BUILD_INTERFACE:agar-build-options>)
		set_target_properties(ag_sg-static PROPERTIES DEBUG_POSTFIX "${AGAR_CMAKE_DEBUG_POSTFIX}")
	endif()

	if(AGAR_SK)
		add_library(ag_sk-static STATIC ${SOURCE_FILES_SK})
		target_compile_options(ag_sk-static PUBLIC ${AGAR_CORE_CFLAGS} ${AGAR_GUI_CFLAGS} ${AGAR_MATH_CFLAGS} ${AGAR_SK_CFLAGS})
		target_compile_definitions(ag_sk-static PUBLIC _AGAR_SK_INTERNAL)
		Agar_SetPlatformSpecificStatic(ag_sk-static "ag_sk")
		target_link_libraries(ag_sk-static PUBLIC ${AGAR_SK_LIBS} ${AGAR_MATH_LIBS} ${AGAR_GUI_LIBS} ${AGAR_CORE_LIBS} ${EXTRA_LIBS} ${EXTRA_LDFLAGS})
		target_include_directories(ag_sk-static BEFORE PRIVATE "${AGAR_BINARY_DIR}/include")
		target_include_directories(ag_sk-static PUBLIC "$<BUILD_INTERFACE:${AGAR_BINARY_DIR}/include>" $<INSTALL_INTERFACE:include> $<INSTALL_INTERFACE:include/agar>)
		target_link_libraries(ag_sk-static PRIVATE $<BUILD_INTERFACE:agar-build-options>)
		set_target_properties(ag_sk-static PROPERTIES DEBUG_POSTFIX "${AGAR_CMAKE_DEBUG_POSTFIX}")
	endif()

	if(AGAR_VG)
		add_library(ag_vg-static STATIC ${SOURCE_FILES_VG})
		target_compile_options(ag_vg-static PUBLIC ${AGAR_CORE_CFLAGS} ${AGAR_GUI_CFLAGS} ${AGAR_VG_CFLAGS})
		target_compile_definitions(ag_vg-static PUBLIC _AGAR_VG_INTERNAL)
		Agar_SetPlatformSpecificStatic(ag_vg-static "ag_vg")
		target_link_libraries(ag_vg-static PUBLIC ${AGAR_VG_LIBS} ${AGAR_GUI_LIBS} ${AGAR_CORE_LIBS} ${EXTRA_LIBS} ${EXTRA_LDFLAGS})
		target_include_directories(ag_vg-static BEFORE PRIVATE "${AGAR_BINARY_DIR}/include")
		target_include_directories(ag_vg-static PUBLIC "$<BUILD_INTERFACE:${AGAR_BINARY_DIR}/include>" $<INSTALL_INTERFACE:include> $<INSTALL_INTERFACE:include/agar>)
		target_link_libraries(ag_vg-static PRIVATE $<BUILD_INTERFACE:agar-build-options>)
		set_target_properties(ag_vg-static PROPERTIES DEBUG_POSTFIX "${AGAR_CMAKE_DEBUG_POSTFIX}")
	endif()
endif()

#
# Install: Shared and Static Libraries.
#
if(AGAR_SHARED)
	install(TARGETS ag_core EXPORT ag_coreTargets
		LIBRARY DESTINATION "${CMAKE_INSTALL_LIBDIR}"
		ARCHIVE DESTINATION "${CMAKE_INSTALL_LIBDIR}"
		RUNTIME DESTINATION "${CMAKE_INSTALL_BINDIR}")
	if(AGAR_GUI)
		install(TARGETS ag_gui EXPORT ag_guiTargets
			LIBRARY DESTINATION "${CMAKE_INSTALL_LIBDIR}"
			ARCHIVE DESTINATION "${CMAKE_INSTALL_LIBDIR}"
			RUNTIME DESTINATION "${CMAKE_INSTALL_BINDIR}")
	endif()
	if(AGAR_AU)
		install(TARGETS ag_au EXPORT ag_auTargets
			LIBRARY DESTINATION "${CMAKE_INSTALL_LIBDIR}"
			ARCHIVE DESTINATION "${CMAKE_INSTALL_LIBDIR}"
			RUNTIME DESTINATION "${CMAKE_INSTALL_BINDIR}")
	endif()
	if(AGAR_MAP)
		install(TARGETS ag_map EXPORT ag_mapTargets
			LIBRARY DESTINATION "${CMAKE_INSTALL_LIBDIR}"
			ARCHIVE DESTINATION "${CMAKE_INSTALL_LIBDIR}"
			RUNTIME DESTINATION "${CMAKE_INSTALL_BINDIR}")
	endif()
	if(AGAR_MATH)
		install(TARGETS ag_math EXPORT ag_mathTargets
			LIBRARY DESTINATION "${CMAKE_INSTALL_LIBDIR}"
			ARCHIVE DESTINATION "${CMAKE_INSTALL_LIBDIR}"
			RUNTIME DESTINATION "${CMAKE_INSTALL_BINDIR}")
	endif()
	if(AGAR_NET)
		install(TARGETS ag_net EXPORT ag_netTargets
			LIBRARY DESTINATION "${CMAKE_INSTALL_LIBDIR}"
			ARCHIVE DESTINATION "${CMAKE_INSTALL_LIBDIR}"
			RUNTIME DESTINATION "${CMAKE_INSTALL_BINDIR}")
	endif()
	if(AGAR_SG)
		install(TARGETS ag_sg EXPORT ag_sgTargets
			LIBRARY DESTINATION "${CMAKE_INSTALL_LIBDIR}"
			ARCHIVE DESTINATION "${CMAKE_INSTALL_LIBDIR}"
			RUNTIME DESTINATION "${CMAKE_INSTALL_BINDIR}")
	endif()
	if(AGAR_SK)
		install(TARGETS ag_sk EXPORT ag_skTargets
			LIBRARY DESTINATION "${CMAKE_INSTALL_LIBDIR}"
			ARCHIVE DESTINATION "${CMAKE_INSTALL_LIBDIR}"
			RUNTIME DESTINATION "${CMAKE_INSTALL_BINDIR}")
	endif()
	if(AGAR_VG)
		install(TARGETS ag_vg EXPORT ag_vgTargets
			LIBRARY DESTINATION "${CMAKE_INSTALL_LIBDIR}"
			ARCHIVE DESTINATION "${CMAKE_INSTALL_LIBDIR}"
			RUNTIME DESTINATION "${CMAKE_INSTALL_BINDIR}")
	endif()
endif()

if(AGAR_STATIC)
	install(TARGETS ag_core-static EXPORT ag_coreStaticTargets
		LIBRARY DESTINATION "${CMAKE_INSTALL_LIBDIR}"
		ARCHIVE DESTINATION "${CMAKE_INSTALL_LIBDIR}"
		RUNTIME DESTINATION "${CMAKE_INSTALL_BINDIR}")
	if(AGAR_GUI)
		install(TARGETS ag_gui-static EXPORT ag_guiStaticTargets
			LIBRARY DESTINATION "${CMAKE_INSTALL_LIBDIR}"
			ARCHIVE DESTINATION "${CMAKE_INSTALL_LIBDIR}"
			RUNTIME DESTINATION "${CMAKE_INSTALL_BINDIR}")
	endif()
	if(AGAR_AU)
		install(TARGETS ag_au-static EXPORT ag_auStaticTargets
			LIBRARY DESTINATION "${CMAKE_INSTALL_LIBDIR}"
			ARCHIVE DESTINATION "${CMAKE_INSTALL_LIBDIR}"
			RUNTIME DESTINATION "${CMAKE_INSTALL_BINDIR}")
	endif()
	if(AGAR_MAP)
		install(TARGETS ag_map-static EXPORT ag_mapStaticTargets
			LIBRARY DESTINATION "${CMAKE_INSTALL_LIBDIR}"
			ARCHIVE DESTINATION "${CMAKE_INSTALL_LIBDIR}"
			RUNTIME DESTINATION "${CMAKE_INSTALL_BINDIR}")
	endif()
	if(AGAR_MATH)
		install(TARGETS ag_math-static EXPORT ag_mathStaticTargets
			LIBRARY DESTINATION "${CMAKE_INSTALL_LIBDIR}"
			ARCHIVE DESTINATION "${CMAKE_INSTALL_LIBDIR}"
			RUNTIME DESTINATION "${CMAKE_INSTALL_BINDIR}")
	endif()
	if(AGAR_NET)
		install(TARGETS ag_net-static EXPORT ag_netStaticTargets
			LIBRARY DESTINATION "${CMAKE_INSTALL_LIBDIR}"
			ARCHIVE DESTINATION "${CMAKE_INSTALL_LIBDIR}"
			RUNTIME DESTINATION "${CMAKE_INSTALL_BINDIR}")
	endif()
	if(AGAR_SG)
		install(TARGETS ag_sg-static EXPORT ag_sgStaticTargets
			LIBRARY DESTINATION "${CMAKE_INSTALL_LIBDIR}"
			ARCHIVE DESTINATION "${CMAKE_INSTALL_LIBDIR}"
			RUNTIME DESTINATION "${CMAKE_INSTALL_BINDIR}")
	endif()
	if(AGAR_SK)
		install(TARGETS ag_sk-static EXPORT ag_skStaticTargets
			LIBRARY DESTINATION "${CMAKE_INSTALL_LIBDIR}"
			ARCHIVE DESTINATION "${CMAKE_INSTALL_LIBDIR}"
			RUNTIME DESTINATION "${CMAKE_INSTALL_BINDIR}")
	endif()
	if(AGAR_VG)
		install(TARGETS ag_vg-static EXPORT ag_vgStaticTargets
			LIBRARY DESTINATION "${CMAKE_INSTALL_LIBDIR}"
			ARCHIVE DESTINATION "${CMAKE_INSTALL_LIBDIR}"
			RUNTIME DESTINATION "${CMAKE_INSTALL_BINDIR}")
	endif()
endif()

#
# Install: Cmake Package Helpers.
#
if(WINDOWS AND NOT MINGW)
	set(PKG_PREFIX "cmake")
else()
	set(PKG_PREFIX "${CMAKE_INSTALL_LIBDIR}/cmake/agar")
endif()
include(CMakePackageConfigHelpers)
write_basic_package_version_file("${AGAR_BINARY_DIR}/agarConfigVersion.cmake"
	VERSION ${AGAR_VERSION}
	COMPATIBILITY AnyNewerVersion
)

if(AGAR_SHARED)
	install(EXPORT ag_coreTargets FILE ag_coreTargets.cmake NAMESPACE ag_core:: DESTINATION ${PKG_PREFIX})
	if(AGAR_GUI)
		install(EXPORT ag_guiTargets FILE ag_guiTargets.cmake NAMESPACE ag_gui:: DESTINATION ${PKG_PREFIX})
	endif()
	if(AGAR_AU)
		install(EXPORT ag_auTargets FILE ag_auTargets.cmake NAMESPACE ag_au:: DESTINATION ${PKG_PREFIX})
	endif()
	if(AGAR_MAP)
		install(EXPORT ag_mapTargets FILE ag_mapTargets.cmake NAMESPACE ag_map:: DESTINATION ${PKG_PREFIX})
	endif()
	if(AGAR_MATH)
		install(EXPORT ag_mathTargets FILE ag_mathTargets.cmake NAMESPACE ag_math:: DESTINATION ${PKG_PREFIX})
	endif()
	if(AGAR_NET)
		install(EXPORT ag_netTargets FILE ag_netTargets.cmake NAMESPACE ag_net:: DESTINATION ${PKG_PREFIX})
	endif()
	if(AGAR_SG)
		install(EXPORT ag_sgTargets FILE ag_sgTargets.cmake NAMESPACE ag_sg:: DESTINATION ${PKG_PREFIX})
	endif()
	if(AGAR_SK)
		install(EXPORT ag_skTargets FILE ag_skTargets.cmake NAMESPACE ag_sk:: DESTINATION ${PKG_PREFIX})
	endif()
	if(AGAR_VG)
		install(EXPORT ag_vgTargets FILE ag_vgTargets.cmake NAMESPACE ag_vg:: DESTINATION ${PKG_PREFIX})
	endif()
endif()

if(AGAR_STATIC)
	install(EXPORT ag_coreStaticTargets FILE ag_coreStaticTargets.cmake NAMESPACE ag_core:: DESTINATION ${PKG_PREFIX})
	if(AGAR_GUI)
		install(EXPORT ag_guiStaticTargets FILE ag_guiStaticTargets.cmake NAMESPACE ag_gui:: DESTINATION ${PKG_PREFIX})
	endif()
	if(AGAR_AU)
		install(EXPORT ag_auStaticTargets FILE ag_auStaticTargets.cmake NAMESPACE ag_au:: DESTINATION ${PKG_PREFIX})
	endif()
	if(AGAR_MAP)
		install(EXPORT ag_mapStaticTargets FILE ag_mapStaticTargets.cmake NAMESPACE ag_map:: DESTINATION ${PKG_PREFIX})
	endif()
	if(AGAR_MATH)
		install(EXPORT ag_mathStaticTargets FILE ag_mathStaticTargets.cmake NAMESPACE ag_math:: DESTINATION ${PKG_PREFIX})
	endif()
	if(AGAR_NET)
		install(EXPORT ag_netStaticTargets FILE ag_netStaticTargets.cmake NAMESPACE ag_net:: DESTINATION ${PKG_PREFIX})
	endif()
	if(AGAR_SG)
		install(EXPORT ag_sgStaticTargets FILE ag_sgStaticTargets.cmake NAMESPACE ag_sg:: DESTINATION ${PKG_PREFIX})
	endif()
	if(AGAR_SK)
		install(EXPORT ag_skStaticTargets FILE ag_skStaticTargets.cmake NAMESPACE ag_sk:: DESTINATION ${PKG_PREFIX})
	endif()
	if(AGAR_VG)
		install(EXPORT ag_vgStaticTargets FILE ag_vgStaticTargets.cmake NAMESPACE ag_vg:: DESTINATION ${PKG_PREFIX})
	endif()
endif()

install(FILES
    ${AGAR_SOURCE_DIR}/agarConfig.cmake
    ${AGAR_BINARY_DIR}/agarConfigVersion.cmake
    DESTINATION ${PKG_PREFIX}
    COMPONENT Devel)

#
# Install: Agar C Include Files.
#
foreach(agar_incl_subdir
    au config core gui map math net sg sk vg)
	file(GLOB include_files ${AGAR_BINARY_DIR}/include/agar/${agar_incl_subdir}/*.h)
	install(FILES ${include_files} DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/agar/${agar_incl_subdir})
endforeach()
file(GLOB include_files ${AGAR_BINARY_DIR}/include/agar/*.h)
install(FILES ${include_files} DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/agar)

string(TOUPPER "${CMAKE_BUILD_TYPE}" UPPER_BUILD_TYPE)
if(UPPER_BUILD_TYPE MATCHES DEBUG)
	set(SOPOSTFIX "${AGAR_CMAKE_DEBUG_POSTFIX}")
else()
	set(SOPOSTFIX "")
endif()

if(NOT (WINDOWS OR CYGWIN) OR MINGW)
	#
	# Install: Symbolic Links for Shared Libraries.
	#
	if(AGAR_SHARED AND NOT MINGW)
		set(SOEXT ${CMAKE_SHARED_LIBRARY_SUFFIX})

		get_target_property(SONAME ag_core OUTPUT_NAME)
		install(CODE "
execute_process(COMMAND ${CMAKE_COMMAND} -E create_symlink
\"lib${SONAME}${SOPOSTFIX}${SOEXT}.${AGAR_LIBRARY_VERSION}\" \"libag_core${SOPOSTFIX}${SOEXT}\"
 WORKING_DIRECTORY \"${AGAR_BINARY_DIR}\")")
		install(FILES ${AGAR_BINARY_DIR}/libag_core${SOPOSTFIX}${SOEXT}
		    DESTINATION "${CMAKE_INSTALL_LIBDIR}")
	
		if(AGAR_GUI)
			get_target_property(SONAME ag_gui OUTPUT_NAME)
			install(CODE "
execute_process(COMMAND ${CMAKE_COMMAND} -E create_symlink
\"lib${SONAME}${SOPOSTFIX}${SOEXT}.${AGAR_LIBRARY_VERSION}\" \"libag_gui${SOPOSTFIX}${SOEXT}\"
 WORKING_DIRECTORY \"${AGAR_BINARY_DIR}\")")
			install(FILES ${AGAR_BINARY_DIR}/libag_gui${SOPOSTFIX}${SOEXT}
			    DESTINATION "${CMAKE_INSTALL_LIBDIR}")
		endif()
		if(AGAR_AU)
			get_target_property(SONAME ag_au OUTPUT_NAME)
			install(CODE "
execute_process(COMMAND ${CMAKE_COMMAND} -E create_symlink
\"lib${SONAME}${SOPOSTFIX}${SOEXT}.${AGAR_LIBRARY_VERSION}\" \"libag_au${SOPOSTFIX}${SOEXT}\"
 WORKING_DIRECTORY \"${AGAR_BINARY_DIR}\")")
			install(FILES ${AGAR_BINARY_DIR}/libag_au${SOPOSTFIX}${SOEXT}
			    DESTINATION "${CMAKE_INSTALL_LIBDIR}")
		endif()
		if(AGAR_MAP)
			get_target_property(SONAME ag_map OUTPUT_NAME)
			install(CODE "
execute_process(COMMAND ${CMAKE_COMMAND} -E create_symlink
\"lib${SONAME}${SOPOSTFIX}${SOEXT}.${AGAR_LIBRARY_VERSION}\" \"libag_map${SOPOSTFIX}${SOEXT}\"
 WORKING_DIRECTORY \"${AGAR_BINARY_DIR}\")")
			install(FILES ${AGAR_BINARY_DIR}/libag_map${SOPOSTFIX}${SOEXT}
			    DESTINATION "${CMAKE_INSTALL_LIBDIR}")
		endif()
		if(AGAR_MATH)
			get_target_property(SONAME ag_math OUTPUT_NAME)
			install(CODE "
execute_process(COMMAND ${CMAKE_COMMAND} -E create_symlink
\"lib${SONAME}${SOPOSTFIX}${SOEXT}.${AGAR_LIBRARY_VERSION}\" \"libag_math${SOPOSTFIX}${SOEXT}\"
 WORKING_DIRECTORY \"${AGAR_BINARY_DIR}\")")
			install(FILES ${AGAR_BINARY_DIR}/libag_math${SOPOSTFIX}${SOEXT}
			    DESTINATION "${CMAKE_INSTALL_LIBDIR}")
		endif()
		if(AGAR_NET)
			get_target_property(SONAME ag_net OUTPUT_NAME)
			install(CODE "
execute_process(COMMAND ${CMAKE_COMMAND} -E create_symlink
\"lib${SONAME}${SOPOSTFIX}${SOEXT}.${AGAR_LIBRARY_VERSION}\" \"libag_net${SOPOSTFIX}${SOEXT}\"
 WORKING_DIRECTORY \"${AGAR_BINARY_DIR}\")")
			install(FILES ${AGAR_BINARY_DIR}/libag_net${SOPOSTFIX}${SOEXT}
			    DESTINATION "${CMAKE_INSTALL_LIBDIR}")
		endif()
		if(AGAR_SG)
			get_target_property(SONAME ag_sg OUTPUT_NAME)
			install(CODE "
execute_process(COMMAND ${CMAKE_COMMAND} -E create_symlink
\"lib${SONAME}${SOPOSTFIX}${SOEXT}.${AGAR_LIBRARY_VERSION}\" \"libag_sg${SOPOSTFIX}${SOEXT}\"
 WORKING_DIRECTORY \"${AGAR_BINARY_DIR}\")")
			install(FILES ${AGAR_BINARY_DIR}/libag_sg${SOPOSTFIX}${SOEXT}
			    DESTINATION "${CMAKE_INSTALL_LIBDIR}")
		endif()
		if(AGAR_SK)
			get_target_property(SONAME ag_sk OUTPUT_NAME)
			install(CODE "
execute_process(COMMAND ${CMAKE_COMMAND} -E create_symlink
\"lib${SONAME}${SOPOSTFIX}${SOEXT}.${AGAR_LIBRARY_VERSION}\" \"libag_sk${SOPOSTFIX}${SOEXT}\"
 WORKING_DIRECTORY \"${AGAR_BINARY_DIR}\")")
			install(FILES ${AGAR_BINARY_DIR}/libag_sk${SOPOSTFIX}${SOEXT}
			    DESTINATION "${CMAKE_INSTALL_LIBDIR}")
		endif()
		if(AGAR_VG)
			get_target_property(SONAME ag_vg OUTPUT_NAME)
			install(CODE "
execute_process(COMMAND ${CMAKE_COMMAND} -E create_symlink
\"lib${SONAME}${SOPOSTFIX}${SOEXT}.${AGAR_LIBRARY_VERSION}\" \"libag_vg${SOPOSTFIX}${SOEXT}\"
 WORKING_DIRECTORY \"${AGAR_BINARY_DIR}\")")
			install(FILES ${AGAR_BINARY_DIR}/libag_vg${SOPOSTFIX}${SOEXT}
			    DESTINATION "${CMAKE_INSTALL_LIBDIR}")
		endif()
	endif()

	#
	# Install: Helper packages for the Unix shell, pkgconfig and GNU autotools.
	#
#	if(FREEBSD)
#		install(FILES ${AGAR_BINARY_DIR}/agar.pc
#		    DESTINATION "libdata/pkgconfig")
#	else()
#		install(FILES ${AGAR_BINARY_DIR}/agar.pc
#		    DESTINATION "${CMAKE_INSTALL_LIBDIR}/pkgconfig")
#	endif()

	set(propsRelease
		IMPORTED_IMPLIB_RELEASE IMPORTED_IMPLIB_NOCONFIG IMPORTED_IMPLIB IMPORTED_IMPLIB_MINSIZEREL
		IMPORTED_IMPLIB_RELWITHDEBINFO IMPORTED_LOCATION_RELEASE IMPORTED_LOCATION_NOCONFIG
		IMPORTED_LOCATION IMPORTED_LOCATION_MINSIZEREL IMPORTED_LOCATION_RELWITHDEBINFO)

	set(propsDebug IMPORTED_IMPLIB_DEBUG IMPORTED_LOCATION_DEBUG)

	# agar-core-config
	set(AGAR_CONFIG_CFLAGS "")
	set(AGAR_CONFIG_LIBS "")
	set(AGAR_CONFIG_LIBS_STATIC "")
	set(AGAR_CONFIG_DEPLIBS "")
	list(JOIN AGAR_CORE_CFLAGS " " AGAR_CONFIG_CFLAGS)
	list(JOIN AGAR_CORE_LIBS " " AGAR_CONFIG_DEPLIBS)
	if("${CMAKE_BUILD_TYPE}" STREQUAL "Debug")
		set(AGAR_CONFIG_LIBS "-lag_cored")
		set(AGAR_CONFIG_LIBS_STATIC "${AGAR_LIBDIR}/libag_cored.a")
	else()
		set(AGAR_CONFIG_LIBS "-lag_core")
		set(AGAR_CONFIG_LIBS_STATIC "${AGAR_LIBDIR}/libag_core.a")
	endif()
	configure_file(
		"${AGAR_SOURCE_DIR}/mk/cmake-agar-core-config.in"
		"${AGAR_BINARY_DIR}/agar-core-config"
		IMMEDIATE @ONLY)
	install(PROGRAMS ${AGAR_BINARY_DIR}/agar-core-config DESTINATION "${CMAKE_INSTALL_BINDIR}")

	# agar-config
	if(AGAR_GUI)
		set(AGAR_CONFIG_CFLAGS "")
		set(AGAR_CONFIG_LIBS "")
		set(AGAR_CONFIG_LIBS_STATIC "")
		set(AGAR_CONFIG_DEPLIBS "")
		foreach(agarcflag ${AGAR_CORE_CFLAGS} ${AGAR_GUI_CFLAGS})
			if(AGAR_CONFIG_CFLAGS STREQUAL "")
				set(AGAR_CONFIG_CFLAGS "${agarcflag}")
			else()
				set(AGAR_CONFIG_CFLAGS "${AGAR_CONFIG_CFLAGS} ${agarcflag}")
			endif()
		endforeach()
		foreach(agarlib ${AGAR_GUI_LIBS} ${AGAR_CORE_LIBS})
			if(AGAR_CONFIG_DEPLIBS STREQUAL "")
				set(AGAR_CONFIG_DEPLIBS "${agarlib}")
			else()
				set(AGAR_CONFIG_DEPLIBS "${AGAR_CONFIG_DEPLIBS} ${agarlib}")
			endif()
		endforeach()
		if("${CMAKE_BUILD_TYPE}" STREQUAL "Debug")
			set(AGAR_CONFIG_LIBS "-lag_guid -lag_cored")
			set(AGAR_CONFIG_LIBS_STATIC "${AGAR_LIBDIR}/libag_guid.a ${AGAR_LIBDIR}/libag_cored.a")
		else()
			set(AGAR_CONFIG_LIBS "-lag_gui -lag_core")
			set(AGAR_CONFIG_LIBS_STATIC "${AGAR_LIBDIR}/libag_gui.a ${AGAR_LIBDIR}/libag_core.a")
		endif()
		configure_file(
			"${AGAR_SOURCE_DIR}/mk/cmake-agar-config.in"
			"${AGAR_BINARY_DIR}/agar-config"
			IMMEDIATE @ONLY)
		install(PROGRAMS ${AGAR_BINARY_DIR}/agar-config DESTINATION "${CMAKE_INSTALL_BINDIR}")
	endif()

	# agar-au-config
	if(AGAR_AU)
		set(AGAR_CONFIG_CFLAGS "")
		set(AGAR_CONFIG_LIBS "")
		set(AGAR_CONFIG_LIBS_STATIC "")
		set(AGAR_CONFIG_DEPLIBS "")
		foreach(agarcflag ${AGAR_CORE_CFLAGS} ${AGAR_GUI_CFLAGS} ${AGAR_AU_CFLAGS})
			if(AGAR_CONFIG_CFLAGS STREQUAL "")
				set(AGAR_CONFIG_CFLAGS "${agarcflag}")
			else()
				set(AGAR_CONFIG_CFLAGS "${AGAR_CONFIG_CFLAGS} ${agarcflag}")
			endif()
		endforeach()
		foreach(agarlib ${AGAR_AU_LIBS} ${AGAR_GUI_LIBS} ${AGAR_CORE_LIBS})
			if(AGAR_CONFIG_DEPLIBS STREQUAL "")
				set(AGAR_CONFIG_DEPLIBS "${agarlib}")
			else()
				set(AGAR_CONFIG_DEPLIBS "${AGAR_CONFIG_DEPLIBS} ${agarlib}")
			endif()
		endforeach()
		if("${CMAKE_BUILD_TYPE}" STREQUAL "Debug")
			set(AGAR_CONFIG_LIBS "-lag_aud -lag_guid -lag_cored")
			set(AGAR_CONFIG_LIBS_STATIC "${AGAR_LIBDIR}/libag_aud.a ${AGAR_LIBDIR}/libag_guid.a ${AGAR_LIBDIR}/libag_cored.a")
		else()
			set(AGAR_CONFIG_LIBS "-lag_au -lag_gui -lag_core")
			set(AGAR_CONFIG_LIBS_STATIC "${AGAR_LIBDIR}/libag_au.a ${AGAR_LIBDIR}/libag_gui.a ${AGAR_LIBDIR}/libag_core.a")
		endif()
		configure_file(
			"${AGAR_SOURCE_DIR}/mk/cmake-agar-au-config.in"
			"${AGAR_BINARY_DIR}/agar-au-config"
			IMMEDIATE @ONLY)
		install(PROGRAMS ${AGAR_BINARY_DIR}/agar-au-config DESTINATION "${CMAKE_INSTALL_BINDIR}")
	endif()

	# agar-map-config
	if(AGAR_MAP)
		set(AGAR_CONFIG_CFLAGS "")
		set(AGAR_CONFIG_LIBS "")
		set(AGAR_CONFIG_LIBS_STATIC "")
		set(AGAR_CONFIG_DEPLIBS "")
		foreach(agarcflag ${AGAR_CORE_CFLAGS} ${AGAR_GUI_CFLAGS} ${AGAR_MAP_CFLAGS})
			if(AGAR_CONFIG_CFLAGS STREQUAL "")
				set(AGAR_CONFIG_CFLAGS "${agarcflag}")
			else()
				set(AGAR_CONFIG_CFLAGS "${AGAR_CONFIG_CFLAGS} ${agarcflag}")
			endif()
		endforeach()
		foreach(agarlib ${AGAR_MAP_LIBS} ${AGAR_GUI_LIBS} ${AGAR_CORE_LIBS})
			if(AGAR_CONFIG_DEPLIBS STREQUAL "")
				set(AGAR_CONFIG_DEPLIBS "${agarlib}")
			else()
				set(AGAR_CONFIG_DEPLIBS "${AGAR_CONFIG_DEPLIBS} ${agarlib}")
			endif()
		endforeach()
		if("${CMAKE_BUILD_TYPE}" STREQUAL "Debug")
			set(AGAR_CONFIG_LIBS "-lag_mapd -lag_guid -lag_cored")
			set(AGAR_CONFIG_LIBS_STATIC "${AGAR_LIBDIR}/libag_mapd.a ${AGAR_LIBDIR}/libag_guid.a ${AGAR_LIBDIR}/libag_cored.a")
		else()
			set(AGAR_CONFIG_LIBS "-lag_map -lag_gui -lag_core")
			set(AGAR_CONFIG_LIBS_STATIC "${AGAR_LIBDIR}/libag_map.a ${AGAR_LIBDIR}/libag_gui.a ${AGAR_LIBDIR}/libag_core.a")
		endif()
		configure_file(
			"${AGAR_SOURCE_DIR}/mk/cmake-agar-map-config.in"
			"${AGAR_BINARY_DIR}/agar-map-config"
			IMMEDIATE @ONLY)
		install(PROGRAMS ${AGAR_BINARY_DIR}/agar-map-config DESTINATION "${CMAKE_INSTALL_BINDIR}")
	endif()

	# agar-math-config
	if(AGAR_MATH)
		set(AGAR_CONFIG_CFLAGS "")
		set(AGAR_CONFIG_LIBS "")
		set(AGAR_CONFIG_LIBS_STATIC "")
		set(AGAR_CONFIG_DEPLIBS "")
		foreach(agarcflag ${AGAR_CORE_CFLAGS} ${AGAR_GUI_CFLAGS} ${AGAR_MATH_CFLAGS})
			if(AGAR_CONFIG_CFLAGS STREQUAL "")
				set(AGAR_CONFIG_CFLAGS "${agarcflag}")
			else()
				set(AGAR_CONFIG_CFLAGS "${AGAR_CONFIG_CFLAGS} ${agarcflag}")
			endif()
		endforeach()
		foreach(agarlib ${AGAR_MATH_LIBS} ${AGAR_GUI_LIBS} ${AGAR_CORE_LIBS})
			if(AGAR_CONFIG_DEPLIBS STREQUAL "")
				set(AGAR_CONFIG_DEPLIBS "${agarlib}")
			else()
				set(AGAR_CONFIG_DEPLIBS "${AGAR_CONFIG_DEPLIBS} ${agarlib}")
			endif()
		endforeach()
		if("${CMAKE_BUILD_TYPE}" STREQUAL "Debug")
			set(AGAR_CONFIG_LIBS "-lag_mathd -lag_guid -lag_cored")
			set(AGAR_CONFIG_LIBS_STATIC "${AGAR_LIBDIR}/libag_mathd.a ${AGAR_LIBDIR}/libag_guid.a ${AGAR_LIBDIR}/libag_cored.a")
		else()
			set(AGAR_CONFIG_LIBS "-lag_math -lag_gui -lag_core")
			set(AGAR_CONFIG_LIBS_STATIC "${AGAR_LIBDIR}/libag_math.a ${AGAR_LIBDIR}/libag_gui.a ${AGAR_LIBDIR}/libag_core.a")
		endif()
		configure_file(
			"${AGAR_SOURCE_DIR}/mk/cmake-agar-math-config.in"
			"${AGAR_BINARY_DIR}/agar-math-config"
			IMMEDIATE @ONLY)
		install(PROGRAMS ${AGAR_BINARY_DIR}/agar-math-config DESTINATION "${CMAKE_INSTALL_BINDIR}")
	endif()

	# agar-net-config
	if(AGAR_NET)
		set(AGAR_CONFIG_CFLAGS "")
		set(AGAR_CONFIG_LIBS "")
		set(AGAR_CONFIG_LIBS_STATIC "")
		set(AGAR_CONFIG_DEPLIBS "")
		foreach(agarcflag ${AGAR_CORE_CFLAGS} ${AGAR_NET_CFLAGS})
			if(AGAR_CONFIG_CFLAGS STREQUAL "")
				set(AGAR_CONFIG_CFLAGS "${agarcflag}")
			else()
				set(AGAR_CONFIG_CFLAGS "${AGAR_CONFIG_CFLAGS} ${agarcflag}")
			endif()
		endforeach()
		foreach(agarlib ${AGAR_NET_LIBS} ${AGAR_CORE_LIBS})
			if(AGAR_CONFIG_DEPLIBS STREQUAL "")
				set(AGAR_CONFIG_DEPLIBS "${agarlib}")
			else()
				set(AGAR_CONFIG_DEPLIBS "${AGAR_CONFIG_DEPLIBS} ${agarlib}")
			endif()
		endforeach()
		if("${CMAKE_BUILD_TYPE}" STREQUAL "Debug")
			set(AGAR_CONFIG_LIBS "-lag_netd -lag_cored")
			set(AGAR_CONFIG_LIBS_STATIC "${AGAR_LIBDIR}/libag_netd.a ${AGAR_LIBDIR}/libag_cored.a")
		else()
			set(AGAR_CONFIG_LIBS "-lag_net -lag_core")
			set(AGAR_CONFIG_LIBS_STATIC "${AGAR_LIBDIR}/libag_net.a ${AGAR_LIBDIR}/libag_core.a")
		endif()
		configure_file(
			"${AGAR_SOURCE_DIR}/mk/cmake-agar-net-config.in"
			"${AGAR_BINARY_DIR}/agar-net-config"
			IMMEDIATE @ONLY)
		install(PROGRAMS ${AGAR_BINARY_DIR}/agar-net-config DESTINATION "${CMAKE_INSTALL_BINDIR}")
	endif()

	# agar-sg-config
	if(AGAR_SG)
		set(AGAR_CONFIG_CFLAGS "")
		set(AGAR_CONFIG_LIBS "")
		set(AGAR_CONFIG_LIBS_STATIC "")
		set(AGAR_CONFIG_DEPLIBS "")
		foreach(agarcflag ${AGAR_CORE_CFLAGS} ${AGAR_GUI_CFLAGS} ${AGAR_MATH_CFLAGS} ${AGAR_SG_CFLAGS})
			if(AGAR_CONFIG_CFLAGS STREQUAL "")
				set(AGAR_CONFIG_CFLAGS "${agarcflag}")
			else()
				set(AGAR_CONFIG_CFLAGS "${AGAR_CONFIG_CFLAGS} ${agarcflag}")
			endif()
		endforeach()
		foreach(agarlib ${AGAR_SG_LIBS} ${AGAR_MATH_LIBS} ${AGAR_GUI_LIBS} ${AGAR_CORE_LIBS})
			if(AGAR_CONFIG_DEPLIBS STREQUAL "")
				set(AGAR_CONFIG_DEPLIBS "${agarlib}")
			else()
				set(AGAR_CONFIG_DEPLIBS "${AGAR_CONFIG_DEPLIBS} ${agarlib}")
			endif()
		endforeach()
		if("${CMAKE_BUILD_TYPE}" STREQUAL "Debug")
			set(AGAR_CONFIG_LIBS "-lag_sgd -lag_mathd -lag_guid -lag_cored")
			set(AGAR_CONFIG_LIBS_STATIC "${AGAR_LIBDIR}/libag_sgd.a ${AGAR_LIBDIR}/libag_mathd.a ${AGAR_LIBDIR}/libag_guid.a ${AGAR_LIBDIR}/libag_cored.a")
		else()
			set(AGAR_CONFIG_LIBS "-lag_sg -lag_math -lag_gui -lag_core")
			set(AGAR_CONFIG_LIBS_STATIC "${AGAR_LIBDIR}/libag_sg.a ${AGAR_LIBDIR}/libag_math.a ${AGAR_LIBDIR}/libag_gui.a ${AGAR_LIBDIR}/libag_core.a")
		endif()
		configure_file(
			"${AGAR_SOURCE_DIR}/mk/cmake-agar-sg-config.in"
			"${AGAR_BINARY_DIR}/agar-sg-config"
			IMMEDIATE @ONLY)
		install(PROGRAMS ${AGAR_BINARY_DIR}/agar-sg-config DESTINATION "${CMAKE_INSTALL_BINDIR}")
	endif()

	# agar-sk-config
	if(AGAR_SK)
		set(AGAR_CONFIG_CFLAGS "")
		set(AGAR_CONFIG_LIBS "")
		set(AGAR_CONFIG_LIBS_STATIC "")
		set(AGAR_CONFIG_DEPLIBS "")
		foreach(agarcflag ${AGAR_CORE_CFLAGS} ${AGAR_GUI_CFLAGS} ${AGAR_MATH_CFLAGS} ${AGAR_SK_CFLAGS})
			if(AGAR_CONFIG_CFLAGS STREQUAL "")
				set(AGAR_CONFIG_CFLAGS "${agarcflag}")
			else()
				set(AGAR_CONFIG_CFLAGS "${AGAR_CONFIG_CFLAGS} ${agarcflag}")
			endif()
		endforeach()
		foreach(agarlib ${AGAR_SK_LIBS} ${AGAR_MATH_LIBS} ${AGAR_GUI_LIBS} ${AGAR_CORE_LIBS})
			if(AGAR_CONFIG_DEPLIBS STREQUAL "")
				set(AGAR_CONFIG_DEPLIBS "${agarlib}")
			else()
				set(AGAR_CONFIG_DEPLIBS "${AGAR_CONFIG_DEPLIBS} ${agarlib}")
			endif()
		endforeach()
		if("${CMAKE_BUILD_TYPE}" STREQUAL "Debug")
			set(AGAR_CONFIG_LIBS "-lag_skd -lag_mathd -lag_guid -lag_cored")
			set(AGAR_CONFIG_LIBS_STATIC "${AGAR_LIBDIR}/libag_skd.a ${AGAR_LIBDIR}/libag_mathd.a ${AGAR_LIBDIR}/libag_guid.a ${AGAR_LIBDIR}/libag_cored.a")
		else()
			set(AGAR_CONFIG_LIBS "-lag_sk -lag_math -lag_gui -lag_core")
			set(AGAR_CONFIG_LIBS_STATIC "${AGAR_LIBDIR}/libag_sk.a ${AGAR_LIBDIR}/libag_math.a ${AGAR_LIBDIR}/libag_gui.a ${AGAR_LIBDIR}/libag_core.a")
		endif()
		configure_file(
			"${AGAR_SOURCE_DIR}/mk/cmake-agar-sk-config.in"
			"${AGAR_BINARY_DIR}/agar-sk-config"
			IMMEDIATE @ONLY)
		install(PROGRAMS ${AGAR_BINARY_DIR}/agar-sk-config DESTINATION "${CMAKE_INSTALL_BINDIR}")
	endif()

	# agar-vg-config
	if(AGAR_VG)
		set(AGAR_CONFIG_CFLAGS "")
		set(AGAR_CONFIG_LIBS "")
		set(AGAR_CONFIG_LIBS_STATIC "")
		set(AGAR_CONFIG_DEPLIBS "")
		foreach(agarcflag ${AGAR_CORE_CFLAGS} ${AGAR_GUI_CFLAGS} ${AGAR_VG_CFLAGS})
			if(AGAR_CONFIG_CFLAGS STREQUAL "")
				set(AGAR_CONFIG_CFLAGS "${agarcflag}")
			else()
				set(AGAR_CONFIG_CFLAGS "${AGAR_CONFIG_CFLAGS} ${agarcflag}")
			endif()
		endforeach()
		foreach(agarlib ${AGAR_VG_LIBS} ${AGAR_GUI_LIBS} ${AGAR_CORE_LIBS})
			if(AGAR_CONFIG_DEPLIBS STREQUAL "")
				set(AGAR_CONFIG_DEPLIBS "${agarlib}")
			else()
				set(AGAR_CONFIG_DEPLIBS "${AGAR_CONFIG_DEPLIBS} ${agarlib}")
			endif()
		endforeach()
		if("${CMAKE_BUILD_TYPE}" STREQUAL "Debug")
			set(AGAR_CONFIG_LIBS "-lag_vgd -lag_guid -lag_cored")
			set(AGAR_CONFIG_LIBS_STATIC "${AGAR_LIBDIR}/libag_vgd.a ${AGAR_LIBDIR}/libag_guid.a ${AGAR_LIBDIR}/libag_cored.a")
		else()
			set(AGAR_CONFIG_LIBS "-lag_vg -lag_gui -lag_core")
			set(AGAR_CONFIG_LIBS_STATIC "${AGAR_LIBDIR}/libag_vg.a ${AGAR_LIBDIR}/libag_gui.a ${AGAR_LIBDIR}/libag_core.a")
		endif()
		configure_file(
			"${AGAR_SOURCE_DIR}/mk/cmake-agar-vg-config.in"
			"${AGAR_BINARY_DIR}/agar-vg-config"
			IMMEDIATE @ONLY)
		install(PROGRAMS ${AGAR_BINARY_DIR}/agar-vg-config DESTINATION "${CMAKE_INSTALL_BINDIR}")
	endif()

	unset(propsRelease)
	unset(propsDebug)

	install(FILES "${AGAR_SOURCE_DIR}/mk/agar.m4" DESTINATION "${CMAKE_INSTALL_DATAROOTDIR}/aclocal")
endif()

#
# Install: Data Files and Fonts.
#
if(AGAR_GUI)
	set(AGAR_DATA_FILES
		${AGAR_SOURCE_DIR}/gui/style.css
		${AGAR_SOURCE_DIR}/gui/license.txt)

	set(AGAR_FONT_FILES
		${AGAR_SOURCE_DIR}/gui/fonts/OFL11.txt
		${AGAR_SOURCE_DIR}/gui/fonts/OFL-FAQ.txt
		${AGAR_SOURCE_DIR}/gui/fonts/Charter-LICENSE.txt
		${AGAR_SOURCE_DIR}/gui/fonts/Vera-Copyright.txt
		${AGAR_SOURCE_DIR}/gui/fonts/League-Gothic-LICENSE.md
		${AGAR_SOURCE_DIR}/gui/fonts/League-Spartan-LICENSE.md
		${AGAR_SOURCE_DIR}/gui/fonts/Mukta-OFL.txt
		${AGAR_SOURCE_DIR}/gui/fonts/agar-minimal.agbf
		${AGAR_SOURCE_DIR}/gui/fonts/agar-minimal-12.png
		${AGAR_SOURCE_DIR}/gui/fonts/agar-ideograms.agbf
		${AGAR_SOURCE_DIR}/gui/fonts/agar-ideograms-12.png
		${AGAR_SOURCE_DIR}/gui/fonts/agar-ideograms-14.png
		${AGAR_SOURCE_DIR}/gui/fonts/agar-ideograms-16.png
		${AGAR_SOURCE_DIR}/gui/fonts/algue.ttf
		${AGAR_SOURCE_DIR}/gui/fonts/algue-bold.ttf
		${AGAR_SOURCE_DIR}/gui/fonts/algue-italic.ttf
		${AGAR_SOURCE_DIR}/gui/fonts/algue-bold-italic.ttf
		${AGAR_SOURCE_DIR}/gui/fonts/charter-bold-italic.otf
		${AGAR_SOURCE_DIR}/gui/fonts/charter-bold.otf
		${AGAR_SOURCE_DIR}/gui/fonts/charter-italic.otf
		${AGAR_SOURCE_DIR}/gui/fonts/charter.otf
		${AGAR_SOURCE_DIR}/gui/fonts/fira-sans-bold-italic.otf
		${AGAR_SOURCE_DIR}/gui/fonts/fira-sans-bold.otf
		${AGAR_SOURCE_DIR}/gui/fonts/fira-sans-condensed-bold-italic.otf
		${AGAR_SOURCE_DIR}/gui/fonts/fira-sans-condensed-bold.otf
		${AGAR_SOURCE_DIR}/gui/fonts/fira-sans-condensed-italic.otf
		${AGAR_SOURCE_DIR}/gui/fonts/fira-sans-condensed-light-italic.otf
		${AGAR_SOURCE_DIR}/gui/fonts/fira-sans-condensed-light.otf
		${AGAR_SOURCE_DIR}/gui/fonts/fira-sans-condensed.otf
		${AGAR_SOURCE_DIR}/gui/fonts/fira-sans-italic.otf
		${AGAR_SOURCE_DIR}/gui/fonts/fira-sans-light-italic.otf
		${AGAR_SOURCE_DIR}/gui/fonts/fira-sans-light.otf
		${AGAR_SOURCE_DIR}/gui/fonts/fira-sans.otf
		${AGAR_SOURCE_DIR}/gui/fonts/fraktur-LICENSE.txt
		${AGAR_SOURCE_DIR}/gui/fonts/fraktur.ttf
		${AGAR_SOURCE_DIR}/gui/fonts/league-gothic.otf
		${AGAR_SOURCE_DIR}/gui/fonts/league-gothic-italic.otf
		${AGAR_SOURCE_DIR}/gui/fonts/league-gothic-condensed.otf
		${AGAR_SOURCE_DIR}/gui/fonts/league-gothic-condensed-italic.otf
		${AGAR_SOURCE_DIR}/gui/fonts/league-spartan.otf
		${AGAR_SOURCE_DIR}/gui/fonts/league-spartan-black.otf
		${AGAR_SOURCE_DIR}/gui/fonts/league-spartan-bold.otf
		${AGAR_SOURCE_DIR}/gui/fonts/league-spartan-extrabold.otf
		${AGAR_SOURCE_DIR}/gui/fonts/league-spartan-extralight.otf
		${AGAR_SOURCE_DIR}/gui/fonts/league-spartan-light.otf
		${AGAR_SOURCE_DIR}/gui/fonts/league-spartan-semibold.otf
		${AGAR_SOURCE_DIR}/gui/fonts/monoalgue.ttf
		${AGAR_SOURCE_DIR}/gui/fonts/monoalgue-bold.ttf
		${AGAR_SOURCE_DIR}/gui/fonts/monoalgue-italic.ttf
		${AGAR_SOURCE_DIR}/gui/fonts/monoalgue-bold-italic.ttf
		${AGAR_SOURCE_DIR}/gui/fonts/unialgue.ttf)
	
	install(FILES ${AGAR_FONT_FILES} DESTINATION ${AGAR_TTFDIR})
	install(FILES ${AGAR_DATA_FILES} DESTINATION ${AGAR_DATADIR})
endif()

#
# Install: Manual Pages.
#
file(GLOB AGAR_CORE_MAN3 ${AGAR_SOURCE_DIR}/core/*.3)
install(FILES ${AGAR_CORE_MAN3} DESTINATION "${CMAKE_INSTALL_MANDIR}/man3")

if(AGAR_GUI)
	file(GLOB AGAR_GUI_MAN3 ${AGAR_SOURCE_DIR}/gui/*.3)
	install(FILES ${AGAR_GUI_MAN3} DESTINATION "${CMAKE_INSTALL_MANDIR}/man3")
endif()
if(AGAR_AU)
	file(GLOB AGAR_AU_MAN3 ${AGAR_SOURCE_DIR}/au/*.3)
	install(FILES ${AGAR_AU_MAN3} DESTINATION "${CMAKE_INSTALL_MANDIR}/man3")
endif()
if(AGAR_MAP)
	file(GLOB AGAR_MAP_MAN3 ${AGAR_SOURCE_DIR}/map/*.3)
	install(FILES ${AGAR_MAP_MAN3} DESTINATION "${CMAKE_INSTALL_MANDIR}/man3")
endif()
if(AGAR_MATH)
	file(GLOB AGAR_MATH_MAN3 ${AGAR_SOURCE_DIR}/math/*.3)
	install(FILES ${AGAR_MATH_MAN3} DESTINATION "${CMAKE_INSTALL_MANDIR}/man3")
endif()
if(AGAR_NET)
	file(GLOB AGAR_NET_MAN3 ${AGAR_SOURCE_DIR}/net/*.3)
	install(FILES ${AGAR_NET_MAN3} DESTINATION "${CMAKE_INSTALL_MANDIR}/man3")
endif()
if(AGAR_SG)
	file(GLOB AGAR_SG_MAN3 ${AGAR_SOURCE_DIR}/sg/*.3)
	install(FILES ${AGAR_SG_MAN3} DESTINATION "${CMAKE_INSTALL_MANDIR}/man3")
endif()
if(AGAR_SK)
	file(GLOB AGAR_SK_MAN3 ${AGAR_SOURCE_DIR}/sk/*.3)
	install(FILES ${AGAR_SK_MAN3} DESTINATION "${CMAKE_INSTALL_MANDIR}/man3")
endif()
if(AGAR_VG)
	file(GLOB AGAR_VG_MAN3 ${AGAR_SOURCE_DIR}/vg/*.3)
	install(FILES ${AGAR_VG_MAN3} DESTINATION "${CMAKE_INSTALL_MANDIR}/man3")
endif()

#
# Uninstall Target.
#
if(NOT TARGET uninstall)
	configure_file(
		"${AGAR_SOURCE_DIR}/mk/cmake_uninstall.cmake.in"
		"${AGAR_BINARY_DIR}/cmake_uninstall.cmake"
		IMMEDIATE @ONLY)

	add_custom_target(uninstall
		COMMAND ${CMAKE_COMMAND} -P ${AGAR_BINARY_DIR}/cmake_uninstall.cmake)
endif()
