cmake_minimum_required(VERSION 2.8)

# on / off for verbose build.
set(CMAKE_VERBOSE_MAKEFILE off)

set(CMAKE_CXX_STANDARD 14)
set(CMAKE_CXX_STANDARD_REQUIRED True)

set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${CMAKE_SOURCE_DIR}/CMake")
include(cotire)

# Project Information.
project(V-Gears)
set(CMAKE_PACKAGE_ICON v-gears.png)
set(VGears_VERSION__MAJOR 0)
set(VGears_VERSION__MINOR 1)
set(VGears_VERSION__PATCH 1)
set(VGears_VERSION ${VGears_VERSION__MAJOR}.${VGears_VERSION__MINOR}.${VGears_VERSION__PATCH})

add_definitions(-DBOOST_BIND_GLOBAL_PLACEHOLDERS)

# Generate version header.
configure_file(${CMAKE_CURRENT_SOURCE_DIR}/src/Version.h.in ${CMAKE_CURRENT_SOURCE_DIR}/src/Version.h) 

if ("${CMAKE_BUILD_TYPE}" STREQUAL "")
    # CMake defaults to leaving CMAKE_BUILD_TYPE empty. This screws up
    # differentiation between debug and release builds.
    set(CMAKE_BUILD_TYPE "Release" CACHE STRING "Choose the type of build, options are: None (CMAKE_CXX_FLAGS or CMAKE_C_FLAGS used) Debug Release RelWithDebInfo MinSizeRel." FORCE)
    message("CMAKE_BUILD_TYPE was empty defaulting to Release")
endif()

message("CMAKE_BUILD_TYPE is ${CMAKE_BUILD_TYPE} CMAKE_BINARY_DIR is ${CMAKE_BINARY_DIR}")

set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY_RELEASE ${CMAKE_BINARY_DIR}/bin)
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY_RELEASE ${CMAKE_BINARY_DIR}/bin)
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY_RELEASE ${CMAKE_BINARY_DIR}/bin)

set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY_DEBUG ${CMAKE_BINARY_DIR}/bin_debug)
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY_DEBUG ${CMAKE_BINARY_DIR}/bin_debug)
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY_DEBUG ${CMAKE_BINARY_DIR}/bin_debug)

# Enable Visual Studio solution "folders".
SET_PROPERTY(GLOBAL PROPERTY USE_FOLDERS ON)

#if (APPLE)
    #set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -m32")
    #set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -m32")
    #set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -m32")
#endif()

set(CMAKE_FRAMEWORK_PATH
    ${CMAKE_FRAMEWORK_PATH}
    ${CMAKE_CURRENT_SOURCE_DIR}/OgreSDK/lib/macosx/Release
    ${CMAKE_CURRENT_SOURCE_DIR}/OgreSDK/lib/macosx/Debug
)

set(OGRE_FRAMEWORK_INCLUDES
    ${CMAKE_CURRENT_SOURCE_DIR}/OgreSDK/include
)

option(VGears_BUILD_PLUGINS "Build the plugins" TRUE)
option(VGears_BUILD_UTILITIES "Build the V-Gears-Installer" TRUE)
option(VGears_BUILD_TESTS "Build the unit tests" FALSE)
option(VGears_MULTITHREADING "Enable multithreading" FALSE)
option(VGears_SOUND "Enable Sound" TRUE)

find_path(OGRE_CMAKE_MODULE_PATH FindOGRE.cmake
    HINTS
    "$ENV{OGRE_HOME}/CMake/"
    "/usr/local/lib/OGRE/cmake"
    "/usr/lib/OGRE/cmake"
    "/usr/share/OGRE/cmake/modules"
    "${CMAKE_CURRENT_SOURCE_DIR}/OgreSDK/CMake"
)
if(OGRE_CMAKE_MODULE_PATH-NOTFOUND)
    message(SEND_ERROR "Failed to find OGRE module path.")
