From 48c294105f5123dc876fbad199ec1e0166d82a18 Mon Sep 17 00:00:00 2001 From: Dimitri Staessens Date: Tue, 23 Dec 2025 11:59:45 +0100 Subject: build: Refactor CMake modules This moves the CMake build logic out of the source tree and splits it up into a more modular form. The tests now have a CMakeLists.txt file in their respective source directory. Signed-off-by: Dimitri Staessens Signed-off-by: Sander Vrijders --- cmake/dependencies/bpf.cmake | 20 ++++++++++++++++++++ cmake/dependencies/fuse.cmake | 23 +++++++++++++++++++++++ cmake/dependencies/libgcrypt.cmake | 31 +++++++++++++++++++++++++++++++ cmake/dependencies/libtoml.cmake | 5 +++++ cmake/dependencies/netmap.cmake | 18 ++++++++++++++++++ cmake/dependencies/openssl.cmake | 26 ++++++++++++++++++++++++++ cmake/dependencies/protobufc.cmake | 11 +++++++++++ cmake/dependencies/rawsockets.cmake | 12 ++++++++++++ cmake/dependencies/robustmutex.cmake | 18 ++++++++++++++++++ cmake/dependencies/sysrandom.cmake | 21 +++++++++++++++++++++ cmake/dependencies/systemlibraries.cmake | 20 ++++++++++++++++++++ 11 files changed, 205 insertions(+) create mode 100644 cmake/dependencies/bpf.cmake create mode 100644 cmake/dependencies/fuse.cmake create mode 100644 cmake/dependencies/libgcrypt.cmake create mode 100644 cmake/dependencies/libtoml.cmake create mode 100644 cmake/dependencies/netmap.cmake create mode 100644 cmake/dependencies/openssl.cmake create mode 100644 cmake/dependencies/protobufc.cmake create mode 100644 cmake/dependencies/rawsockets.cmake create mode 100644 cmake/dependencies/robustmutex.cmake create mode 100644 cmake/dependencies/sysrandom.cmake create mode 100644 cmake/dependencies/systemlibraries.cmake (limited to 'cmake/dependencies') diff --git a/cmake/dependencies/bpf.cmake b/cmake/dependencies/bpf.cmake new file mode 100644 index 00000000..8c04937f --- /dev/null +++ b/cmake/dependencies/bpf.cmake @@ -0,0 +1,20 @@ +# Berkeley Packet Filter support (BSD/macOS only) +if (NOT CMAKE_SYSTEM_NAME STREQUAL "Linux") + find_path(BPF_C_INCLUDE_DIR + net/bpf.h + HINTS /usr/include /usr/local/include) + + mark_as_advanced(BPF_C_INCLUDE_DIR) + + if (BPF_C_INCLUDE_DIR) + set(DISABLE_BPF FALSE CACHE BOOL + "Disable Berkeley Packet Filter support for Ethernet IPCPs") + if (NOT DISABLE_BPF) + message(STATUS "Berkeley Packet Filter support for Ethernet IPCPs enabled") + set(HAVE_BPF TRUE) + else () + message(STATUS "Berkeley Packet Filter support for Ethernet IPCPs disabled by user") + unset(HAVE_BPF) + endif () + endif () +endif () diff --git a/cmake/dependencies/fuse.cmake b/cmake/dependencies/fuse.cmake new file mode 100644 index 00000000..8ef60292 --- /dev/null +++ b/cmake/dependencies/fuse.cmake @@ -0,0 +1,23 @@ +find_library(FUSE_LIBRARIES fuse QUIET) +if (FUSE_LIBRARIES) + #FIXME: Check for version >= 2.6 + set(DISABLE_FUSE FALSE CACHE BOOL "Disable FUSE support") + if (NOT DISABLE_FUSE) + message(STATUS "FUSE support enabled") + set(FUSE_PREFIX "/tmp/ouroboros" CACHE STRING + "Mountpoint for RIB filesystem") + set(HAVE_FUSE TRUE CACHE INTERNAL "") + else () + message(STATUS "FUSE support disabled by user") + unset(HAVE_FUSE CACHE) + endif () +else () + message(STATUS "Install FUSE version > 2.6 to enable RIB access") +endif () + +if (NOT HAVE_FUSE) + set(FUSE_LIBRARIES "") + set(FUSE_INCLUDE_DIR "") +endif () + +mark_as_advanced(FUSE_LIBRARIES) diff --git a/cmake/dependencies/libgcrypt.cmake b/cmake/dependencies/libgcrypt.cmake new file mode 100644 index 00000000..90a25f36 --- /dev/null +++ b/cmake/dependencies/libgcrypt.cmake @@ -0,0 +1,31 @@ +find_library(LIBGCRYPT_LIBRARIES gcrypt QUIET) +if (LIBGCRYPT_LIBRARIES) + find_path(LIBGCRYPT_INCLUDE_DIR gcrypt.h + HINTS /usr/include /usr/local/include) + if (LIBGCRYPT_INCLUDE_DIR) + file(STRINGS ${LIBGCRYPT_INCLUDE_DIR}/gcrypt.h GCSTR + REGEX "^#define GCRYPT_VERSION ") + string(REGEX REPLACE "^#define GCRYPT_VERSION \"(.*)\".*$" "\\1" + GCVER "${GCSTR}") + if (NOT GCVER VERSION_LESS "1.7.0") + set(DISABLE_LIBGCRYPT FALSE CACHE BOOL "Disable libgcrypt support") + if (NOT DISABLE_LIBGCRYPT) + message(STATUS "libgcrypt support enabled") + set(HAVE_LIBGCRYPT TRUE CACHE INTERNAL "") + else () + message(STATUS "libgcrypt support disabled by user") + unset(HAVE_LIBGCRYPT CACHE) + endif() + else () + message(STATUS "Install version >= \"1.7.0\" to enable libgcrypt support " + "(found version \"${GCVER}\")") + endif() + endif () +endif () + +if (NOT HAVE_LIBGCRYPT) + set(LIBGCRYPT_LIBRARIES "") + set(LIBGCRYPT_INCLUDE_DIR "") +endif () + +mark_as_advanced(LIBGCRYPT_LIBRARIES LIBGCRYPT_INCLUDE_DIR) diff --git a/cmake/dependencies/libtoml.cmake b/cmake/dependencies/libtoml.cmake new file mode 100644 index 00000000..3974a1dd --- /dev/null +++ b/cmake/dependencies/libtoml.cmake @@ -0,0 +1,5 @@ +find_library(LIBTOML_LIBRARIES toml QUIET) +if (LIBTOML_LIBRARIES) + find_path(LIBTOML_INCLUDE toml.h) + mark_as_advanced(LIBTOML_LIBRARIES LIBTOML_INCLUDE) +endif () diff --git a/cmake/dependencies/netmap.cmake b/cmake/dependencies/netmap.cmake new file mode 100644 index 00000000..d8d3781b --- /dev/null +++ b/cmake/dependencies/netmap.cmake @@ -0,0 +1,18 @@ +# netmap support (optional acceleration) +find_path(NETMAP_C_INCLUDE_DIR + net/netmap_user.h + HINTS /usr/include /usr/local/include) + +mark_as_advanced(NETMAP_C_INCLUDE_DIR) + +if (NOT HAVE_RAW_SOCKETS AND NOT HAVE_BPF AND NETMAP_C_INCLUDE_DIR) + set(DISABLE_NETMAP FALSE CACHE BOOL + "Disable netmap support for ETH IPCPs") + if (NOT DISABLE_NETMAP) + message(STATUS "Netmap support for Ethernet IPCPs enabled") + set(HAVE_NETMAP TRUE) + else () + message(STATUS "Netmap support for Ethernet IPCPs disabled by user") + unset(HAVE_NETMAP) + endif () +endif () diff --git a/cmake/dependencies/openssl.cmake b/cmake/dependencies/openssl.cmake new file mode 100644 index 00000000..604d5d99 --- /dev/null +++ b/cmake/dependencies/openssl.cmake @@ -0,0 +1,26 @@ +find_package(OpenSSL QUIET) +if (OPENSSL_FOUND) + set(HAVE_OPENSSL_RNG TRUE) + if (OPENSSL_VERSION VERSION_LESS "1.1.0") + message(STATUS "Install version >= \"1.1.0\" to enable OpenSSL support " + "(found version \"${OPENSSL_VERSION}\")") + else () + set(DISABLE_OPENSSL FALSE CACHE BOOL "Disable OpenSSL support") + if (NOT DISABLE_OPENSSL) + message(STATUS "OpenSSL support enabled") + set(HAVE_OPENSSL TRUE CACHE INTERNAL "") + else() + message(STATUS "OpenSSL support disabled") + unset(HAVE_OPENSSL CACHE) + endif() + endif () +else() + message(STATUS "Install openSSL version >= \"1.1.0\" to enable OpenSSL support") + unset(HAVE_OPENSSL_RNG) + unset(HAVE_OPENSSL CACHE) + set(OPENSSL_INCLUDE_DIR "") + set(OPENSSL_LIBRARIES "") + set(OPENSSL_CRYPTO_LIBRARY "") +endif () + +mark_as_advanced(OPENSSL_LIBRARIES OPENSSL_CRYPTO_LIBRARY) diff --git a/cmake/dependencies/protobufc.cmake b/cmake/dependencies/protobufc.cmake new file mode 100644 index 00000000..f1fab59d --- /dev/null +++ b/cmake/dependencies/protobufc.cmake @@ -0,0 +1,11 @@ +list(APPEND CMAKE_MODULE_PATH "${CMAKE_SOURCE_DIR}/cmake/utils") + +find_package(ProtobufC QUIET) +if (NOT (PROTOBUF_C_INCLUDE_DIRS AND PROTOBUF_C_LIBRARY + AND PROTOBUF_PROTOC_C_EXECUTABLE)) + message(FATAL_ERROR "Protobuf C compiler required but not found. " + "Please install Google Protocol Buffers.") +else () + message(STATUS "Found protobuf C compiler in ${PROTOBUF_PROTOC_C_EXECUTABLE}") +endif () +include_directories(${PROTOBUF_C_INCLUDE_DIRS}) diff --git a/cmake/dependencies/rawsockets.cmake b/cmake/dependencies/rawsockets.cmake new file mode 100644 index 00000000..92f7b8b7 --- /dev/null +++ b/cmake/dependencies/rawsockets.cmake @@ -0,0 +1,12 @@ +# Raw sockets support (Linux only) +if (CMAKE_SYSTEM_NAME STREQUAL "Linux") + set(DISABLE_RAW_SOCKETS FALSE CACHE BOOL + "Disable raw socket support for Ethernet IPCPs") + if (NOT DISABLE_RAW_SOCKETS) + message(STATUS "Raw socket support for Ethernet IPCPs enabled") + set(HAVE_RAW_SOCKETS TRUE) + else () + message(STATUS "Raw socket support for Ethernet IPCPs disabled by user") + unset(HAVE_RAW_SOCKETS) + endif () +endif () diff --git a/cmake/dependencies/robustmutex.cmake b/cmake/dependencies/robustmutex.cmake new file mode 100644 index 00000000..94aec8f0 --- /dev/null +++ b/cmake/dependencies/robustmutex.cmake @@ -0,0 +1,18 @@ +list(APPEND CMAKE_REQUIRED_DEFINITIONS -D_POSIX_C_SOURCE=200809L) +list(APPEND CMAKE_REQUIRED_DEFINITIONS -D__XSI_VISIBLE=500) +list(APPEND CMAKE_REQUIRED_LIBRARIES pthread) +check_symbol_exists(pthread_mutexattr_setrobust pthread.h HAVE_ROBUST_MUTEX) + +if (HAVE_ROBUST_MUTEX) + set(DISABLE_ROBUST_MUTEXES FALSE CACHE BOOL "Disable robust mutex support") + if (NOT DISABLE_ROBUST_MUTEXES) + message(STATUS "Robust mutex support enabled") + set(HAVE_ROBUST_MUTEX TRUE) + else () + message(STATUS "Robust mutex support disabled by user") + unset(HAVE_ROBUST_MUTEX) + endif () +else() + message(STATUS "Robust mutex support not available") + unset(HAVE_ROBUST_MUTEX) +endif () diff --git a/cmake/dependencies/sysrandom.cmake b/cmake/dependencies/sysrandom.cmake new file mode 100644 index 00000000..972db801 --- /dev/null +++ b/cmake/dependencies/sysrandom.cmake @@ -0,0 +1,21 @@ +if (APPLE OR CMAKE_SYSTEM_NAME STREQUAL "FreeBSD") + set(SYS_RND_HDR "") +else () + find_path(SYS_RND_HDR sys/random.h PATH /usr/include/ /usr/local/include/) + if (SYS_RND_HDR) + message(STATUS "Found sys/random.h in ${SYS_RND_HDR}") + set(HAVE_SYS_RANDOM TRUE) + else () + set(SYS_RND_HDR "") + unset(HAVE_SYS_RANDOM) + endif () +endif() + +# Validate that at least one secure random generator is available +if (NOT ((CMAKE_SYSTEM_NAME STREQUAL "FreeBSD") OR APPLE OR + HAVE_SYS_RANDOM OR HAVE_OPENSSL_RNG OR HAVE_LIBGCRYPT)) + message(FATAL_ERROR "No secure random generator found, " + "please install libgcrypt (> 1.7.0) or OpenSSL") +endif () + +mark_as_advanced(SYS_RND_HDR) diff --git a/cmake/dependencies/systemlibraries.cmake b/cmake/dependencies/systemlibraries.cmake new file mode 100644 index 00000000..e00266d6 --- /dev/null +++ b/cmake/dependencies/systemlibraries.cmake @@ -0,0 +1,20 @@ +if (NOT APPLE) + find_library(LIBRT_LIBRARIES rt) + if (NOT LIBRT_LIBRARIES) + message(FATAL_ERROR "Could not find librt") + endif () +else () + set(LIBRT_LIBRARIES "") +endif () + +find_library(LIBPTHREAD_LIBRARIES pthread) +if (NOT LIBPTHREAD_LIBRARIES) + message(FATAL_ERROR "Could not find libpthread") +endif () + +find_library(LIBM_LIBRARIES m) +if (NOT LIBM_LIBRARIES) + message(FATAL_ERROR "Could not find libm") +endif () + +mark_as_advanced(LIBRT_LIBRARIES LIBPTHREAD_LIBRARIES LIBM_LIBRARIES) -- cgit v1.2.3