cmake_minimum_required(VERSION 3.10)
project(nwedav C)

set(CMAKE_C_STANDARD 11)
set(CMAKE_C_STANDARD_REQUIRED ON)

option(WITH_SSL "Enable SSL/TLS support" OFF)

find_package(Threads REQUIRED)
find_package(PkgConfig REQUIRED)
pkg_check_modules(SQLITE3 REQUIRED sqlite3)
pkg_check_modules(OPENSSL REQUIRED openssl)
pkg_check_modules(UUID uuid)

if(WIN32)
    add_definitions(-D_WIN32_WINNT=0x0601)
    set(PLATFORM_LIBS ws2_32 mswsock crypt32 rpcrt4)
elseif(APPLE)
    set(PLATFORM_LIBS)
else()
    set(PLATFORM_LIBS)
endif()

set(COMMON_SOURCES
    src/platform/pal.c
    src/platform/file.c
    src/platform/time.c
    src/platform/memory.c
    src/core/config.c
    src/core/logging.c
    src/user/usermgr.c
    src/user/password.c
)

set(SERVER_SOURCES
    src/main.c
    src/core/server.c
    src/http/parser.c
    src/http/response.c
    src/http/headers.c
    src/webdav/xml.c
    src/webdav/methods.c
    src/webdav/propfind.c
    src/webdav/proppatch.c
    src/webdav/lock.c
    src/storage/backend.c
    src/storage/properties.c
    src/storage/locks.c
    src/auth/auth.c
    src/concurrency/threadpool.c
    src/concurrency/eventloop.c
    src/concurrency/connpool.c
)

set(CLI_SOURCES
    src/cli/webdavctl.c
)

add_executable(nwedav ${COMMON_SOURCES} ${SERVER_SOURCES})
target_include_directories(nwedav PRIVATE
    ${CMAKE_SOURCE_DIR}/include
    ${CMAKE_SOURCE_DIR}/src
    ${SQLITE3_INCLUDE_DIRS}
    ${OPENSSL_INCLUDE_DIRS}
)
target_link_libraries(nwedav
    Threads::Threads
    ${SQLITE3_LIBRARIES}
    ${OPENSSL_LIBRARIES}
    ${PLATFORM_LIBS}
)
if(UUID_FOUND)
    target_include_directories(nwedav PRIVATE ${UUID_INCLUDE_DIRS})
    target_link_libraries(nwedav ${UUID_LIBRARIES})
endif()

add_executable(webdavctl ${COMMON_SOURCES} ${CLI_SOURCES})
target_include_directories(webdavctl PRIVATE
    ${CMAKE_SOURCE_DIR}/include
    ${CMAKE_SOURCE_DIR}/src
    ${SQLITE3_INCLUDE_DIRS}
    ${OPENSSL_INCLUDE_DIRS}
)
target_link_libraries(webdavctl
    Threads::Threads
    ${SQLITE3_LIBRARIES}
    ${OPENSSL_LIBRARIES}
    ${PLATFORM_LIBS}
)
if(UUID_FOUND)
    target_include_directories(webdavctl PRIVATE ${UUID_INCLUDE_DIRS})
    target_link_libraries(webdavctl ${UUID_LIBRARIES})
endif()

if(WITH_SSL)
    target_compile_definitions(nwedav PRIVATE WITH_SSL)
    target_compile_definitions(webdavctl PRIVATE WITH_SSL)
endif()

install(TARGETS nwedav webdavctl DESTINATION bin)

enable_testing()