else()
    set(CMAKE_MODULE_PATH "${OGRE_CMAKE_MODULE_PATH};${CMAKE_MODULE_PATH}")
endif()

set(VGears_SOURCE_DIR ${CMAKE_SOURCE_DIR}/src)

message("VGears_SOURCE_DIR ${VGears_SOURCE_DIR}")

set(CMAKE_MODULE_PATH "${OGRE_CMAKE_MODULE_PATH};${CMAKE_MODULE_PATH}")
set(CMAKE_MODULE_PATH 
    "${CMAKE_MODULE_PATH}"
    "${CMAKE_SOURCE_DIR}/CMake"
)

set(CMAKE_DEBUG_POSTFIX "_d")

if(CMAKE_INSTALL_PREFIX_INITIALIZED_TO_DEFAULT)
    set(CMAKE_INSTALL_PREFIX
        "${VGears_SOURCE_DIR}/data" CACHE PATH "V-Gears install prefix" FORCE
    )
endif()

find_package(Qt5Widgets REQUIRED)
find_package(ZLIB REQUIRED)
find_package(OGRE REQUIRED)

# Find Boost
if(NOT OGRE_BUILD_PLATFORM_IPHONE)
    if(WIN32)
        set(Boost_USE_STATIC_LIBS TRUE)
    else()
        # Statically linking boost to a dynamic Ogre build doesn't work on Linux 64bit
        set(Boost_USE_STATIC_LIBS ${OGRE_STATIC})
    endif ()
    if(MINGW)
        # This is probably a bug in CMake: the boost find module tries to look for
        # boost libraries with name libboost_*, but CMake already prefixes library
        # search names with "lib". This is the workaround.
        set(CMAKE_FIND_LIBRARY_PREFIXES ${CMAKE_FIND_LIBRARY_PREFIXES} "")
    endif ()

    set(Boost_ADDITIONAL_VERSIONS "1.55" "1.55.0" "1.53" "1.53.0" "1.52" "1.52.0" "1.51" "1.51.0" "1.50" "1.50.0" "1.49" "1.49.0" "1.48" "1.48.0" "1.47" "1.47.0" "1.46" "1.46.0" "1.45" "1.45.0" "1.44" "1.44.0" "1.42" "1.42.0" "1.41.0" "1.41" "1.40.0" "1.40")
    # Components that need linking (NB does not include header-only components like bind)
    set(OGRE_BOOST_COMPONENTS thread date_time)
    find_package(Boost COMPONENTS ${OGRE_BOOST_COMPONENTS} QUIET)
    if (NOT Boost_FOUND)
        set(Boost_USE_STATIC_LIBS NOT ${Boost_USE_STATIC_LIBS})
        find_package(Boost COMPONENTS ${OGRE_BOOST_COMPONENTS} QUIET)
    endif()

    if(Boost_FOUND AND Boost_VERSION GREATER 104900)
        set(OGRE_BOOST_COMPONENTS thread date_time system chrono)
        find_package(Boost COMPONENTS ${OGRE_BOOST_COMPONENTS} QUIET)
    endif()

    # Set up referencing of Boost
    include_directories(${Boost_INCLUDE_DIR})
    if (NOT APPLE)
        add_definitions(-DBOOST_ALL_NO_LIB)
    endif()

    set(OGRE_LIBRARIES ${OGRE_LIBRARIES} ${Boost_LIBRARIES})

    find_package(Boost COMPONENTS program_options filesystem QUIET)
    set(OGRE_LIBRARIES ${OGRE_LIBRARIES} ${Boost_LIBRARIES})
    set(VGears_LIBRARIES ${OGRE_LIBRARIES})

    if(VGears_SOUND)
        find_package(OpenAL REQUIRED)
        find_package(OggVorbis REQUIRED)
        add_definitions(-DVGears_SOUND)
        set(VGears_LIBRARIES
            ${VGears_LIBRARIES}
            ${OPENAL_LIBRARY}
            ${OGGVORBIS_LIBRARIES}
        )
    endif()

    if(VGears_MULTITHREADING)
        # Find Threads
        find_package (Threads REQUIRED)
        set(VGears_LIBRARIES
            ${VGears_LIBRARIES}
            ${CMAKE_THREAD_LIBS_INIT}
        )
    endif()

    if(VGears_BUILD_TESTS)
        #message(STATUS "Looking for boost unit test..")
        find_package(Boost COMPONENTS unit_test_framework REQUIRED)
        set(VGears_TEST_LIBRARIES
            ${OGRE_LIBRARIES}
            ${Boost_LIBRARIES}
        )
        # Enable CTest.
        enable_testing()
        endif()
