[verified] feat: pin native protobuf and gRPC generation

This commit is contained in:
Dobromir Popov
2026-07-17 23:43:03 +03:00
parent db59caa8e9
commit 902ecde363
7 changed files with 288 additions and 61 deletions

View File

@@ -4,10 +4,8 @@
# 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.
#
# gRPC C++ is optional here on purpose. The conformance test only needs message
# types, so the schema can be verified on a machine that has protobuf but not
# the gRPC C++ stack. When gRPC *is* found, the service stubs are generated too
# and exported as `shard_runtime_grpc` for the worker (DGR-008) to link.
# 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=<protobuf-install>
@@ -23,8 +21,17 @@ project(meshnet_shard_protocol CXX)
set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
find_package(protobuf CONFIG REQUIRED)
find_package(gRPC CONFIG QUIET)
# 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")
@@ -39,24 +46,19 @@ protobuf_generate(
PROTOC_OUT_DIR "${CMAKE_CURRENT_BINARY_DIR}"
)
# Service stubs: only when the gRPC C++ stack is present.
if(gRPC_FOUND)
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=$<TARGET_FILE:gRPC::grpc_cpp_plugin>"
IMPORT_DIRS "${CMAKE_CURRENT_SOURCE_DIR}/proto"
PROTOC_OUT_DIR "${CMAKE_CURRENT_BINARY_DIR}"
)
message(STATUS "gRPC C++ found: building ShardRuntime service stubs")
else()
message(STATUS "gRPC C++ not found: building message types only "
"(sufficient for the conformance test)")
endif()
# 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=$<TARGET_FILE:gRPC::grpc_cpp_plugin>"
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()

View File

@@ -46,7 +46,7 @@ sampled token to request/recipe identity and sampling/template/reasoning inputs.
If the machine has no protobuf C++ toolchain:
```bash
scripts/bootstrap_native_toolchain.sh build/native-toolchain
bash scripts/bootstrap_native_toolchain.sh build/native-toolchain
```
Then:
@@ -58,10 +58,10 @@ cmake --build build/native -j
ctest --test-dir build/native --output-on-failure
```
gRPC C++ is optional: without it, CMake builds the message types only, which is
all the conformance test needs. When gRPC C++ *is* found, the `ShardRuntime`
service stubs are built too and exported as `shard_runtime_grpc` for the worker
(DGR-008) to link.
The bootstrap pins and builds Protobuf `33.1`, gRPC C++ `1.82.1`, and the
matching `grpc_cpp_plugin` into one ignored prefix. CMake requires those exact
package versions and always generates both message and service stubs; it does
not fall back to an arbitrary system plugin.
## How the cross-language check actually proves something