# Project/Package Information
PROJECT(FreedroidRPG)
SET(PACKAGE freedroidrpg)
SET(PACKAGE_NAME ${PROJECT_NAME})
SET(PACKAGE_VERSION_MAJOR 0)
SET(PACKAGE_VERSION_MINOR 11)
SET(PACKAGE_VERSION_PATCH 1)
SET(PACKAGE_VERSION "${PACKAGE_VERSION_MAJOR}.${PACKAGE_VERSION_MINOR}.${PACKAGE_VERSION_PATCH}")

# Initialize CMake
CMAKE_MINIMUM_REQUIRED(VERSION 2.4.5 FATAL_ERROR)
MARK_AS_ADVANCED(CMAKE_BACKWARDS_COMPATIBILITY)
SET(CMAKE_MODULE_PATH "${CMAKE_SOURCE_DIR}/cmake/modules")
SET(CMAKE_REQUIRED_INCLUDES "/usr/local/include")
MARK_AS_ADVANCED(CLEAR CMAKE_VERBOSE_MAKEFILE)
SET(EXECUTABLE_OUTPUT_PATH "" CACHE INTERNAL "Where to put built executables")
SET(LIBRARY_OUTPUT_PATH "" CACHE INTERNAL "Where to put built libraries")
INCLUDE(CMakeDetermineRCCompiler)
INCLUDE(CheckFunctionExists)
INCLUDE(CheckIncludeFile)

# Ensure out of source build
STRING(COMPARE EQUAL "${CMAKE_SOURCE_DIR}" "${CMAKE_BINARY_DIR}" insource)
IF(insource)
	MESSAGE(SEND_ERROR "---- ${PACKAGE_NAME} requires an out of source build ----")
	MESSAGE("Please create a separate build directory and run cmake from there instead.")
	MESSAGE("NB: The build directory must not be a subdirectory of the source directory unless it is named 'build'")
	MESSAGE(FATAL_ERROR "---- ${PACKAGE_NAME} requires an out of source build ----")
ENDIF(insource)

# User Options
OPTION(ENABLE_OPENGL          "Use OpenGL (recommended)"                                          ON)
OPTION(ENABLE_SOUND           "Enable sound support"                                              ON)
OPTION(ENABLE_NLS             "Enable Native Language Support (for non-english interface)"        ON)
OPTION(ENABLE_TOOLS           "Build and install additional development tools"                    ON)
OPTION(ENABLE_BACKTRACE       "Use backtrace() to generate nice bug reports (recommended)"        ON)
OPTION(ENABLE_EXTRA_WARNINGS  "Generate more warning messages when compiling"                     OFF)
OPTION(ENABLE_FAST_MATH       "Compile with -ffast-math (faster game, but might cause trouble)."  ON)

# Required Packages
FIND_PACKAGE(PNG REQUIRED)
FIND_PACKAGE(JPEG REQUIRED)
FIND_PACKAGE(SDL 1.2.3 REQUIRED)
FIND_PACKAGE(SDL_image REQUIRED)
SET(INCLUDE_DIRS ${PNG_INCLUDE_DIR} ${JPEG_INCLUDE_DIR} ${SDL_INCLUDE_DIR} ${SDLIMAGE_INCLUDE_DIR})
SET(LINK_LIBRARIES ${PNG_LIBRARIES} ${JPEG_LIBRARIES} ${SDL_LIBRARY} ${SDLIMAGE_LIBRARY})
SET(DEBIAN_PACKAGE_DEPENDS "libpng12-0, libjpeg62, libsdl1.2debian, libsdl-image1.2")
SET(WIN32_PACKAGE_DLLS "zlib1.dll" "libpng12-*.dll" "libjpeg-*.dll" "SDL.dll" "SDL_image.dll")

# Required Packages for OpenGL
IF(ENABLE_OPENGL)
	FIND_PACKAGE(OpenGL REQUIRED)
	SET(INCLUDE_DIRS ${INCLUDE_DIRS} ${OPENGL_INCLUDE_DIR})
	SET(LINK_LIBRARIES ${LINK_LIBRARIES} ${OPENGL_LIBRARIES})
	SET(DEBIAN_PACKAGE_DEPENDS "${DEBIAN_PACKAGE_DEPENDS}, libgl1-mesa-glx | libgl1")
ENDIF(ENABLE_OPENGL)