endif()

set(OGRE_LIBRARIES ${OGRE_LIBRARIES} ${OGRE_Overlay_LIBRARIES})

#find_package(Boost COMPONENTS unit_test_framework REQUIRED)

if (Boost_LIBRARIES STREQUAL "")
    message(SEND_ERROR "Boost_LIBRARIES is not set")
endif()

set(VGears_INCLUDE_DIRS
    ${VGears_INCLUDE_DIRS}
    ${CMAKE_CURRENT_SOURCE_DIR}/src/
    ${OIS_INCLUDE_DIRS}
    ${OGRE_Overlay_INCLUDE_DIRS}
    #${CMAKE_CURRENT_SOURCE_DIR}/lib
    #${CMAKE_CURRENT_BINARY_DIR}/lib/luajit
    #${CMAKE_CURRENT_SOURCE_DIR}/lib/luajit/src
    #${CMAKE_CURRENT_SOURCE_DIR}/lib/luabind
    #${CMAKE_CURRENT_SOURCE_DIR}/lib/luabind/luabind/detail
)

if (MSVC)
    # Build cpp files on all cores, up virtual mem for PCH's as cotire really makes the compiler scream
    SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /MP /Zm193")
    # Shut up about insecure functions, as this is cross platform code we can't use the Win32 specifc functions
    add_definitions( -D_CRT_SECURE_NO_WARNINGS )
endif()

if (UNIX AND $ENV{COVERAGE}==1)
      message("Setting coverage compiler options")
      SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -g -O0") # debug, no optimisation
      SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} --coverage") # enabling coverage
endif()

#Compiler flags
SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fPIC") # Position Independent Code, required if QT is compiled with -reduce-relocations

#TODO: Force DEBUG, no optimizations for now.
SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -g -rdynamic -O0")

add_definitions(-DTIXML_USE_STL)
#add_subdirectory(lib)
add_subdirectory(src)

if(VGears_BUILD_PLUGINS)
    add_subdirectory(PlugIns)
endif()

if(VGears_BUILD_UTILITIES)
    add_subdirectory(src/installer)
endif()

if(VGears_BUILD_TESTS)
    add_subdirectory(test)
endif()

SET(EXECUTABLE_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/output)

# Set generic CPack properties
# DO NOT include on win32 - causes CRT dlls to be included
#INCLUDE(InstallRequiredSystemLibraries)

set(CPACK_PACKAGE_NAME "v-gears")
SET(CPACK_PACKAGE_VERSION ${VGears_VERSION})
SET(CPACK_PACKAGE_DESCRIPTION_SUMMARY "A free implementation of the Final Fantasy VII Engine")
SET(CPACK_PACKAGE_VENDOR "V-Gears team")
# TODO: Need to set these up properly, installing build instructions is a bit strange :)
SET(CPACK_RESOURCE_FILE_LICENSE "${PROJECT_SOURCE_DIR}/COPYING.txt")
#SET(CPACK_RESOURCE_FILE_README "${PROJECT_SOURCE_DIR}/readme.md")

MESSAGE( STATUS "CMAKE_BUILD_TYPE:         " ${CMAKE_BUILD_TYPE} )

