##
## Copyright (c) Toposens GmbH 2021. All rights reserved.
##

cmake_minimum_required(VERSION 3.10)

# Project and packages
project(toposens-sensor-library VERSION 1.2.4 DESCRIPTION "toposens sensor library")
find_package(Threads REQUIRED)

# Compiler
set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(CMAKE_C_STANDARD 11)
set(CMAKE_EXPORT_COMPILE_COMMANDS ON)
set(THREADS_PREFER_PTHREAD_FLAG ON)

set(CMAKE_INSTALL_PREFIX "/usr")

set(INCLUDE_INSTALL_DIR include/)

add_compile_options(-Wall -Wextra -Werror -Wno-unused-function -Wno-unused-variable -Wno-unused-result)

set(INCLUDE_FILES
${CMAKE_CURRENT_SOURCE_DIR}/src/linux
${CMAKE_CURRENT_SOURCE_DIR}/config
${CMAKE_CURRENT_SOURCE_DIR}
)


#------------------------------------------------------------------------------
# This variable controls the prefix used to generate the following files:
#  <export_config_name>ConfigVersion.cmake
#  <export_config_name>Config.cmake
#  <export_config_name>Targets.cmake
# and it also used to initialize TOPOSENS_SENSOR_LIBRARY_INSTALL_CONFIG_DIR value.
set(export_config_name ${PROJECT_NAME})
#------------------------------------------------------------------------------

if(NOT DEFINED TOPOSENS-SENSOR-LIBRARY_INSTALL_INCLUDE_DIR)
  set(TOPOSENS-SENSOR-LIBRARY_INSTALL_INCLUDE_DIR include)
endif()

if(NOT DEFINED TOPOSENS-SENSOR-LIBRARY_INSTALL_BIN_DIR)
  set(TOPOSENS-SENSOR-LIBRARY_INSTALL_BIN_DIR bin)
endif()

if(NOT DEFINED TOPOSENS-SENSOR-LIBRARY_INSTALL_LIBRARY_DIR)
  set(TOPOSENS-SENSOR-LIBRARY_INSTALL_LIBRARY_DIR lib)
endif()

if(NOT DEFINED TOPOSENS-SENSOR-LIBRARY_INSTALL_CONFIG_DIR)
  set(TOPOSENS-SENSOR-LIBRARY_INSTALL_CONFIG_DIR ${TOPOSENS-SENSOR-LIBRARY_INSTALL_LIBRARY_DIR}/cmake/${export_config_name})
endif()


if($ENV{TOPOSENSDEBUG})
  set(CMAKE_BUILD_TYPE Debug)
  message("Building Debug type")
else()
  message("Setting build type to 'Release'")
  set(CMAKE_BUILD_TYPE "Release" CACHE STRING "Choose the type of build." FORCE)
  mark_as_advanced(CMAKE_BUILD_TYPE)
endif()

find_program(CLANG_TIDY_COMMAND NAMES clang-tidy)
if(NOT CLANG_TIDY_COMMAND)
  message("Clang-tidy not found!")
else()
  set(CMAKE_C_CLANG_TIDY
      clang-tidy;
      -header-filter=.;
      )
endif()

set(SOURCE_FILES
  ${CMAKE_CURRENT_SOURCE_DIR}/src/linux/messagestrings.c
  ${CMAKE_CURRENT_SOURCE_DIR}/src/linux/socketinterface.c
  ${CMAKE_CURRENT_SOURCE_DIR}/src/linux/uartinterface.c
)

include_directories(
  include
)

# add the library
add_library(${PROJECT_NAME} SHARED src/sensor_lib.c ${SOURCE_FILES})

link_directories(${INCLUDE_FILES})

target_include_directories(${PROJECT_NAME}
   INTERFACE
     $<BUILD_INTERFACE:${toposens-sensor-library_SOURCE_DIR}/include>
     $<INSTALL_INTERFACE:${TOPOSENS-SENSOR-LIBRARY_INSTALL_INCLUDE_DIR}/toposens>
 )

install(
  TARGETS ${PROJECT_NAME} toposens-core-libs
  EXPORT ${export_config_name}Targets
  ARCHIVE DESTINATION ${TOPOSENS-SENSOR-LIBRARY_INSTALL_LIBRARY_DIR}
  LIBRARY DESTINATION ${TOPOSENS-SENSOR-LIBRARY_INSTALL_LIBRARY_DIR}
  RUNTIME DESTINATION ${TOPOSENS-SENSOR-LIBRARY_INSTALL_BIN_DIR}
)

set(THREADS_PREFER_PTHREAD_FLAG ON)
find_package(Threads REQUIRED)
target_link_libraries(${PROJECT_NAME} PRIVATE Threads::Threads -dynamic toposens-core-libs toposens-iso-tp)

target_link_libraries(${PROJECT_NAME} INTERFACE toposens-core-libs)

