cmake_minimum_required(VERSION 3.0.2)
project(robot_image_geometry VERSION 1.0.0 LANGUAGES CXX)

# ========================================================
# Detect build mode
# ========================================================
if(DEFINED CATKIN_DEVEL_PREFIX OR DEFINED CATKIN_TOPLEVEL)
  set(BUILDING_WITH_CATKIN TRUE)
  message(STATUS "Building robot_image_geometry with Catkin")
else()
  set(BUILDING_WITH_CATKIN FALSE)
  message(STATUS "Building robot_image_geometry with Standalone CMake")
endif()

# ========================================================
# C++ Standard
# ========================================================
set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(CMAKE_CXX_EXTENSIONS OFF)

set(CMAKE_EXPORT_COMPILE_COMMANDS ON)

add_compile_options(
  -Wall
  -Wextra
  -Wpedantic
)

# ========================================================
# Common dependencies
# ========================================================
find_package(OpenCV REQUIRED)

# ========================================================
# Standalone mode
# ========================================================
if(NOT BUILDING_WITH_CATKIN)

  set(CMAKE_POSITION_INDEPENDENT_CODE ON)

  set(CMAKE_BUILD_RPATH_USE_ORIGIN TRUE)
  set(CMAKE_INSTALL_RPATH_USE_LINK_PATH TRUE)
  set(CMAKE_BUILD_RPATH "${CMAKE_BINARY_DIR}")

  set(PACKAGES_DIR
    robot_sensor_msgs
  )

  include_directories(
    include
    ${OpenCV_INCLUDE_DIRS}
  )

# ========================================================
# Catkin mode
# ========================================================
else()

  find_package(catkin REQUIRED COMPONENTS
    robot_sensor_msgs
  )

  catkin_package(
    INCLUDE_DIRS
      include

    LIBRARIES
      ${PROJECT_NAME}

    CATKIN_DEPENDS
      robot_sensor_msgs

    DEPENDS
      OpenCV
  )

  include_directories(
    include
    ${catkin_INCLUDE_DIRS}
    ${OpenCV_INCLUDE_DIRS}
  )

endif()

# ========================================================
# Library
# ========================================================
add_library(${PROJECT_NAME} SHARED

  src/pinhole_camera_model.cpp
)

target_include_directories(${PROJECT_NAME}
  PUBLIC
    $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include>
    $<INSTALL_INTERFACE:include>
)

# ========================================================
# Link
# ========================================================
if(BUILDING_WITH_CATKIN)

  add_dependencies(
    ${PROJECT_NAME}
    ${catkin_EXPORTED_TARGETS}
  )

  target_link_libraries(${PROJECT_NAME}

    PUBLIC
      ${catkin_LIBRARIES}
      ${OpenCV_LIBRARIES}
  )

else()

  target_link_libraries(${PROJECT_NAME}

    PUBLIC
      ${PACKAGES_DIR}
      ${OpenCV_LIBRARIES}
  )

  set_target_properties(${PROJECT_NAME}
    PROPERTIES

    LIBRARY_OUTPUT_DIRECTORY
      ${CMAKE_BINARY_DIR}

    BUILD_RPATH
      "${CMAKE_BINARY_DIR}"

    INSTALL_RPATH
      "${CMAKE_INSTALL_PREFIX}/lib"
  )

endif()

# ========================================================
# Install
# ========================================================
if(BUILDING_WITH_CATKIN)

  install(
    TARGETS ${PROJECT_NAME}

    ARCHIVE DESTINATION
      ${CATKIN_PACKAGE_LIB_DESTINATION}

    LIBRARY DESTINATION
      ${CATKIN_PACKAGE_LIB_DESTINATION}

    RUNTIME DESTINATION
      ${CATKIN_GLOBAL_BIN_DESTINATION}
  )

  install(
    DIRECTORY include/${PROJECT_NAME}/
    DESTINATION ${CATKIN_PACKAGE_INCLUDE_DESTINATION}
    FILES_MATCHING PATTERN "*.h"
  )

else()

  install(
    TARGETS ${PROJECT_NAME}
    EXPORT ${PROJECT_NAME}-targets

    ARCHIVE DESTINATION lib
    LIBRARY DESTINATION lib
    RUNTIME DESTINATION bin
  )

  install(
    EXPORT ${PROJECT_NAME}-targets
    FILE ${PROJECT_NAME}-targets.cmake
    NAMESPACE ${PROJECT_NAME}::
    DESTINATION lib/cmake/${PROJECT_NAME}
  )

  install(
    DIRECTORY include/${PROJECT_NAME}/
    DESTINATION include
    FILES_MATCHING PATTERN "*.h"
  )

endif()

# ========================================================
# Tests
# ========================================================
if(BUILDING_WITH_CATKIN)

  if(CATKIN_ENABLE_TESTING AND EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/test)
    add_subdirectory(test)
  endif()

endif()