
#
# This is the CMakeLists.txt file for the StreamRuntime application
#

# ========== Minimum cmake version required ==========
CMAKE_MINIMUM_REQUIRED(VERSION 3.13)

IF("${PATH_COMMON}" STREQUAL "")
  SET(PATH_COMMON "${CMAKE_CURRENT_SOURCE_DIR}/../CMake" CACHE PATH "CMake common files directory path")
ENDIF("${PATH_COMMON}" STREQUAL "")

IF(NOT EXISTS "${PATH_COMMON}/Common_settings.cmake")
  MESSAGE(FATAL_ERROR "Please set PATH_COMMON to the CMake-folder")
ENDIF(NOT EXISTS "${PATH_COMMON}/Common_settings.cmake")

SET(STREAMRUNTIME_APPNAME "SR_TiltMazeDemo")

# ========== Setup configurations ==========
INCLUDE("${PATH_COMMON}/Common_settings.cmake")

# check if paths are set correctly 
INCLUDE("${PATH_COMMON}/CheckPaths.cmake")

# sets into parent_scope if any (gets rid of additional variable for appname)
get_directory_property(hasParent PARENT_DIRECTORY)
IF(hasParent)
  SET(STREAMRUNTIME_APPNAME ${STREAMRUNTIME_APPNAME} PARENT_SCOPE)
ENDIF(hasParent)

# ========== Set project name and version number ==========
PROJECT(${STREAMRUNTIME_APPNAME} VERSION ${GLOBAL_VERSION})

# run for correct platform-architecture
INCLUDE("${PATH_COMMON}/CheckArchitecture.cmake")

