Project (Flare)
cmake_minimum_required (VERSION 2.6)

Set (PACKAGE "FLARE")
Set (VERSION "1.12")

set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${CMAKE_SOURCE_DIR}/cmake/")

# can't use add_compile_options here. Seems to have something to do with add_compile_options appending it after the "-O3 -DNDEBUG" flags
if (MINGW AND CMAKE_BUILD_TYPE STREQUAL "Release")
	set(CMAKE_CXX_FLAGS_RELEASE "-Wl,-subsystem,windows ${CMAKE_CXX_FLAGS_RELEASE}")
endif()

# Default definitions
if (MSVC)
	add_definitions(-D_CRT_SECURE_NO_WARNINGS)
	add_definitions(-D_CRT_SECURE_NO_DEPRECATE)
	add_definitions(-D_CRT_NONSTDC_NO_DEPRECATE)
else ()
	add_compile_options(
		-Wall -Wextra -Wunused -Wshadow -Woverloaded-virtual -Wunreachable-code -Wconversion -Wno-sign-conversion -Wformat-security
		-fno-math-errno -fno-exceptions
		-std=c++98
	)
endif ()

add_compile_options(
	"$<$<CONFIG:RELEASE>:-O2>"
	"$<$<CONFIG:RELEASE>:-g0>"

	"$<$<CONFIG:RELWITHDEBINFO>:-O2>"
	"$<$<CONFIG:RELWITHDEBINFO>:-g>"

	"$<$<CONFIG:MINSIZEREL>:-Os>"
	"$<$<CONFIG:MINSIZEREL>:-g0>"

	"$<$<CONFIG:DEBUG>:-O0>"
	"$<$<CONFIG:DEBUG>:-g3>"
	"$<$<CONFIG:DEBUG>:-pg>"
)

# Not supported by CMake 3.12!
# Travis uses this version so we have to stick to modifying the strings...
# add_link_options(
# 	"$<$<CONFIG:DEBUG>:-pg>"
# )

if (CMAKE_BUILD_TYPE STREQUAL "Debug")
	set(CMAKE_EXE_LINKER_FLAGS_DEBUG "-pg ${CMAKE_EXE_LINKER_FLAGS_DEBUG}")
	set(CMAKE_SHARED_LINKER_FLAGS_DEBUG "-pg ${CMAKE_SHARED_LINKER_FLAGS_DEBUG}")
	set(CMAKE_MODULE_LINKER_FLAGS_DEBUG "-pg ${CMAKE_MODULE_LINKER_FLAGS_DEBUG}")
endif()

set(BINDIR  "games"             CACHE STRING "Directory from CMAKE_INSTALL_PREFIX where game executable will be installed.")
set(DATADIR "share/games/flare" CACHE STRING "Directory from CMAKE_INSTALL_PREFIX where game data files will be installed.")
set(MANDIR  "share/man"         CACHE STRING "Directory from CMAKE_INSTALL_PREFIX where manual pages will be installed.")

If(NOT IS_ABSOLUTE "${BINDIR}")
	set(FLARE_EXECUTABLE_PATH ${CMAKE_INSTALL_PREFIX}/${BINDIR}/flare)
Else(NOT IS_ABSOLUTE "${BINDIR}")
	set(FLARE_EXECUTABLE_PATH ${BINDIR}/flare)
EndIf(NOT IS_ABSOLUTE "${BINDIR}")

If(NOT IS_ABSOLUTE "${DATADIR}")
	add_definitions(-DDATA_INSTALL_DIR="${CMAKE_INSTALL_PREFIX}/${DATADIR}")
Else(NOT IS_ABSOLUTE "${DATADIR}")
	add_definitions(-DDATA_INSTALL_DIR="${DATADIR}")
EndIf(NOT IS_ABSOLUTE "${DATADIR}")


# desktop file
If(NOT IS_ABSOLUTE "${BINDIR}")
	set(FLARE_EXECUTABLE_PATH ${CMAKE_INSTALL_PREFIX}/${BINDIR}/flare)