# Required Packages for Sound Support
IF(ENABLE_SOUND)
	FIND_PACKAGE(OggVorbis REQUIRED)
	FIND_PACKAGE(SDL_mixer REQUIRED)
	SET(INCLUDE_DIRS ${INCLUDE_DIRS} ${OGGVORBIS_INCLUDE_DIR} ${SDLMIXER_INCLUDE_DIR})
	SET(LINK_LIBRARIES ${LINK_LIBRARIES} ${OGGVORBIS_LIBRARIES} ${SDLMIXER_LIBRARY})
	SET(DEBIAN_PACKAGE_DEPENDS "${DEBIAN_PACKAGE_DEPENDS}, libogg, libvorbis0a, libsdl-mixer-1.2")
	SET(WIN32_PACKAGE_DLLS ${WIN32_PACKAGE_DLLS} "libogg-*.dll" "libvorbis-*.dll" "SDL_mixer.dll")
ENDIF(ENABLE_SOUND)

# Required Packages for NLS
IF(ENABLE_NLS)
	FIND_PACKAGE(Gettext REQUIRED)
	SET(INCLUDE_DIRS ${INCLUDE_DIRS} ${GETTEXT_INCLUDE_DIR})
	SET(LINK_LIBRARIES ${LINK_LIBRARIES} ${GETTEXT_LIBRARIES})
	SET(WIN32_PACKAGE_DLLS ${WIN32_PACKAGE_DLLS} "libiconv-*.dll" "libintl-*.dll")
ENDIF(ENABLE_NLS)

# Required Packages for the Development Tools
IF(ENABLE_TOOLS)
	SET(QT_MIN_VERSION "4.3.0")
	FIND_PACKAGE(Qt4)
	IF(QT4_FOUND)
		SET(DEBIAN_PACKAGE_DEPENDS "${DEBIAN_PACKAGE_DEPENDS}, libqt4-core, libqt4-gui")
		SET(WIN32_PACKAGE_DLLS ${WIN32_PACKAGE_DLLS} "mingwm10.dll" "QtCore4.dll" "QtGui4.dll")
	ENDIF(QT4_FOUND)
ENDIF(ENABLE_TOOLS)

# System Information
CHECK_FUNCTION_EXISTS(alphasort HAVE_ALPHASORT)
CHECK_FUNCTION_EXISTS(scandir HAVE_SCANDIR)
CHECK_INCLUDE_FILE(dirent.h HAVE_DIRENT_H)
CHECK_INCLUDE_FILE(execinfo.h HAVE_EXECINFO_H)
CHECK_INCLUDE_FILE(fcntl.h HAVE_FCNTL_H)
CHECK_INCLUDE_FILE(locale.h HAVE_LOCALE_H)
CHECK_INCLUDE_FILE(signal.h HAVE_SIGNAL_H)
CHECK_INCLUDE_FILE(stdlib.h HAVE_STDLIB_H)
CHECK_INCLUDE_FILE(strings.h HAVE_STRINGS_H)
CHECK_INCLUDE_FILE(string.h HAVE_STRING_H)
CHECK_INCLUDE_FILE(stdint.h HAVE_STDINT_H)
CHECK_INCLUDE_FILE(sys/ioctl.h HAVE_SYS_IOCTL_H)
CHECK_INCLUDE_FILE(sys/soundcard.h HAVE_SYS_SOUNDCARD_H)
CHECK_INCLUDE_FILE(sys/stat.h HAVE_SYS_STAT_H)
CHECK_INCLUDE_FILE(sys/time.h HAVE_SYS_TIME_H)
CHECK_INCLUDE_FILE(sys/types.h HAVE_SYS_TYPES_H)
CHECK_INCLUDE_FILE(time.h HAVE_TIME_H)
CHECK_INCLUDE_FILE(unistd.h HAVE_UNISTD_H)
CHECK_INCLUDE_FILE(libintl.h HAVE_LIBINTL_H)
CHECK_INCLUDE_FILE(libgen.h HAVE_LIBGEN_H)

# Optional Features
IF(ENABLE_BACKTRACE)
	CHECK_FUNCTION_EXISTS(backtrace HAVE_BACKTRACE)
ENDIF(ENABLE_BACKTRACE)

# Optional Features (Deprecated)
SET(HAVE_LIBGL ${OPENGL_FOUND})
SET(HAVE_LIBSDL_MIXER ${SDLMIXER_FOUND})

# Create config.h
CONFIGURE_FILE(${CMAKE_SOURCE_DIR}/cmake/config.h.in
			   ${CMAKE_BINARY_DIR}/config.h)

