 
#
# This is the CMakeLists.txt file for the eGaC library
#

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

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

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

# ========== Some cache variables ==========
SET(EGAC_BUILD_EGML 1 CACHE BOOL "eC only?")
SET(EGAC_BUILD_IMAGELIBS 0 CACHE BOOL "Include imagelibs in binary?")
SET(EGML_NEON_OPTIMIZATION 0 CACHE BOOL "Activate neon-blits in eGML?")
SET(EGML_BUILD_NEONLOOPS 0 CACHE BOOL "Include neonloops as source in binary?")
SET(EGML_BUILD_NEONLOOPS_BENCHMARK 0 CACHE BOOL "Include neonloops benchmark as source in binary?")

SET(EGAC_STRING_FORMAT "UTF16" CACHE STRING "use which unicode?")
set_property(CACHE EGAC_STRING_FORMAT PROPERTY STRINGS UTF16 UTF8)

IF("${EGAC_STRING_FORMAT}" STREQUAL "UTF16")
  SET(EC_STRING_FORMAT_PREPROCESSOR "EC_STRING_FORMAT_UTF16")
ELSEIF("${EGAC_STRING_FORMAT}" STREQUAL "UTF8")
  SET(EC_STRING_FORMAT_PREPROCESSOR "EC_STRING_FORMAT_UTF8")
ENDIF("${EGAC_STRING_FORMAT}" STREQUAL "UTF16")

