cmake_minimum_required(VERSION 3.16)
project(visual_odometry LANGUAGES CXX)


# Set the C++ standard
set(CMAKE_CXX_STANDARD 20)
set(CMAKE_CXX_STANDARD_REQUIRED True)
set(CMAKE_EXPORT_COMPILE_COMMANDS ON)
# set(BUILD_TESTING ON)


# TODO: Fix this if we use it or remove from project
#set(CMAKE_CXX_CLANG_TIDY clang-tidy; -checks=*;)


# OpenCV package
find_package(OpenCV REQUIRED)
# include_directories(${OpenCV_INCLUDE_DIRS})

# JSON library 
include(FetchContent)
FetchContent_Declare(
  nlohmann_json
  GIT_REPOSITORY https://github.com/nlohmann/json.git
  GIT_TAG        v3.11.3
)
FetchContent_MakeAvailable(nlohmann_json)

# cpuporfile
find_library(UPROFILE_LIB cppuprofile PATHS /usr/local/lib REQUIRED)

# Glob source and header files
file(GLOB SOURCES CONFIGURE_DEPENDS ${PROJECT_SOURCE_DIR}/src/*.cpp)
file(GLOB HEADERS CONFIGURE_DEPENDS ${PROJECT_SOURCE_DIR}/include/*.hpp ${PROJECT_SOURCE_DIR}/include/**/*.hpp)

# Create static library 
add_library(${PROJECT_NAME} STATIC ${SOURCES} ${HEADERS})

# Include directories
target_include_directories(${PROJECT_NAME} PUBLIC
  $<BUILD_INTERFACE:${PROJECT_SOURCE_DIR}/include>
  $<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}>
  ${OpenCV_INCLUDE_DIRS}        
  /usr/local/include/cppuprofile   
)

# Link librarys
target_link_libraries(
  ${PROJECT_NAME} ${OpenCV_LIBS}
  nlohmann_json::nlohmann_json
  ${UPROFILE_LIB} 
)

# Add compile options based on configuration
target_compile_options(${PROJECT_NAME} PUBLIC
  $<$<CONFIG:Debug>:-ggdb3;-Og>
  $<$<CONFIG:RelWithDebInfo>:-ggdb3;-O3>
  $<$<CONFIG:Release>:-O3>
  -Wall
  -Wextra
  -Wno-sign-compare
)


# Install the library and headers
include(GNUInstallDirs)
install(TARGETS ${PROJECT_NAME}
       EXPORT ${PROJECT_NAME}_Targets
       ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}
       LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
       RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR})


install(DIRECTORY ${PROJECT_SOURCE_DIR}/include/ DESTINATION ${CMAKE_INSTALL_INCLUDEDIR})

enable_testing()

# Add a main executable for the library

if ("${BUILD_TESTING}" STREQUAL "" OR BUILD_TESTING)
  
  add_executable(${PROJECT_NAME}_example ${PROJECT_SOURCE_DIR}/example/main.cpp)
  target_link_libraries(${PROJECT_NAME}_example PRIVATE ${PROJECT_NAME})
  target_include_directories(${PROJECT_NAME}_example PRIVATE ${PROJECT_SOURCE_DIR}/include)


  include(CTest)
  enable_testing()

  file(GLOB TEST_SOURCES CONFIGURE_DEPENDS ${PROJECT_SOURCE_DIR}/test/*.cpp)
  
  foreach(TEST_FILE ${TEST_SOURCES})
  get_filename_component(TEST_NAME ${TEST_FILE} NAME_WE)
  add_executable(${TEST_NAME} ${TEST_FILE})
  target_link_libraries(${TEST_NAME} PRIVATE ${PROJECT_NAME} Catch2::Catch2WithMain)
  add_test(NAME ${TEST_NAME} COMMAND ${TEST_NAME})
  endforeach()
endif()

