zynk/CMakeLists.txt
hanez 739e3622b5 Commit links for !gitlog, full changelog link for !changelog, CMake, multi-file refactor
- !gitlog now shows a link to each commit in the repository, using the
  git remote URL converted from SSH/SCP to HTTPS
- !changelog now shows a 'Full changelog: <url>' link to CHANGELOG.md
  in the repository as the last message after all entries
- Removed 'full' keyword from !gitlog and !changelog (previously showed
  full commit messages and complete changelog entries)
- Switched build system from Make to CMake with feature toggles
  (-DWITH_<FEATURE>=ON/OFF)
- Refactored single-file codebase into dedicated header files: each
  command now lives in its own cmd_*.h file, with separate modules for
  database (db.h), IRC protocol (irc.h), networking (net.h), TLS (tls.h),
  and AI (ai.h)
- Updated README.md to reflect the simplified !gitlog and !changelog
  syntax and the new CMake build instructions

(0.40.0)
2026-07-23 01:46:37 +02:00

89 lines
3.7 KiB
CMake

cmake_minimum_required(VERSION 3.13)
project(zynk VERSION 0.40.0 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_GREETING_OR_CHAT "Greeting/chat with AI fallback" ON)
# Map WITH_* options to HAS_CMD_* compile definitions
foreach(_feat ZYNK PING VERSION HELP QUIT WEATHER FORECAST STOCK
CALC TIME SEEN TELL GITLOG CHANGELOG AI CODE
REBUILD UPTIME RELOAD RESTART GREETING_OR_CHAT)
string(TOLOWER "${_feat}" _feat_lower)
if(WITH_${_feat})
list(APPEND _cmd_defs "HAS_CMD_${_feat}")
endif()
endforeach()
# Print feature status
message(STATUS "")
message(STATUS "zynk feature configuration:")
message(STATUS "=============================================")
foreach(_feat ZYNK PING VERSION HELP QUIT WEATHER FORECAST STOCK
CALC TIME SEEN TELL GITLOG CHANGELOG AI CODE
REBUILD UPTIME RELOAD RESTART GREETING_OR_CHAT)
string(TOLOWER "${_feat}" _feat_lower)
if(WITH_${_feat})
message(STATUS "[ON] ${_feat} (!${_feat_lower})")
else()
message(STATUS "[OFF] ${_feat} (!${_feat_lower})")
endif()
endforeach()
message(STATUS "=============================================")
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 -pedantic)
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)