INSTALL(FILES "${CMAKE_CURRENT_SOURCE_DIR}/data/field_models_and_animation_metadata.xml" DESTINATION ".")

#OS SPECIFIC
if(WIN32)
    # On Windows generate MSI packages
    SET(CPACK_GENERATOR "WIX")
    SET(CPACK_WIX_TEMPLATE "${CMAKE_CURRENT_SOURCE_DIR}/wix.template.in")
    SET(CPACK_WIX_UPGRADE_GUID 8fbb893f-5622-4f6d-a7f6-c221f7be5d52)
    # TODO: Set MSI banner image, copyright info etc, also include startmenu/desktop shortcuts
    #set the name of the installer default formating is name-version-os
    # If empty assume release
    if ("${CMAKE_BUILD_TYPE}" STREQUAL "" OR "${CMAKE_BUILD_TYPE}" STREQUAL "Release")
        message("RELEASE installer build")
        install(FILES ${PROJECT_SOURCE_DIR}/output/resources.cfg DESTINATION ./)
        install(FILES ${PROJECT_SOURCE_DIR}/output/plugins.cfg DESTINATION ./)
        install(FILES ${OGRE_CMAKE_MODULE_PATH}/../bin/release/OgreMain.dll DESTINATION ./)
        install(FILES ${OGRE_CMAKE_MODULE_PATH}/../bin/release/RenderSystem_GL.dll DESTINATION ./)
        install(FILES ${OGRE_CMAKE_MODULE_PATH}/../bin/release/OGREOVERLAY.DLL DESTINATION ./)
        install(FILES ${OGRE_CMAKE_MODULE_PATH}/../bin/release/OIS.DLL DESTINATION ./)
        install(FILES ${QT_PLUGINS_DIR}/../bin/QtCore4.dll DESTINATION ./)
        install(FILES ${QT_PLUGINS_DIR}/../bin/QtGui4.dll DESTINATION ./)
    else()
        message("DEBUG installer build")
        install(FILES ${PROJECT_SOURCE_DIR}/output/resources_d.cfg DESTINATION ./)
        install(FILES ${PROJECT_SOURCE_DIR}/output/plugins_d.cfg DESTINATION ./)
        install(FILES ${OGRE_CMAKE_MODULE_PATH}/../bin/debug/OgreMain_d.dll DESTINATION ./)
        install(FILES ${OGRE_CMAKE_MODULE_PATH}/../bin/debug/RenderSystem_GL_d.dll DESTINATION ./)
        install(FILES ${OGRE_CMAKE_MODULE_PATH}/../bin/debug/OGREOVERLAY_D.DLL DESTINATION ./)
        install(FILES ${OGRE_CMAKE_MODULE_PATH}/../bin/debug/OIS_D.DLL DESTINATION ./)
        install(FILES ${QT_PLUGINS_DIR}/../bin/QtCored4.dll DESTINATION ./)
        install(FILES ${QT_PLUGINS_DIR}/../bin/QtGuid4.dll DESTINATION ./)
    endif()