# Configuration for SDK Package
IF(EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/CPackPackages.cmake")
  # Only add SDK settings if cmake sdk packages file exists
  SET(SDK_PACKAGE_GENERATOR CACHE BOOL "Generate Guiliani SDK Install Packages")
  SET(SDK_PACKAGE_INCLUDE_HOST CACHE BOOL "Include Host-System-Packages")
ENDIF(EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/CPackPackages.cmake")

SET(STREAMRUNTIME_SDK_PROJECT CACHE BOOL "Generate SDK project? (Activate this if you are using Guiliani as a library)")
IF(NOT EXISTS "${PATH_GUILIANI}/Source")
  SET(STREAMRUNTIME_SDK_PROJECT 1 CACHE BOOL "Generate SDK project? (Activate this if you are using Guiliani as a library)" FORCE)
ENDIF(NOT EXISTS "${PATH_GUILIANI}/Source")

IF(GSE_SDK_PROJECT)
  SET(STREAMRUNTIME_SDK_PROJECT 1 CACHE BOOL "Generate SDK project? (Activate this if you are using Guiliani as a library)" FORCE)
ENDIF(GSE_SDK_PROJECT)

IF(STREAMRUNTIME_SDK_PROJECT)
  SET(GSE_PROJECT 1)  #means do not include Guiliani and eGaC project!
ENDIF(STREAMRUNTIME_SDK_PROJECT)

IF(NOT STREAMRUNTIME_SDK_PROJECT)
  IF(CMAKE_CONFIGURATION_TYPES)
    LIST(APPEND CMAKE_CONFIGURATION_TYPES DebugFixpoint ReleaseFixpoint)
    LIST(REMOVE_DUPLICATES CMAKE_CONFIGURATION_TYPES)
    SET(CMAKE_CONFIGURATION_TYPES "${CMAKE_CONFIGURATION_TYPES}" CACHE STRING "Reset the configurations to what we need" FORCE)
  ENDIF(CMAKE_CONFIGURATION_TYPES)
ENDIF(NOT STREAMRUNTIME_SDK_PROJECT)

SET(GUILIANI_GUICONFIG_CPP "${PATH_GUILIANI}/Share/GUIConfig.cpp")
SOURCE_GROUP("GUIConfig" FILES ${GUILIANI_GUICONFIG_CPP})

# ========== StreamRuntime Source files ==========
FILE(GLOB SR_SOURCE_CPP 
    "${PROJECT_SOURCE_DIR}/Source/*.cpp")
SOURCE_GROUP("Source Files" FILES ${SR_SOURCE_CPP})

FILE(GLOB SR_SOURCE_COMMON_CPP
    "${PROJECT_SOURCE_DIR}/Common/Source/*.cpp")
SOURCE_GROUP("Source Files\\Common" FILES ${SR_SOURCE_COMMON_CPP})

FILE(GLOB SR_SOURCE_H 
    "${PROJECT_SOURCE_DIR}/Include/*.h")
SOURCE_GROUP("Header Files" FILES ${SR_SOURCE_H})

FILE(GLOB SR_SOURCE_COMMON_H
    "${PROJECT_SOURCE_DIR}/Common/Include/*.h")
SOURCE_GROUP("Header Files\\Common" FILES ${SR_SOURCE_COMMON_H})

FILE(GLOB SR_GUICONFIG_SOURCE_H "${PROJECT_SOURCE_DIR}/Include/GUIConfig/*.h")
SOURCE_GROUP("Header Files\\GUIConfig" FILES ${SR_GUICONFIG_SOURCE_H})

FILE(GLOB CUSTOM_EXTENSION_H "${PROJECT_SOURCE_DIR}/Include/CustomExtension/*.h")
SOURCE_GROUP("Header Files\\Custom Extension" FILES ${CUSTOM_EXTENSION_H})
FILE(GLOB COMMON_CUSTOM_EXTENSION_H "${PROJECT_SOURCE_DIR}/Common/Include/CustomExtension/*.h")
SOURCE_GROUP("Header Files\\Custom Extension\\Common" FILES ${COMMON_CUSTOM_EXTENSION_H})

FILE(GLOB CUSTOM_EXTENSION_CPP "${PROJECT_SOURCE_DIR}/Source/CustomExtension/*.cpp")
SOURCE_GROUP("Source Files\\Custom Extension" FILES ${CUSTOM_EXTENSION_CPP})
FILE(GLOB COMMON_CUSTOM_EXTENSION_CPP "${PROJECT_SOURCE_DIR}/Common/Source/CustomExtension/*.cpp")
SOURCE_GROUP("Source Files\\Custom Extension\\Common" FILES ${COMMON_CUSTOM_EXTENSION_CPP})

# ========== Create complete list of files for GSE binary ==========
SET(SR_SOURCES_LIST
  ${SR_SOURCE_CPP}
  ${SR_SOURCE_COMMON_CPP}
  ${SR_SOURCE_H}
  ${SR_SOURCE_COMMON_H}
  ${SR_GUICONFIG_SOURCE_H}
  ${GUILIANI_GUICONFIG_CPP}
  ${COMMON_CUSTOM_EXTENSION_CPP}
  ${COMMON_CUSTOM_EXTENSION_H}
  ${CUSTOM_EXTENSION_CPP}
  ${CUSTOM_EXTENSION_H}
)

# ========== Build StreamRuntime binary ==========
ADD_EXECUTABLE(${PROJECT_NAME} ${ADD_EXECUTABLE_PARAMETERS} ${SR_SOURCES_LIST})

# ========== Include correct platform file ==========
INCLUDE("${PATH_COMMON}/Platform.cmake")

# ========== Set wrapper definitions ==========
INCLUDE("CMake/GfxEnv.cmake")

# ========== Set include directories ==========
INCLUDE("${PATH_COMMON}/Include_directories.cmake")

# ========== Output some information ==========
INCLUDE("${PATH_COMMON}/Build_information.cmake")

TARGET_SOURCES(${PROJECT_NAME} 
  PRIVATE ${PLATFORM_FILES}
)

TARGET_INCLUDE_DIRECTORIES(${PROJECT_NAME}
  PRIVATE "${PATH_GUILIANI}/Include/CustomExtension"
  PRIVATE "${PROJECT_SOURCE_DIR}/Include"
  PRIVATE "${PROJECT_SOURCE_DIR}/Include/CustomExtension"
  PRIVATE "${PROJECT_SOURCE_DIR}/Include/GUIConfig"
  PRIVATE "${PROJECT_SOURCE_DIR}/Common/Include"
  PRIVATE "${PROJECT_SOURCE_DIR}/Common/Include/CustomExtension"
)

IF(NOT GSE_PROJECT)
  INCLUDE("${PATH_COMMON}/AddSources.cmake")

  IF("${SDK_PACKAGE_TYPE}" STREQUAL "SDK")
    # documentation
    IF(EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/../Documentation/CPackPackages.cmake")
      INCLUDE(${CMAKE_CURRENT_SOURCE_DIR}/../Documentation/CPackPackages.cmake)
    ENDIF(EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/../Documentation/CPackPackages.cmake")

    # add common to package
    IF(EXISTS "${PATH_COMMON}/CPackPackages.cmake")
      INCLUDE (${PATH_COMMON}/CPackPackages.cmake)
    ENDIF(EXISTS "${PATH_COMMON}/CPackPackages.cmake")

    # add Libs to package
    IF(EXISTS "${PATH_LIBS}/CPackPackages.cmake")
      INCLUDE (${PATH_LIBS}/CPackPackages.cmake)
    ENDIF(EXISTS "${PATH_LIBS}/CPackPackages.cmake")
  ENDIF()
  
  # add own package-file
  IF(EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/CPackConfiguration.cmake")
    INCLUDE(${CMAKE_CURRENT_SOURCE_DIR}/CPackConfiguration.cmake)
  ENDIF(EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/CPackConfiguration.cmake")

  IF(EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/CPackAdditionalPackages.cmake")
    INCLUDE(${CMAKE_CURRENT_SOURCE_DIR}/CPackAdditionalPackages.cmake)
  ENDIF(EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/CPackAdditionalPackages.cmake")
ENDIF(NOT GSE_PROJECT)

INCLUDE("${PATH_COMMON}/AddLibs.cmake")

# ========== Link the executable to the needed libraries ==========
TARGET_LINK_LIBRARIES(${PROJECT_NAME}
  Guiliani
  eGaC
  ${PLATFORM_LIBS}
)

# ========== Set output directories ==========
IF(MSVC_IDE)
  SET_TARGET_PROPERTIES(${PROJECT_NAME} PROPERTIES RUNTIME_OUTPUT_DIRECTORY_DEBUG "${PROJECT_SOURCE_DIR}/Binary/${CMAKE_SYSTEM_NAME}/${CMAKE_CXX_COMPILER_ID}/Debug")
  SET_TARGET_PROPERTIES(${PROJECT_NAME} PROPERTIES RUNTIME_OUTPUT_DIRECTORY_RELEASE "${PROJECT_SOURCE_DIR}/Binary/${CMAKE_SYSTEM_NAME}/${CMAKE_CXX_COMPILER_ID}/Release")
  SET_TARGET_PROPERTIES(${PROJECT_NAME} PROPERTIES RUNTIME_OUTPUT_DIRECTORY_DEBUGFIXPOINT "${PROJECT_SOURCE_DIR}/Binary/${CMAKE_SYSTEM_NAME}/${CMAKE_CXX_COMPILER_ID}/DebugFixpoint")
  SET_TARGET_PROPERTIES(${PROJECT_NAME} PROPERTIES RUNTIME_OUTPUT_DIRECTORY_RELEASEFIXPOINT "${PROJECT_SOURCE_DIR}/Binary/${CMAKE_SYSTEM_NAME}/${CMAKE_CXX_COMPILER_ID}/ReleaseFixpoint")
  SET_TARGET_PROPERTIES(${PROJECT_NAME} PROPERTIES RUNTIME_OUTPUT_DIRECTORY_DEBUGEVALUATION "${PROJECT_SOURCE_DIR}/Binary/${CMAKE_SYSTEM_NAME}/${CMAKE_CXX_COMPILER_ID}/DebugEvaluation")
  SET_TARGET_PROPERTIES(${PROJECT_NAME} PROPERTIES RUNTIME_OUTPUT_DIRECTORY_RELEASEEVALUATION "${PROJECT_SOURCE_DIR}/Binary/${CMAKE_SYSTEM_NAME}/${CMAKE_CXX_COMPILER_ID}/ReleaseEvaluation")
  SET_TARGET_PROPERTIES(${PROJECT_NAME} PROPERTIES RUNTIME_OUTPUT_NAME "${PROJECT_NAME}")
ENDIF(MSVC_IDE)

# ========== Set preprocessor defines ==========
SET_TARGET_PROPERTIES(${PROJECT_NAME} PROPERTIES COMPILE_DEFINITIONS "${PREPROCESSOR_DEFINES};${PLATFORM_DEFINES};${STREAMRUNTIME_WRAPPER_DEFINITION};STREAMRUNTIME_APPLICATION;${PLATFORM_DEFINES}")
IF (NOT GSE_PROJECT)
  SET_TARGET_PROPERTIES(Guiliani PROPERTIES COMPILE_DEFINITIONS_DEBUGEVALUATION "GUILIANI_EVALUATION")
  SET_TARGET_PROPERTIES(Guiliani PROPERTIES COMPILE_DEFINITIONS_RELEASEEVALUATION "GUILIANI_EVALUATION")
  IF(WIN32)
    SET_TARGET_PROPERTIES(eGaC PROPERTIES COMPILE_DEFINITIONS_DEBUGEVALUATION "eGML_EVALLIB")
    SET_TARGET_PROPERTIES(eGaC PROPERTIES COMPILE_DEFINITIONS_RELEASEEVALUATION "eGML_EVALLIB")
  ELSE(WIN32)
    SET_TARGET_PROPERTIES(eGaC PROPERTIES COMPILE_DEFINITIONS_DEBUGEVALUATION "eGML_EVALLIB2")
    SET_TARGET_PROPERTIES(eGaC PROPERTIES COMPILE_DEFINITIONS_RELEASEEVALUATION "eGML_EVALLIB2")
  ENDIF(WIN32)
ENDIF(NOT GSE_PROJECT)

SET_TARGET_PROPERTIES(${PROJECT_NAME} PROPERTIES COMPILE_DEFINITIONS_DEBUGFIXPOINT "eC_FIXPOINT")
SET_TARGET_PROPERTIES(${PROJECT_NAME} PROPERTIES COMPILE_DEFINITIONS_RELEASEFIXPOINT "eC_FIXPOINT")

IF(SDK_PACKAGE_GENERATOR AND EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/CPackPackages.cmake")
  INCLUDE(${CMAKE_CURRENT_SOURCE_DIR}/CPackPackages.cmake)
ENDIF(SDK_PACKAGE_GENERATOR AND EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/CPackPackages.cmake")
