cmake_minimum_required(VERSION 3.14)
project(mcap_vendor LANGUAGES C CXX)

## Dependencies
find_package(ament_cmake REQUIRED)
find_package(liblz4_vendor REQUIRED)
find_package(lz4 REQUIRED)
find_package(zstd_vendor REQUIRED)
find_package(zstd REQUIRED)

## Compile options
if(NOT CMAKE_CXX_STANDARD)
  set(CMAKE_CXX_STANDARD 17)
  set(CMAKE_CXX_STANDARD_REQUIRED ON)
  set(CMAKE_CXX_EXTENSIONS OFF)
endif()
if(CMAKE_COMPILER_IS_GNUCXX OR CMAKE_CXX_COMPILER_ID MATCHES "Clang")
  add_compile_options(-Wall -Wextra -Wpedantic)
endif()
if (MSVC)
  add_compile_options(/W4 /WX
    /wd4251 # suppress warning about having template instances (such as std::string) as public class members
  )
  # suppress error disallowing `fopen` in favor of `fopen_s`
  add_compile_definitions(_CRT_SECURE_NO_WARNINGS)
endif()

## Define vendor macro
macro(build_mcap_vendor)
  add_library(mcap SHARED
    src/main.cpp
  )

  set(_mcap_include_dir ${CMAKE_CURRENT_SOURCE_DIR}/include)
  file(GLOB _mcap_installed_headers
    ${_mcap_include_dir}/mcap/*.hpp
    ${_mcap_include_dir}/mcap/*.inl
  )

  target_include_directories(mcap PUBLIC
    "$<BUILD_INTERFACE:${_mcap_include_dir}>"
    "$<INSTALL_INTERFACE:include/${PROJECT_NAME}>"
  )
  target_link_libraries(mcap LZ4::lz4 zstd::zstd)

  install(
    FILES ${_mcap_installed_headers}
    DESTINATION include/${PROJECT_NAME}/mcap
  )

  install(
    TARGETS mcap
    EXPORT mcap
    ARCHIVE DESTINATION lib
    LIBRARY DESTINATION lib
    RUNTIME DESTINATION bin
  )
endmacro()

## Call vendor macro
build_mcap_vendor()

ament_export_include_directories(include/${PROJECT_NAME})
ament_export_targets(mcap HAS_LIBRARY_TARGET)
ament_export_dependencies(liblz4_vendor lz4 zstd_vendor zstd)

## Package
ament_package()
