##################################################################
# File Descriptor : CMakeLists at root directory
# Author : Lucien Yin
# History :
#          2020-03-18 Create
# Copyright : 2020 Unisoc, Incoporated. All Rights Reserved.
##################################################################
cmake_minimum_required(VERSION 3.13)
set(CLANG_USE_UBUNTU_C_LIB 1)
#
###############################################
# Initialzie Build System
###############################################
#
include(scripts/cmake/top.cmake)

#
###############################################
# Create project
###############################################
#
set(BUILD_SHARED_LIBS OFF)
set(project_version "0.0.1")
project(${PROJECT} VERSION ${project_version})
enable_language(C CXX ASM)

#
###############################################
# Setup Output image file
###############################################
#
set(CP_TARGET_ELF   ${PROJECT}.elf)
set(CP_TARGET_BIN   ${PROJECT}.bin)
set(CP_TARGET_HEX   ${PROJECT}.hex)
set(CP_TARGET_LST   ${PROJECT}.lst)
set(CP_TARGET_DIS   ${PROJECT}.dis)
set(CP_TARGET_SYM   ${PROJECT}.sym)
set(CP_TARGET_REGION_RO   ${PROJECT}_REGION_RO)
set(CP_TARGET_REGION_RW   ${PROJECT}_REGION_RW)

#
###############################################
# project compile information
# MY_NAME, COMPILE_DATE and COMPILE_TIME are defined in sensorhub/Android.mk
###############################################
#
add_definitions(-DVERSION_BUILDER=${MY_NAME})
add_definitions(-DVERSION_DATE=${COMPILE_DATE})
add_definitions(-DVERSION_TIME=${COMPILE_TIME})

#
###############################################
# "cp" is a catch-all CMake library for source files that can be
# built purely with the include paths, defines, and other compiler
# flags that come with cp_interface.
#cp_library_named(cp)
###############################################
#
include_directories(
  # builtime_ver.h
  ${PROJECT_BUILD_ROOT}/auto_generate/include

  ${PROJECT_SOURCE_ROOT}/private/rtos/kernel/export/inc
  ${PROJECT_SOURCE_ROOT}/private/rtos/arm_drv/export/inc
  ${PROJECT_SOURCE_ROOT}/private/rtos/arm_drv/export/cmsis_core_m/Include

  ${PROJECT_SOURCE_ROOT}/ms_ref/export/inc

  ${PROJECT_SOURCE_ROOT}/common/export/inc_pm

  ${PROJECT_SOURCE_ROOT}/ms_customize/export/inc
  ${PROJECT_SOURCE_ROOT}/ms_customize/source/product/config/${CONFIG_PRODUCT_CONFIG}
)

if(CONFIG_SUBSYS_CONFIG_CH)
    include_directories(
        ${PROJECT_SOURCE_ROOT}/chip_drv_ch/chip_plf/${CONFIG_SOC_ID}/ch
        ${PROJECT_SOURCE_ROOT}/chip_drv_ch/export/inc
    )
else()
    include_directories(
        ${PROJECT_SOURCE_ROOT}/chip_drv_pm/chip_plf/export/inc
        ${PROJECT_SOURCE_ROOT}/chip_drv_pm/export/inc
        ${PROJECT_SOURCE_ROOT}/chip_drv_pm/export/inc/outdated
    )
endif()

if(CONFIG_CPP_FEATURE_ENABLE)
  if(CONFIG_COMPILER_GCC)
    if(0)
      include_directories(${PROJECT_SOURCE_ROOT}/lib/newlib-nano/arm-none-eabi/include/c++/9.2.1)
      include_directories(${PROJECT_SOURCE_ROOT}/lib/newlib-nano/arm-none-eabi/include/c++/9.2.1/arm-none-eabi/thumb/v7e-m+fp/softfp)
    else()
      include_directories(${TOOLCHAIN_PATH}/arm-none-eabi/include/c++/9.2.1)
      include_directories(${TOOLCHAIN_PATH}/arm-none-eabi/include/c++/9.2.1/arm-none-eabi/thumb/v7e-m+fp/softfp)
    endif()
  else()
  include_directories(${TOOLCHAIN_PATH}/include/c++/v1)

  endif()
