cmake_minimum_required(VERSION 3.16) # Default C compiler when CC / CMAKE_C_COMPILER are not set: # *BSD (FreeBSD, NetBSD, OpenBSD, …) → LLVM Clang (native toolchain on BSD) # other → GCC if(NOT DEFINED ENV{CC} AND NOT CMAKE_C_COMPILER) if(CMAKE_HOST_SYSTEM_NAME MATCHES "^(FreeBSD|OpenBSD|NetBSD|DragonFly)$") find_program(HYBBX_PREFERRED_CLANG NAMES clang) if(HYBBX_PREFERRED_CLANG) set(CMAKE_C_COMPILER "${HYBBX_PREFERRED_CLANG}" CACHE FILEPATH "HyBBX C compiler (Clang on BSD)" FORCE) else() find_program(HYBBX_PREFERRED_GCC NAMES gcc) if(HYBBX_PREFERRED_GCC) set(CMAKE_C_COMPILER "${HYBBX_PREFERRED_GCC}" CACHE FILEPATH "HyBBX C compiler (GCC fallback on BSD)" FORCE) endif() unset(HYBBX_PREFERRED_GCC) endif() unset(HYBBX_PREFERRED_CLANG) else() find_program(HYBBX_PREFERRED_GCC NAMES gcc) if(HYBBX_PREFERRED_GCC) set(CMAKE_C_COMPILER "${HYBBX_PREFERRED_GCC}" CACHE FILEPATH "HyBBX primary C compiler (GCC)" FORCE) endif() unset(HYBBX_PREFERRED_GCC) endif() endif() project(HyBBX VERSION 2.8.0 DESCRIPTION "C99 transport service: centralized daemon + link/repeater edge" LANGUAGES C ) set(CMAKE_C_STANDARD 99) set(CMAKE_C_STANDARD_REQUIRED ON) set(CMAKE_C_EXTENSIONS OFF) # Export compile commands for IDE integration set(CMAKE_EXPORT_COMPILE_COMMANDS ON) include(CMakeDependentOption) # --------------------------------------------------------------------------- # Options # --------------------------------------------------------------------------- option(HYBBX_BUILD_DAEMON "Build hybbx server daemon" ON) option(HYBBX_BUILD_CLIENTS "Build standalone CLI clients" ON) option(HYBBX_CLIENTS_ONLY "Clients only (no daemon, no plugins)" OFF) option(HYBBX_BUILD_PLUGINS "Build transport plugins" ON) option(HYBBX_PLUGIN_TELNET "Build TCP/IP telnet transport" ON) option(HYBBX_PLUGIN_PACKET_RADIO "Build packet radio transport" ON) option(HYBBX_PLUGIN_ARDOP "Build ARDOP host-client transport" ON) option(HYBBX_PLUGIN_CRDOP "Build CRDOP CB host-client transport" ON) option(HYBBX_PLUGIN_SSH "Build SSH transport (requires libssh)" ON) option(HYBBX_PLUGIN_BAYCOM "Build BayCom/based transport plugin (default ON)" ON) option(HYBBX_PLUGIN_MAINS_PROXY "Build Main-to-Main mesh proxy" ON) option(HYBBX_PLUGIN_WEBSOCKET "Build WebSocket forward-proxy transport" ON) option(HYBBX_BUILD_TESTS "Build unit tests" OFF) option(HYBBX_HARDENING "Enable compiler security hardening" ON) option(HYBBX_WARNINGS_AS_ERRORS "Treat warnings as errors" OFF) option(HYBBX_CRYPTO_OPENSSL "Optional OpenSSL crypto backends" OFF) option(HYBBX_CRYPTO_LIBSODIUM "Optional libsodium crypto backends" OFF) option(HYBBX_STORAGE_SQLITE "Optional SQLite storage backend" ON) cmake_dependent_option(HYBBX_BUILD_CLIENT_TELNET "Build hybbx-telnet standalone client" ON "HYBBX_BUILD_CLIENTS" OFF) cmake_dependent_option(HYBBX_BUILD_CLIENT_TERMINAL "Build hybbx-terminal standalone client" ON "HYBBX_BUILD_CLIENTS" OFF) cmake_dependent_option(HYBBX_BUILD_CLIENT_SSH "Build hybbx-ssh standalone client (requires libssh)" ON "HYBBX_BUILD_CLIENTS" OFF) if(HYBBX_CLIENTS_ONLY) set(HYBBX_BUILD_DAEMON OFF CACHE BOOL "Clients-only build" FORCE) set(HYBBX_BUILD_PLUGINS OFF CACHE BOOL "Clients-only build" FORCE) set(HYBBX_BUILD_CLIENTS ON CACHE BOOL "Clients-only build" FORCE) endif() set(HYBBX_HAVE_LIBSSH FALSE) if(HYBBX_PLUGIN_SSH OR HYBBX_BUILD_CLIENT_SSH) find_package(PkgConfig QUIET) if(PkgConfig_FOUND) pkg_check_modules(LIBSSH QUIET libssh) endif() if(LIBSSH_FOUND) set(HYBBX_HAVE_LIBSSH TRUE) message(STATUS "HyBBX: libssh ${LIBSSH_VERSION} — SSH enabled") else() if(HYBBX_PLUGIN_SSH) message(WARNING "HYBBX_PLUGIN_SSH=ON but libssh was not found — SSH plugin disabled") set(HYBBX_PLUGIN_SSH OFF CACHE BOOL "libssh not found" FORCE) endif() if(HYBBX_BUILD_CLIENT_SSH) message(WARNING "HYBBX_BUILD_CLIENT_SSH=ON but libssh was not found — hybbx-ssh disabled") set(HYBBX_BUILD_CLIENT_SSH OFF CACHE BOOL "libssh not found" FORCE) endif() endif() endif() if(NOT HYBBX_BUILD_DAEMON) set(HYBBX_BUILD_PLUGINS OFF CACHE BOOL "No daemon — skip plugins" FORCE) endif() set(HYBBX_HAVE_OPENSSL FALSE) if(HYBBX_CRYPTO_OPENSSL) find_package(OpenSSL QUIET) if(OpenSSL_FOUND) set(HYBBX_HAVE_OPENSSL TRUE) message(STATUS "HyBBX: OpenSSL crypto backends enabled") else() message(WARNING "HYBBX_CRYPTO_OPENSSL=ON but OpenSSL was not found") endif() endif() set(HYBBX_HAVE_LIBSODIUM FALSE) if(HYBBX_CRYPTO_LIBSODIUM) find_package(PkgConfig QUIET) if(PkgConfig_FOUND) pkg_check_modules(LIBSODIUM QUIET libsodium) endif() if(LIBSODIUM_FOUND) set(HYBBX_HAVE_LIBSODIUM TRUE) message(STATUS "HyBBX: libsodium crypto backends enabled") else() message(WARNING "HYBBX_CRYPTO_LIBSODIUM=ON but libsodium was not found") endif() endif() set(HYBBX_HAVE_SQLITE FALSE) if(HYBBX_STORAGE_SQLITE AND HYBBX_BUILD_DAEMON) find_package(PkgConfig QUIET) if(PkgConfig_FOUND) pkg_check_modules(SQLITE3 QUIET sqlite3) endif() if(SQLITE3_FOUND) set(HYBBX_HAVE_SQLITE TRUE) message(STATUS "HyBBX: sqlite3 ${SQLITE3_VERSION} — SQLite storage enabled") if(SQLITE3_LIBRARY_DIRS) link_directories(${SQLITE3_LIBRARY_DIRS}) endif() else() message(WARNING "HYBBX_STORAGE_SQLITE=ON but libsqlite3 was not found") endif() endif() # --------------------------------------------------------------------------- # --------------------------------------------------------------------------- find_package(PkgConfig QUIET) if(PkgConfig_FOUND) endif() else() endif() # --------------------------------------------------------------------------- # Platform detection (see docs/PLATFORMS.md) # --------------------------------------------------------------------------- if(CMAKE_SYSTEM_NAME STREQUAL "AmigaOS") set(HYBBX_PLATFORM_AMIGAOS TRUE) message(STATUS "HyBBX: targeting AmigaOS 3.9+ (cross-GCC)") elseif(WIN32) set(HYBBX_PLATFORM_WINDOWS TRUE) message(STATUS "HyBBX: targeting Windows 10+ (GCC/Clang via MinGW or LLVM-MinGW)") elseif(APPLE) set(HYBBX_PLATFORM_MACOS TRUE) message(STATUS "HyBBX: targeting MacOS X+ (Apple Clang / LLVM Clang)") elseif(CMAKE_SYSTEM_NAME MATCHES "Linux") set(HYBBX_PLATFORM_LINUX TRUE) message(STATUS "HyBBX: targeting Linux") add_compile_definitions(_DEFAULT_SOURCE=1) elseif(CMAKE_SYSTEM_NAME MATCHES "FreeBSD|OpenBSD|NetBSD|DragonFly") set(HYBBX_PLATFORM_BSD TRUE) message(STATUS "HyBBX: targeting BSD (${CMAKE_SYSTEM_NAME})") else() message(STATUS "HyBBX: targeting ${CMAKE_SYSTEM_NAME} (POSIX/GCC/Clang)") endif() if(NOT DEFINED HYBBX_PLATFORM_AMIGAOS) set(HYBBX_PLATFORM_AMIGAOS FALSE) endif() if(HYBBX_PLATFORM_AMIGAOS) set(HYBBX_PLUGIN_SSH OFF CACHE BOOL "AmigaOS build" FORCE) set(HYBBX_BUILD_CLIENT_SSH OFF CACHE BOOL "AmigaOS build" FORCE) set(HYBBX_BUILD_CLIENT_TERMINAL OFF CACHE BOOL "AmigaOS build" FORCE) set(HYBBX_PLUGIN_WEBSOCKET OFF CACHE BOOL "AmigaOS build" FORCE) set(HYBBX_PLUGIN_BAYCOM OFF CACHE BOOL "AmigaOS build" FORCE) set(HYBBX_PLUGIN_MAINS_PROXY OFF CACHE BOOL "AmigaOS build" FORCE) set(HYBBX_PLUGIN_ARDOP OFF CACHE BOOL "AmigaOS build" FORCE) set(HYBBX_PLUGIN_CRDOP OFF CACHE BOOL "AmigaOS build" FORCE) message(STATUS "HyBBX: AmigaOS — hybbx-telnet client (clib2); telnet + packet_radio plugins") endif() # --------------------------------------------------------------------------- # Install layout (self-contained — all usable files in ONE tree) # # Default (source tree): # cmake -B build && cmake --build build && cmake --install build # → ${CMAKE_SOURCE_DIR}/bin/ # # Alternate (explicit prefix): # cmake -B build -DCMAKE_INSTALL_PREFIX=/usr/local # cmake --build build && sudo cmake --install build # → /usr/local/hybbx/ # # cmake -B build -DCMAKE_INSTALL_PREFIX="$HOME" # → $HOME/hybbx/ # # Layout under that root: # hybbxd, hybbx-start, hybbx.ini, text/, data/, logs/, clients… # --------------------------------------------------------------------------- # Default prefix = source directory → install into ./bin if(CMAKE_INSTALL_PREFIX_INITIALIZED_TO_DEFAULT) set(CMAKE_INSTALL_PREFIX "${CMAKE_SOURCE_DIR}" CACHE PATH "HyBBX install prefix (default: source dir → ./bin)" FORCE) endif() get_filename_component(_hybbx_src_abs "${CMAKE_SOURCE_DIR}" ABSOLUTE) get_filename_component(_hybbx_pfx_abs "${CMAKE_INSTALL_PREFIX}" ABSOLUTE) if(_hybbx_pfx_abs STREQUAL _hybbx_src_abs) set(HYBBX_INSTALL_HOME "bin") else() set(HYBBX_INSTALL_HOME "hybbx") endif() unset(_hybbx_src_abs) unset(_hybbx_pfx_abs) set(HYBBX_PLUGIN_INSTALL_DIR "${HYBBX_INSTALL_HOME}/lib/plugins") option(HYBBX_INSTALL_DEV "Install headers, static libs, and CMake package files under the install tree" OFF) message(STATUS "HyBBX install tree: ${CMAKE_INSTALL_PREFIX}/${HYBBX_INSTALL_HOME}" " (HYBBX_INSTALL_DEV=${HYBBX_INSTALL_DEV})") include(${CMAKE_CURRENT_SOURCE_DIR}/cmake/Compiler.cmake) include(${CMAKE_CURRENT_SOURCE_DIR}/cmake/Hardening.cmake) # --------------------------------------------------------------------------- # Subdirectories # --------------------------------------------------------------------------- add_subdirectory(src) if(HYBBX_BUILD_PLUGINS) add_subdirectory(plugins) endif() if(HYBBX_BUILD_TESTS) enable_testing() add_subdirectory(tests) endif() # --------------------------------------------------------------------------- # Package config (optional — HYBBX_INSTALL_DEV=ON) # --------------------------------------------------------------------------- if(HYBBX_INSTALL_DEV) include(CMakePackageConfigHelpers) configure_package_config_file( "${CMAKE_CURRENT_SOURCE_DIR}/cmake/HyBBXConfig.cmake.in" "${CMAKE_CURRENT_BINARY_DIR}/HyBBXConfig.cmake" INSTALL_DESTINATION "${HYBBX_INSTALL_HOME}/lib/cmake/HyBBX" ) write_basic_package_version_file( "${CMAKE_CURRENT_BINARY_DIR}/HyBBXConfigVersion.cmake" VERSION ${PROJECT_VERSION} COMPATIBILITY SameMajorVersion ) install( FILES "${CMAKE_CURRENT_BINARY_DIR}/HyBBXConfig.cmake" "${CMAKE_CURRENT_BINARY_DIR}/HyBBXConfigVersion.cmake" DESTINATION "${HYBBX_INSTALL_HOME}/lib/cmake/HyBBX" ) endif()