elseif(APPLE)
    # APPLE is also UNIX, so must check for APPLE before UNIX
    SET(CPACK_GENERATOR "DragNDrop")
    if ("${CMAKE_BUILD_TYPE}" STREQUAL "" OR "${CMAKE_BUILD_TYPE}" STREQUAL "Release")
       set(OSX_BIN_DIR "${CMAKE_BINARY_DIR}/bin_release")
       message("DEBUG installer build, CMAKE_BINARY_DIR=${CMAKE_BINARY_DIR} OSX_BIN_DIR=${OSX_BIN_DIR}")
    else()
       set(OSX_BIN_DIR "${CMAKE_BINARY_DIR}/bin_debug")
       message("RELEASE installer build, CMAKE_BINARY_DIR=${CMAKE_BINARY_DIR} OSX_BIN_DIR=${OSX_BIN_DIR}")
    endif()
    install(FILES ${PROJECT_SOURCE_DIR}/output/resources.cfg DESTINATION ./)
    install(FILES ${PROJECT_SOURCE_DIR}/output/plugins.cfg DESTINATION ./)
    install(FILES ${OSX_BIN_DIR}/Ogre DESTINATION ./)
    install(FILES ${OSX_BIN_DIR}/RenderSystem_GL DESTINATION ./)
    install(FILES ${OSX_BIN_DIR}/OgreOverlay DESTINATION ./)
    install(FILES ${OSX_BIN_DIR}/libboost_thread-mt.dylib DESTINATION ./)
    install(FILES ${OSX_BIN_DIR}/libboost_date_time-mt.dylib DESTINATION ./)
    install(FILES ${OSX_BIN_DIR}/libboost_system-mt.dylib DESTINATION ./)
    install(FILES ${OSX_BIN_DIR}/libboost_atomic-mt.dylib DESTINATION ./)
    install(FILES ${OSX_BIN_DIR}/libboost_chrono-mt.dylib DESTINATION ./)
    install(FILES ${OSX_BIN_DIR}/libboost_program_options-mt.dylib DESTINATION ./)
    install(FILES ${OSX_BIN_DIR}/libboost_filesystem-mt.dylib DESTINATION ./)
    install(FILES ${OSX_BIN_DIR}/libboost_filesystem-mt.dylib DESTINATION ./)
    install(FILES ${OSX_BIN_DIR}/QtCore DESTINATION ./)
    install(FILES ${OSX_BIN_DIR}/QtGui DESTINATION ./)
    install(FILES ${OSX_BIN_DIR}/liblua.dylib DESTINATION ./)
