cmake_minimum_required(VERSION 3.16)
project(ngs LANGUAGES CXX)

set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(CMAKE_CXX_EXTENSIONS OFF)

add_definitions(-DHPSOCKET_STATIC_LIB)

add_executable(ngs
    src/main.cpp
    src/utils.cpp
    src/api/api_server.cpp
    src/store/store.cpp
    src/system/metrics.cpp
    src/system/metrics_history.cpp
    src/files/files.cpp
    src/tasks/tasks.cpp
    src/software/software.cpp
    src/software/nginx/nginx.cpp
    src/software/fastweb/fastweb.cpp
    src/software/mysql/mysql.cpp
    src/software/redis/redis.cpp
    src/website/website.cpp
    src/ssl/acme.cpp
    src/auth/auth.cpp
    src/weblog/weblog.cpp
)

target_include_directories(ngs PRIVATE
    ${CMAKE_CURRENT_SOURCE_DIR}/src
    /usr/local/include
)

target_compile_options(ngs PRIVATE -Wall -Wextra)
target_compile_definitions(ngs PRIVATE NGS_SOURCE_DIR="${CMAKE_SOURCE_DIR}")

list(APPEND CMAKE_LIBRARY_PATH /usr/local/lib /usr/lib/x86_64-linux-gnu /usr/lib)

# Prefer shared mysqlcppconn so we do not require linkable libmysqlclient at build time
# (libmysqlcppconn.so already DT_NEEDED libmysqlclient.so.*).
set(_ngs_saved_suffixes "${CMAKE_FIND_LIBRARY_SUFFIXES}")
set(CMAKE_FIND_LIBRARY_SUFFIXES ".so")
find_library(MYSQLCPPCONN_LIB NAMES mysqlcppconn)
set(CMAKE_FIND_LIBRARY_SUFFIXES "${_ngs_saved_suffixes}")
if(NOT MYSQLCPPCONN_LIB)
    find_library(MYSQLCPPCONN_LIB NAMES mysqlcppconn REQUIRED)
endif()

find_library(MYSQLCLIENT_LIB NAMES mysqlclient)
find_library(YLIB_LIB NAMES ylib REQUIRED)
find_library(HPSOCKET_LIB NAMES hpsocket REQUIRED)
find_library(LEVELDB_LIB NAMES leveldb REQUIRED)
find_library(SQLITE3_LIB NAMES sqlite3 REQUIRED)
find_library(SSL_LIB NAMES ssl REQUIRED)
find_library(CRYPTO_LIB NAMES crypto REQUIRED)
find_library(Z_LIB NAMES z REQUIRED)
find_library(X11_LIB NAMES X11 REQUIRED)

set(NGS_LIBS
    ${YLIB_LIB}
    ${MYSQLCPPCONN_LIB}
    ${HPSOCKET_LIB}
    ${LEVELDB_LIB}
    ${SQLITE3_LIB}
    ${SSL_LIB}
    ${CRYPTO_LIB}
    ${Z_LIB}
    ${X11_LIB}
    pthread
    dl
    rt
    stdc++fs
)

# Needed when linking a static libmysqlcppconn; optional for the shared .so case.
if(MYSQLCLIENT_LIB)
    list(APPEND NGS_LIBS ${MYSQLCLIENT_LIB})
elseif(MYSQLCPPCONN_LIB MATCHES "\\.(a)$")
    message(FATAL_ERROR
        "libmysqlcppconn is static but libmysqlclient was not found. "
        "Install libmysqlclient-dev (or ./build.sh deps).")
endif()

target_link_libraries(ngs PRIVATE ${NGS_LIBS})

message(STATUS "mysqlcppconn: ${MYSQLCPPCONN_LIB}")
if(MYSQLCLIENT_LIB)
    message(STATUS "mysqlclient: ${MYSQLCLIENT_LIB}")
else()
    message(STATUS "mysqlclient: (not found, using shared mysqlcppconn runtime dep)")
endif()

install(TARGETS ngs RUNTIME DESTINATION bin)

add_custom_target(install-deps
    COMMAND sudo apt-get update
    COMMAND sudo DEBIAN_FRONTEND=noninteractive apt-get install -y
            build-essential cmake pkg-config
            libpcre3-dev zlib1g-dev libssl-dev libsqlite3-dev
            libleveldb-dev libmysqlcppconn-dev libmysqlclient-dev
            curl tar
    COMMENT "Install apt build dependencies (ylib and HPSocket must be preinstalled)"
    VERBATIM
)