# Compilation Profiles and Optimizations
IF(NOT CMAKE_BUILD_TYPE)
	SET(CMAKE_BUILD_TYPE RelWithDebInfo CACHE STRING "Choose the type of build, options are: Profile Debug RelWithDebInfo Release MinSizeRel." FORCE)
ENDIF(NOT CMAKE_BUILD_TYPE)

IF(CMAKE_COMPILER_IS_GNUCC)
	# C compiler is GCC derivative
	SET(CMAKE_C_FLAGS_PROFILE          "-g3 -ggdb -fno-inline -pg -ftest-coverage -fprofile-arcs")
	SET(CMAKE_C_FLAGS_DEBUG            "-g3 -ggdb -fno-inline")
	SET(CMAKE_C_FLAGS_RELWITHDEBINFO   "-O2 -g")
	SET(CMAKE_C_FLAGS_RELEASE          "-O2")
	SET(CMAKE_C_FLAGS_MINSIZEREL       "-Os")

	SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wall")
	IF(ENABLE_EXTRA_WARNINGS)
		SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wextra -Wmissing-prototypes -Wstrict-prototypes -Wshadow -Wpointer-arith -Wcast-qual -Wcast-align -Wwrite-strings -Waggregate-return -Wnested-externs -fno-common")
	ENDIF(ENABLE_EXTRA_WARNINGS)
	IF(ENABLE_FAST_MATH)
		SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -ffast-math")
	ENDIF(ENABLE_FAST_MATH)
ENDIF(CMAKE_COMPILER_IS_GNUCC)
IF(CMAKE_COMPILER_IS_GNUCXX)
	# C++ compiler is G++ derivative
	SET(CMAKE_CXX_FLAGS_PROFILE          "-g3 -ggdb -fno-inline -pg -ftest-coverage -fprofile-arcs")
	SET(CMAKE_CXX_FLAGS_DEBUG            "-g3 -ggdb -fno-inline")
	SET(CMAKE_CXX_FLAGS_RELWITHDEBINFO   "-O2 -g")
	SET(CMAKE_CXX_FLAGS_RELEASE          "-O2")
	SET(CMAKE_CXX_FLAGS_MINSIZEREL       "-Os")
	
	# Compilation flags
	SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall")
	IF(ENABLE_EXTRA_WARNINGS)
		SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wextra -Wmissing-prototypes -Wstrict-prototypes -Wshadow -Wpointer-arith -Wcast-qual -Wcast-align -Wwrite-strings -Waggregate-return -Wnested-externs -fno-common")
	ENDIF(ENABLE_EXTRA_WARNINGS)
	IF(ENABLE_FAST_MATH)
		SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -ffast-math")
	ENDIF(ENABLE_FAST_MATH)
ENDIF(CMAKE_COMPILER_IS_GNUCXX)
# ToDo: Add support for non-gcc compilers

# Platform Specefic Paths
IF(WIN32)
	SET(BINDIR ".")
	SET(LIBDIR ".")
	SET(DATADIR ".")
	ADD_DEFINITIONS(-DFD_DATADIR='"."')
ELSE(WIN32)
	SET(BINDIR "bin")
	SET(LIBDIR "lib")
	SET(DATADIR "share/${PACKAGE}")
	ADD_DEFINITIONS(-DFD_DATADIR='"${CMAKE_INSTALL_PREFIX}/${DATADIR}"')
ENDIF(WIN32)

# Do the subdirectories
ADD_SUBDIRECTORY(win32)
ADD_SUBDIRECTORY(src)
ADD_SUBDIRECTORY(po)
ADD_SUBDIRECTORY(croppy)
ADD_SUBDIRECTORY(gluem)
ADD_SUBDIRECTORY(archetypeeditor)

# Install Datafiles
INSTALL(DIRECTORY dialogs graphics map sound
		DESTINATION "${DATADIR}"
		PATTERN "CVS" EXCLUDE
		PATTERN "*.blend" EXCLUDE
		PATTERN "*.py" EXCLUDE
		PATTERN "*~" EXCLUDE
		PATTERN ".#*" EXCLUDE
	   )

