cmake_minimum_required(VERSION 3.12)
project(auto_apms_util)

if(CMAKE_COMPILER_IS_GNUCXX OR CMAKE_CXX_COMPILER_ID MATCHES "Clang")
    add_compile_options(-Wall -Wextra -Wpedantic)
endif()

find_package(ament_cmake REQUIRED)
find_package(ament_cmake_python REQUIRED)
find_package(rclcpp REQUIRED)
find_package(rcpputils REQUIRED)
find_package(rclcpp_action REQUIRED)
find_package(ament_index_cpp REQUIRED)
find_package(generate_parameter_library REQUIRED)
find_package(pluginlib REQUIRED)
find_package(yaml_cpp_vendor REQUIRED)
find_package(yaml-cpp REQUIRED)

# ActionWrapper parameter names
set(_AUTO_APMS_UTIL__ACTION_PARAM_LOOP_RATE "loop_rate")
set(_AUTO_APMS_UTIL__ACTION_PARAM_FEEDBACK_RATE "feedback_rate")

# Plugin resource type name according to pluginlib convention.
# We don't rely on pluginlib's resource parsing, but it's nice to stick to conventions anyways.
set(_AUTO_APMS_UTIL__RESOURCE_TYPE_NAME__PLUGINLIB "auto_apms_util__pluginlib__plugins")

#
# ------------ Library --------------
#

# Generate parameter headers employing https://github.com/PickNikRobotics/generate_parameter_library
configure_file("config/action_wrapper_params.yaml.in" "${PROJECT_BINARY_DIR}/${PROJECT_NAME}/action_wrapper_params.yaml")
set(_temp ${CMAKE_CURRENT_SOURCE_DIR})  # WORKAROUND: temporarily change CMAKE_CURRENT_SOURCE_DIR since the function doesn't allow to load the parameter definition file from a different directory
set(CMAKE_CURRENT_SOURCE_DIR "${PROJECT_BINARY_DIR}/${PROJECT_NAME}")
generate_parameter_library(action_wrapper_params "action_wrapper_params.yaml")
set(CMAKE_CURRENT_SOURCE_DIR ${_temp})

add_library(${PROJECT_NAME} SHARED
  "src/action_wrapper.cpp"
  "src/string.cpp"
  "src/resource.cpp"
  "src/logging.cpp"
  "src/filesystem.cpp"
)
target_include_directories(${PROJECT_NAME} PUBLIC
  $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include>
  $<INSTALL_INTERFACE:include>
)
target_compile_definitions(${PROJECT_NAME} PRIVATE
  _AUTO_APMS_UTIL__ACTION_PARAM_LOOP_RATE="${_AUTO_APMS_UTIL__ACTION_PARAM_LOOP_RATE}"
  _AUTO_APMS_UTIL__ACTION_PARAM_FEEDBACK_RATE="${_AUTO_APMS_UTIL__ACTION_PARAM_FEEDBACK_RATE}"
)
target_compile_definitions(${PROJECT_NAME} PUBLIC
  _AUTO_APMS_UTIL__RESOURCE_TYPE_NAME__PLUGINLIB="${_AUTO_APMS_UTIL__RESOURCE_TYPE_NAME__PLUGINLIB}"
)
target_link_libraries(${PROJECT_NAME} PUBLIC
  rclcpp::rclcpp
  rcpputils::rcpputils
  rclcpp_action::rclcpp_action
  ament_index_cpp::ament_index_cpp
  pluginlib::pluginlib
  yaml-cpp::yaml-cpp

  action_wrapper_params
)

# Install the version header to the autogenerated headers dir also used by rosidl generators
ament_generate_version_header(${PROJECT_NAME} HEADER_PATH "${PROJECT_NAME}/version.hpp")

#
# ------------ Testing --------------
#

if(BUILD_TESTING)
  find_package(ament_cmake_copyright REQUIRED)
  find_package(ament_cmake_gtest REQUIRED)
  find_package(auto_apms_interfaces REQUIRED)

  ament_copyright()

  ament_add_gtest(${PROJECT_NAME}_unit_tests
    "test/unit/main.cpp"
  )
  target_link_libraries(${PROJECT_NAME}_unit_tests
    ${auto_apms_interfaces_TARGETS}
    ${PROJECT_NAME}
  )
endif()

#
# ------------ Packaging --------------
#

# Python tools
ament_python_install_package(${PROJECT_NAME})

# Export libraries
install(
  TARGETS
  ${PROJECT_NAME}
  action_wrapper_params
  EXPORT export_${PROJECT_NAME}
  LIBRARY DESTINATION lib
  ARCHIVE DESTINATION lib
  RUNTIME DESTINATION bin
)
ament_export_targets(export_${PROJECT_NAME} HAS_LIBRARY_TARGET)
ament_export_dependencies(
  rclcpp
  rcpputils
  rclcpp_action
  ament_index_cpp
  pluginlib
  yaml_cpp_vendor
  yaml-cpp
)

install(
  DIRECTORY include/${PROJECT_NAME}
  DESTINATION include
)

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

install(
  DIRECTORY cmake
  DESTINATION share/${PROJECT_NAME}
)

ament_package(CONFIG_EXTRAS "auto_apms_util-extras.cmake.in")
