cmake_minimum_required(VERSION 3.22)
project(j7s_diagnostics_ros CXX)

find_package(ament_cmake REQUIRED)
find_package(rclcpp REQUIRED)
find_package(diagnostic_msgs REQUIRED)
find_package(fmt REQUIRED)
include(FetchContent)

FetchContent_Declare(
    Corrosion
    GIT_REPOSITORY https://github.com/corrosion-rs/corrosion.git
    GIT_TAG master
)
FetchContent_MakeAvailable(Corrosion)

set(CMAKE_CXX_STANDARD 20)

# Rust bindings.
corrosion_import_crate(MANIFEST_PATH j7s_diagnostics_cxx/Cargo.toml)
corrosion_add_cxxbridge(j7s_diagnostics_cxx_bridge
  CRATE j7s_diagnostics_cxx
  FILES lib.rs)
corrosion_install(TARGETS j7s_diagnostics_cxx
  EXPORT export_${PROJECT_NAME}
  ARCHIVE DESTINATION lib
  LIBRARY DESTINATION lib
  RUNTIME DESTINATION bin
)

# The rest of the stuff.
# Note that rust/cxx doesn't support shared libraries so
# this library (and anything that uses it) will have
# to be statically linked.
add_library(conversions STATIC src/conversions.cpp)
target_include_directories(conversions PUBLIC
  $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include>
  $<INSTALL_INTERFACE:include/${PROJECT_NAME}>)
target_link_libraries(conversions PUBLIC
            j7s_diagnostics_cxx_bridge
            j7s_diagnostics_cxx
            fmt
            ${diagnostic_msgs_TARGETS}
)

add_executable(test_bin src/test.cpp)
target_include_directories(test_bin PUBLIC
  $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include>
  $<INSTALL_INTERFACE:include/${PROJECT_NAME}>)
target_link_libraries(test_bin PRIVATE
    conversions
)

add_executable(j7s_diagnostic_node src/j7s_diagnostic_node.cpp)
target_include_directories(j7s_diagnostic_node PUBLIC
  $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include>
  $<INSTALL_INTERFACE:include/${PROJECT_NAME}>)
target_link_libraries(j7s_diagnostic_node PRIVATE
    conversions
    rclcpp::rclcpp
)

install(TARGETS
  conversions
  test_bin
  j7s_diagnostic_node
  DESTINATION lib/${PROJECT_NAME})

ament_export_targets(export_${PROJECT_NAME})
ament_package()
