cmake_minimum_required(VERSION 3.5)
project(cloudwatch_logger)

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

# Enable strict compiler flags if possible.
include(CheckCXXCompilerFlag)
# Removed -Wmissing-declarations until gmock is ignored
# removed -Werror=pedantic until ros.h is fixed
set(FLAGS -Wno-long-long -Wall -Wextra -Wcast-align -Wcast-qual -Wformat -Wwrite-strings)
foreach(FLAG ${FLAGS})
  check_cxx_compiler_flag(${FLAG} R${FLAG})
  if(${R${FLAG}})
    set(WARNING_CXX_FLAGS "${WARNING_CXX_FLAGS} ${FLAG}")
  endif()
endforeach()

if(NOT DEFINED CXX_DISABLE_WERROR)
  set(WARNING_CXX_FLAGS "-Werror ${WARNING_CXX_FLAGS}")
endif()
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${WARNING_CXX_FLAGS}")

find_package(ament_cmake REQUIRED)
find_package(rclcpp REQUIRED)
find_package(rcl_interfaces REQUIRED)
find_package(std_srvs REQUIRED)
find_package(aws_common REQUIRED)
find_package(aws_ros2_common REQUIRED)
find_package(cloudwatch_logs_common REQUIRED)
find_package(dataflow_lite REQUIRED)
find_package(file_management REQUIRED)

set(CLOUDWATCH_LOGGER_LIBRARY_TARGET ${PROJECT_NAME}_lib)


###########
## Build ##
###########

add_library(${CLOUDWATCH_LOGGER_LIBRARY_TARGET}
        src/log_node.cpp
        src/log_node_param_helper.cpp
        )
ament_target_dependencies(${CLOUDWATCH_LOGGER_LIBRARY_TARGET}
        rclcpp
        rcl_interfaces
        std_msgs
        std_srvs
        aws_common
        aws_ros2_common
        AWSSDK
        cloudwatch_logs_common
        dataflow_lite
        file_management
        )
## Specify additional locations of header files
include_directories(
        include
        )

## Declare a C++ executable
add_executable(${PROJECT_NAME}
        src/main.cpp
        )
target_link_libraries(${PROJECT_NAME}
        ${CLOUDWATCH_LOGGER_LIBRARY_TARGET}
        )


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

install(TARGETS ${PROJECT_NAME} ${CLOUDWATCH_LOGGER_LIBRARY_TARGET}
        ARCHIVE DESTINATION lib
        LIBRARY DESTINATION lib
        RUNTIME DESTINATION lib/${PROJECT_NAME}
        )
install(DIRECTORY include/
        DESTINATION include
        FILES_MATCHING PATTERN "*.h"
        )
install(DIRECTORY config/
        DESTINATION share/${PROJECT_NAME}/config
        )
install(DIRECTORY launch/
        DESTINATION share/${PROJECT_NAME}/launch
        )

ament_export_include_directories(include)

ament_export_dependencies(ament_cmake)
ament_export_dependencies(rcl_interfaces)
ament_export_dependencies(rclcpp)
ament_export_dependencies(aws_common)
ament_export_dependencies(aws_ros2_common)
ament_export_dependencies(cloudwatch_logs_common)
ament_export_dependencies(dataflow_lite)
ament_export_dependencies(file_management)

ament_package()


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

if(BUILD_TESTING)
  find_package(ament_cmake_gmock REQUIRED)
  
  ament_add_gmock(test_log_node
          test/log_node_test.cpp
          )
  target_include_directories(test_log_node PRIVATE
          include
          ${cloudwatch_logs_common_INCLUDE_DIRS}
          ${dataflow_lite_INCLUDE_DIRS}
          ${file_management_INCLUDE_DIRS}
          ${AWSSDK_INCLUDE_DIRS}
          ${aws_common_INCLUDE_DIRS}
          ${rclcpp_INCLUDE_DIRS}
          )
  target_link_libraries(test_log_node
          ${CLOUDWATCH_LOGGER_LIBRARY_TARGET}
          )

  ament_add_gmock(test_log_node_param_helper
          test/log_node_param_helper_test.cpp
          )
  target_include_directories(test_log_node_param_helper PRIVATE
          include
          ${cloudwatch_logs_common_INCLUDE_DIRS}
          ${dataflow_lite_INCLUDE_DIRS}
          ${file_management_INCLUDE_DIRS}
          ${AWSSDK_INCLUDE_DIRS}
          ${aws_common_INCLUDE_DIRS}
          ${rclcpp_INCLUDE_DIRS}
          )
  target_link_libraries(test_log_node_param_helper
          ${CLOUDWATCH_LOGGER_LIBRARY_TARGET}
          )
endif()
