cmake_minimum_required(VERSION 3.21) project(kpnpp VERSION 0.1.0 LANGUAGES CXX) set(CMAKE_CXX_STANDARD 20) set(CMAKE_CXX_STANDARD_REQUIRED ON) set(CMAKE_CXX_EXTENSIONS OFF) option(KPN_BUILD_TESTS "Build tests" ON) option(KPN_BUILD_PYTHON "Build Python bindings (requires nanobind)" ON) option(KPN_BUILD_EXAMPLES "Build examples" ON) option(KPN_WEB_DEBUG "Enable web debug UI (cpp-httplib)" OFF) # ── Core library (header-only) ──────────────────────────────────────────────── add_library(kpn INTERFACE) target_include_directories(kpn INTERFACE $ $ ) target_compile_features(kpn INTERFACE cxx_std_20) # Threads required by node/channel implementation find_package(Threads REQUIRED) target_link_libraries(kpn INTERFACE Threads::Threads) # ── Web debug UI (optional) ─────────────────────────────────────────────────── if(KPN_WEB_DEBUG) include(FetchContent) FetchContent_Declare( cpp-httplib GIT_REPOSITORY https://github.com/yhirose/cpp-httplib.git GIT_TAG v0.18.0 ) FetchContent_MakeAvailable(cpp-httplib) # httplib made available but NOT forced onto kpn interface — targets opt in # by defining KPN_WEB_DEBUG=1 and linking httplib::httplib themselves. # This prevents tests and other examples from pulling in the HTTP server. endif() # Convenience function for targets that want web debug function(kpn_target_enable_web_debug target) target_compile_definitions(${target} PRIVATE KPN_WEB_DEBUG=1) target_link_libraries(${target} PRIVATE httplib::httplib) endfunction() # ── Tests ───────────────────────────────────────────────────────────────────── if(KPN_BUILD_TESTS) enable_testing() add_subdirectory(tests) endif() # ── Python bindings ─────────────────────────────────────────────────────────── if(KPN_BUILD_PYTHON) find_package(Python 3.8 COMPONENTS Interpreter Development.Module REQUIRED) find_package(nanobind CONFIG QUIET) if(NOT nanobind_FOUND) # Fall back to FetchContent if nanobind not installed system-wide include(FetchContent) FetchContent_Declare( nanobind GIT_REPOSITORY https://github.com/wjakob/nanobind.git GIT_TAG v2.12.0 ) FetchContent_MakeAvailable(nanobind) endif() add_subdirectory(python) endif() # ── Examples ────────────────────────────────────────────────────────────────── if(KPN_BUILD_EXAMPLES) add_subdirectory(examples) endif()