cmake_minimum_required(VERSION 3.0)

# automagically detect if we should cross-compile
if(DEFINED ENV{TOOLCHAIN})
	set(CMAKE_C_COMPILER	$ENV{TOOLCHAIN}gcc)
	set(CMAKE_CXX_COMPILER	$ENV{TOOLCHAIN}g++)
	set(CMAKE_AR	"$ENV{TOOLCHAIN}ar" CACHE FILEPATH "CW archiver" FORCE)
endif()

project(lib60870-C)
ENABLE_TESTING()

set(LIB_VERSION_MAJOR "2")
set(LIB_VERSION_MINOR "3")
set(LIB_VERSION_PATCH "2")

set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${CMAKE_SOURCE_DIR}/third_party/cmake/modules/")

macro(ADD_C_FLAGS flags)
    set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${flags}")
endmacro()

# feature checks
include(CheckLibraryExists)
check_library_exists(rt clock_gettime "time.h" CONFIG_SYSTEM_HAS_CLOCK_GETTIME)

# check if we are on a little or a big endian
include (TestBigEndian)
test_big_endian(PLATFORM_IS_BIGENDIAN)

option(BUILD_HAL "Build the platform abstraction layer (HAL)" ON)
option(BUILD_COMMON "Build common code (shared with other libraries - e.g. libiec61850)" ON)

option(BUILD_EXAMPLES "Build the examples" ON)
option(BUILD_TESTS "Build the tests" ON)

if(BUILD_HAL)

if(EXISTS ${CMAKE_CURRENT_LIST_DIR}/dependencies/mbedtls-2.28)
set(WITH_MBEDTLS 1)
else()
message("NOTE: mbedtls 2.28 is required for TLS support!")
endif(EXISTS ${CMAKE_CURRENT_LIST_DIR}/dependencies/mbedtls-2.28)

endif(BUILD_HAL)

include_directories(
    ${CMAKE_CURRENT_LIST_DIR}/config
    ${CMAKE_CURRENT_LIST_DIR}/src/file-service
    ${CMAKE_CURRENT_LIST_DIR}/src/inc/api
    ${CMAKE_CURRENT_LIST_DIR}/src/inc/internal
    ${CMAKE_CURRENT_LIST_DIR}/src/common/inc
    ${CMAKE_CURRENT_LIST_DIR}/src/hal/inc
)

if(WITH_MBEDTLS)
include_directories(
    ${CMAKE_CURRENT_LIST_DIR}/src/hal/tls/mbedtls
    ${CMAKE_CURRENT_LIST_DIR}/dependencies/mbedtls-2.28/include
)

file(GLOB tls_SRCS ${CMAKE_CURRENT_LIST_DIR}/dependencies/mbedtls-2.28/library/*.c)

add_definitions(-DCONFIG_CS104_SUPPORT_TLS=1)
add_definitions(-DMBEDTLS_CONFIG_FILE="mbedtls_config.h")

endif(WITH_MBEDTLS)


set(API_HEADERS 
	${CMAKE_CURRENT_LIST_DIR}/src/hal/inc/hal_time.h 
	${CMAKE_CURRENT_LIST_DIR}/src/hal/inc/hal_thread.h
	${CMAKE_CURRENT_LIST_DIR}/src/hal/inc/hal_socket.h
	${CMAKE_CURRENT_LIST_DIR}/src/hal/inc/hal_serial.h
	${CMAKE_CURRENT_LIST_DIR}/src/hal/inc/hal_base.h
	${CMAKE_CURRENT_LIST_DIR}/src/hal/inc/tls_config.h
	${CMAKE_CURRENT_LIST_DIR}/src/common/inc/linked_list.h
	${CMAKE_CURRENT_LIST_DIR}/src/inc/api/cs101_master.h
	${CMAKE_CURRENT_LIST_DIR}/src/inc/api/cs101_slave.h
	${CMAKE_CURRENT_LIST_DIR}/src/inc/api/cs104_slave.h
	${CMAKE_CURRENT_LIST_DIR}/src/inc/api/iec60870_master.h
	${CMAKE_CURRENT_LIST_DIR}/src/inc/api/iec60870_slave.h
	${CMAKE_CURRENT_LIST_DIR}/src/inc/api/iec60870_common.h
	${CMAKE_CURRENT_LIST_DIR}/src/inc/api/cs101_information_objects.h
	${CMAKE_CURRENT_LIST_DIR}/src/inc/api/cs104_connection.h
	${CMAKE_CURRENT_LIST_DIR}/src/inc/api/link_layer_parameters.h
)

include(CheckCCompilerFlag)

check_c_compiler_flag("-Wredundant-decls" SUPPORT_REDUNDANT_DECLS)
if (SUPPORT_REDUNDANT_DECLS)
    set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wredundant-decls")
endif(SUPPORT_REDUNDANT_DECLS)

# write the detected stuff to this file
# configure_file(config/lib60870_config.h.cmake ${CMAKE_CURRENT_BINARY_DIR}/config/lib60870_config.h)

if(BUILD_EXAMPLES)
	add_subdirectory(${CMAKE_CURRENT_LIST_DIR}/examples)
endif(BUILD_EXAMPLES)

if(BUILD_TESTS)
	add_subdirectory(${CMAKE_CURRENT_LIST_DIR}/tests)
endif(BUILD_TESTS)

add_subdirectory(${CMAKE_CURRENT_LIST_DIR}/src)

INSTALL(FILES ${API_HEADERS} DESTINATION include/lib60870 COMPONENT Development)

IF(EXISTS "${CMAKE_ROOT}/Modules/CPack.cmake")
INCLUDE(InstallRequiredSystemLibraries)
 
SET(CPACK_PACKAGE_DESCRIPTION "IEC 60870-5-101/104 master/slave library")
SET(CPACK_PACKAGE_DESCRIPTION_SUMMARY "IEC 60870-5-101/104 master/slave library")
SET(CPACK_PACKAGE_VENDOR "MZ Automation GmbH")
SET(CPACK_PACKAGE_CONTACT "info@mz-automation.de")
SET(CPACK_PACKAGE_VERSION_MAJOR "${LIB_VERSION_MAJOR}")
SET(CPACK_PACKAGE_VERSION_MINOR "${LIB_VERSION_MINOR}")
SET(CPACK_PACKAGE_VERSION_PATCH "${LIB_VERSION_PATCH}")
SET(CPACK_PACKAGE_FILE_NAME "${CMAKE_PROJECT_NAME}_${LIB_VERSION_MAJOR}.${LIB_VERSION_MINOR}.${CPACK_PACKAGE_VERSION_PATCH}_${CMAKE_SYSTEM_PROCESSOR}")
SET(CPACK_SOURCE_PACKAGE_FILE_NAME "${CMAKE_PROJECT_NAME}_${LIB_VERSION_MAJOR}.${LIB_VERSION_MINOR}.${CPACK_PACKAGE_VERSION_PATCH}")
 
SET(CPACK_COMPONENTS_ALL Libraries Development Applications)
#set(CPACK_PACKAGE_INSTALL_DIRECTORY "${CMAKE_PROJECT_NAME}")
INCLUDE(CPack)
 
ENDIF(EXISTS "${CMAKE_ROOT}/Modules/CPack.cmake")
