project(link C CXX)
cmake_minimum_required(VERSION 3.1)
set(CMAKE_MODULE_PATH "${CMAKE_SOURCE_DIR}/cmake" ${CMAKE_MODULE_PATH})
set(CMAKE_EXPORT_COMPILE_COMMANDS ON)

set(FOLLY_SHARED ON)

include(CheckCXXSourceCompiles)

find_package(GFlags REQUIRED)
find_package(Glog REQUIRED)
find_package(Threads REQUIRED)
find_package(Wangle REQUIRED)
find_package(Fizz REQUIRED)
find_package(OpenSSL 1.1.1 REQUIRED)
find_package(OnedataHelpers REQUIRED)
find_package(Boost COMPONENTS filesystem log thread context system iostreams regex REQUIRED)
find_library(PROXYGEN_LIBRARY proxygen REQUIRED)
find_package(ZLIB)
find_package(AWSSDK REQUIRED COMPONENTS s3)
set(AWS_SDK_LIBRARIES
        ${AWSSDK_LINK_LIBRARIES}
        ${AWSSDK_PLATFORM_DEPS}
        ${CURL_LIBRARIES})

find_library(CEPHCOMMON_LIBRARY "ceph-common" NAMES "ceph-common" "libceph-common.so.2" "libceph-common.so.0" PATH_SUFFIXES "ceph")
find_library(RADOS_LIBRARY rados)
find_library(RADOSSTRIPER_LIBRARY radosstriper)

include(/usr/share/xrootd/cmake/XRootDConfig.cmake)
find_package(XRootD REQUIRED)

find_package(NFS REQUIRED)

add_subdirectory(proto)

set(SOURCES
  src/authCache.cpp
  src/client.cpp
  src/controlService.cpp
  src/fetchManager.cpp
  src/handleCache.cpp
  src/main.cpp
  src/reader.cpp
  src/server.cpp
  src/serverSideLink.cpp
  src/service.cpp
  src/shaper.cpp
  src/shaperMap.cpp
  src/shaperTimer.cpp
  src/ssl.cpp
  src/storage.cpp)

if (DEFINED ENV{ONEDATA_SCL})
  execute_process(
  COMMAND pkg-config --libs-only-l glusterfs-api botan-1.10 tbb fuse3
  OUTPUT_VARIABLE PKG_CONFIG_RESULTS)
else()
  execute_process(
  COMMAND pkg-config --libs-only-l glusterfs-api botan-2 tbb fuse3
  OUTPUT_VARIABLE PKG_CONFIG_RESULTS)
endif()

string(REGEX REPLACE "[^a-zA-Z0-9\\.\\-]" ";"
  PKG_CONFIG_RESULTS ${PKG_CONFIG_RESULTS})

add_executable(link ${SOURCES})
target_compile_options(link PRIVATE "-std=c++17" "-pthread" "-fno-omit-frame-pointer")
target_compile_definitions(link PUBLIC
  "-DASIO_STANDALONE"
  "-DWITH_CEPH=1"
  "-DWITH_S3=1"
  "-DWITH_SWIFT=1"
  "-DWITH_GLUSTERFS=1"
  "-DWITH_WEBDAV=1"
  "-DWITH_XROOTD=1"
  "-DWITH_NFS=1"
  "-DSPDLOG_COMPILED_LIB"
  "-DSPDLOG_FMT_EXTERNAL"
  "-D_FILE_OFFSET_BITS=64")
set(SPDLOG_INCLUDE_DIRS ${ONEDATA_HELPERS_INCLUDE_DIR}/../../deps/spdlog)
target_include_directories(link PUBLIC
  ${ONEDATA_HELPERS_INCLUDE_DIR}
  "${ONEDATA_HELPERS_INCLUDE_DIR}/../../src"
  ${DOUBLE_CONVERSION_INCLUDE_DIR}
  ${FOLLY_INCLUDE_DIR}
  ${SPDLOG_INCLUDE_DIRS}
  ${GFLAGS_INCLUDE_DIR}
  ${LIBGLOG_INCLUDE_DIR}
  ${WANGLE_INCLUDE_DIR}
  ${Boost_INCLUDE_DIRS}
  ${XROOTD_INCLUDE_DIRS})
target_link_libraries(link
  ${ONEDATA_HELPERS_LIBRARY}
  ${DOUBLE_CONVERSION_LIBARY}
  ${GFLAGS_LIBRARIES}
  ${LIBGLOG_LIBRARY}
  ${CMAKE_THREAD_LIBS_INIT}
  ${OPENSSL_LIBRARIES}
  ${Boost_LIBRARIES}
  ${RADOSSTRIPER_LIBRARY}
  ${RADOS_LIBRARY}
  ${CEPHCOMMON_LIBRARY}
  ${XROOTD_LIBRARIES}
  ${NFS_LIBRARY}
  ${AWS_SDK_LIBRARIES}
  ZLIB::ZLIB
  -lcurl -lPocoUtil -lPocoXML -lPocoNet -lPocoJSON -lPocoFoundation
  -lnss3 -lnspr4 -liberty -levent
  -lspdlog -lfmt -ldl -ljemalloc -lunwind -lprofiler
  -lproxygen -lwangle -lfizz -lfolly -lssl -lcrypto
  -lz -lsodium -ldouble-conversion
  ${PKG_CONFIG_RESULTS}
  proto)

find_program(
    CLANG_TIDY
    NAMES "run-clang-tidy"
    DOC "Path to run-clang-tidy script")

if(CLANG_TIDY)
    include(ProcessorCount)
    ProcessorCount(CLANG_TIDY_PARALLEL_JOBS)
    message(STATUS
        "run-clang-tidy script found: ${CLANG_TIDY} - adding target clang-tidy")
    set(CLANG_TIDY_SOURCE_FILTER "src/*.cpp")
    file(GLOB_RECURSE CLANG_TIDY_SOURCES
         "${CMAKE_CURRENT_SOURCE_DIR}/${CLANG_TIDY_SOURCE_FILTER}")
    add_custom_target(clang-tidy COMMAND ${CLANG_TIDY}
        -export-fixes clang-tidy-suggested-fixes.yaml
        -j ${CLANG_TIDY_PARALLEL_JOBS}
        -extra-arg=-DTBB_USE_GLIBCXX_VERSION=50400
        ${CLANG_TIDY_SOURCES})
else(CLANG_TIDY)
    message(STATUS "run-clang-tidy script not found - target clang-tidy not available")
endif(CLANG_TIDY)