endif()

#
#################################################
# setup external static lib
#################################################
#
include(${PROJECT_SOURCE_ROOT}/lib/libsetup.cmake)

#
###############################################
# Global Project macro define
###############################################
#
#cp_compile_definitions("DEBUG" "USE_FULL_LL_DRIVER")

#
###############################################
# include sub-dircetory's CMakeLists.txt
###############################################
#

# SP-CP Module include
add_subdirectory(ms_customize)
if(CONFIG_SUBSYS_CONFIG_CH)
    add_subdirectory(chip_drv_ch)
else()
    add_subdirectory(chip_drv_pm)
endif()
add_subdirectory(ms_ref)
add_subdirectory(version)
add_subdirectory(common)
if(CONFIG_SENSOR_HUB_CODE_SELECT_SENSOR_HUB_SPRD_WATCH)
    add_subdirectory(sensor_hub_sprd_watch)
elseif(CONFIG_SENSOR_HUB_CODE_SELECT_SENSOR_HUB_SPRD)
    add_subdirectory(sensor_hub_sprd)
endif()
if(NOT ${LINK_PRIVATE_LIB})
  add_subdirectory(private/rtos)
  if(CONFIG_SUBSYS_CONFIG_CH)
    add_subdirectory(private/chip_drv_ch)
  else()
    add_subdirectory(private/chip_drv)
  endif()
  if(${FUSION_LOCATION_SOURCE})
    add_subdirectory(private/fusion_location)
  else()
    if(CONFIG_SENSOR_HUB_CODE_SELECT_SENSOR_HUB_SPRD_WATCH)
      add_subdirectory(private/sensorhub_algo_watch)
    elseif(CONFIG_SENSOR_HUB_CODE_SELECT_SENSOR_HUB_SPRD)
      add_subdirectory(private/sensorhub_algo)
    endif()
  endif()
endif()

#
###############################################
# Create a dummy file to work around CMake
# Requirement of having a source file while
# adding an executable
#
###############################################
#

#
#----------------------------------------
# Create a dummy file and Add executable
#----------------------------------------
#
set(DUMMY_FILE ${PROJECT_BUILD_ROOT}/auto_generate/dummy_file.c)
add_custom_command(OUTPUT ${DUMMY_FILE}
                   COMMAND ${CMAKE_COMMAND} -E touch ${DUMMY_FILE}
                   VERBATIM)

add_custom_target(TARGET_DUMMY DEPENDS "${DUMMY_FILE}")

add_executable(${CP_TARGET_ELF} "${DUMMY_FILE}")
add_dependencies(${CP_TARGET_ELF} TARGET_DUMMY)

# target_link_options(${CP_TARGET_ELF} PUBLIC ${PORJECT_LINK_FLAGS})


#
#----------------------------------------
# LDS Script Preprocess
#----------------------------------------
#
set(LD_SCRIPT_PATH ${PROJECT_SOURCE_ROOT}/ms_customize)
set(LD_SCRIPT ${LD_SCRIPT_PATH}/${PROJECT}.lds)
set(GEN_LDS ${PROJECT_BUILD_ROOT}/auto_generate/${PROJECT_NAME}_ldscript)
set(AUTOCONF_H_PATH ${PROJECT_BUILD_ROOT}/auto_generate/kconfig/include/generated) # autoconfig.h path
set(MEM_CONFIG_H_PATH ${PROJECT_SOURCE_ROOT}/ms_customize/source/product/config/${CONFIG_PRODUCT_CONFIG}) # mem_cfg.h path
if(UNIX)
add_custom_command(OUTPUT ${GEN_LDS}
                    COMMAND ${CMAKE_C_COMPILER}
                            -C -P -x c -E
                            -o ${GEN_LDS}
                            -I ${AUTOCONF_H_PATH}
                            -I ${MEM_CONFIG_H_PATH}
                            ${LD_SCRIPT}
                    DEPENDS ${AUTOCONF_H_PATH}/autoconf.h
                           ${MEM_CONFIG_H_PATH}/mem_cfg.h
                           ${LD_SCRIPT}
                   COMMENT "Preprocess LDS File!"
                   VERBATIM)
