cmake_minimum_required(VERSION 3.5)

project(candlelib)

set(CMAKE_POSITION_INDEPENDENT_CODE ON)

if(CANDLESDK_BUILD_PYTHON)
    set(CANDLE_BUILD_STATIC ON)
endif()

if(UNIX)
    set(CMAKE_MODULE_PATH ${CMAKE_CURRENT_SOURCE_DIR}/cmake/modules)
    include(${CMAKE_MODULE_PATH}/Findlibusb.cmake)
    find_package(libusb REQUIRED)
endif()
if(WIN32)
    set(LIBUSB_WINDOWS_DYNAMIC
      ${CMAKE_CURRENT_SOURCE_DIR}/third_party/libusb/lib/windows/libusb-1.0.dll)
    set(LIBUSB_WINDOWS_STATIC
      ${CMAKE_CURRENT_SOURCE_DIR}/third_party/libusb/lib/windows/libusb-1.0.a)
    set(LIBUSB_INCLUDE_DIR
      ${CMAKE_CURRENT_SOURCE_DIR}/third_party/libusb/inc/libusb-1.0)
endif()

if(CANDLE_BUILD_STATIC)
    set(CANDLE_BUILD_STATIC "TRUE")
    set(CANDLE_BUILD_SHARED "FALSE")
    add_library(candle STATIC ${CANDLE_SOURCE})
else()
    set(CANDLE_BUILD_STATIC "FALSE")
    set(CANDLE_BUILD_SHARED "TRUE")
    add_library(candle SHARED ${CANDLE_SOURCE})
endif()

message(
  STATUS
    "\nCANDLE_BUILD_SHARED: ${CANDLE_BUILD_SHARED}\nCANDLE_BUILD_STATIC: ${CANDLE_BUILD_STATIC}"
)

if(UNIX)
    set(UNIX_ONLY_SOURCES src/communication_interface/SPI.cpp)
endif()

target_sources(
  candle
  PRIVATE src/crc.cpp
          src/can_bootloader/can_bootloader.cpp
          src/communication_device/candle.cpp
          src/communication_device/candle_frame_adapter.cpp
          src/communication_device/candle_bootloader.cpp
          ${UNIX_ONLY_SOURCES}
          src/communication_interface/USB.cpp
          src/MD/MD.cpp
          src/MD/MDCO.cpp
          src/pds/pds.cpp
          src/pds/pds_module.cpp
          src/pds/pds_protocol.cpp
          src/pds/power_stage.cpp
          src/pds/brake_resistor.cpp
          src/pds/isolated_converter.cpp
          src/objectDictionary/edsParser.cpp
          src/objectDictionary/edsEntry.cpp)

if(UNIX)
    target_compile_definitions(candle PRIVATE UNIX)
endif()
target_include_directories(
  candle
  PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/include
         ${CMAKE_CURRENT_SOURCE_DIR}/src/MD
         ${CMAKE_CURRENT_SOURCE_DIR}/src/pds
         ${CMAKE_CURRENT_SOURCE_DIR}/src/can_bootloader
         ${CMAKE_CURRENT_SOURCE_DIR}/src/communication_device
         ${CMAKE_CURRENT_SOURCE_DIR}/src/communication_interface
         ${CMAKE_CURRENT_SOURCE_DIR}/../commons/logger
         ${CMAKE_CURRENT_SOURCE_DIR}/../candletool/include
         ${CMAKE_CURRENT_SOURCE_DIR}/../candletool/3rd_party/mINI/src
         ${CMAKE_CURRENT_SOURCE_DIR}/src/objectDictionary
         ${LIBUSB_INCLUDE_DIR})
target_include_directories(candle SYSTEM PRIVATE ${LIBUSB_INCLUDE_DIR})
if(UNIX)
    target_link_libraries(candle shared_data logger pthread ${LIBUSB_LIBRARY})
else()
    target_link_libraries(candle shared_data logger pthread
                        ${LIBUSB_WINDOWS_STATIC} -static)

