blob: 64a6947733f25b78d14593428b8edd2ac9584dd9 [file] [log] [blame]
Tim Windelschmidtd4817492025-06-16 15:03:12 +02001From 865b50b442368ba2a91a53d68b946e04022875e4 Mon Sep 17 00:00:00 2001
Tim Windelschmidt1f51cf42024-10-01 17:04:28 +02002From: Lorenz Brun <lorenz@monogon.tech>
3Date: Wed, 25 Sep 2024 02:37:42 +0200
Tim Windelschmidtd4817492025-06-16 15:03:12 +02004Subject: [PATCH] Support no_std in Prost toolchain
Tim Windelschmidt1f51cf42024-10-01 17:04:28 +02005
6---
Tim Windelschmidtd6349752025-01-09 06:43:26 +01007 extensions/prost/private/prost.bzl | 8 ++++++++
Tim Windelschmidtd4817492025-06-16 15:03:12 +02008 extensions/prost/private/protoc_wrapper.rs | 23 ++++++++++++++++++++--
9 2 files changed, 29 insertions(+), 2 deletions(-)
Tim Windelschmidt1f51cf42024-10-01 17:04:28 +020010
Tim Windelschmidtd6349752025-01-09 06:43:26 +010011diff --git a/extensions/prost/private/prost.bzl b/extensions/prost/private/prost.bzl
Tim Windelschmidtd4817492025-06-16 15:03:12 +020012index c5917107b..b06e126e6 100644
Tim Windelschmidtd6349752025-01-09 06:43:26 +010013--- a/extensions/prost/private/prost.bzl
14+++ b/extensions/prost/private/prost.bzl
Tim Windelschmidtd4817492025-06-16 15:03:12 +020015@@ -89,6 +89,9 @@ def _compile_proto(
Tim Windelschmidtd6349752025-01-09 06:43:26 +010016 additional_args.add("--additional_srcs={}".format(",".join([f.path for f in all_additional_srcs.to_list()])))
17 additional_args.add_all(prost_toolchain.prost_opts + prost_opts, format_each = "--prost_opt=%s")
18
Tim Windelschmidtd4817492025-06-16 15:03:12 +020019+ if prost_toolchain.is_no_std:
20+ additional_args.add("--is_no_std")
Tim Windelschmidt1f51cf42024-10-01 17:04:28 +020021+
22 if prost_toolchain.tonic_plugin:
23 tonic_plugin = prost_toolchain.tonic_plugin[DefaultInfo].files_to_run
24 additional_args.add(prost_toolchain.tonic_plugin_flag % tonic_plugin.executable.path)
Tim Windelschmidtd4817492025-06-16 15:03:12 +020025@@ -459,6 +462,7 @@ def _rust_prost_toolchain_impl(ctx):
Tim Windelschmidt1f51cf42024-10-01 17:04:28 +020026 tonic_runtime = ctx.attr.tonic_runtime,
27 include_transitive_deps = ctx.attr.include_transitive_deps,
Tim Windelschmidtd4817492025-06-16 15:03:12 +020028 compile_well_known_types = ctx.attr.compile_well_known_types,
29+ is_no_std = ctx.attr.is_no_std,
Tim Windelschmidt1f51cf42024-10-01 17:04:28 +020030 )]
Tim Windelschmidtd6349752025-01-09 06:43:26 +010031
Tim Windelschmidt1f51cf42024-10-01 17:04:28 +020032 rust_prost_toolchain = rule(
Tim Windelschmidtd4817492025-06-16 15:03:12 +020033@@ -474,6 +478,10 @@ rust_prost_toolchain = rule(
34 doc = "Whether to include transitive dependencies. If set to True, all transitive dependencies will directly accessible by the dependent crate.",
35 default = False,
Tim Windelschmidt1f51cf42024-10-01 17:04:28 +020036 ),
Tim Windelschmidtd4817492025-06-16 15:03:12 +020037+ "is_no_std": attr.bool(
Tim Windelschmidt1f51cf42024-10-01 17:04:28 +020038+ doc = "If a no_std tag should be put into the generated code.",
39+ default = False,
40+ ),
Tim Windelschmidtd4817492025-06-16 15:03:12 +020041 "prost_opts": attr.string_list(
42 doc = "Additional options to add to Prost.",
43 ),
Tim Windelschmidtd6349752025-01-09 06:43:26 +010044diff --git a/extensions/prost/private/protoc_wrapper.rs b/extensions/prost/private/protoc_wrapper.rs
Tim Windelschmidtd4817492025-06-16 15:03:12 +020045index 878f1c30c..8f09c77fc 100644
Tim Windelschmidtd6349752025-01-09 06:43:26 +010046--- a/extensions/prost/private/protoc_wrapper.rs
47+++ b/extensions/prost/private/protoc_wrapper.rs
48@@ -156,8 +156,17 @@ fn generate_lib_rs(
Tim Windelschmidt1f51cf42024-10-01 17:04:28 +020049 is_tonic: bool,
50 direct_dep_crate_names: Vec<String>,
Tim Windelschmidtd6349752025-01-09 06:43:26 +010051 additional_content: String,
Tim Windelschmidtd4817492025-06-16 15:03:12 +020052+ is_no_std: bool,
Tim Windelschmidt1f51cf42024-10-01 17:04:28 +020053 ) -> String {
54- let mut contents = vec!["// @generated".to_string(), "".to_string()];
55+ let mut contents = vec![
Tim Windelschmidtd4817492025-06-16 15:03:12 +020056+ if is_no_std {
Tim Windelschmidtd6349752025-01-09 06:43:26 +010057+ "#![no_std]".to_string()
58+ } else {
59+ "".to_string()
60+ },
Tim Windelschmidt1f51cf42024-10-01 17:04:28 +020061+ "// @generated".to_string(),
62+ "".to_string(),
63+ ];
64 for crate_name in direct_dep_crate_names {
65 contents.push(format!("pub use {crate_name};"));
66 }
Tim Windelschmidtd4817492025-06-16 15:03:12 +020067@@ -471,6 +480,9 @@ struct Args {
Tim Windelschmidt1f51cf42024-10-01 17:04:28 +020068 /// Whether to generate tonic code.
69 is_tonic: bool,
Tim Windelschmidtd6349752025-01-09 06:43:26 +010070
Tim Windelschmidt1f51cf42024-10-01 17:04:28 +020071+ // Whether to put a no_std tag into the generated code.
Tim Windelschmidtd4817492025-06-16 15:03:12 +020072+ is_no_std: bool,
Tim Windelschmidt1f51cf42024-10-01 17:04:28 +020073+
74 /// Extra arguments to pass to protoc.
75 extra_args: Vec<String>,
76 }
Tim Windelschmidtd4817492025-06-16 15:03:12 +020077@@ -494,6 +506,7 @@ impl Args {
Tim Windelschmidt1f51cf42024-10-01 17:04:28 +020078 let mut direct_dep_crate_names = Vec::new();
79 let mut is_tonic = false;
Tim Windelschmidtd4817492025-06-16 15:03:12 +020080 let mut compile_well_known_types = false;
81+ let mut is_no_std = false;
Tim Windelschmidtd6349752025-01-09 06:43:26 +010082
Tim Windelschmidt1f51cf42024-10-01 17:04:28 +020083 let mut extra_args = Vec::new();
Tim Windelschmidtd6349752025-01-09 06:43:26 +010084
Tim Windelschmidtd4817492025-06-16 15:03:12 +020085@@ -516,6 +529,10 @@ impl Args {
Tim Windelschmidt1f51cf42024-10-01 17:04:28 +020086 is_tonic = true;
87 return;
88 }
Tim Windelschmidtd4817492025-06-16 15:03:12 +020089+ if arg == "--is_no_std" {
90+ is_no_std = true;
Tim Windelschmidt1f51cf42024-10-01 17:04:28 +020091+ return;
92+ }
Tim Windelschmidtd6349752025-01-09 06:43:26 +010093
Tim Windelschmidtd4817492025-06-16 15:03:12 +020094 if arg == "--compile_well_known_types" {
95 compile_well_known_types = true;
96@@ -664,6 +681,7 @@ impl Args {
Tim Windelschmidt1f51cf42024-10-01 17:04:28 +020097 proto_paths,
98 direct_dep_crate_names,
99 is_tonic,
Tim Windelschmidtd4817492025-06-16 15:03:12 +0200100+ is_no_std,
Tim Windelschmidt1f51cf42024-10-01 17:04:28 +0200101 label: label.unwrap(),
102 extra_args,
Tim Windelschmidtd4817492025-06-16 15:03:12 +0200103 compile_well_known_types,
104@@ -769,6 +787,7 @@ fn main() {
Tim Windelschmidt1f51cf42024-10-01 17:04:28 +0200105 proto_paths,
106 direct_dep_crate_names,
107 is_tonic,
Tim Windelschmidtd4817492025-06-16 15:03:12 +0200108+ is_no_std,
Tim Windelschmidt1f51cf42024-10-01 17:04:28 +0200109 extra_args,
Tim Windelschmidtd4817492025-06-16 15:03:12 +0200110 compile_well_known_types,
Tim Windelschmidt1f51cf42024-10-01 17:04:28 +0200111 } = Args::parse().expect("Failed to parse args");
Tim Windelschmidtd4817492025-06-16 15:03:12 +0200112@@ -947,6 +966,7 @@ fn main() {
Tim Windelschmidtd6349752025-01-09 06:43:26 +0100113 is_tonic,
114 direct_dep_crate_names,
115 additional_content,
Tim Windelschmidtd4817492025-06-16 15:03:12 +0200116+ is_no_std,
Tim Windelschmidtd6349752025-01-09 06:43:26 +0100117 ),
Tim Windelschmidt1f51cf42024-10-01 17:04:28 +0200118 )
119 .expect("Failed to write file.");
Tim Windelschmidtd4817492025-06-16 15:03:12 +0200120@@ -1002,7 +1022,6 @@ fn escape_keyword(s: String) -> String {
121
122 #[cfg(test)]
123 mod test {
124-
125 use super::*;
126
127 use prost_types::{FieldDescriptorProto, ServiceDescriptorProto};
Tim Windelschmidtd6349752025-01-09 06:43:26 +0100128--
Tim Windelschmidtd4817492025-06-16 15:03:12 +02001292.49.0