cmake_minimum_required(VERSION 3.5)
project(kinesis_video_streamer)

# Add support for C++14
if(NOT CMAKE_CXX_STANDARD)
  set(CMAKE_CXX_STANDARD 14)
endif()

find_package(kinesis_manager REQUIRED)
find_package(rclcpp REQUIRED)
find_package(aws_ros2_common REQUIRED)
find_package(ament_cmake REQUIRED)
find_package(aws_common REQUIRED)
find_package(image_transport REQUIRED)
find_package(kinesis_video_msgs REQUIRED)
find_package(rmw_implementation REQUIRED)

set(PRODUCER_LIBRARY producer)
set(LOG_LIBRARY log4cplus)
set(INCLUDE_DIRS ${kinesis_manager_INCLUDE_DIRS} ${rclcpp_INCLUDE_DIRS}
    ${aws_ros2_common_INCLUDE_DIRS} ${ament_cmake_INCLUDE_DIRS}
    ${aws_common_INCLUDE_DIRS} ${image_transport_INCLUDE_DIRS}
    ${kinesis_video_msgs_INCLUDE_DIRS}
    ${rmw_implementation_INCLUDE_DIRS})
set(LIB_DEPS ${kinesis_manager_LIBRARIES} ${rclcpp_LIBRARIES}
    ${aws_ros2_common_LIBRARIES} ${ament_cmake_LIBRARIES} ${aws_common_LIBRARIES}
    ${image_transport_LIBRARIES} ${PRODUCER_LIBRARY}
    ${kinesis_video_msgs_LIBRARIES} ${rmw_implementation_LIBRARIES} ${LOG_LIBRARY})

###########
## Build ##
###########
## Declare a C++ executable
set(KINESIS_VIDEO_STREAMER_SRC src/ros_stream_subscription_installer.cpp
  src/subscriber_callbacks.cpp src/streamer.cpp src/main.cpp)
add_executable(${PROJECT_NAME} ${KINESIS_VIDEO_STREAMER_SRC})
add_library(${PROJECT_NAME}_lib ${KINESIS_VIDEO_STREAMER_SRC})

## Specify include directories
target_include_directories(${PROJECT_NAME} PRIVATE include ${INCLUDE_DIRS})
target_include_directories(${PROJECT_NAME}_lib PUBLIC include ${INCLUDE_DIRS})
target_link_libraries(${PROJECT_NAME} ${LIB_DEPS})
target_link_libraries(${PROJECT_NAME}_lib ${LIB_DEPS})

#############
## Install ##
#############

## Mark executables and/or libraries for installation
install(TARGETS ${PROJECT_NAME}
  ARCHIVE
  DESTINATION lib/${PROJECT_NAME}
  LIBRARY
  DESTINATION lib/${PROJECT_NAME}
  RUNTIME
  DESTINATION lib/${PROJECT_NAME})

install(DIRECTORY config DESTINATION share/${PROJECT_NAME})
install(DIRECTORY launch DESTINATION share/${PROJECT_NAME})

#############
## Tests ##
#############

if(BUILD_TESTING)
  find_package(ament_cmake_gtest REQUIRED)
  find_package(ament_cmake_gmock REQUIRED)
  
  ament_add_gtest(test_kinesis_video_streamer
    test/kinesis_video_streamer_test.cpp)
  target_include_directories(test_kinesis_video_streamer
    PRIVATE include ${KPL_INCLUDES_PATH}
    ${kinesis_manager_INCLUDE_DIRS})
  target_link_libraries(test_kinesis_video_streamer
          ${PROJECT_NAME}_lib
          ${LIB_DEPS})

  ament_add_gmock(test_streamer_node
    test/streamer_node_test.cpp)
  target_include_directories(test_streamer_node
    PRIVATE include ${KPL_INCLUDES_PATH}
    ${kinesis_manager_INCLUDE_DIRS})
  target_link_libraries(test_streamer_node
          ${PROJECT_NAME}_lib
          ${LIB_DEPS})

  ament_add_gmock(test_subscriber_callbacks
    test/subscriber_callbacks_test.cpp)
  target_include_directories(test_subscriber_callbacks
    PRIVATE include ${KPL_INCLUDES_PATH}
    ${kinesis_manager_INCLUDE_DIRS})
  target_link_libraries(test_subscriber_callbacks
          ${PROJECT_NAME}_lib
          ${LIB_DEPS})
endif()

ament_package()