endif()
if(NOT SUPPRESS_WARN)
    target_compile_options(candle PRIVATE -Wall -Wextra -Wpedantic -Wno-unused-parameter -Wno-missing-field-initializers)
else()
    target_compile_options(candle PRIVATE -w)
endif()
if(CMAKE_BUILD_TYPE STREQUAL "Debug")
    target_compile_options(candle PRIVATE -g3)
else()
    target_compile_options(candle PRIVATE -O2)
endif()

string(REGEX MATCH "([0-9]+)\\.([0-9]+)\\.([0-9]+)" _ "${CANDLESDK_VERSION}")
target_compile_definitions(
  candle
  PRIVATE CANDLE_VMAJOR=${CMAKE_MATCH_1}
  PRIVATE CANDLE_VMINOR=${CMAKE_MATCH_2}
  PRIVATE CANDLE_VREVISION=${CMAKE_MATCH_3}
  PRIVATE CANDLE_VTAG=${CANDLESDK_VERSION_TAG})

if(MAKE_TESTS)
    enable_testing()

    add_unit_test_executable(pds_protocol_test test/pds_protocol_test.cpp)
    target_sources(pds_protocol_test PRIVATE src/pds/pds_protocol.cpp)
    target_include_directories(pds_protocol_test PRIVATE include src/pds)
    target_link_libraries(pds_protocol_test PRIVATE logger shared_data candle)

    add_unit_test_executable(candle_v2_test
                           src/communication_device/candle_test.cpp)
    target_sources(candle_v2_test PRIVATE src/communication_device/candle.cpp)
    target_include_directories(
    candle_v2_test PRIVATE include src/communication_device
                           src/communication_interface)
    target_link_libraries(candle_v2_test PRIVATE logger shared_data candle)

    add_unit_test_executable(candle_bootloader_test
                           src/communication_device/candle_bootloader_test.cpp)
    target_sources(candle_bootloader_test
                 PRIVATE src/communication_device/candle_bootloader_test.cpp)
    target_include_directories(
    candle_bootloader_test PRIVATE include src/communication_device
                                   src/communication_interface)
    target_link_libraries(candle_bootloader_test PRIVATE logger shared_data
                                                       candle)

    add_unit_test_executable(usb_v2_test src/communication_interface/USB_test.cpp)
    target_sources(usb_v2_test PRIVATE src/communication_interface/USB.cpp)
    target_include_directories(usb_v2_test PRIVATE include
                                                 src/communication_interface/)
    target_link_libraries(usb_v2_test PRIVATE logger shared_data candle)

    if(UNIX)
        add_unit_test_executable(spi_v2_test
                             src/communication_interface/SPI_test.cpp)
        target_sources(spi_v2_test PRIVATE src/communication_interface/SPI.cpp)
        target_include_directories(spi_v2_test PRIVATE include
                                                   src/communication_interface/)
        target_link_libraries(spi_v2_test PRIVATE logger shared_data candle)
    endif()

    add_unit_test_executable(md_v2_test src/MD/MD_test.cpp)
    target_sources(md_v2_test PRIVATE src/MD/MD.cpp)
    target_include_directories(md_v2_test PRIVATE include src/MD/)
    target_link_libraries(md_v2_test PRIVATE logger shared_data candle)

    add_unit_test_executable(
    candle_frame_adapter_test
    src/communication_device/candle_frame_adapter_test.cpp)
    target_sources(candle_frame_adapter_test
                 PRIVATE src/communication_device/candle_frame_adapter.cpp)
    target_include_directories(candle_frame_adapter_test
                             PRIVATE include src src/communication_device)
    target_link_libraries(candle_frame_adapter_test PRIVATE logger shared_data
                                                          candle)

    add_unit_test_executable(eds_entry_test src/objectDictionary/edsEntry_test.cpp)
    target_sources(eds_entry_test PRIVATE src/objectDictionary/edsEntry.hpp)
    target_include_directories(eds_entry_test PRIVATE src/objectDictionary)
    target_link_libraries(eds_entry_test PRIVATE logger shared_data candle)

endif()
