zynk/CMakeLists.txt

84 lines
4 KiB
CMake

cmake_minimum_required(VERSION 3.13)
project(zynk VERSION 0.43.2 LANGUAGES C)
# Prefer C99; the code is compatible with C99/C11
set(CMAKE_C_STANDARD 99)
set(CMAKE_C_STANDARD_REQUIRED ON)
option(BUILD_STRICT "Enable strict compiler warnings" ON)
# Feature toggles — all ON by default, disable with -DWITH_<FEATURE>=OFF
option(WITH_ZYNK "Key-value store command (!zynk)" ON)
option(WITH_PING "Ping/pong command" ON)
option(WITH_VERSION "Version command" ON)
option(WITH_HELP "Help command" ON)
option(WITH_QUIT "Quit/die shutdown command" ON)
option(WITH_WEATHER "Weather command (requires curl)" ON)
option(WITH_FORECAST "Forecast command (requires curl)" ON)
option(WITH_STOCK "Stock quote command (requires curl)" ON)
option(WITH_CALC "Calculator command (requires bc)" ON)
option(WITH_TIME "Time/timezone command" ON)
option(WITH_SEEN "Seen command (tracks nick activity)" ON)
option(WITH_TELL "Tell command (pending messages)" ON)
option(WITH_GITLOG "Git log command" ON)
option(WITH_CHANGELOG "Changelog command" ON)
option(WITH_AI "AI question command (requires opencode)" ON)
option(WITH_CODE "AI code change command (ops only)" OFF)
option(WITH_REBUILD "Rebuild command (ops only)" OFF)
option(WITH_UPTIME "Uptime command" ON)
option(WITH_RELOAD "Hot-reload command (ops only)" ON)
option(WITH_RESTART "Restart command (ops only)" ON)
option(WITH_YT "YouTube title command (requires curl)" ON)
option(WITH_WP "Wikipedia search command (requires curl)" ON)
option(WITH_GREETING_OR_CHAT "Greeting/chat with AI fallback" ON)
# Map WITH_* options to HAS_CMD_* compile definitions and print feature status
message(STATUS "=============================================================================")
message(STATUS "Feature configuration for zynk (${PROJECT_VERSION}):")
message(STATUS "=============================================================================")
foreach(_feat ZYNK PING VERSION HELP QUIT WEATHER FORECAST STOCK
CALC TIME SEEN TELL GITLOG CHANGELOG AI CODE
REBUILD UPTIME RELOAD RESTART YT WP GREETING_OR_CHAT)
string(TOLOWER "${_feat}" _feat_lower)
if(WITH_${_feat})
list(APPEND _cmd_defs "HAS_CMD_${_feat}")
message(STATUS "[ON] ${_feat} (!${_feat_lower})")
else()
message(STATUS "[OFF] ${_feat} (!${_feat_lower})")
endif()
endforeach()
message(STATUS "=============================================================================")
# Homebrew OpenSSL hint on macOS (set before find_package)
if(APPLE AND DEFINED ENV{HOMEBREW_PREFIX})
list(APPEND CMAKE_PREFIX_PATH
"$ENV{HOMEBREW_PREFIX}/opt/openssl"
"$ENV{HOMEBREW_PREFIX}/opt/openssl@3")
endif()
find_package(OpenSSL REQUIRED)
add_executable(zynk zynk.c)
if(BUILD_STRICT)
if(CMAKE_C_COMPILER_ID MATCHES "Clang|GNU")
target_compile_options(zynk PRIVATE -Wall -Wextra -Wformat=2
-Wstrict-prototypes -pedantic -fstack-protector-strong
$<$<OR:$<CONFIG:Release>,$<CONFIG:RelWithDebInfo>,$<CONFIG:MinSizeRel>>:SHELL:-U_FORTIFY_SOURCE -D_FORTIFY_SOURCE=3>)
target_link_options(zynk PRIVATE -Wl,-z,relro,-z,now -Wl,-z,noexecstack)
endif()
endif()
target_compile_definitions(zynk PRIVATE ${_cmd_defs} ZYNK_VERSION="${PROJECT_VERSION}")
target_link_libraries(zynk PRIVATE OpenSSL::SSL OpenSSL::Crypto)
# dlopen/dlsym come from libdl on Unix-like systems (not needed on macOS)
if(UNIX AND NOT APPLE)
find_library(DL_LIBRARY dl)
if(DL_LIBRARY)
target_link_libraries(zynk PRIVATE ${DL_LIBRARY})
endif()
endif()
install(TARGETS zynk RUNTIME DESTINATION bin)