add_custom_command(TARGET ${PROJECT_NAME}
    POST_BUILD
    COMMAND
        python3 ${CMAKE_CURRENT_SOURCE_DIR}/python_bindings/toposens_cffi.py
          -p ${CMAKE_CURRENT_SOURCE_DIR}
          -l ${CMAKE_CURRENT_BINARY_DIR}
          -n toposens_cffi.so
    VERBATIM
)


#install directive
install(TARGETS ${PROJECT_NAME} LIBRARY)

install(FILES ${CMAKE_CURRENT_BINARY_DIR}/toposens_cffi.so DESTINATION lib/python3/dist-packages)

install(FILES include/toposens/sensor_lib.h DESTINATION include/toposens)
install(FILES include/toposens/custom_structs.h DESTINATION include/toposens)
install(FILES include/toposens/custom_types.h DESTINATION include/toposens)
install(FILES include/toposens/message_flags.h DESTINATION include/toposens)
install(FILES include/toposens/config/sensor_lib_config.h DESTINATION include/toposens/config)
install(FILES include/toposens/custom_types_internal.h DESTINATION include/toposens)
install(FILES include/toposens/custom_structs_internal.h DESTINATION include/toposens)

install(FILES python_bindings/toposens.py DESTINATION lib/python3/dist-packages)

include(CMakePackageConfigHelpers)

set(INSTALL_CMAKE_CONFIG_DIR ${CMAKE_INSTALL_LIBDIR}/cmake/toposens-sensor-library)

set(config_version_file ${CMAKE_CURRENT_BINARY_DIR}/${export_config_name}ConfigVersion.cmake)

write_basic_package_version_file(
  ${config_version_file}
  COMPATIBILITY SameMajorVersion
)

#------------------------------------------------------------------------------
# Export '<export_config_name>Targets.cmake' for a build tree

export(
  EXPORT ${PROJECT_NAME}Targets
  FILE "${CMAKE_CURRENT_BINARY_DIR}/${export_config_name}Targets.cmake"
)

set(build_config ${CMAKE_BINARY_DIR}/${export_config_name}Config.cmake)
configure_package_config_file(
  cmake/${export_config_name}Config.cmake.in
  ${build_config}
  INSTALL_DESTINATION "${PROJECT_BINARY_DIR}"
)

#------------------------------------------------------------------------------
# Export '<export_config_name>Targets.cmake' for an install tree
install(
  EXPORT ${export_config_name}Targets
  FILE ${export_config_name}Targets.cmake
  DESTINATION ${TOPOSENS-SENSOR-LIBRARY_INSTALL_CONFIG_DIR}
  )

set(install_config ${PROJECT_BINARY_DIR}/CMakeFiles/${export_config_name}Config.cmake)
configure_package_config_file(
  cmake/${export_config_name}Config.cmake.in
  ${install_config}
  INSTALL_DESTINATION ${TOPOSENS-SENSOR-LIBRARY_INSTALL_CONFIG_DIR}
  )

# Install config files
install(
  FILES ${config_version_file} ${install_config}
  DESTINATION "${TOPOSENS-SENSOR-LIBRARY_INSTALL_CONFIG_DIR}"
  )

#------------------------------------------------------------------------------

# .deb configuration
set(CPACK_PACKAGE_NAME ${PROJECT_NAME}
    CACHE STRING "The resulting package name"
)

set(CPACK_PACKAGE_VENDOR "Toposens GmbH")

set(CPACK_VERBATIM_VARIABLES YES)

set(CPACK_PACKAGE_INSTALL_DIRECTORY ${CPACK_PACKAGE_NAME})
set(CPACK_OUTPUT_FILE_PREFIX "${CMAKE_SOURCE_DIR}/artifacts")

set(CPACK_PACKAGING_INSTALL_PREFIX "/usr")

set(CPACK_PACKAGE_VERSION_MAJOR ${PROJECT_VERSION_MAJOR})
set(CPACK_PACKAGE_VERSION_MINOR ${PROJECT_VERSION_MINOR})
set(CPACK_PACKAGE_VERSION_PATCH ${PROJECT_VERSION_PATCH})

set(CPACK_PACKAGE_CONTACT "info@toposens.com")
set(CPACK_DEBIAN_PACKAGE_MAINTAINER "toposens")

set(CPACK_DEBIAN_PACKAGE_DEPENDS "python3-cffi")

# set(CPACK_RESOURCE_FILE_LICENSE "${CMAKE_CURRENT_SOURCE_DIR}/LICENSE")
# set(CPACK_RESOURCE_FILE_README "${CMAKE_CURRENT_SOURCE_DIR}/README.md")

set(CPACK_DEBIAN_FILE_NAME DEB-DEFAULT)

set(CPACK_DEB_COMPONENT_INSTALL YES)

include(CPack)
