cmake_minimum_required(VERSION 3.1.2)
project(kinesis_video_streamer)
set(CMAKE_CXX_STANDARD 14)

###################################
## non-catkin packages           ##
###################################
include(FindCURL)
find_package(kinesis_manager REQUIRED)

# KPL configuration
set(PRODUCER_LIBRARY producer)
set(LOG_LIBRARY log4cplus)

###################################
## catkin specific configuration ##
###################################
find_package(catkin REQUIRED COMPONENTS
        aws_common
        aws_ros1_common
        kinesis_video_msgs
        roscpp
        image_transport
        std_msgs)
catkin_package()

###########
## Build ##
###########
## Declare a C++ executable
set(KINESIS_VIDEO_STREAMER_SRC src/ros_stream_subscription_installer.cpp src/subscriber_callbacks.cpp src/streamer.cpp)
add_executable(${PROJECT_NAME} src/main.cpp ${KINESIS_VIDEO_STREAMER_SRC})
add_library(${PROJECT_NAME}_lib ${KINESIS_VIDEO_STREAMER_SRC})
## Specify include directories
target_include_directories(${PROJECT_NAME} PRIVATE include ${catkin_INCLUDE_DIRS} ${kinesis_manager_INCLUDE_DIRS})
target_include_directories(${PROJECT_NAME}_lib PUBLIC include ${catkin_INCLUDE_DIRS} ${kinesis_manager_INCLUDE_DIRS})
## Specify libraries to link a library or executable target against
target_link_libraries(${PROJECT_NAME} ${catkin_LIBRARIES} ${kinesis_manager_LIBRARIES} ${PRODUCER_LIBRARY} ${LOG_LIBRARY} ${CURL_LIBRARIES})
target_link_libraries(${PROJECT_NAME}_lib ${catkin_LIBRARIES} ${kinesis_manager_LIBRARIES} ${PRODUCER_LIBRARY} ${CURL_LIBRARIES})

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

## Mark executables and/or libraries for installation
install(TARGETS ${PROJECT_NAME}
  ARCHIVE DESTINATION ${CATKIN_PACKAGE_LIB_DESTINATION}
  LIBRARY DESTINATION ${CATKIN_PACKAGE_LIB_DESTINATION}
  RUNTIME DESTINATION ${CATKIN_PACKAGE_BIN_DESTINATION}
)
install(DIRECTORY launch/ DESTINATION ${CATKIN_PACKAGE_SHARE_DESTINATION}/launch)
install(DIRECTORY config/ DESTINATION ${CATKIN_PACKAGE_SHARE_DESTINATION}/config)
install(FILES kvs_log_configuration DESTINATION ${CATKIN_PACKAGE_SHARE_DESTINATION})

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

if(CATKIN_ENABLE_TESTING)
  find_package(rostest REQUIRED)
  add_rostest_gtest(test_kinesis_video_streamer
    test/test_kinesis_video_streamer.test
    test/kinesis_video_streamer_test.cpp
  )
  target_include_directories(test_kinesis_video_streamer PRIVATE
    include
    ${catkin_INCLUDE_DIRS}
    ${kinesis_manager_INCLUDE_DIRS}
  )
  target_link_libraries(test_kinesis_video_streamer
    ${PROJECT_NAME}_lib
    ${catkin_LIBRARIES}
  )

  find_package(GMock QUIET)
  if(GMOCK_FOUND)
    add_rostest_gmock(test_streamer_node
    	test/test_streamer_node.test
    	test/streamer_node_test.cpp
    )
    target_include_directories(test_streamer_node PRIVATE
      include
      ${catkin_INCLUDE_DIRS}
      ${kinesis_manager_INCLUDE_DIRS}
      ${GMOCK_INCLUDE_DIRS}
    )
    target_link_libraries(test_streamer_node
      ${PROJECT_NAME}_lib
      ${catkin_LIBRARIES}
      ${GMOCK_BOTH_LIBRARIES}
    )
  else()
    include_directories(/usr/include/gmock /usr/src/gmock)
    add_library(${PROJECT_NAME}_libgmock SHARED /usr/src/gmock/src/gmock-all.cc)

    add_rostest_gtest(test_streamer_node
      test/test_streamer_node.test
      test/streamer_node_test.cpp
    )
    target_include_directories(test_streamer_node PRIVATE
      include
      ${catkin_INCLUDE_DIRS}
      ${kinesis_manager_INCLUDE_DIRS}
    )
    target_link_libraries(test_streamer_node
      ${PROJECT_NAME}_lib
      ${catkin_LIBRARIES}
      ${PROJECT_NAME}_libgmock
    )
  endif()
endif()