else()#WIN32
add_custom_command(OUTPUT ${GEN_LDS}
                   PRE_LINK
                   COMMAND ${CMAKE_C_COMPILER}
                           -C -P -x c -E
                           -o ${GEN_LDS}
                           -I ${AUTOCONF_H_PATH}
                           -I ${MEM_CONFIG_H_PATH}
                           ${LD_SCRIPT}
                   DEPENDS ${AUTOCONF_H_PATH}/autoconf.h
                           ${MEM_CONFIG_H_PATH}/mem_cfg.h
                           ${LD_SCRIPT}
                   COMMENT "Preprocess LDS File!"
                   VERBATIM)
endif()
add_custom_target(PROJECT_LINK_SCRIPT
                  ALL
                  DEPENDS ${GEN_LDS}
                  VERBATIM)
add_dependencies(${CP_TARGET_ELF} PROJECT_LINK_SCRIPT)
target_link_libraries(${CP_TARGET_ELF} -T ${GEN_LDS})
print(GEN_LDS)

#----------------------------------------
# Setup sprd soure code library
#----------------------------------------
get_property(CP_LIBS_PROPERTY GLOBAL PROPERTY CP_LIBS)
get_property(CP_INTERFACE_LIBS_PROPERTY GLOBAL PROPERTY CP_INTERFACE_LIBS)
print(CP_LIBS_PROPERTY)
target_link_libraries(${CP_TARGET_ELF}
                      ${CP_LIBS_PROPERTY}
                      )

#----------------------------------------
# Setup sprd export library
#----------------------------------------
get_property(CP_EXPORT_LIBS_PROPERTY GLOBAL PROPERTY CP_EXPORT_LIBS)
print(CP_EXPORT_LIBS_PROPERTY)
target_link_libraries(${CP_TARGET_ELF}
                      ${CP_EXPORT_LIBS_PROPERTY}
                     )

#----------------------------------------
# Setup static library, include unsoc internel
# static lib and 3th_part static lib
# For Example, unisoc
#----------------------------------------
get_property(CP_EXTERNAL_LIBS_PROPERTY GLOBAL PROPERTY CP_EXTERNAL_LIBS)
print(CP_EXTERNAL_LIBS_PROPERTY)
target_link_libraries(${CP_TARGET_ELF}
                    ${CP_EXTERNAL_LIBS_PROPERTY}
                    )


# Since the os_main function is defined in the generated coredos
# source code, we have an cyclic symbol dependency. Therefore we
# add --start-group,--end-group "parentheses" around object files
# and library files.
SET(CMAKE_CXX_LINK_EXECUTABLE  "<CMAKE_CXX_COMPILER> <FLAGS> <CMAKE_CXX_LINK_FLAGS> <LINK_FLAGS> -Wl,--start-group <OBJECTS> <LINK_LIBRARIES> -Wl,--end-group -o <TARGET>")
set(CMAKE_C_LINK_EXECUTABLE "<CMAKE_C_COMPILER>  <FLAGS> <CMAKE_C_LINK_FLAGS> <LINK_FLAGS> <OBJECTS>  -o <TARGET> -Wl,--start-group <LINK_LIBRARIES> -Wl,--end-group")
#set(CMAKE_ASM_LINK_EXECUTABLE "<CMAKE_ASM_COMPILER>  <FLAGS> <CMAKE_ASM_LINK_FLAGS> <LINK_FLAGS> <OBJECTS>  -o <TARGET> -Wl,--start-group <LINK_LIBRARIES> -Wl,--end-group")

