# Native Shard protocol: C++ schema generation, build wiring and conformance test. # # The C++ stubs are generated into the build tree at configure time — they are # never committed. A C++ consumer already needs a toolchain, so committing # generated C++ would only create a second copy of the schema that can rot. # # Protobuf and gRPC C++ are required together so message and service bindings are # generated by one exact toolchain. The ignored bootstrap prefix supplies both. # # Build: # cmake -S packages/node/native -B build/native -DCMAKE_PREFIX_PATH= # cmake --build build/native -j # ctest --test-dir build/native --output-on-failure # # `scripts/bootstrap_native_toolchain.sh` builds a protobuf install from source # when the system has none. cmake_minimum_required(VERSION 3.24) project(meshnet_shard_protocol CXX) set(CMAKE_CXX_STANDARD 17) set(CMAKE_CXX_STANDARD_REQUIRED ON) # Protobuf and gRPC are one pinned generation toolchain. Configure only against # the ignored prefix produced by scripts/bootstrap_native_toolchain.sh; accepting # an arbitrary system plugin would make generated service bindings host-dependent. set(MESHNET_PROTOBUF_VERSION "33.1.0") set(MESHNET_GRPC_VERSION "1.82.1") find_package(protobuf ${MESHNET_PROTOBUF_VERSION} EXACT CONFIG REQUIRED) find_package(gRPC ${MESHNET_GRPC_VERSION} EXACT CONFIG REQUIRED) if(NOT TARGET gRPC::grpc_cpp_plugin) message(FATAL_ERROR "pinned gRPC package does not export grpc_cpp_plugin") endif() set(SHARD_PROTO "${CMAKE_CURRENT_SOURCE_DIR}/proto/shard_runtime.proto") # Message types: always available. add_library(shard_runtime_proto STATIC "${SHARD_PROTO}") target_link_libraries(shard_runtime_proto PUBLIC protobuf::libprotobuf) target_include_directories(shard_runtime_proto PUBLIC "${CMAKE_CURRENT_BINARY_DIR}") protobuf_generate( TARGET shard_runtime_proto LANGUAGE cpp IMPORT_DIRS "${CMAKE_CURRENT_SOURCE_DIR}/proto" PROTOC_OUT_DIR "${CMAKE_CURRENT_BINARY_DIR}" ) # Service stubs are part of the reproducibility contract, not an optional branch. add_library(shard_runtime_grpc STATIC "${SHARD_PROTO}") target_link_libraries(shard_runtime_grpc PUBLIC shard_runtime_proto gRPC::grpc++) target_include_directories(shard_runtime_grpc PUBLIC "${CMAKE_CURRENT_BINARY_DIR}") protobuf_generate( TARGET shard_runtime_grpc LANGUAGE grpc GENERATE_EXTENSIONS .grpc.pb.h .grpc.pb.cc PLUGIN "protoc-gen-grpc=$" IMPORT_DIRS "${CMAKE_CURRENT_SOURCE_DIR}/proto" PROTOC_OUT_DIR "${CMAKE_CURRENT_BINARY_DIR}" ) message(STATUS "Pinned gRPC ${gRPC_VERSION}: building ShardRuntime service stubs") enable_testing() # DGR-037: the standalone worker owns exactly one loaded llama.cpp artifact. # Its implementation types stay in worker/llama_shard_engine.cpp; the gRPC # service receives only the project-owned ShardEngine surface. set(MESHNET_LLAMA_SOURCE_DIR "${CMAKE_SOURCE_DIR}/../../../build/llama.cpp/source" CACHE PATH "Applied pinned llama.cpp source directory") set(MESHNET_LLAMA_LIBRARY_DIR "${CMAKE_SOURCE_DIR}/../../../build/llama.cpp/build/bin" CACHE PATH "Directory containing the matching applied-patch libllama") find_path(MESHNET_LLAMA_INCLUDE_DIR llama.h PATHS "${MESHNET_LLAMA_SOURCE_DIR}/include" NO_DEFAULT_PATH REQUIRED) find_path(MESHNET_LLAMA_GGML_INCLUDE_DIR ggml.h PATHS "${MESHNET_LLAMA_SOURCE_DIR}/ggml/include" NO_DEFAULT_PATH REQUIRED) find_library(MESHNET_LLAMA_LIBRARY NAMES llama PATHS "${MESHNET_LLAMA_LIBRARY_DIR}" NO_DEFAULT_PATH REQUIRED) add_executable(shard_worker worker/shard_worker_main.cpp worker/shard_service.cpp worker/llama_shard_engine.cpp) target_include_directories(shard_worker PRIVATE "${CMAKE_CURRENT_SOURCE_DIR}/worker" "${MESHNET_LLAMA_INCLUDE_DIR}" "${MESHNET_LLAMA_GGML_INCLUDE_DIR}") target_link_libraries(shard_worker PRIVATE shard_runtime_grpc gRPC::grpc++ "${MESHNET_LLAMA_LIBRARY}") set_target_properties(shard_worker PROPERTIES BUILD_RPATH "${MESHNET_LLAMA_LIBRARY_DIR}") # Pure-C++ CTest: the worker binds an ephemeral port, self-drives the full # lifecycle (capability, health, fragmented prefill, decode, release) over a # real loopback gRPC channel, and exits non-zero on any mismatch. This proves # the worker serves the contract without needing a Python environment. add_executable(shard_protocol_conformance tests/test_shard_protocol_conformance.cpp) target_link_libraries(shard_protocol_conformance PRIVATE shard_runtime_proto) # The test asserts against the same committed vectors the Python test uses, and # writes its own re-serialization back out so Python can prove the two languages # agree byte-for-byte. add_test( NAME shard_protocol_conformance COMMAND shard_protocol_conformance "${CMAKE_CURRENT_SOURCE_DIR}/testdata" "${CMAKE_CURRENT_BINARY_DIR}" )