cmake_minimum_required(VERSION 3.5)
project(srp LANGUAGES C VERSION 0.0.1)

include(GNUInstallDirs)
set(EXECUTABLE_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/usr/bin)

option(BUILD_TEST "Build test_package" OFF)

if (BUILD_TEST)
add_definitions(-DBUILD_TEST)
endif()

set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -D__FILENAME__='\"$(notdir $(abspath $(patsubst %.o,%,$@)))\"'")

set(CMAKE_SKIP_RPATH On)

# ============================================================
# 半静态链接配置
# - libevent/openssl: 由 conan shared=False 编译为 .a，自动静态链接
# - libgcc: -static-libgcc 消除 libgcc_s.so 依赖
# - libc/pthread: 保持动态链接，依赖目标系统 glibc
# - crypt: 已用 OpenSSL EVP SHA-512 实现替代，不再依赖 libcrypt.so
# ============================================================
if (CMAKE_C_COMPILER_ID STREQUAL "GNU")
    set(SEMISTATIC_LINK_OPTIONS -static-libgcc -Wl,--as-needed)
elseif (CMAKE_C_COMPILER_ID STREQUAL "Clang")
    set(SEMISTATIC_LINK_OPTIONS -static-libgcc -Wl,--as-needed)
endif()

set(PUB_SRC src/common.c src/buffer.c src/connect.c src/crypto.c src/srp.c src/network.c src/config.c src/access_control.c)
set(NODE_SRC ${PUB_SRC} src/node.c srpn.c)
set(SRV_SRC ${PUB_SRC} src/server.c srps.c)

find_package(PkgConfig REQUIRED)
pkg_check_modules(LIBEV REQUIRED libevent)
pkg_check_modules(CRYPTO REQUIRED libcrypto)

add_executable(srpn ${NODE_SRC})
add_executable(srps ${SRV_SRC})

target_compile_definitions(srpn PUBLIC _NODE)
target_compile_definitions(srps PUBLIC _SERVER)

target_include_directories(srpn PUBLIC
    ./src
    ${LIBEV_INCLUDE_DIRS}
    ${CRYPTO_INCLUDE_DIRS}
)
target_link_directories(srpn PUBLIC
    ${LIBEV_LIBRARY_DIRS}
    ${CRYPTO_LIBRARY_DIRS}
)
target_link_libraries(srpn PUBLIC
    ${LIBEV_LIBRARIES}
    ${CRYPTO_LIBRARIES}
    pthread
)
target_link_options(srpn PRIVATE ${SEMISTATIC_LINK_OPTIONS})

target_include_directories(srps PUBLIC
    ./src
    ${LIBEV_INCLUDE_DIRS}
    ${CRYPTO_INCLUDE_DIRS}
)
target_link_directories(srps PUBLIC
    ${LIBEV_LIBRARY_DIRS}
    ${CRYPTO_LIBRARY_DIRS}
)
target_link_libraries(srps PUBLIC
    ${LIBEV_LIBRARIES}
    ${CRYPTO_LIBRARIES}
    pthread
)
target_link_options(srps PRIVATE ${SEMISTATIC_LINK_OPTIONS})

if (BUILD_TEST)
add_subdirectory(test_package)
endif()

install(TARGETS srps DESTINATION usr/bin/)
install(TARGETS srpn DESTINATION usr/bin/)
install(FILES scripts/srps.conf DESTINATION etc/srp/)
install(FILES scripts/srpn.conf DESTINATION etc/srp/)
install(FILES scripts/srpn.service DESTINATION usr/lib/systemd/system/)
install(FILES scripts/srps.service DESTINATION usr/lib/systemd/system/)