elseif(UNIX)
    # On Linux generate TAR.GZ,DEB and RPM packages
    # Find out what architecture are we running on and set the package architecture 
    
    # Set the generic files needing to be installed
    install(FILES ${PROJECT_SOURCE_DIR}/v-gears.png DESTINATION ./share/pixmaps/ )
    install(FILES ${PROJECT_SOURCE_DIR}/v-gears.desktop DESTINATION ./share/applications/ )
    install(FILES ${PROJECT_SOURCE_DIR}/debian/menu DESTINATION share/menu/ RENAME v-gears )
    install(FILES ${PROJECT_SOURCE_DIR}/output/plugins.cfg_linux DESTINATION share/v-gears/ RENAME plugins.cfg PERMISSIONS OWNER_WRITE OWNER_READ GROUP_READ GROUP_WRITE WORLD_WRITE WORLD_READ)
    install(FILES ${PROJECT_SOURCE_DIR}/output/resources.cfg_linux DESTINATION share/v-gears/ RENAME resources.cfg PERMISSIONS OWNER_WRITE OWNER_READ GROUP_READ GROUP_WRITE WORLD_WRITE WORLD_READ)
    install(FILES ${PROJECT_SOURCE_DIR}/output/v-gears.cfg_linux DESTINATION share/v-gears/ RENAME v-gears.cfg PERMISSIONS OWNER_WRITE OWNER_READ GROUP_READ GROUP_WRITE WORLD_WRITE WORLD_READ)
        
    if(EXISTS "/usr/lib/x86_64-linux-gnu/OGRE/RenderSystem_GL.so.1.12.10")
        install(FILES /usr/lib/x86_64-linux-gnu/OGRE/RenderSystem_GL.so.1.12.10 DESTINATION lib/v-gears/plugins/ )
    elseif(EXISTS "/usr/lib/i386-linux-gnu/OGRE/RenderSystem_GL.so.1.12.10")
        install(FILES /usr/lib/i386-linux-gnu/OGRE/RenderSystem_GL.so.1.12.10 DESTINATION lib/v-gears/plugins/ )
    endif()
        
    SET(CPACK_SOURCE_GENERATOR "TGZ;TZ")
    SET(CPACK_GENERATOR "TGZ")
    # Detect Distro Family DEB , RPM.
    if(EXISTS "/etc/lsb-release")
        set(DistroType DEB)
    elseif(EXISTS "/etc/debian_release")
        set(DistroType DEB)
    elseif(EXISTS "/etc/fedora-release")
        set(DistroType RPM)
    endif()
    message(STATUS "Distro Detected: ${DistroType} ")

    if(DistroType MATCHES "DEB")
        # Setup DEB package properties
        MESSAGE(STATUS "DEB ADDED TO GENERATION LIST")
        SET(CPACK_GENERATOR "${CPACK_GENERATOR};DEB")
    endif()
    if(EXISTS "/usr/bin/rpmbuild")
        MESSAGE(STATUS "RPM ADDED TO GENERATION LIST (RPM IS DISABLED IN CMAKELISTS)")
        # Uncomment to allow for rpm files to be built.   
        # SET(CPACK_GENERATOR "${CPACK_GENERATOR};RPM")
    endif()

    # Setup DEB package properties
    # TODO
    SET(CPACK_DEBIAN_PACKAGE_MAINTAINER "Iñigo Valentin <i@v.com>")
    
    #Set DEBIAN INFO
    SET(CPACK_DEBIAN_PACKAGE_SECTION games)
    SET(CPACK_DEBIAN_PACKAGE_PRIORITY extra)
    #SET(CPACK_PACKAGE_EXECUTABLE )
    EXECUTE_PROCESS(COMMAND dpkg --print-architecture OUTPUT_VARIABLE CPACK_DEBIAN_PACKAGE_ARCHITECTURE OUTPUT_STRIP_TRAILING_WHITESPACE)
    MESSAGE (STATUS "Architecture: ${CPACK_DEBIAN_PACKAGE_ARCHITECTURE}")
    # We should need no longer need postinst since we have added extra install steps to what it would.
    #SET(CPACK_DEBIAN_PACKAGE_CONTROL_EXTRA ${CMAKE_SOURCE_DIR}/debian/postinst )
    # Set the name to be debian package like.
    SET(CPACK_PACKAGE_FILE_NAME "v-gears_${CPACK_PACKAGE_VERSION}-${CPACK_DEBIAN_PACKAGE_ARCHITECTURE}")
    #SET(CPACK_DEBIAN_PACKAGE_DEPENDS "libogre-1.9, libois,libboost-program-options,libboost-filesystem,libvorbis,libopenal,libboost-test,zlib1g")
    SET(CPACK_DEBIAN_PACKAGE_DEPENDS "libogre-1.9.0, libois-1.3.0,libboost-program-options1.54.0,libboost-filesystem1.54.0,libvorbis0a,libvorbisfile3,libvorbisenc2,libopenal1,libboost-test1.54.0,zlib1g,liblua5.1-0")
    #Set RPM info
    SET(CPACK_RPM_PACKAGE_SUMMARY CPACK_PACKAGE_DESCRIPTION_SUMMARY)
    SET(CPACK_RPM_PACKAGE_NAME CPACK_PACKAGE_NAME)
    SET(CPACK_RPM_PACKAGE_VERSION CPACK_PACKAGE_VERSION)
    SET(CPACK_RPM_PACKAGE_RELEASE 1)
    SET(CPACK_RPM_PACKAGE_LICENSE "GPLv3+")
    SET(CPACK_RPM_PACKAGE_GROUP games)
    SET(CPACK_RPM_PACKAGE_VENDOR)
    SET(CPACK_RPM_PACKAGE_DESCRIPTION)
    #REQUIREMENTS NEED TO BE CHECKED USING FEDORA.
    #SET(CPACK_RPM_PACKAGE_REQUIRES "ogre,ois,boost,vorbis,lua,zlib1g")
endif()

INCLUDE(CPack)
#End of install instructions
