summaryrefslogtreecommitdiff
path: root/CMakeLists.txt
diff options
context:
space:
mode:
Diffstat (limited to 'CMakeLists.txt')
-rw-r--r--CMakeLists.txt272
1 files changed, 272 insertions, 0 deletions
diff --git a/CMakeLists.txt b/CMakeLists.txt
new file mode 100644
index 0000000..70a6c32
--- /dev/null
+++ b/CMakeLists.txt
@@ -0,0 +1,272 @@
+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()
+
+# ---------------------------------------------------------------------------
+# 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()
git clone -b <branch> https://cgit.mode42.com/<repo>.git
git clone -b <branch> git://cgit.mode42.com/<repo>.git

info@mode42.com