#
# TOOL
#

cmake_minimum_required(VERSION 3.10)

#
# PROJECT DEFINITIONS
#

project(PTX_IOTRD_API)

#
# Target (will appear again in filename)
set(CMAKE_TARGET_IOTRD_EXAMPLE_EXE    IOTRDExample)       # POS Example Executable with IOTRD Component Support
set(CMAKE_TARGET_IOTRD                IOTRD)              # POS Library with IOTRD Component Support

#
# MAIN Targets: Call make with one of THESE names!
set(CMAKE_TARGET_IOTRD_BUILD_EXE_EX   IOTRD_EXAMPLE_EXE)  # POS Example Executable with IOTRD Component Support
set(CMAKE_TARGET_IOTRD_BUILD          IOTRD_LIB)          # POS Library with IOTRD Component Support

#
# Basic locations from here>
set(PRJ_CFG_SRC_PATH            )                       # Where the sources are found
set(PRJ_CFG_OUTPUT_PATH         ../BUILD/)              # Output relative to CMake*.txt
set(PRJ_CFG_OUTPUT_PATH_SRC_REL ../)                    # Sources/Input relative to Output


#
# Platform diversity
#
message("####################### LINUX #######################")
set(PRJ_CFG_COMPILER_FPIC            -fPIC)                                # Position independent code flag required
set(PRJ_CFG_COMPILER_FVH             -fvisibility=hidden)                  # Standard visibility in shared objects

#
# Generic Configuration options
#

set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${PRJ_CFG_OUTPUT_PATH})
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${PRJ_CFG_OUTPUT_PATH})
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${PRJ_CFG_OUTPUT_PATH})

set(CMAKE_VERBOSE_MAKEFILE         OFF)                                      # Show compiler command
set(CMAKE_USE_RELATIVE_PATHS       ON)

#
# PATH COMPLETION
#
set(CFG_SRC_ROOT                "${CMAKE_CURRENT_SOURCE_DIR}")
set(CFG_INC_ROOT                "${CMAKE_CURRENT_SOURCE_DIR}")
message(STATUS "*** CMAKE SOURCE = ${CFG_SRC_ROOT} ***")
message(STATUS "*** CMAKE INC    = ${CFG_INC_ROOT} ***")

#
# GENERIC DEFINES AND OPTIONS
#

add_definitions(
    -D__NEWLIB__
    -DDUMMY_DEF=dummy # Just show how to set a value
)

add_definitions(
    # W Options
    -Werror
    -Wvla
    -Wshadow
    -Wmissing-include-dirs
    -Wall
    -Wextra 
    -Wtype-limits
    -Winit-self
    -Wcast-align
    -Wundef
    -Wfloat-equal
    -Wredundant-decls
    -Wno-pointer-to-int-cast
   -Wunused
   -Wuninitialized
   -Wmissing-declarations
   -Wconversion
   -Wpointer-arith
   -Wlogical-op
   -Waggregate-return
   -Werror=strict-prototypes
    # Code generation options
    -g
    -ffunction-sections
    -fdata-sections
    --param max-inline-insns-single=100
    # Diagnostic options
    -fdiagnostics-show-option
    # Other options
    -std=gnu99
)

#
# BUILDING TYPE DIVERSITY FOR NSC STACK
#  "RD_ONLY" --> Building for Reader Only
#
add_definitions(
		-DPTX_FEATURES_NSC_READER_ONLY
        -DPTX_PRODUCT_TYPE_IOT_READER
)

if (PTX_SDK_HAL)
    if(${PTX_SDK_HAL} STREQUAL "SPI")
       add_definitions(-DPTX_FEATURES_HAL_SPI)
    elseif(${PTX_SDK_HAL} STREQUAL "I2C")
       add_definitions(-DPTX_FEATURES_HAL_I2C)
    elseif(${PTX_SDK_HAL} STREQUAL "UART")
       add_definitions(-DPTX_FEATURES_HAL_UART)
    else()
       message(WARNING "No or unavailable HAL interface selected, defaulting to SPI")
       add_definitions(-DPTX_FEATURES_HAL_SPI)
    endif()
else()
       message(WARNING "No or unavailable HAL interface selected, defaulting to SPI")
       add_definitions(-DPTX_FEATURES_HAL_SPI)    
endif()


#
# NATIVE and CROSS_COMPILE Options (to be added to Win/LIN/.. native targets and cross-compile targets)
#

set (CFG_PLATFORM_NATIVE_FLAGS      "${PRJ_CFG_COMPILER_FVH} ${PRJ_CFG_COMPILER_FPIC}")

#
# Target-specific Compiler Flags (additional to base set. Example: -DDUMMY_DEF1=dummy1)
set (CFG_ADDITIONAL_COMPILE_DEF      "-DDUMMY_DEF1=dummy1") 
set (CFG_ADDITIONAL_EXE_COMPILE_DEF  "-DDUMMY_DEF1=dummy1") 
set (CFG_ADDITIONAL_COMPILE_FLAGS    "${CFG_PLATFORM_NATIVE_FLAGS}   -O -pedantic      ${CFG_ADDITIONAL_COMPILE_DEF}")
set (CFG_ADDITIONAL_EXE_COMPILE_FLAGS "${CFG_PLATFORM_NATIVE_FLAGS}  -O -pedantic      ${CFG_ADDITIONAL_EXE_COMPILE_DEF}")

#
# LINKER
#

#
# Additional Linker Flags for POS-Library with IOTRD support
set(CFG_LINKER_IOTRD_PARAMS   "-pthread")
set(CFL_LINKER_IOTRD_CMDS     "-Wl,-Map=${CMAKE_TARGET_IOTRD}.map,--cref,--sort-common,--gc-sections") # ,--print-gc-sections
set(CFG_ADDITIONAL_IOTRD_LIB_LINK_FLAGS "${CFG_LINKER_IOTRD_PARAMS} ${CFL_LINKER_IOTRD_CMDS}")

#
# Additional Linker Flags for POS-Example with IOTRD support
set(CFG_LINKER_IOTRD_PARAMS   "-pthread")
set(CFL_LINKER_IOTRD_CMDS     "-Wl,-Map=${CMAKE_TARGET_IOTRD}.map,--cref,--sort-common,--gc-sections") # ,--print-gc-sections
set(CFG_ADDITIONAL_IOTRD_EXE_LINK_FLAGS "${CFG_LINKER_IOTRD_PARAMS} ${CFL_LINKER_IOTRD_CMDS}")

#
# MAIN BUILD TARGET FOR POS-Library with IOTRD-Support
add_custom_target(
    ${CMAKE_TARGET_IOTRD_BUILD}
    ALL
    DEPENDS ${CMAKE_TARGET_IOTRD}
    COMMENT "TARGET ${CMAKE_TARGET_IOTRD_BUILD}: CALLS DEPENDENCY ${CMAKE_TARGET_IOTRD}"
)

#
# MAIN BUILD TARGET FOR POS-Example with IOTRD-Support
add_custom_target(
    ${CMAKE_TARGET_IOTRD_BUILD_EXE_EX}
    ALL
    DEPENDS ${CMAKE_TARGET_IOTRD_EXAMPLE_EXE}
    COMMENT "TARGET ${CMAKE_TARGET_IOTRD_BUILD_EXE_EX}: CALLS DEPENDENCY ${CMAKE_TARGET_IOTRD_EXAMPLE_EXE}"
)