# 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")
ENDIF(EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/CPackPackages.cmake")

# ========== Set project name and version number ==========
PROJECT(eGaC VERSION "1.60.0")

# ========== Core files ==========
FILE(GLOB EC_CPP   "${PROJECT_SOURCE_DIR}/comps/eC/code/*.cpp")
FILE(GLOB EC_H     "${PROJECT_SOURCE_DIR}/comps/eC/code/*.h")
FILE(GLOB EDBG_CPP "${PROJECT_SOURCE_DIR}/comps/eDBG/code/*.cpp")
FILE(GLOB EDBG_H   "${PROJECT_SOURCE_DIR}/comps/eDBG/code/*.h")
FILE(GLOB EGML_CPP "${PROJECT_SOURCE_DIR}/comps/eGML/code/*.cpp")
FILE(GLOB EGML_H   "${PROJECT_SOURCE_DIR}/comps/eGML/code/*.h")
FILE(GLOB EIMG_CPP
  "${PROJECT_SOURCE_DIR}/comps/eImg/code/*.cpp"
  "${PROJECT_SOURCE_DIR}/comps/eImg/code/eImg_RLE/*.cpp"
  "${PROJECT_SOURCE_DIR}/comps/eImg/code/eImg_RAW/*.cpp"
  "${PROJECT_SOURCE_DIR}/comps/eImg/code/eImg_Bmp/*.cpp"
  "${PROJECT_SOURCE_DIR}/comps/eImg/code/eImg_BLU/*.cpp"
  "${PROJECT_SOURCE_DIR}/comps/eImg/code/eImg_Gif/*.cpp"
  "${PROJECT_SOURCE_DIR}/comps/eImg/code/eImg_Jpeg/eImg_Jpeg.cpp"
  #"${PROJECT_SOURCE_DIR}/comps/eImg/code/eImg_Jpeg/eImg_JpegSrcMgr.cpp"
  "${PROJECT_SOURCE_DIR}/comps/eImg/code/eImg_Png/*.cpp"
  "${PROJECT_SOURCE_DIR}/comps/eImg/code/eImg_Tga/*.cpp"
)
FILE(GLOB EIMG_H
  "${PROJECT_SOURCE_DIR}/comps/eImg/code/*.h"
  "${PROJECT_SOURCE_DIR}/comps/eImg/code/eImg_RLE/*.h"
  "${PROJECT_SOURCE_DIR}/comps/eImg/code/eImg_RAW/*.h"
  "${PROJECT_SOURCE_DIR}/comps/eImg/code/eImg_Bmp/*.h"
  "${PROJECT_SOURCE_DIR}/comps/eImg/code/eImg_BLU/*.h"
  "${PROJECT_SOURCE_DIR}/comps/eImg/code/eImg_Gif/*.h"
  "${PROJECT_SOURCE_DIR}/comps/eImg/code/eImg_Jpeg/eImg_Jpeg.h"
  "${PROJECT_SOURCE_DIR}/comps/eImg/code/eImg_Png/*.h"
  "${PROJECT_SOURCE_DIR}/comps/eImg/code/eImg_Tga/*.h"
)

IF(EGAC_BUILD_IMAGELIBS)
  FILE(GLOB IMAGELIBS_CPP 
    "${PROJECT_SOURCE_DIR}/intfs/ImageLibs/Gif/*.c"
    "${PROJECT_SOURCE_DIR}/intfs/ImageLibs/Jpeg/*.c"
    "${PROJECT_SOURCE_DIR}/intfs/ImageLibs/Jpeg/decompression/*.c"
    "${PROJECT_SOURCE_DIR}/intfs/ImageLibs/png/*.c"
    "${PROJECT_SOURCE_DIR}/intfs/ImageLibs/zlib/*.c"
  )
  FILE(GLOB IMAGELIBS_H 
    "${PROJECT_SOURCE_DIR}/intfs/ImageLibs/Gif/*.h"
    "${PROJECT_SOURCE_DIR}/intfs/ImageLibs/Jpeg/*.h"
    "${PROJECT_SOURCE_DIR}/intfs/ImageLibs/Jpeg/decompression/*.h"
    "${PROJECT_SOURCE_DIR}/intfs/ImageLibs/png/*.h"
    "${PROJECT_SOURCE_DIR}/intfs/ImageLibs/zlib/*.h"
  )
ENDIF(EGAC_BUILD_IMAGELIBS)

IF(EGML_BUILD_NEONLOOPS)
  FILE(GLOB NEONLOOP_LIB_CPP
    "${PROJECT_SOURCE_DIR}/comps/eGML/code/eGML_NEON/log_stdout.c"
    "${PROJECT_SOURCE_DIR}/comps/eGML/code/eGML_NEON/loops_stdlib.c"
    "${PROJECT_SOURCE_DIR}/comps/eGML/code/eGML_NEON/neonloops.c"
    "${PROJECT_SOURCE_DIR}/comps/eGML/code/eGML_NEON/NEON_code/import.c"
    "${PROJECT_SOURCE_DIR}/comps/eGML/code/eGML_NEON/NEON_code/loops_stdlib.c"
    "${PROJECT_SOURCE_DIR}/comps/eGML/code/eGML_NEON/NEON_code/neonloops.c"
  )

  # IAR-assembler does not compile fxn.S
  IF(CMAKE_ASM_COMPILER_ID STREQUAL "IAR")
    FILE(GLOB NEONLOOP_LIB_ASM 
      "${PROJECT_SOURCE_DIR}/comps/eGML/code/eGML_NEON/NEON_code/fxn_iar.S"
    )
  ELSE(CMAKE_ASM_COMPILER_ID STREQUAL "IAR")
    FILE(GLOB NEONLOOP_LIB_ASM 
      "${PROJECT_SOURCE_DIR}/comps/eGML/code/eGML_NEON/NEON_code/fxn.S"
    )
  ENDIF(CMAKE_ASM_COMPILER_ID STREQUAL "IAR")
  
  FILE(GLOB NEONLOOP_LIB_H 
    "${PROJECT_SOURCE_DIR}/comps/eGML/code/eGML_NEON/*.h"
  )
  IF(EGML_BUILD_NEONLOOPS_BENCHMARK)
    FILE(GLOB NEONLOOP_BENCHMARK_LIB_CPP 
       "${PROJECT_SOURCE_DIR}/comps/eGML/code/eGML_NEON/Benchmark/*.c"
       "${PROJECT_SOURCE_DIR}/comps/eGML/code/eGML_NEON/Benchmark/*.cpp"
       "${PROJECT_SOURCE_DIR}/comps/eGML/code/eGML_NEON/Benchmark/easy_crc/*.c"
    )
    FILE(GLOB NEONLOOP_BENCHMARK_LIB_H 
       "${PROJECT_SOURCE_DIR}/comps/eGML/code/eGML_NEON/Benchmark/*.h"
       "${PROJECT_SOURCE_DIR}/comps/eGML/code/eGML_NEON/Benchmark/easy_crc/*.h"
    )
  ENDIF(EGML_BUILD_NEONLOOPS_BENCHMARK)
ENDIF(EGML_BUILD_NEONLOOPS)
     
# === create source groups, headers mixed with cpp/c files ===
SOURCE_GROUP("eC" FILES ${EC_CPP} ${EC_H})
SOURCE_GROUP("eDBG" FILES ${EDBG_CPP} ${EDBG_H})
SOURCE_GROUP("eGML" FILES ${EGML_CPP} ${EGML_H})
SOURCE_GROUP("eImg" FILES ${EIMG_CPP} ${EIMG_H})
SOURCE_GROUP("eImg\\ImageLibs" FILES ${IMAGELIBS_CPP} ${IMAGELIBS_H})
SOURCE_GROUP("eGML_NEON" FILES ${NEONLOOP_LIB_CPP} ${NEONLOOP_LIB_H})

# ========== Create complete list of files ==========
IF(EGAC_BUILD_EGML)
  SET(SOURCES_LIST 
    ${EC_CPP}
    ${EC_H}
    ${EDBG_CPP}
    ${EDBG_H}
    ${EGML_CPP}
    ${EGML_H}
    ${EIMG_CPP}
    ${EIMG_H}
    ${IMAGELIBS_CPP}
    ${IMAGELIBS_H}
    ${NEONLOOP_LIB_ASM}
    ${NEONLOOP_LIB_CPP}
    ${NEONLOOP_LIB_H}
  )
ELSE(EGAC_BUILD_EGML)
  SET(SOURCES_LIST 
    ${EC_CPP}
    ${EDBG_CPP}
    ${IMAGELIBS_CPP}
    ${IMAGELIBS_H}
  )
ENDIF(EGAC_BUILD_EGML)

# ========== Build eGaC library ==========
ADD_LIBRARY(${PROJECT_NAME} STATIC ${SOURCES_LIST})

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

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

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

TARGET_SOURCES(${PROJECT_NAME} 
  PRIVATE ${EGAC_PLATFORM_FILES}
)
  
TARGET_INCLUDE_DIRECTORIES(${PROJECT_NAME}
  PRIVATE "${PATH_EGAC}/comps/eC/code"
  PRIVATE "${PATH_EGAC}/comps/eDBG/code"
  PRIVATE "${PATH_EGAC}/comps/eImg/code"
  PRIVATE "${PATH_EGAC}/comps/eGML/code"
  PRIVATE "${PATH_EGAC}/comps/eMem/code"
)

# ========== Set include directories ==========
IF(EGAC_BUILD_EGML)
  TARGET_INCLUDE_DIRECTORIES(${PROJECT_NAME}
    PRIVATE "${PATH_EGAC}/comps/eImg/code"
    PRIVATE "${PATH_EGAC}/comps/eGML/code/eGML_NEON"
    PRIVATE "${PATH_EGAC}/comps/eGML/code/eGML_NEON/NEON_code"
  )
    
  IF(EGML_NEON_OPTIMIZATION)
    TARGET_INCLUDE_DIRECTORIES(${PROJECT_NAME}
      PRIVATE "${PATH_EGAC}/comps/eGML/code/eGML_NEON"
    )
  ENDIF(EGML_NEON_OPTIMIZATION)
ENDIF(EGAC_BUILD_EGML)

# ========== Set preprocessor defines ==========
SET_TARGET_PROPERTIES(${PROJECT_NAME} PROPERTIES COMPILE_DEFINITIONS "${PREPROCESSOR_DEFINES};${EC_STRING_FORMAT_PREPROCESSOR};${PLATFORM_DEFINES}")
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)
  INCLUDE(CPackPackages.cmake)
ENDIF(SDK_PACKAGE_GENERATOR)
