- !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)
89 lines
3.7 KiB
CMake
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)
|