cmake_minimum_required(VERSION 3.5)

set(CMAKE_CXX_STANDARD 20)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(CMAKE_C_STANDARD 20)
set(CMAKE_C_STANDARD_REQUIRED ON)

set(NIIPP_LIB uav-niipp)

if(NOT UAV_INCLUDE_LIBS)
    if(NOT DEFINED PROJECT_VERSION)
        set(PROJECT_VERSION 1.0.0)
    endif()

    project(${NIIPP_LIB} VERSION ${PROJECT_VERSION} DESCRIPTION "${NIIPP_LIB} library")
endif()

set(NIIPP_HEADERS
    niipp-interface.h
    aniipp-interface.h
)

set(NIIPP_SOURCES
    niipp-interface.cpp
    aniipp-interface.cpp
)

set(NIIPP_DETAILS
  detail/niipp-config.h
  detail/interface-factory.h
  detail/merge-utils.h
  detail/merge-utils.cpp
)

add_library(${NIIPP_LIB} SHARED
    ${NIIPP_HEADERS}
    ${NIIPP_SOURCES}
    ${NIIPP_DETAILS}
)

if(UAV_LIB_NIIPP)
    add_dependencies(${NIIPP_LIB} uavconfdetpojo uav-spi uav-tty-serial uav-tcp-serial)
endif()

target_link_libraries(${NIIPP_LIB} PUBLIC
  $<BUILD_INTERFACE:${CMAKE_CURRENT_BINARY_DIR}/../libuavconfdetpojo.so>
  $<INSTALL_INTERFACE:uavconfdetpojo>
  $<BUILD_INTERFACE:${CMAKE_CURRENT_BINARY_DIR}/../uav-spi/libuav-spi.so>
  $<INSTALL_INTERFACE:uav-spi>
  $<BUILD_INTERFACE:${CMAKE_CURRENT_BINARY_DIR}/../uav-tty-serial/libuav-tty-serial.so>
  $<INSTALL_INTERFACE:uav-tty-serial>
  $<BUILD_INTERFACE:${CMAKE_CURRENT_BINARY_DIR}/../uav-tcp-serial/libuav-tcp-serial.so>
  $<INSTALL_INTERFACE:uav-tcp-serial>
)

target_include_directories(${NIIPP_LIB} PRIVATE
  $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/../>
  $<INSTALL_INTERFACE:.>
)

if(DEFINED CPACK_ARCHITECTURE_PATH)
  install(TARGETS ${NIIPP_LIB}
      LIBRARY DESTINATION /usr/lib/${CPACK_ARCHITECTURE_PATH}
  )
  set(INCLUDE_DIR /usr/include/${CPACK_ARCHITECTURE_PATH})
else()
  install(TARGETS ${NIIPP_LIB}
      LIBRARY DESTINATION /usr/lib
  )
  set(INCLUDE_DIR /usr/include)
endif()

foreach(_file IN LISTS NIIPP_HEADERS)
    install(FILES ${_file} DESTINATION ${INCLUDE_DIR}/${NIIPP_LIB}/)
endforeach()

if(NOT UAV_INCLUDE_LIBS)
  if(DEFINED CPACK_DEBIAN_PACKAGE_ARCHITECTURE)
    set(CPACK_PACKAGE_FILE_NAME "lib${NIIPP_LIB}-${CPACK_DEBIAN_PACKAGE_ARCHITECTURE}-${PROJECT_VERSION}-Linux")
  else()
  set(CPACK_PACKAGE_FILE_NAME "lib${NIIPP_LIB}-${PROJECT_VERSION}-Linux")
  endif()

  set(CPACK_PACKAGE_VENDOR "4code")
  set(CPACK_PACKAGE_CONTACT "info@4code.ru")

  set(CPACK_ARCHIVE_COMPONENT_INSTALL On)
  set(CPACK_DEB_COMPONENT_INSTALL On)

  set(CPACK_PACKAGING_INSTALL_PREFIX "/usr")

  set(CPACK_DEBIAN_PACKAGE_DEPENDS "uavconfdetpojo (= ${PROJECT_VERSION}), gpiod")

  include(CPack)
endif()

if (TESTING)
    find_library(GEST gtest)
    set(NIIPP_TEST_SOURCES
        test/main.cpp
        test/test.cpp
    )

    add_executable(${NIIPP_LIB}-test
        ${NIIPP_HEADERS}
        ${NIIPP_SOURCES}
        ${NIIPP_DETAILS}
        ${NIIPP_TEST_SOURCES}
    )

    target_link_libraries(${NIIPP_LIB}-test PRIVATE
        gtest
        $<BUILD_INTERFACE:${CMAKE_CURRENT_BINARY_DIR}/../libuavconfdetpojo.so>
        $<INSTALL_INTERFACE:uavconfdetpojo>
        $<BUILD_INTERFACE:${CMAKE_CURRENT_BINARY_DIR}/../uav-spi/libuav-spi.so>
        $<INSTALL_INTERFACE:uav-spi>
        $<BUILD_INTERFACE:${CMAKE_CURRENT_BINARY_DIR}/../uav-tty-serial/libuav-tty-serial.so>
        $<INSTALL_INTERFACE:uav-tty-serial>
        $<BUILD_INTERFACE:${CMAKE_CURRENT_BINARY_DIR}/../uav-tcp-serial/libuav-tcp-serial.so>
        $<INSTALL_INTERFACE:uav-tcp-serial>
    )

    target_include_directories(${NIIPP_LIB}-test PRIVATE
      $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/../>
      $<INSTALL_INTERFACE:.>
    )

endif()