Else(NOT IS_ABSOLUTE "${BINDIR}")
	set(FLARE_EXECUTABLE_PATH ${BINDIR}/flare)
EndIf(NOT IS_ABSOLUTE "${BINDIR}")
configure_file("${CMAKE_CURRENT_SOURCE_DIR}/distribution/flare.desktop.in" "${CMAKE_CURRENT_BINARY_DIR}/flare.desktop")


# Detect missing dependencies
# First, search for SDL2 modules

Find_Package(SDL2)
If (NOT SDL2_FOUND)
	Message (FATAL_ERROR "Couldn't find SDL2 development files. On Debian-based systems (such as Ubuntu) you should install the 'libsdl2-dev' package.")
Else (NOT SDL2_FOUND)
	INCLUDE_DIRECTORIES(${SDL2_INCLUDE_DIR})
EndIf (NOT SDL2_FOUND)

Find_Package(SDL2_image)
If (NOT SDL2IMAGE_FOUND)
	Message (FATAL_ERROR "Couldn't find SDL2-image development files. On Debian-based systems (such as Ubuntu) you should install the 'libsdl2-image-dev' package.")
Else (NOT SDL2IMAGE_FOUND)
	INCLUDE_DIRECTORIES(${SDL2IMAGE_INCLUDE_DIR})
EndIf (NOT SDL2IMAGE_FOUND)

Find_Package(SDL2_mixer)
If (NOT SDL2MIXER_FOUND)
	Message (FATAL_ERROR "Couldn't find SDL2-mixer development files. On Debian-based systems (such as Ubuntu) you should install the 'libsdl2-mixer-dev' package.")
Else (NOT SDL2MIXER_FOUND)
	INCLUDE_DIRECTORIES(${SDL2MIXER_INCLUDE_DIR})
EndIf (NOT SDL2MIXER_FOUND)

Find_Package(SDL2_ttf)
If (NOT SDL2TTF_FOUND)
	Message (FATAL_ERROR "Couldn't find SDL2-ttf development files. On Debian-based systems (such as Ubuntu) you should install the 'libsdl2-ttf-dev' package.")
Else (NOT SDL2TTF_FOUND)
	INCLUDE_DIRECTORIES(${SDL2TTF_INCLUDE_DIR})
EndIf (NOT SDL2TTF_FOUND)


# Sources

