# TODO: UPDATE LICENCE AND DESCRIPTION
# Minimal CMake configuration for Valhalla
#
# Builds libvalhalla and minimal collection of programs.
#
# This is NOT equivalent to the official Valhalla build configuration based on GNU Autotools.
# This is NOT suitable for building complete Valhalla suite.
# This is secondary build configuration provided for convenient development
# on Windows and using CMake-enabled IDEs.
#
# This files is adaptation of the file for the mfw plugin from https://gitlab.com/omprussia/libraries/mfw-offline-routing/-/blob/master/vendors/valhalla.cmake?ref_type=heads
cmake_minimum_required(VERSION 3.13 FATAL_ERROR)
project(valhalla LANGUAGES CXX C)

include(GNUInstallDirs)

find_package(protobuf CONFIG REQUIRED)

set(valhalla_protobuf_targets protobuf::protobuf)
set(Protobuf_USE_STATIC_LIBS OFF)

include(${Protobuf_package_path}/lib/cmake/protobuf/protobuf-config.cmake)
include(${Protobuf_package_path}/lib/cmake/protobuf/protobuf-module.cmake)
include(${Protobuf_package_path}/lib/cmake/protobuf/protobuf-options.cmake)
include(${Protobuf_package_path}/lib/cmake/protobuf/protobuf-targets.cmake)


set(VALHALLA_SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR})
set(VALHALLA_BUILD_DIR ${CMAKE_CURRENT_BINARY_DIR})
list(INSERT CMAKE_MODULE_PATH 0 ${VALHALLA_SOURCE_DIR}/cmake)

# https://github.com/valhalla/valhalla/blob/48b339bacc18a221471307bf7ec631ac0ac9714a/docs/docs/building.md#include-valhalla-as-a-project-dependency
set(date_include_dir ${VALHALLA_SOURCE_DIR}/third_party/date/include)
set(rapidjson_include_dir ${VALHALLA_SOURCE_DIR}/third_party/rapidjson/include)

# install third_party
# https://github.com/Tencent/rapidjson/tree/083f359f5c36198accc2b9360ce1e32a333231d9?tab=readme-ov-file#installation
install(DIRECTORY ${rapidjson_include_dir}/
  DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}")
install(DIRECTORY ${date_include_dir}/
  DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}")

# Reduce number of supported locales to improve build

file(READ ${VALHALLA_SOURCE_DIR}/cmake/Binary2Header.cmake TEXT)
string(FIND "${TEXT}" "\"\${source}/*.json\"" containsInvalidString)

if (${containsInvalidString} GREATER -1)
    string(REPLACE "\"\${source}/*.json\"" "\"\${source}/ru-RU.json" "\${source}/en-US.json\"" TEXT "${TEXT}")
    file(WRITE ${VALHALLA_SOURCE_DIR}/cmake/Binary2Header.cmake "${TEXT}")
endif()

##Fix valhalla dependencies with fake interfaces
add_library(libprime_server INTERFACE IMPORTED)
add_library(CURL::CURL INTERFACE IMPORTED)
# add_library(Threads::Threads INTERFACE IMPORTED)

set(CMAKE_CXX_STANDARD 17 CACHE STRING "C++ language version to use (default is 17)")
option(ENABLE_TOOLS "Enable Valhalla tools" OFF)
option(ENABLE_DATA_TOOLS "Enable Valhalla data tools" OFF)
option(ENABLE_SERVICES "Enable Valhalla services" OFF)
option(ENABLE_HTTP "Enable the use of CURL" OFF)
option(ENABLE_PYTHON_BINDINGS "Enable Python bindings" OFF)
option(ENABLE_CCACHE "Speed up incremental rebuilds via ccache" OFF)
option(ENABLE_COVERAGE "Build with coverage instrumentalisation" OFF)
option(ENABLE_COMPILER_WARNINGS "Build with compiler warnings" OFF)
option(ENABLE_SANITIZERS "Use all the integrated sanitizers for Debug build" OFF)
option(ENABLE_ADDRESS_SANITIZER "Use memory sanitizer for Debug build" OFF)
option(ENABLE_UNDEFINED_SANITIZER "Use UB sanitizer for Debug build" OFF)
option(ENABLE_TESTS "Enable Valhalla tests" OFF)
option(ENABLE_WERROR "Convert compiler warnings to errors. Requires ENABLE_COMPILER_WARNINGS=ON to take effect" OFF)
option(ENABLE_BENCHMARKS "Enable microbenchmarking" OFF)
option(ENABLE_THREAD_SAFE_TILE_REF_COUNT "If ON uses shared_ptr as tile reference(i.e. it is thread safe)" OFF)
option(ENABLE_SINGLE_FILES_WERROR "Convert compiler warnings to errors for single files" OFF)
option(ENABLE_STATIC_LIBRARY_MODULES "If ON builds Valhalla modules as STATIC library targets" OFF)