###############################################
# Create bin files
#
###############################################
#
if(CONFIG_COMPILER_GCC)
set(HEX_FILE ${PROJECT_BUILD_ROOT}/${CP_TARGET_HEX})
set(BIN_FILE ${PROJECT_BUILD_ROOT}/${CP_TARGET_BIN})
add_custom_command(TARGET ${CP_TARGET_ELF} POST_BUILD
        COMMAND ${CMAKE_OBJCOPY} -Oihex $<TARGET_FILE:${CP_TARGET_ELF}> ${HEX_FILE}
        COMMAND ${CMAKE_OBJCOPY} -Obinary $<TARGET_FILE:${CP_TARGET_ELF}> ${BIN_FILE}
        COMMAND ${CMAKE_SIZE} --format=berkeley "${CP_TARGET_ELF}"
        COMMENT "Building ${HEX_FILE} \nBuilding ${BIN_FILE}")
elseif(CONFIG_COMPILER_CLANG)
set(HEX_FILE ${PROJECT_BUILD_ROOT}/${CP_TARGET_HEX})
set(BIN_FILE ${PROJECT_BUILD_ROOT}/${CP_TARGET_BIN})
set(DIS_FILE ${PROJECT_BUILD_ROOT}/${CP_TARGET_DIS})
set(SYM_FILE ${PROJECT_BUILD_ROOT}/${CP_TARGET_SYM})

set(ELF_MEM_ANALYZE_PY ${PROJECT_SOURCE_ROOT}/scripts/elf_tools/elf-mem-analyze.py)
if(UNIX)
    set(ELF_MEM_ANALYZE_PARAM " ")
else()#WIN32
    set(ELF_MEM_ANALYZE_PARAM -t ${PROJECT_SOURCE_ROOT}/scripts/elf_tools/bin/win/arm-none-eabi-)
endif()

add_custom_command(TARGET ${CP_TARGET_ELF} POST_BUILD
        #COMMAND ${CMAKE_OBJCOPY} -Oihex $<TARGET_FILE:${CP_TARGET_ELF}> ${HEX_FILE}
        COMMAND ${CMAKE_OBJCOPY} -Obinary -S $<TARGET_FILE:${CP_TARGET_ELF}> ${BIN_FILE}
        #COMMAND ${CMAKE_OBJDUMP} --triple=arm-arm-none-eabi --arch-name=thumb --mcpu=cortex-m4 --print-imm-hex -d -S -l  $<TARGET_FILE:${CP_TARGET_ELF}> > ${DIS_FILE}
        #COMMAND ${CMAKE_NM} -n $<TARGET_FILE:${CP_TARGET_ELF}> > ${SYM_FILE}
        #COMMAND ${CMAKE_SIZE} --format=berkeley "${CP_TARGET_ELF}"
        #COMMAND ${PYTHON_EXECUTABLE} ${ELF_MEM_ANALYZE_PY} ${ELF_MEM_ANALYZE_PARAM} -U ${CP_TARGET_ELF} -l ${GEN_LDS}
        #COMMAND ${PYTHON_EXECUTABLE} ${ELF_MEM_ANALYZE_PY} ${ELF_MEM_ANALYZE_PARAM} -RO -H ${CP_TARGET_ELF} > ${PROJECT_BUILD_ROOT}/${CP_TARGET_REGION_RO}
        #COMMAND ${PYTHON_EXECUTABLE} ${ELF_MEM_ANALYZE_PY} ${ELF_MEM_ANALYZE_PARAM} -RW -H ${CP_TARGET_ELF} > ${PROJECT_BUILD_ROOT}/${CP_TARGET_REGION_RW}
        COMMENT "Building ${HEX_FILE} \nBuilding ${BIN_FILE}")
endif()