Set (FLARE_SOURCES
	./src/Animation.cpp
	./src/AnimationMedia.cpp
	./src/AnimationManager.cpp
	./src/AnimationSet.cpp
	./src/AStarContainer.cpp
	./src/AStarNode.cpp
	./src/Avatar.cpp
	./src/Camera.cpp
	./src/CampaignManager.cpp
	./src/CombatText.cpp
	./src/CursorManager.cpp
	./src/DeviceList.cpp
	./src/EffectManager.cpp
	./src/EnemyGroupManager.cpp
	./src/EngineSettings.cpp
	./src/Entity.cpp
	./src/EntityBehavior.cpp
	./src/EntityManager.cpp
	./src/EventManager.cpp
	./src/FileParser.cpp
	./src/FontEngine.cpp
	./src/GameSlotPreview.cpp
	./src/GameState.cpp
	./src/GameStateConfig.cpp
	./src/GameStateCutscene.cpp
	./src/GameStateTitle.cpp
	./src/GameStateLoad.cpp
	./src/GameStatePlay.cpp
	./src/GameStateNew.cpp
	./src/GameSwitcher.cpp
	./src/GetText.cpp
	./src/Hazard.cpp
	./src/HazardManager.cpp
	./src/IconManager.cpp
	./src/InputState.cpp
	./src/ItemManager.cpp
	./src/ItemStorage.cpp
	./src/Loot.cpp
	./src/LootManager.cpp
	./src/Map.cpp
	./src/MapParallax.cpp
	./src/MapCollision.cpp
	./src/MapRenderer.cpp
	./src/Menu.cpp
	./src/MenuActionBar.cpp
	./src/MenuActiveEffects.cpp
	./src/MenuBook.cpp
	./src/MenuCharacter.cpp
	./src/MenuConfig.cpp
	./src/MenuConfirm.cpp
	./src/MenuDevConsole.cpp
	./src/MenuEnemy.cpp
	./src/MenuExit.cpp
	./src/MenuGameOver.cpp
	./src/MenuHUDLog.cpp
	./src/MenuInventory.cpp
	./src/MenuItemStorage.cpp
	./src/MenuLog.cpp
	./src/MenuManager.cpp
	./src/MenuMiniMap.cpp
	./src/MenuMovementType.cpp
	./src/MenuNumPicker.cpp
	./src/MenuPowers.cpp
	./src/MenuStash.cpp
	./src/MenuStatBar.cpp
	./src/MenuTalker.cpp
	./src/MenuTouchControls.cpp
	./src/MenuVendor.cpp
	./src/MessageEngine.cpp
	./src/ModManager.cpp
	./src/NPC.cpp
	./src/NPCManager.cpp
	./src/PowerManager.cpp
	./src/QuestLog.cpp
	./src/RenderDevice.cpp
	./src/SaveLoad.cpp
	./src/SDLInputState.cpp
	./src/SDLSoftwareRenderDevice.cpp
	./src/SDLSoundManager.cpp
	./src/SDLHardwareRenderDevice.cpp
	./src/SDLFontEngine.cpp
	./src/Settings.cpp
	./src/SharedGameResources.cpp
	./src/SharedResources.cpp
	./src/SoundManager.cpp
	./src/StatBlock.cpp
	./src/Stats.cpp
	./src/Subtitles.cpp
	./src/TileSet.cpp
	./src/TooltipData.cpp
	./src/TooltipManager.cpp
	./src/Utils.cpp
	./src/UtilsDebug.cpp
	./src/UtilsFileSystem.cpp
	./src/UtilsParsing.cpp
	./src/Version.cpp
	./src/Widget.cpp
	./src/WidgetCheckBox.cpp
	./src/WidgetButton.cpp
	./src/WidgetHorizontalList.cpp
	./src/WidgetInput.cpp
	./src/WidgetLabel.cpp
	./src/WidgetListBox.cpp
	./src/WidgetLog.cpp
	./src/WidgetScrollBar.cpp
	./src/WidgetScrollBox.cpp
	./src/WidgetSlider.cpp
	./src/WidgetSlot.cpp
	./src/WidgetTabControl.cpp
	./src/WidgetTooltip.cpp
	./src/main.cpp
)