set(LOGGING_LEVEL "" CACHE STRING "Logging level, default is INFO")
set_property(CACHE LOGGING_LEVEL PROPERTY STRINGS "NONE;ALL;ERROR;WARN;INFO;DEBUG;TRACE")
set_property(GLOBAL PROPERTY USE_FOLDERS ON)
set(ENABLE_WERROR OFF)

set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(CMAKE_EXPORT_COMPILE_COMMANDS ON)
set(THREADS_PREFER_PTHREAD_FLAG ON)
set(ENABLE_STATIC_LIBRARY_MODULES OFF)

set(CMAKE_INTERPROCEDURAL_OPTIMIZATION_MINSIZEREL ON)
set(CMAKE_POSITION_INDEPENDENT_CODE ON)

function(create_source_groups prefix)
  foreach(file ${ARGN})
    get_filename_component(file "${file}" ABSOLUTE)
    string(FIND "${file}" "${PROJECT_BINARY_DIR}/" pos)
    if(pos EQUAL 0)
      source_group(TREE "${PROJECT_BINARY_DIR}/" PREFIX "Generated Files" FILES "${file}")
    else()
      source_group(TREE "${PROJECT_SOURCE_DIR}/" PREFIX "${prefix}" FILES "${file}")
    endif()
  endforeach()
endfunction()

include(${VALHALLA_SOURCE_DIR}/cmake/SanitizerOptions.cmake)

set(CMAKE_THREAD_PREFER_PTHREAD TRUE)
set(THREADS_PREFER_PTHREAD_FLAG TRUE)

find_package(ZLIB REQUIRED)

find_package(CURL REQUIRED)
set_target_properties(CURL::CURL PROPERTIES
INTERFACE_INCLUDE_DIRECTORIES "${CURL_INCLUDE_DIR}"
INTERFACE_COMPILE_DEFINITIONS CURL_STATICLIB)
link_libraries(${CURL_LIBRARIES})

find_package(Boost REQUIRED)
add_definitions(-DBOOST_NO_CXX11_SCOPED_ENUMS)
add_definitions(-DBOOST_ALLOW_DEPRECATED_HEADERS)
add_definitions(-DBOOST_BIND_GLOBAL_PLACEHOLDERS)

if (ENABLE_THREAD_SAFE_TILE_REF_COUNT)
 add_definitions(-DENABLE_THREAD_SAFE_TILE_REF_COUNT)
endif ()

set(PKG_CONFIG_FOUND OFF)

## libvalhalla
add_subdirectory(src)

set(valhalla_hdrs
    ${VALHALLA_SOURCE_DIR}/valhalla/valhalla.h
    ${VALHALLA_SOURCE_DIR}/valhalla/worker.h
    ${VALHALLA_SOURCE_DIR}/valhalla/config.h
    ${VALHALLA_SOURCE_DIR}/valhalla/filesystem.h
    ${VALHALLA_SOURCE_DIR}/valhalla/proto_conversions.h
    ${VALHALLA_SOURCE_DIR}/valhalla/config.h
)

install(FILES ${valhalla_hdrs}
  DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}/valhalla"
)