# Install DLLs (Win32 Only)
IF(WIN32)
	IF(CMAKE_CROSSCOMPILING)
		EXEC_PROGRAM(find ARGS ${CMAKE_FIND_ROOT_PATH} -type d -iname 'bin' OUTPUT_VARIABLE BIN_DIRS)
		EXEC_PROGRAM(find ARGS ${CMAKE_FIND_ROOT_PATH} -type d -iname 'lib' OUTPUT_VARIABLE LIB_DIRS)
		STRING(REPLACE "\n" ";" DIRS "${BIN_DIRS};${LIB_DIRS}")
	ENDIF(CMAKE_CROSSCOMPILING)
	SET(DLLS)
	FOREACH(GLOB ${WIN32_PACKAGE_DLLS})
		SET(FILES)
		IF(CMAKE_CROSSCOMPILING)
			FOREACH(DIR ${DIRS})
				FILE(TO_CMAKE_PATH "${DIR}" DIR)
				FILE(GLOB FILE "${DIR}/${GLOB}")
				SET(FILES ${FILES} ${FILE})
			ENDFOREACH(DIR $ENV{PATH} $ENV{LIB})
		ELSE(CMAKE_CROSSCOMPILING)
			FOREACH(DIR $ENV{PATH} $ENV{LIB})
				FILE(TO_CMAKE_PATH "${DIR}" DIR)
				FILE(GLOB FILE "${DIR}/${GLOB}")
				SET(FILES ${FILES} ${FILE})
			ENDFOREACH(DIR $ENV{PATH} $ENV{LIB})
		ENDIF(CMAKE_CROSSCOMPILING)
		LIST(GET FILES 0 DLL)
		IF(EXISTS ${DLL})
			SET(DLLS ${DLLS} ${DLL})
		ENDIF(EXISTS ${DLL})
	ENDFOREACH(GLOB ${GLOBS})
	INSTALL(FILES ${DLLS} DESTINATION ${LIBDIR})
ENDIF(WIN32)

# Set CMAKE_SYSTEM_ARCHITECTURE in addition to CMAKE_SYSTEM_PROCESSOR.
# This realy should be pushed upstream to CMakeDetermineSystem.cmake
IF(NOT CMAKE_SYSTEM_ARCHITECTURE)
	IF(UNIX AND CMAKE_UNAME)
		EXEC_PROGRAM(${CMAKE_UNAME} ARGS -m OUTPUT_VARIABLE CMAKE_SYSTEM_ARCHITECTURE RETURN_VALUE val)
		IF("${val}" GREATER 0)
			SET(CMAKE_SYSTEM_ARCHITECTURE "${CMAKE_SYSTEM_PROCESSOR}")
		ENDIF("${val}" GREATER 0)
		SET(CMAKE_UNAME ${CMAKE_UNAME} CACHE INTERNAL "uname command")
	ELSE(UNIX AND CMAKE_UNAME)
	SET(CMAKE_SYSTEM_ARCHITECTURE "${CMAKE_SYSTEM_PROCESSOR}")
	ENDIF(UNIX AND CMAKE_UNAME)
ENDIF(NOT CMAKE_SYSTEM_ARCHITECTURE)