Set (FLARE_HEADERS
	./src/Animation.h
	./src/AnimationMedia.h
	./src/AnimationManager.h
	./src/AnimationSet.h
	./src/AStarContainer.h
	./src/AStarNode.h
	./src/Avatar.h
	./src/Camera.h
	./src/CampaignManager.h
	./src/CombatText.h
	./src/CommonIncludes.h
	./src/CursorManager.h
	./src/DeviceList.h
	./src/EffectManager.h
	./src/EnemyGroupManager.h
	./src/EngineSettings.h
	./src/Entity.h
	./src/EntityBehavior.h
	./src/EntityManager.h
	./src/EventManager.h
	./src/FileParser.h
	./src/FontEngine.h
	./src/GameSlotPreview.h
	./src/GameState.h
	./src/GameStateConfig.h
	./src/GameStateCutscene.h
	./src/GameStateTitle.h
	./src/GameStateLoad.h
	./src/GameStatePlay.h
	./src/GameStateNew.h
	./src/GameSwitcher.h
	./src/GetText.h
	./src/Hazard.h
	./src/HazardManager.h
	./src/IconManager.h
	./src/InputState.h
	./src/ItemManager.h
	./src/ItemStorage.h
	./src/Loot.h
	./src/LootManager.h
	./src/Map.h
	./src/MapParallax.h
	./src/MapCollision.h
	./src/MapRenderer.h
	./src/Menu.h
	./src/MenuActionBar.h
	./src/MenuActiveEffects.h
	./src/MenuBook.h
	./src/MenuCharacter.h
	./src/MenuConfig.h
	./src/MenuConfirm.h
	./src/MenuDevConsole.h
	./src/MenuEnemy.h
	./src/MenuExit.h
	./src/MenuGameOver.h
	./src/MenuHUDLog.h
	./src/MenuInventory.h
	./src/MenuItemStorage.h
	./src/MenuLog.h
	./src/MenuManager.h
	./src/MenuMiniMap.h
	./src/MenuMovementType.h
	./src/MenuNumPicker.h
	./src/MenuPowers.h
	./src/MenuStash.h
	./src/MenuStatBar.h
	./src/MenuTalker.h
	./src/MenuTouchControls.h
	./src/MenuVendor.h
	./src/MessageEngine.h
	./src/ModManager.h
	./src/NPC.h
	./src/NPCManager.h
	./src/PowerManager.h
	./src/QuestLog.h
	./src/RenderDevice.h
	./src/SDLInputState.h
	./src/SDLSoftwareRenderDevice.h
	./src/SDLSoundManager.h
	./src/SDLHardwareRenderDevice.h
	./src/SDLFontEngine.h
	./src/Settings.h
	./src/SharedGameResources.h
	./src/SharedResources.h
	./src/StatBlock.h
	./src/Stats.h
	./src/SoundManager.h
	./src/Subtitles.h
	./src/TileSet.h
	./src/TooltipData.h
	./src/TooltipManager.h
	./src/Utils.h
	./src/UtilsDebug.h
	./src/UtilsFileSystem.h
	./src/UtilsMath.h
	./src/UtilsParsing.h
	./src/Version.h
	./src/Widget.h
	./src/WidgetCheckBox.h
	./src/WidgetButton.h
	./src/WidgetHorizontalList.h
	./src/WidgetInput.h
	./src/WidgetLabel.h
	./src/WidgetListBox.h
	./src/WidgetLog.h
	./src/WidgetScrollBar.h
	./src/WidgetScrollBox.h
	./src/WidgetSlider.h
	./src/WidgetSlot.h
	./src/WidgetTabControl.h
	./src/WidgetTooltip.h
)

# Add icon and file info to executable for Windows systems
IF (WIN32)
	SET(FLARE_SOURCES
	${FLARE_SOURCES}
	./src/Flare.rc
	)
ENDIF (WIN32)

Add_Executable (flare ${FLARE_SOURCES} ${FLARE_HEADERS})

# libSDLMain comes with libSDL if needed on certain platforms
If (NOT SDL2MAIN_LIBRARY)
	Set (SDL2MAIN_LIBRARY "")
EndIf (NOT SDL2MAIN_LIBRARY)

Target_Link_Libraries (flare ${CMAKE_LD_FLAGS} ${SDL2_LIBRARY} ${SDL2IMAGE_LIBRARY} ${SDL2MIXER_LIBRARY} ${SDL2TTF_LIBRARY} ${SDL2MAIN_LIBRARY})


# installing to the proper places
install(PROGRAMS
	${CMAKE_CURRENT_BINARY_DIR}/flare
	DESTINATION ${BINDIR})
install(DIRECTORY
	"${CMAKE_CURRENT_SOURCE_DIR}/mods"
	DESTINATION ${DATADIR})
install(FILES
	"${CMAKE_CURRENT_SOURCE_DIR}/distribution/flare.man"
	DESTINATION ${MANDIR}/man6
	RENAME flare.6)
install(FILES
	"${CMAKE_CURRENT_BINARY_DIR}/flare.desktop"
	DESTINATION ${CMAKE_INSTALL_PREFIX}/share/applications)
install(FILES
	"${CMAKE_CURRENT_SOURCE_DIR}/distribution/flare_logo.svg"
	DESTINATION ${CMAKE_INSTALL_PREFIX}/share/icons/hicolor/scalable/apps
	RENAME flare.svg)