# Packaging Support
INCLUDE(InstallRequiredSystemLibraries)
SET(CPACK_PACKAGE_NAME ${PACKAGE_NAME})
SET(CPACK_PACKAGE_DESCRIPTION_SUMMARY "${PACKAGE_NAME} is a free isometric RPG game inspired by elements of Diablo and Fallout.")
SET(CPACK_PACKAGE_VENDOR "freedroid.org")
SET(CPACK_PACKAGE_CONTACT "freedroid-discussion@lists.sourceforge.net")
SET(CPACK_PACKAGE_VERSION_MAJOR "${PACKAGE_VERSION_MAJOR}")
SET(CPACK_PACKAGE_VERSION_MINOR "${PACKAGE_VERSION_MINOR}")
SET(CPACK_PACKAGE_VERSION_PATCH "${PACKAGE_VERSION_PATCH}")
SET(CPACK_RESOURCE_FILE_LICENSE "${CMAKE_CURRENT_SOURCE_DIR}/COPYING")
SET(CPACK_PACKAGE_INSTALL_DIRECTORY "${PACKAGE_NAME} ${PACKAGE_VERSION_MAJOR}.${PACKAGE_VERSION_MINOR}")
SET(CPACK_SYSTEM_NAME ${CMAKE_SYSTEM_NAME}-${CMAKE_SYSTEM_ARCHITECTURE})
SET(CPACK_SOURCE_PACKAGE_FILE_NAME "${PACKAGE_NAME}-${PACKAGE_VERSION_MAJOR}.${PACKAGE_VERSION_MINOR}.${PACKAGE_VERSION_PATCH}")
SET(CPACK_PACKAGE_FILE_NAME "${CPACK_SOURCE_PACKAGE_FILE_NAME}-${CPACK_SYSTEM_NAME}")
SET(CPACK_SOURCE_IGNORE_FILES "/build/;/CVS/;.*~;/\\\\.#")
IF(UNIX)
	# All UNIX platforms, including Mac OS X and Cygwin.
	SET(CPACK_GENERATOR TBZ2)
	SET(CPACK_SOURCE_GENERATOR TBZ2)
	IF(APPLE)
		SET(CPACK_GENERATOR PackageMaker)
	ELSEIF(CYGWIN)
		SET(CPACK_GENERATOR CygwinBinary)
		SET(CPACK_SOURCE_GENERATOR TBZ2;CygwinSource)
	ELSEIF(CMAKE_SYSTEM_NAME MATCHES "Linux")
		IF(CMAKE_MAJOR_VERSION GREATER 2 OR CMAKE_MINOR_VERSION GREATER 4)
			SET(DEBIAN_PACKAGE_ARCHITECTURE ${CMAKE_SYSTEM_ARCHITECTURE})
			IF(DEBIAN_PACKAGE_ARCHITECTURE MATCHES "x86_64")
				SET(DEBIAN_PACKAGE_ARCHITECTURE "AMD64")
			ELSEIF(DEBIAN_PACKAGE_ARCHITECTURE MATCHES "i[1-8]86" OR DEBIAN_PACKAGE_ARCHITECTURE MATCHES "x86")
				SET(DEBIAN_PACKAGE_ARCHITECTURE "i386")
			ENDIF(DEBIAN_PACKAGE_ARCHITECTURE MATCHES "x86_64")
			SET(CPACK_GENERATOR TBZ2;DEB)
		ENDIF(CMAKE_MAJOR_VERSION GREATER 2 OR CMAKE_MINOR_VERSION GREATER 4)
	ENDIF(APPLE)
	SET(CPACK_STRIP_FILES "${BINDIR}/freedroidrpg" "${BINDIR}/croppy" "${BINDIR}/gluem")
	SET(CPACK_SOURCE_STRIP_FILES)
ELSE(UNIX)
	# Windows (MSYS and Native)
	IF(CMAKE_MAJOR_VERSION GREATER 2 OR CMAKE_MINOR_VERSION GREATER 4)
		SET(CPACK_SOURCE_GENERATOR ZIP)
		SET(CPACK_GENERATOR ZIP;NSIS)
	ELSE(CMAKE_MAJOR_VERSION GREATER 2 OR CMAKE_MINOR_VERSION GREATER 4)
		SET(CPACK_SOURCE_GENERATOR TBZ2)
		SET(CPACK_GENERATOR TBZ2;NSIS)
	ENDIF(CMAKE_MAJOR_VERSION GREATER 2 OR CMAKE_MINOR_VERSION GREATER 4)
	SET(CPACK_PACKAGE_EXECUTABLES "..\\\\freedroidrpg;${PACKAGE_NAME}")
	IF(ENABLE_TOOLS AND QT4_FOUND)
		SET(CPACK_PACKAGE_EXECUTABLES ${CPACK_PACKAGE_EXECUTABLES} "..\\\\archetypeeditor;${PACKAGE_NAME} Archetype Editor")
	ENDIF(ENABLE_TOOLS AND QT4_FOUND)
	SET(CPACK_NSIS_INSTALLED_ICON_NAME ".\\\\freedroid.exe")
	SET(CPACK_NSIS_DISPLAY_NAME "${PACKAGE_NAME} ${PACKAGE_VERSION}")
	SET(CPACK_NSIS_HELP_LINK "http:\\\\\\\\freedroid.org")
	SET(CPACK_NSIS_URL_INFO_ABOUT "http:\\\\\\\\freedroid.org")
	SET(CPACK_NSIS_CONTACT "${CPACK_PACKAGE_CONTACT}")
	SET(CPACK_NSIS_MODIFY_PATH ON)
ENDIF(UNIX)
INCLUDE(CPack)

# Uninstall support
CONFIGURE_FILE("${CMAKE_CURRENT_SOURCE_DIR}/cmake/cmake_uninstall.cmake.in" "${CMAKE_CURRENT_BINARY_DIR}/cmake_uninstall.cmake" @ONLY)
ADD_CUSTOM_TARGET(uninstall "${CMAKE_COMMAND}" -P "${CMAKE_CURRENT_BINARY_DIR}/cmake_uninstall.cmake")
