diff options
Diffstat (limited to 'meta-oe/recipes-devtools/protobuf')
-rw-r--r-- | meta-oe/recipes-devtools/protobuf/protobuf-c/0001-Makefile.am-do-not-compile-the-code-which-was-genera.patch | 29 | ||||
-rw-r--r-- | meta-oe/recipes-devtools/protobuf/protobuf-c/protobuf-30.patch | 1446 | ||||
-rw-r--r-- | meta-oe/recipes-devtools/protobuf/protobuf-c_1.5.1.bb (renamed from meta-oe/recipes-devtools/protobuf/protobuf-c_1.5.0.bb) | 12 | ||||
-rw-r--r-- | meta-oe/recipes-devtools/protobuf/protobuf/0001-Fix-build-on-mips-clang.patch | 30 | ||||
-rw-r--r-- | meta-oe/recipes-devtools/protobuf/protobuf/0001-examples-Makefile-respect-CXX-LDFLAGS-variables-fix-.patch | 35 | ||||
-rw-r--r-- | meta-oe/recipes-devtools/protobuf/protobuf/0001-fix-protobuf-native-build-failure-with-gcc-10.patch | 46 | ||||
-rw-r--r-- | meta-oe/recipes-devtools/protobuf/protobuf/0001-utf8_range-add-version-marker-to-library-19009.patch | 43 | ||||
-rw-r--r-- | meta-oe/recipes-devtools/protobuf/protobuf_6.31.1.bb (renamed from meta-oe/recipes-devtools/protobuf/protobuf_4.25.3.bb) | 33 |
8 files changed, 1615 insertions, 59 deletions
diff --git a/meta-oe/recipes-devtools/protobuf/protobuf-c/0001-Makefile.am-do-not-compile-the-code-which-was-genera.patch b/meta-oe/recipes-devtools/protobuf/protobuf-c/0001-Makefile.am-do-not-compile-the-code-which-was-genera.patch index 896a568e19..cae68e948b 100644 --- a/meta-oe/recipes-devtools/protobuf/protobuf-c/0001-Makefile.am-do-not-compile-the-code-which-was-genera.patch +++ b/meta-oe/recipes-devtools/protobuf/protobuf-c/0001-Makefile.am-do-not-compile-the-code-which-was-genera.patch | |||
@@ -1,6 +1,6 @@ | |||
1 | From 62b2fd0a150133b6439f6537cb1762d35f5790ee Mon Sep 17 00:00:00 2001 | 1 | From ad4d22cd6b0b1237a4d50699736d38cd3c902ace Mon Sep 17 00:00:00 2001 |
2 | From: Xiangyu Chen <xiangyu.chen@windriver.com> | 2 | From: Xiangyu Chen <xiangyu.chen@windriver.com> |
3 | Date: Fri, 31 Mar 2023 16:02:50 +0800 | 3 | Date: Wed, 12 Mar 2025 00:16:24 -0700 |
4 | Subject: [PATCH] Makefile.am: do not compile the code which was generated from | 4 | Subject: [PATCH] Makefile.am: do not compile the code which was generated from |
5 | test-full.proto in protobuf-c-native | 5 | test-full.proto in protobuf-c-native |
6 | 6 | ||
@@ -11,15 +11,18 @@ the test-full.proto with latest version protobuf. | |||
11 | Upstream-Status: Inappropriate [oe specific] | 11 | Upstream-Status: Inappropriate [oe specific] |
12 | 12 | ||
13 | Signed-off-by: Xiangyu Chen <xiangyu.chen@windriver.com> | 13 | Signed-off-by: Xiangyu Chen <xiangyu.chen@windriver.com> |
14 | |||
15 | Rebase to 1.5.1 | ||
16 | Signed-off-by: Hongxu Jia <hongxu.jia@windriver.com> | ||
14 | --- | 17 | --- |
15 | Makefile.am | 75 ----------------------------------------------------- | 18 | Makefile.am | 75 ----------------------------------------------------- |
16 | 1 file changed, 75 deletions(-) | 19 | 1 file changed, 75 deletions(-) |
17 | 20 | ||
18 | diff --git a/Makefile.am b/Makefile.am | 21 | diff --git a/Makefile.am b/Makefile.am |
19 | index ff12664..7412aef 100644 | 22 | index 77aa9d9..5cdd81a 100644 |
20 | --- a/Makefile.am | 23 | --- a/Makefile.am |
21 | +++ b/Makefile.am | 24 | +++ b/Makefile.am |
22 | @@ -136,81 +136,6 @@ else | 25 | @@ -138,81 +138,6 @@ else |
23 | 26 | ||
24 | LOG_COMPILER = $(VALGRIND) | 27 | LOG_COMPILER = $(VALGRIND) |
25 | 28 | ||
@@ -72,20 +75,20 @@ index ff12664..7412aef 100644 | |||
72 | -t_generated_code2_cxx_generate_packed_data_LDADD = \ | 75 | -t_generated_code2_cxx_generate_packed_data_LDADD = \ |
73 | - $(protobuf_LIBS) | 76 | - $(protobuf_LIBS) |
74 | - | 77 | - |
75 | -t/test.pb-c.c t/test.pb-c.h: $(top_builddir)/protoc-c/protoc-gen-c$(EXEEXT) $(top_srcdir)/t/test.proto | 78 | -t/test.pb-c.c t/test.pb-c.h: $(top_builddir)/protoc-gen-c/protoc-gen-c$(EXEEXT) $(top_srcdir)/t/test.proto |
76 | - $(AM_V_GEN)@PROTOC@ --plugin=protoc-gen-c=$(top_builddir)/protoc-c/protoc-gen-c$(EXEEXT) -I$(top_srcdir) --c_out=$(top_builddir) $(top_srcdir)/t/test.proto | 79 | - $(AM_V_GEN)@PROTOC@ --plugin=protoc-gen-c=$(top_builddir)/protoc-gen-c/protoc-gen-c$(EXEEXT) -I$(top_srcdir) --c_out=$(top_builddir) $(top_srcdir)/t/test.proto |
77 | - | 80 | - |
78 | -t/test-optimized.pb-c.c t/test-optimized.pb-c.h: $(top_builddir)/protoc-c/protoc-gen-c$(EXEEXT) $(top_srcdir)/t/test-optimized.proto | 81 | -t/test-optimized.pb-c.c t/test-optimized.pb-c.h: $(top_builddir)/protoc-gen-c/protoc-gen-c$(EXEEXT) $(top_srcdir)/t/test-optimized.proto |
79 | - $(AM_V_GEN)@PROTOC@ --plugin=protoc-gen-c=$(top_builddir)/protoc-c/protoc-gen-c$(EXEEXT) -I$(top_srcdir) --c_out=$(top_builddir) $(top_srcdir)/t/test-optimized.proto | 82 | - $(AM_V_GEN)@PROTOC@ --plugin=protoc-gen-c=$(top_builddir)/protoc-gen-c/protoc-gen-c$(EXEEXT) -I$(top_srcdir) --c_out=$(top_builddir) $(top_srcdir)/t/test-optimized.proto |
80 | - | 83 | - |
81 | -t/test-full.pb-c.c t/test-full.pb-c.h: $(top_builddir)/protoc-c/protoc-gen-c$(EXEEXT) $(top_srcdir)/t/test-full.proto | 84 | -t/test-full.pb-c.c t/test-full.pb-c.h: $(top_builddir)/protoc-gen-c/protoc-gen-c$(EXEEXT) $(top_srcdir)/t/test-full.proto |
82 | - $(AM_V_GEN)@PROTOC@ --plugin=protoc-gen-c=$(top_builddir)/protoc-c/protoc-gen-c$(EXEEXT) -I$(top_srcdir) --c_out=$(top_builddir) $(top_srcdir)/t/test-full.proto | 85 | - $(AM_V_GEN)@PROTOC@ --plugin=protoc-gen-c=$(top_builddir)/protoc-gen-c/protoc-gen-c$(EXEEXT) -I$(top_srcdir) --c_out=$(top_builddir) $(top_srcdir)/t/test-full.proto |
83 | - | 86 | - |
84 | -t/test-full.pb.cc t/test-full.pb.h: @PROTOC@ $(top_srcdir)/t/test-full.proto | 87 | -t/test-full.pb.cc t/test-full.pb.h: @PROTOC@ $(top_srcdir)/t/test-full.proto |
85 | - $(AM_V_GEN)@PROTOC@ -I$(top_srcdir) --cpp_out=$(top_builddir) $(top_srcdir)/t/test-full.proto | 88 | - $(AM_V_GEN)@PROTOC@ -I$(top_srcdir) --cpp_out=$(top_builddir) $(top_srcdir)/t/test-full.proto |
86 | - | 89 | - |
87 | -t/test-proto3.pb-c.c t/test-proto3.pb-c.h: $(top_builddir)/protoc-c/protoc-gen-c$(EXEEXT) $(top_srcdir)/t/test-proto3.proto | 90 | -t/test-proto3.pb-c.c t/test-proto3.pb-c.h: $(top_builddir)/protoc-gen-c/protoc-gen-c$(EXEEXT) $(top_srcdir)/t/test-proto3.proto |
88 | - $(AM_V_GEN)@PROTOC@ --plugin=protoc-gen-c=$(top_builddir)/protoc-c/protoc-gen-c$(EXEEXT) -I$(top_srcdir) --c_out=$(top_builddir) $(top_srcdir)/t/test-proto3.proto | 91 | - $(AM_V_GEN)@PROTOC@ --plugin=protoc-gen-c=$(top_builddir)/protoc-gen-c/protoc-gen-c$(EXEEXT) -I$(top_srcdir) --c_out=$(top_builddir) $(top_srcdir)/t/test-proto3.proto |
89 | - | 92 | - |
90 | -t/generated-code2/test-full-cxx-output.inc: t/generated-code2/cxx-generate-packed-data$(EXEEXT) | 93 | -t/generated-code2/test-full-cxx-output.inc: t/generated-code2/cxx-generate-packed-data$(EXEEXT) |
91 | - $(AM_V_GEN)$(top_builddir)/t/generated-code2/cxx-generate-packed-data$(EXEEXT) > $(top_builddir)/t/generated-code2/test-full-cxx-output.inc | 94 | - $(AM_V_GEN)$(top_builddir)/t/generated-code2/cxx-generate-packed-data$(EXEEXT) > $(top_builddir)/t/generated-code2/test-full-cxx-output.inc |
@@ -102,5 +105,5 @@ index ff12664..7412aef 100644 | |||
102 | t/version/version.c | 105 | t/version/version.c |
103 | t_version_version_LDADD = \ | 106 | t_version_version_LDADD = \ |
104 | -- | 107 | -- |
105 | 2.34.1 | 108 | 2.25.1 |
106 | 109 | ||
diff --git a/meta-oe/recipes-devtools/protobuf/protobuf-c/protobuf-30.patch b/meta-oe/recipes-devtools/protobuf/protobuf-c/protobuf-30.patch new file mode 100644 index 0000000000..1aae1f17b0 --- /dev/null +++ b/meta-oe/recipes-devtools/protobuf/protobuf-c/protobuf-30.patch | |||
@@ -0,0 +1,1446 @@ | |||
1 | From b28683f8027bf1e886b748b5603eb16d203b5a92 Mon Sep 17 00:00:00 2001 | ||
2 | From: Robert Edmonds <edmonds@users.noreply.github.com> | ||
3 | Date: Sat, 8 Feb 2025 18:18:33 -0500 | ||
4 | Subject: [PATCH 01/11] protoc-gen-c/c_helpers.h: Move compat defines into new | ||
5 | header file compat.h | ||
6 | |||
7 | Upstream-Status: Backport [https://gitlab.archlinux.org/archlinux/packaging/packages/protobuf-c/-/blob/main/protobuf-30.patch] | ||
8 | Signed-off-by: Hongxu Jia <hongxu.jia@windriver.com> | ||
9 | |||
10 | --- | ||
11 | protoc-gen-c/c_field.cc | 1 + | ||
12 | protoc-gen-c/c_helpers.cc | 1 + | ||
13 | protoc-gen-c/c_helpers.h | 10 ------- | ||
14 | protoc-gen-c/c_message.cc | 1 + | ||
15 | protoc-gen-c/c_primitive_field.cc | 1 + | ||
16 | protoc-gen-c/compat.h | 46 +++++++++++++++++++++++++++++++ | ||
17 | protoc-gen-c/main.cc | 1 + | ||
18 | 7 files changed, 51 insertions(+), 10 deletions(-) | ||
19 | create mode 100644 protoc-gen-c/compat.h | ||
20 | |||
21 | diff --git a/protoc-gen-c/c_field.cc b/protoc-gen-c/c_field.cc | ||
22 | index 5e79967b..d6d8597e 100644 | ||
23 | --- a/protoc-gen-c/c_field.cc | ||
24 | +++ b/protoc-gen-c/c_field.cc | ||
25 | @@ -74,6 +74,7 @@ | ||
26 | #include "c_message_field.h" | ||
27 | #include "c_primitive_field.h" | ||
28 | #include "c_string_field.h" | ||
29 | +#include "compat.h" | ||
30 | |||
31 | namespace protobuf_c { | ||
32 | |||
33 | diff --git a/protoc-gen-c/c_helpers.cc b/protoc-gen-c/c_helpers.cc | ||
34 | index 5edcf904..c38843f8 100644 | ||
35 | --- a/protoc-gen-c/c_helpers.cc | ||
36 | +++ b/protoc-gen-c/c_helpers.cc | ||
37 | @@ -73,6 +73,7 @@ | ||
38 | #include <google/protobuf/stubs/common.h> | ||
39 | |||
40 | #include "c_helpers.h" | ||
41 | +#include "compat.h" | ||
42 | |||
43 | namespace protobuf_c { | ||
44 | |||
45 | diff --git a/protoc-gen-c/c_helpers.h b/protoc-gen-c/c_helpers.h | ||
46 | index 943676e9..e69504bb 100644 | ||
47 | --- a/protoc-gen-c/c_helpers.h | ||
48 | +++ b/protoc-gen-c/c_helpers.h | ||
49 | @@ -186,16 +186,6 @@ inline int FieldSyntax(const google::protobuf::FieldDescriptor* field) { | ||
50 | return 2; | ||
51 | } | ||
52 | |||
53 | -// Work around changes in protobuf >= 22.x without breaking compilation against | ||
54 | -// older protobuf versions. | ||
55 | -#if GOOGLE_PROTOBUF_VERSION >= 4022000 | ||
56 | -# define GOOGLE_ARRAYSIZE ABSL_ARRAYSIZE | ||
57 | -# define GOOGLE_CHECK_EQ ABSL_CHECK_EQ | ||
58 | -# define GOOGLE_CHECK_EQ ABSL_CHECK_EQ | ||
59 | -# define GOOGLE_DCHECK_GE ABSL_DCHECK_GE | ||
60 | -# define GOOGLE_LOG ABSL_LOG | ||
61 | -#endif | ||
62 | - | ||
63 | } // namespace protobuf_c | ||
64 | |||
65 | #endif // PROTOBUF_C_PROTOC_GEN_C_C_HELPERS_H__ | ||
66 | diff --git a/protoc-gen-c/c_message.cc b/protoc-gen-c/c_message.cc | ||
67 | index d4a9a01e..46413873 100644 | ||
68 | --- a/protoc-gen-c/c_message.cc | ||
69 | +++ b/protoc-gen-c/c_message.cc | ||
70 | @@ -78,6 +78,7 @@ | ||
71 | #include "c_extension.h" | ||
72 | #include "c_helpers.h" | ||
73 | #include "c_message.h" | ||
74 | +#include "compat.h" | ||
75 | |||
76 | namespace protobuf_c { | ||
77 | |||
78 | diff --git a/protoc-gen-c/c_primitive_field.cc b/protoc-gen-c/c_primitive_field.cc | ||
79 | index 253b00bd..588f60e6 100644 | ||
80 | --- a/protoc-gen-c/c_primitive_field.cc | ||
81 | +++ b/protoc-gen-c/c_primitive_field.cc | ||
82 | @@ -67,6 +67,7 @@ | ||
83 | |||
84 | #include "c_helpers.h" | ||
85 | #include "c_primitive_field.h" | ||
86 | +#include "compat.h" | ||
87 | |||
88 | namespace protobuf_c { | ||
89 | |||
90 | diff --git a/protoc-gen-c/compat.h b/protoc-gen-c/compat.h | ||
91 | new file mode 100644 | ||
92 | index 00000000..2ee78281 | ||
93 | --- /dev/null | ||
94 | +++ b/protoc-gen-c/compat.h | ||
95 | @@ -0,0 +1,46 @@ | ||
96 | +// Copyright (c) 2008-2025, Dave Benson and the protobuf-c authors. | ||
97 | +// All rights reserved. | ||
98 | +// | ||
99 | +// Redistribution and use in source and binary forms, with or without | ||
100 | +// modification, are permitted provided that the following conditions are | ||
101 | +// met: | ||
102 | +// | ||
103 | +// * Redistributions of source code must retain the above copyright | ||
104 | +// notice, this list of conditions and the following disclaimer. | ||
105 | +// | ||
106 | +// * Redistributions in binary form must reproduce the above | ||
107 | +// copyright notice, this list of conditions and the following disclaimer | ||
108 | +// in the documentation and/or other materials provided with the | ||
109 | +// distribution. | ||
110 | +// | ||
111 | +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS | ||
112 | +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT | ||
113 | +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR | ||
114 | +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT | ||
115 | +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, | ||
116 | +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT | ||
117 | +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, | ||
118 | +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY | ||
119 | +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | ||
120 | +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE | ||
121 | +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | ||
122 | + | ||
123 | +#ifndef PROTOBUF_C_PROTOC_GEN_C_COMPAT_H__ | ||
124 | +#define PROTOBUF_C_PROTOC_GEN_C_COMPAT_H__ | ||
125 | + | ||
126 | +#if GOOGLE_PROTOBUF_VERSION >= 4022000 | ||
127 | +# define GOOGLE_ARRAYSIZE ABSL_ARRAYSIZE | ||
128 | +# define GOOGLE_CHECK_EQ ABSL_CHECK_EQ | ||
129 | +# define GOOGLE_DCHECK_GE ABSL_DCHECK_GE | ||
130 | +# define GOOGLE_LOG ABSL_LOG | ||
131 | +#endif | ||
132 | + | ||
133 | +namespace protobuf_c { | ||
134 | + | ||
135 | +namespace compat { | ||
136 | + | ||
137 | +} // namespace compat | ||
138 | + | ||
139 | +} // namespace protobuf_c | ||
140 | + | ||
141 | +#endif // PROTOBUF_C_PROTOC_GEN_C_COMPAT_H__ | ||
142 | diff --git a/protoc-gen-c/main.cc b/protoc-gen-c/main.cc | ||
143 | index 0656c113..5ab929d3 100644 | ||
144 | --- a/protoc-gen-c/main.cc | ||
145 | +++ b/protoc-gen-c/main.cc | ||
146 | @@ -32,6 +32,7 @@ | ||
147 | |||
148 | #include "c_generator.h" | ||
149 | #include "c_helpers.h" | ||
150 | +#include "compat.h" | ||
151 | |||
152 | int main(int argc, char* argv[]) { | ||
153 | protobuf_c::CGenerator c_generator; | ||
154 | |||
155 | From 1678f1fba6f2d3e5c1db2817495ddcd72bd4e87b Mon Sep 17 00:00:00 2001 | ||
156 | From: Robert Edmonds <edmonds@users.noreply.github.com> | ||
157 | Date: Sat, 8 Feb 2025 20:09:03 -0500 | ||
158 | Subject: [PATCH 02/11] protoc-gen-c/compat.h: Add `compat::StringView` type | ||
159 | |||
160 | protobuf >= 30.x replaces `const std::string&` in various APIs with | ||
161 | its own string view type that may actually be a `absl::string_view`. | ||
162 | Introduce our own `compat::StringView` type that we can use instead | ||
163 | of `const std::string&` in order to support compiling across multiple | ||
164 | protobuf versions. | ||
165 | --- | ||
166 | protoc-gen-c/compat.h | 8 ++++++++ | ||
167 | 1 file changed, 8 insertions(+) | ||
168 | |||
169 | diff --git a/protoc-gen-c/compat.h b/protoc-gen-c/compat.h | ||
170 | index 2ee78281..fe8041b5 100644 | ||
171 | --- a/protoc-gen-c/compat.h | ||
172 | +++ b/protoc-gen-c/compat.h | ||
173 | @@ -28,6 +28,8 @@ | ||
174 | #ifndef PROTOBUF_C_PROTOC_GEN_C_COMPAT_H__ | ||
175 | #define PROTOBUF_C_PROTOC_GEN_C_COMPAT_H__ | ||
176 | |||
177 | +#include <string> | ||
178 | + | ||
179 | #if GOOGLE_PROTOBUF_VERSION >= 4022000 | ||
180 | # define GOOGLE_ARRAYSIZE ABSL_ARRAYSIZE | ||
181 | # define GOOGLE_CHECK_EQ ABSL_CHECK_EQ | ||
182 | @@ -39,6 +41,12 @@ namespace protobuf_c { | ||
183 | |||
184 | namespace compat { | ||
185 | |||
186 | +#if GOOGLE_PROTOBUF_VERSION >= 6030000 | ||
187 | +typedef google::protobuf::internal::DescriptorStringView StringView; | ||
188 | +#else | ||
189 | +typedef const std::string& StringView; | ||
190 | +#endif | ||
191 | + | ||
192 | } // namespace compat | ||
193 | |||
194 | } // namespace protobuf_c | ||
195 | |||
196 | From db5252c131c82fb48ee599179b6989a577b7fbc8 Mon Sep 17 00:00:00 2001 | ||
197 | From: Robert Edmonds <edmonds@users.noreply.github.com> | ||
198 | Date: Sat, 8 Feb 2025 20:13:44 -0500 | ||
199 | Subject: [PATCH 03/11] Remove some unused functions | ||
200 | |||
201 | --- | ||
202 | protoc-gen-c/c_helpers.cc | 64 --------------------------------------- | ||
203 | protoc-gen-c/c_helpers.h | 3 -- | ||
204 | 2 files changed, 67 deletions(-) | ||
205 | |||
206 | diff --git a/protoc-gen-c/c_helpers.cc b/protoc-gen-c/c_helpers.cc | ||
207 | index c38843f8..bbb4a615 100644 | ||
208 | --- a/protoc-gen-c/c_helpers.cc | ||
209 | +++ b/protoc-gen-c/c_helpers.cc | ||
210 | @@ -90,14 +90,6 @@ namespace protobuf_c { | ||
211 | #pragma warning(disable:4996) | ||
212 | #endif | ||
213 | |||
214 | -std::string DotsToUnderscores(const std::string& name) { | ||
215 | - return StringReplace(name, ".", "_", true); | ||
216 | -} | ||
217 | - | ||
218 | -std::string DotsToColons(const std::string& name) { | ||
219 | - return StringReplace(name, ".", "::", true); | ||
220 | -} | ||
221 | - | ||
222 | std::string SimpleFtoa(float f) { | ||
223 | char buf[100]; | ||
224 | snprintf(buf,sizeof(buf),"%.*g", FLT_DIG, f); | ||
225 | @@ -333,11 +325,6 @@ std::string FilenameIdentifier(const std::string& filename) { | ||
226 | return result; | ||
227 | } | ||
228 | |||
229 | -// Return the name of the BuildDescriptors() function for a given file. | ||
230 | -std::string GlobalBuildDescriptorsName(const std::string& filename) { | ||
231 | - return "proto_BuildDescriptors_" + FilenameIdentifier(filename); | ||
232 | -} | ||
233 | - | ||
234 | std::string GetLabelName(google::protobuf::FieldDescriptor::Label label) { | ||
235 | switch (label) { | ||
236 | case google::protobuf::FieldDescriptor::LABEL_OPTIONAL: return "optional"; | ||
237 | @@ -392,57 +379,6 @@ WriteIntRanges(google::protobuf::io::Printer* printer, int n_values, const int * | ||
238 | } | ||
239 | } | ||
240 | |||
241 | - | ||
242 | - | ||
243 | -// XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXx | ||
244 | -// XXXXXXXXX this stuff is copied from strutils.cc !!!! XXXXXXXXXXXXXXXXXXXXXXXXXXXXx | ||
245 | -// XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXx | ||
246 | -// ---------------------------------------------------------------------- | ||
247 | -// StringReplace() | ||
248 | -// Replace the "old" pattern with the "new" pattern in a string, | ||
249 | -// and append the result to "res". If replace_all is false, | ||
250 | -// it only replaces the first instance of "old." | ||
251 | -// ---------------------------------------------------------------------- | ||
252 | - | ||
253 | -void StringReplace(const std::string& s, const std::string& oldsub, | ||
254 | - const std::string& newsub, bool replace_all, | ||
255 | - std::string* res) { | ||
256 | - if (oldsub.empty()) { | ||
257 | - res->append(s); // if empty, append the given string. | ||
258 | - return; | ||
259 | - } | ||
260 | - | ||
261 | - std::string::size_type start_pos = 0; | ||
262 | - std::string::size_type pos; | ||
263 | - do { | ||
264 | - pos = s.find(oldsub, start_pos); | ||
265 | - if (pos == std::string::npos) { | ||
266 | - break; | ||
267 | - } | ||
268 | - res->append(s, start_pos, pos - start_pos); | ||
269 | - res->append(newsub); | ||
270 | - start_pos = pos + oldsub.size(); // start searching again after the "old" | ||
271 | - } while (replace_all); | ||
272 | - res->append(s, start_pos, s.length() - start_pos); | ||
273 | -} | ||
274 | - | ||
275 | - | ||
276 | -// ---------------------------------------------------------------------- | ||
277 | -// StringReplace() | ||
278 | -// Give me a string and two patterns "old" and "new", and I replace | ||
279 | -// the first instance of "old" in the string with "new", if it | ||
280 | -// exists. If "global" is true; call this repeatedly until it | ||
281 | -// fails. RETURN a new string, regardless of whether the replacement | ||
282 | -// happened or not. | ||
283 | -// ---------------------------------------------------------------------- | ||
284 | - | ||
285 | -std::string StringReplace(const std::string& s, const std::string& oldsub, | ||
286 | - const std::string& newsub, bool replace_all) { | ||
287 | - std::string ret; | ||
288 | - StringReplace(s, oldsub, newsub, replace_all, &ret); | ||
289 | - return ret; | ||
290 | -} | ||
291 | - | ||
292 | // ---------------------------------------------------------------------- | ||
293 | // SplitStringUsing() | ||
294 | // Split a string using a character delimiter. Append the components | ||
295 | diff --git a/protoc-gen-c/c_helpers.h b/protoc-gen-c/c_helpers.h | ||
296 | index e69504bb..377d4272 100644 | ||
297 | --- a/protoc-gen-c/c_helpers.h | ||
298 | +++ b/protoc-gen-c/c_helpers.h | ||
299 | @@ -150,9 +150,6 @@ const char* DeclaredTypeMethodName(google::protobuf::FieldDescriptor::Type type) | ||
300 | // Convert a file name into a valid identifier. | ||
301 | std::string FilenameIdentifier(const std::string& filename); | ||
302 | |||
303 | -// Return the name of the BuildDescriptors() function for a given file. | ||
304 | -std::string GlobalBuildDescriptorsName(const std::string& filename); | ||
305 | - | ||
306 | // return 'required', 'optional', or 'repeated' | ||
307 | std::string GetLabelName(google::protobuf::FieldDescriptor::Label label); | ||
308 | |||
309 | |||
310 | From bc2cb66d908f016dd3f7082c8a6ad7c58bc03412 Mon Sep 17 00:00:00 2001 | ||
311 | From: Robert Edmonds <edmonds@users.noreply.github.com> | ||
312 | Date: Sat, 8 Feb 2025 20:18:05 -0500 | ||
313 | Subject: [PATCH 04/11] Use `compat::StringView` type across various function | ||
314 | signatures | ||
315 | |||
316 | --- | ||
317 | protoc-gen-c/c_helpers.cc | 44 +++++++++++++++++++++------------------ | ||
318 | protoc-gen-c/c_helpers.h | 36 ++++++++++++++++---------------- | ||
319 | 2 files changed, 42 insertions(+), 38 deletions(-) | ||
320 | |||
321 | diff --git a/protoc-gen-c/c_helpers.cc b/protoc-gen-c/c_helpers.cc | ||
322 | index bbb4a615..c759c8c2 100644 | ||
323 | --- a/protoc-gen-c/c_helpers.cc | ||
324 | +++ b/protoc-gen-c/c_helpers.cc | ||
325 | @@ -96,6 +96,7 @@ std::string SimpleFtoa(float f) { | ||
326 | buf[sizeof(buf)-1] = 0; /* should NOT be necessary */ | ||
327 | return buf; | ||
328 | } | ||
329 | + | ||
330 | std::string SimpleDtoa(double d) { | ||
331 | char buf[100]; | ||
332 | snprintf(buf,sizeof(buf),"%.*g", DBL_DIG, d); | ||
333 | @@ -103,7 +104,7 @@ std::string SimpleDtoa(double d) { | ||
334 | return buf; | ||
335 | } | ||
336 | |||
337 | -std::string CamelToUpper(const std::string &name) { | ||
338 | +std::string CamelToUpper(compat::StringView name) { | ||
339 | bool was_upper = true; // suppress initial _ | ||
340 | std::string rv = ""; | ||
341 | int len = name.length(); | ||
342 | @@ -120,7 +121,8 @@ std::string CamelToUpper(const std::string &name) { | ||
343 | } | ||
344 | return rv; | ||
345 | } | ||
346 | -std::string CamelToLower(const std::string &name) { | ||
347 | + | ||
348 | +std::string CamelToLower(compat::StringView name) { | ||
349 | bool was_upper = true; // suppress initial _ | ||
350 | std::string rv = ""; | ||
351 | int len = name.length(); | ||
352 | @@ -138,8 +140,7 @@ std::string CamelToLower(const std::string &name) { | ||
353 | return rv; | ||
354 | } | ||
355 | |||
356 | - | ||
357 | -std::string ToUpper(const std::string &name) { | ||
358 | +std::string ToUpper(compat::StringView name) { | ||
359 | std::string rv = ""; | ||
360 | int len = name.length(); | ||
361 | for (int i = 0; i < len; i++) { | ||
362 | @@ -147,7 +148,8 @@ std::string ToUpper(const std::string &name) { | ||
363 | } | ||
364 | return rv; | ||
365 | } | ||
366 | -std::string ToLower(const std::string &name) { | ||
367 | + | ||
368 | +std::string ToLower(compat::StringView name) { | ||
369 | std::string rv = ""; | ||
370 | int len = name.length(); | ||
371 | for (int i = 0; i < len; i++) { | ||
372 | @@ -155,7 +157,8 @@ std::string ToLower(const std::string &name) { | ||
373 | } | ||
374 | return rv; | ||
375 | } | ||
376 | -std::string ToCamel(const std::string &name) { | ||
377 | + | ||
378 | +std::string ToCamel(compat::StringView name) { | ||
379 | std::string rv = ""; | ||
380 | int len = name.length(); | ||
381 | bool next_is_upper = true; | ||
382 | @@ -172,7 +175,7 @@ std::string ToCamel(const std::string &name) { | ||
383 | return rv; | ||
384 | } | ||
385 | |||
386 | -std::string OverrideFullName(const std::string &full_name, const google::protobuf::FileDescriptor* file) { | ||
387 | +std::string OverrideFullName(compat::StringView full_name, const google::protobuf::FileDescriptor* file) { | ||
388 | const ProtobufCFileOptions opt = file->options().GetExtension(pb_c_file); | ||
389 | if (!opt.has_c_package()) | ||
390 | return full_name; | ||
391 | @@ -184,7 +187,7 @@ std::string OverrideFullName(const std::string &full_name, const google::protobu | ||
392 | return new_name + full_name.substr(file->package().length()); | ||
393 | } | ||
394 | |||
395 | -std::string FullNameToLower(const std::string &full_name, const google::protobuf::FileDescriptor* file) { | ||
396 | +std::string FullNameToLower(compat::StringView full_name, const google::protobuf::FileDescriptor* file) { | ||
397 | std::vector<std::string> pieces; | ||
398 | SplitStringUsing(OverrideFullName(full_name, file), ".", &pieces); | ||
399 | std::string rv = ""; | ||
400 | @@ -195,7 +198,8 @@ std::string FullNameToLower(const std::string &full_name, const google::protobuf | ||
401 | } | ||
402 | return rv; | ||
403 | } | ||
404 | -std::string FullNameToUpper(const std::string &full_name, const google::protobuf::FileDescriptor* file) { | ||
405 | + | ||
406 | +std::string FullNameToUpper(compat::StringView full_name, const google::protobuf::FileDescriptor* file) { | ||
407 | std::vector<std::string> pieces; | ||
408 | SplitStringUsing(OverrideFullName(full_name, file), ".", &pieces); | ||
409 | std::string rv = ""; | ||
410 | @@ -206,7 +210,8 @@ std::string FullNameToUpper(const std::string &full_name, const google::protobuf | ||
411 | } | ||
412 | return rv; | ||
413 | } | ||
414 | -std::string FullNameToC(const std::string &full_name, const google::protobuf::FileDescriptor* file) { | ||
415 | + | ||
416 | +std::string FullNameToC(compat::StringView full_name, const google::protobuf::FileDescriptor* file) { | ||
417 | std::vector<std::string> pieces; | ||
418 | SplitStringUsing(OverrideFullName(full_name, file), ".", &pieces); | ||
419 | std::string rv = ""; | ||
420 | @@ -248,7 +253,7 @@ void PrintComment(google::protobuf::io::Printer* printer, std::string comment) | ||
421 | } | ||
422 | } | ||
423 | |||
424 | -std::string ConvertToSpaces(const std::string &input) { | ||
425 | +std::string ConvertToSpaces(compat::StringView input) { | ||
426 | return std::string(input.size(), ' '); | ||
427 | } | ||
428 | |||
429 | @@ -259,8 +264,7 @@ int compare_name_indices_by_name(const void *a, const void *b) | ||
430 | return strcmp (ni_a->name, ni_b->name); | ||
431 | } | ||
432 | |||
433 | - | ||
434 | -std::string CEscape(const std::string& src); | ||
435 | +std::string CEscape(compat::StringView src); | ||
436 | |||
437 | const char* const kKeywordList[] = { | ||
438 | "and", "and_eq", "asm", "auto", "bitand", "bitor", "bool", "break", "case", | ||
439 | @@ -300,7 +304,7 @@ std::string FieldDeprecated(const google::protobuf::FieldDescriptor* field) { | ||
440 | return ""; | ||
441 | } | ||
442 | |||
443 | -std::string StripProto(const std::string& filename) { | ||
444 | +std::string StripProto(compat::StringView filename) { | ||
445 | if (HasSuffixString(filename, ".protodevel")) { | ||
446 | return StripSuffixString(filename, ".protodevel"); | ||
447 | } else { | ||
448 | @@ -309,7 +313,7 @@ std::string StripProto(const std::string& filename) { | ||
449 | } | ||
450 | |||
451 | // Convert a file name into a valid identifier. | ||
452 | -std::string FilenameIdentifier(const std::string& filename) { | ||
453 | +std::string FilenameIdentifier(compat::StringView filename) { | ||
454 | std::string result; | ||
455 | for (unsigned i = 0; i < filename.size(); i++) { | ||
456 | if (isalnum(filename[i])) { | ||
457 | @@ -335,7 +339,7 @@ std::string GetLabelName(google::protobuf::FieldDescriptor::Label label) { | ||
458 | } | ||
459 | |||
460 | unsigned | ||
461 | -WriteIntRanges(google::protobuf::io::Printer* printer, int n_values, const int *values, const std::string &name) | ||
462 | +WriteIntRanges(google::protobuf::io::Printer* printer, int n_values, const int *values, compat::StringView name) | ||
463 | { | ||
464 | std::map<std::string, std::string> vars; | ||
465 | vars["name"] = name; | ||
466 | @@ -389,7 +393,7 @@ WriteIntRanges(google::protobuf::io::Printer* printer, int n_values, const int * | ||
467 | // ---------------------------------------------------------------------- | ||
468 | template <typename ITR> | ||
469 | static inline | ||
470 | -void SplitStringToIteratorUsing(const std::string& full, | ||
471 | +void SplitStringToIteratorUsing(compat::StringView full, | ||
472 | const char* delim, | ||
473 | ITR& result) { | ||
474 | // Optimize the common case where delim is a single character. | ||
475 | @@ -422,7 +426,7 @@ void SplitStringToIteratorUsing(const std::string& full, | ||
476 | } | ||
477 | } | ||
478 | |||
479 | -void SplitStringUsing(const std::string& full, | ||
480 | +void SplitStringUsing(compat::StringView full, | ||
481 | const char* delim, | ||
482 | std::vector<std::string>* result) { | ||
483 | std::back_insert_iterator< std::vector<std::string> > it(*result); | ||
484 | @@ -435,7 +439,6 @@ char* FastHexToBuffer(int i, char* buffer) | ||
485 | return buffer; | ||
486 | } | ||
487 | |||
488 | - | ||
489 | static int CEscapeInternal(const char* src, int src_len, char* dest, | ||
490 | int dest_len, bool use_hex) { | ||
491 | const char* src_end = src + src_len; | ||
492 | @@ -478,7 +481,8 @@ static int CEscapeInternal(const char* src, int src_len, char* dest, | ||
493 | dest[used] = '\0'; // doesn't count towards return value though | ||
494 | return used; | ||
495 | } | ||
496 | -std::string CEscape(const std::string& src) { | ||
497 | + | ||
498 | +std::string CEscape(compat::StringView src) { | ||
499 | const int dest_length = src.size() * 4 + 1; // Maximum possible expansion | ||
500 | std::unique_ptr<char[]> dest(new char[dest_length]); | ||
501 | const int len = CEscapeInternal(src.data(), src.size(), | ||
502 | diff --git a/protoc-gen-c/c_helpers.h b/protoc-gen-c/c_helpers.h | ||
503 | index 377d4272..ccd39ca2 100644 | ||
504 | --- a/protoc-gen-c/c_helpers.h | ||
505 | +++ b/protoc-gen-c/c_helpers.h | ||
506 | @@ -73,6 +73,8 @@ | ||
507 | |||
508 | #include <protobuf-c/protobuf-c.pb.h> | ||
509 | |||
510 | +#include "compat.h" | ||
511 | + | ||
512 | namespace protobuf_c { | ||
513 | |||
514 | // --- Borrowed from stubs. --- | ||
515 | @@ -84,11 +86,10 @@ template <typename T> std::string SimpleItoa(T n) { | ||
516 | |||
517 | std::string SimpleFtoa(float f); | ||
518 | std::string SimpleDtoa(double f); | ||
519 | -void SplitStringUsing(const std::string &str, const char *delim, std::vector<std::string> *out); | ||
520 | -std::string CEscape(const std::string& src); | ||
521 | -std::string StringReplace(const std::string& s, const std::string& oldsub, const std::string& newsub, bool replace_all); | ||
522 | -inline bool HasSuffixString(const std::string& str, const std::string& suffix) { return str.size() >= suffix.size() && str.compare(str.size() - suffix.size(), suffix.size(), suffix) == 0; } | ||
523 | -inline std::string StripSuffixString(const std::string& str, const std::string& suffix) { if (HasSuffixString(str, suffix)) { return str.substr(0, str.size() - suffix.size()); } else { return str; } } | ||
524 | +void SplitStringUsing(compat::StringView str, const char *delim, std::vector<std::string> *out); | ||
525 | +std::string CEscape(compat::StringView src); | ||
526 | +inline bool HasSuffixString(compat::StringView str, compat::StringView suffix) { return str.size() >= suffix.size() && str.compare(str.size() - suffix.size(), suffix.size(), suffix) == 0; } | ||
527 | +inline std::string StripSuffixString(compat::StringView str, compat::StringView suffix) { if (HasSuffixString(str, suffix)) { return str.substr(0, str.size() - suffix.size()); } else { return str; } } | ||
528 | char* FastHexToBuffer(int i, char* buffer); | ||
529 | |||
530 | |||
531 | @@ -110,31 +111,31 @@ inline const google::protobuf::Descriptor* FieldScope(const google::protobuf::Fi | ||
532 | |||
533 | // convert a CamelCase class name into an all uppercase affair | ||
534 | // with underscores separating words, e.g. MyClass becomes MY_CLASS. | ||
535 | -std::string CamelToUpper(const std::string &class_name); | ||
536 | -std::string CamelToLower(const std::string &class_name); | ||
537 | +std::string CamelToUpper(compat::StringView class_name); | ||
538 | +std::string CamelToLower(compat::StringView class_name); | ||
539 | |||
540 | // lowercased, underscored name to camel case | ||
541 | -std::string ToCamel(const std::string &name); | ||
542 | +std::string ToCamel(compat::StringView name); | ||
543 | |||
544 | // lowercase the string | ||
545 | -std::string ToLower(const std::string &class_name); | ||
546 | -std::string ToUpper(const std::string &class_name); | ||
547 | +std::string ToLower(compat::StringView class_name); | ||
548 | +std::string ToUpper(compat::StringView class_name); | ||
549 | |||
550 | // full_name() to lowercase with underscores | ||
551 | -std::string FullNameToLower(const std::string &full_name, const google::protobuf::FileDescriptor *file); | ||
552 | -std::string FullNameToUpper(const std::string &full_name, const google::protobuf::FileDescriptor *file); | ||
553 | +std::string FullNameToLower(compat::StringView full_name, const google::protobuf::FileDescriptor *file); | ||
554 | +std::string FullNameToUpper(compat::StringView full_name, const google::protobuf::FileDescriptor *file); | ||
555 | |||
556 | // full_name() to c-typename (with underscores for packages, otherwise camel case) | ||
557 | -std::string FullNameToC(const std::string &class_name, const google::protobuf::FileDescriptor *file); | ||
558 | +std::string FullNameToC(compat::StringView class_name, const google::protobuf::FileDescriptor *file); | ||
559 | |||
560 | // Splits, indents, formats, and prints comment lines | ||
561 | void PrintComment(google::protobuf::io::Printer* printer, std::string comment); | ||
562 | |||
563 | // make a string of spaces as long as input | ||
564 | -std::string ConvertToSpaces(const std::string &input); | ||
565 | +std::string ConvertToSpaces(compat::StringView input); | ||
566 | |||
567 | // Strips ".proto" or ".protodevel" from the end of a filename. | ||
568 | -std::string StripProto(const std::string& filename); | ||
569 | +std::string StripProto(compat::StringView filename); | ||
570 | |||
571 | // Get the C++ type name for a primitive type (e.g. "double", "::google::protobuf::int32", etc.). | ||
572 | // Note: non-built-in type names will be qualified, meaning they will start | ||
573 | @@ -148,15 +149,14 @@ const char* PrimitiveTypeName(google::protobuf::FieldDescriptor::CppType type); | ||
574 | const char* DeclaredTypeMethodName(google::protobuf::FieldDescriptor::Type type); | ||
575 | |||
576 | // Convert a file name into a valid identifier. | ||
577 | -std::string FilenameIdentifier(const std::string& filename); | ||
578 | +std::string FilenameIdentifier(compat::StringView filename); | ||
579 | |||
580 | // return 'required', 'optional', or 'repeated' | ||
581 | std::string GetLabelName(google::protobuf::FieldDescriptor::Label label); | ||
582 | |||
583 | - | ||
584 | // write IntRanges entries for a bunch of sorted values. | ||
585 | // returns the number of ranges there are to bsearch. | ||
586 | -unsigned WriteIntRanges(google::protobuf::io::Printer* printer, int n_values, const int *values, const std::string &name); | ||
587 | +unsigned WriteIntRanges(google::protobuf::io::Printer* printer, int n_values, const int *values, compat::StringView name); | ||
588 | |||
589 | struct NameIndex | ||
590 | { | ||
591 | |||
592 | From 75f1c32cc429233a3726358c999009f9ea373b45 Mon Sep 17 00:00:00 2001 | ||
593 | From: Robert Edmonds <edmonds@users.noreply.github.com> | ||
594 | Date: Sat, 8 Feb 2025 20:25:43 -0500 | ||
595 | Subject: [PATCH 05/11] Convert string views to owned strings where necessary | ||
596 | |||
597 | --- | ||
598 | protoc-gen-c/c_enum.cc | 2 +- | ||
599 | protoc-gen-c/c_enum_field.cc | 2 +- | ||
600 | protoc-gen-c/c_helpers.cc | 8 ++++---- | ||
601 | protoc-gen-c/c_helpers.h | 3 +-- | ||
602 | 4 files changed, 7 insertions(+), 8 deletions(-) | ||
603 | |||
604 | diff --git a/protoc-gen-c/c_enum.cc b/protoc-gen-c/c_enum.cc | ||
605 | index 9212ab82..311e4c86 100644 | ||
606 | --- a/protoc-gen-c/c_enum.cc | ||
607 | +++ b/protoc-gen-c/c_enum.cc | ||
608 | @@ -152,7 +152,7 @@ void EnumGenerator::GenerateValueInitializer(google::protobuf::io::Printer *prin | ||
609 | descriptor_->file()->options().optimize_for() == | ||
610 | google::protobuf::FileOptions_OptimizeMode_CODE_SIZE; | ||
611 | vars["enum_value_name"] = vd->name(); | ||
612 | - vars["c_enum_value_name"] = FullNameToUpper(descriptor_->full_name(), descriptor_->file()) + "__" + vd->name(); | ||
613 | + vars["c_enum_value_name"] = FullNameToUpper(descriptor_->full_name(), descriptor_->file()) + "__" + std::string(vd->name()); | ||
614 | vars["value"] = SimpleItoa(vd->number()); | ||
615 | if (optimize_code_size) | ||
616 | printer->Print(vars, " { NULL, NULL, $value$ }, /* CODE_SIZE */\n"); | ||
617 | diff --git a/protoc-gen-c/c_enum_field.cc b/protoc-gen-c/c_enum_field.cc | ||
618 | index 0926ae59..c3111f50 100644 | ||
619 | --- a/protoc-gen-c/c_enum_field.cc | ||
620 | +++ b/protoc-gen-c/c_enum_field.cc | ||
621 | @@ -78,7 +78,7 @@ void SetEnumVariables(const google::protobuf::FieldDescriptor* descriptor, | ||
622 | (*variables)["type"] = FullNameToC(descriptor->enum_type()->full_name(), descriptor->enum_type()->file()); | ||
623 | const google::protobuf::EnumValueDescriptor* default_value = descriptor->default_value_enum(); | ||
624 | (*variables)["default"] = FullNameToUpper(default_value->type()->full_name(), default_value->type()->file()) | ||
625 | - + "__" + default_value->name(); | ||
626 | + + "__" + std::string(default_value->name()); | ||
627 | (*variables)["deprecated"] = FieldDeprecated(descriptor); | ||
628 | } | ||
629 | |||
630 | diff --git a/protoc-gen-c/c_helpers.cc b/protoc-gen-c/c_helpers.cc | ||
631 | index c759c8c2..1aecef93 100644 | ||
632 | --- a/protoc-gen-c/c_helpers.cc | ||
633 | +++ b/protoc-gen-c/c_helpers.cc | ||
634 | @@ -178,13 +178,13 @@ std::string ToCamel(compat::StringView name) { | ||
635 | std::string OverrideFullName(compat::StringView full_name, const google::protobuf::FileDescriptor* file) { | ||
636 | const ProtobufCFileOptions opt = file->options().GetExtension(pb_c_file); | ||
637 | if (!opt.has_c_package()) | ||
638 | - return full_name; | ||
639 | + return std::string(full_name); | ||
640 | |||
641 | std::string new_name = opt.c_package(); | ||
642 | if (file->package().empty()) | ||
643 | new_name += "."; | ||
644 | |||
645 | - return new_name + full_name.substr(file->package().length()); | ||
646 | + return new_name + std::string(full_name.substr(file->package().length())); | ||
647 | } | ||
648 | |||
649 | std::string FullNameToLower(compat::StringView full_name, const google::protobuf::FileDescriptor* file) { | ||
650 | @@ -418,10 +418,10 @@ void SplitStringToIteratorUsing(compat::StringView full, | ||
651 | while (begin_index != std::string::npos) { | ||
652 | end_index = full.find_first_of(delim, begin_index); | ||
653 | if (end_index == std::string::npos) { | ||
654 | - *result++ = full.substr(begin_index); | ||
655 | + *result++ = std::string(full.substr(begin_index)); | ||
656 | return; | ||
657 | } | ||
658 | - *result++ = full.substr(begin_index, (end_index - begin_index)); | ||
659 | + *result++ = std::string(full.substr(begin_index, (end_index - begin_index))); | ||
660 | begin_index = full.find_first_not_of(delim, end_index); | ||
661 | } | ||
662 | } | ||
663 | diff --git a/protoc-gen-c/c_helpers.h b/protoc-gen-c/c_helpers.h | ||
664 | index ccd39ca2..985e4db6 100644 | ||
665 | --- a/protoc-gen-c/c_helpers.h | ||
666 | +++ b/protoc-gen-c/c_helpers.h | ||
667 | @@ -89,10 +89,9 @@ std::string SimpleDtoa(double f); | ||
668 | void SplitStringUsing(compat::StringView str, const char *delim, std::vector<std::string> *out); | ||
669 | std::string CEscape(compat::StringView src); | ||
670 | inline bool HasSuffixString(compat::StringView str, compat::StringView suffix) { return str.size() >= suffix.size() && str.compare(str.size() - suffix.size(), suffix.size(), suffix) == 0; } | ||
671 | -inline std::string StripSuffixString(compat::StringView str, compat::StringView suffix) { if (HasSuffixString(str, suffix)) { return str.substr(0, str.size() - suffix.size()); } else { return str; } } | ||
672 | +inline std::string StripSuffixString(compat::StringView str, compat::StringView suffix) { if (HasSuffixString(str, suffix)) { return std::string(str.substr(0, str.size() - suffix.size())); } else { return std::string(str); } } | ||
673 | char* FastHexToBuffer(int i, char* buffer); | ||
674 | |||
675 | - | ||
676 | // Get the (unqualified) name that should be used for this field in C code. | ||
677 | // The name is coerced to lower-case to emulate proto1 behavior. People | ||
678 | // should be using lowercase-with-underscores style for proto field names | ||
679 | |||
680 | From 0edca93db369fb84f01cc0d4e3ee4cd6c2ad7f4f Mon Sep 17 00:00:00 2001 | ||
681 | From: Robert Edmonds <edmonds@users.noreply.github.com> | ||
682 | Date: Sat, 8 Feb 2025 20:39:11 -0500 | ||
683 | Subject: [PATCH 06/11] Convert various uses of `const char *` to | ||
684 | `compat::StringView` | ||
685 | |||
686 | Also replace some uses of arrays manually allocated with new/delete with | ||
687 | uses of `std::vector`. | ||
688 | --- | ||
689 | protoc-gen-c/c_enum.cc | 35 ++++++++++++++++++----------------- | ||
690 | protoc-gen-c/c_helpers.cc | 2 +- | ||
691 | protoc-gen-c/c_helpers.h | 2 +- | ||
692 | protoc-gen-c/c_message.cc | 28 ++++++++++++---------------- | ||
693 | protoc-gen-c/c_service.cc | 19 +++++++++---------- | ||
694 | 5 files changed, 41 insertions(+), 45 deletions(-) | ||
695 | |||
696 | diff --git a/protoc-gen-c/c_enum.cc b/protoc-gen-c/c_enum.cc | ||
697 | index 311e4c86..c7839edd 100644 | ||
698 | --- a/protoc-gen-c/c_enum.cc | ||
699 | +++ b/protoc-gen-c/c_enum.cc | ||
700 | @@ -142,7 +142,7 @@ struct ValueIndex | ||
701 | int value; | ||
702 | unsigned index; | ||
703 | unsigned final_index; /* index in uniqified array of values */ | ||
704 | - const char *name; | ||
705 | + compat::StringView name; | ||
706 | }; | ||
707 | void EnumGenerator::GenerateValueInitializer(google::protobuf::io::Printer *printer, int index) | ||
708 | { | ||
709 | @@ -176,7 +176,7 @@ static int compare_value_indices_by_name(const void *a, const void *b) | ||
710 | { | ||
711 | const ValueIndex *vi_a = (const ValueIndex *) a; | ||
712 | const ValueIndex *vi_b = (const ValueIndex *) b; | ||
713 | - return strcmp (vi_a->name, vi_b->name); | ||
714 | + return vi_a->name.compare(vi_b->name); | ||
715 | } | ||
716 | |||
717 | void EnumGenerator::GenerateEnumDescriptor(google::protobuf::io::Printer* printer) { | ||
718 | @@ -194,18 +194,20 @@ void EnumGenerator::GenerateEnumDescriptor(google::protobuf::io::Printer* printe | ||
719 | |||
720 | // Sort by name and value, dropping duplicate values if they appear later. | ||
721 | // TODO: use a c++ paradigm for this! | ||
722 | - NameIndex *name_index = new NameIndex[descriptor_->value_count()]; | ||
723 | - ValueIndex *value_index = new ValueIndex[descriptor_->value_count()]; | ||
724 | - for (int j = 0; j < descriptor_->value_count(); j++) { | ||
725 | + std::vector<ValueIndex> value_index; | ||
726 | + for (unsigned j = 0; j < descriptor_->value_count(); j++) { | ||
727 | const google::protobuf::EnumValueDescriptor *vd = descriptor_->value(j); | ||
728 | - name_index[j].index = j; | ||
729 | - name_index[j].name = vd->name().c_str(); | ||
730 | - value_index[j].index = j; | ||
731 | - value_index[j].value = vd->number(); | ||
732 | - value_index[j].name = vd->name().c_str(); | ||
733 | + value_index.push_back({ | ||
734 | + .value = vd->number(), | ||
735 | + .index = j, | ||
736 | + .final_index = 0, | ||
737 | + .name = vd->name(), | ||
738 | + }); | ||
739 | } | ||
740 | - qsort(value_index, descriptor_->value_count(), | ||
741 | - sizeof(ValueIndex), compare_value_indices_by_value_then_index); | ||
742 | + qsort(&value_index[0], | ||
743 | + value_index.size(), | ||
744 | + sizeof(ValueIndex), | ||
745 | + compare_value_indices_by_value_then_index); | ||
746 | |||
747 | // only record unique values | ||
748 | int n_unique_values; | ||
749 | @@ -275,8 +277,10 @@ void EnumGenerator::GenerateEnumDescriptor(google::protobuf::io::Printer* printe | ||
750 | vars["n_ranges"] = SimpleItoa(n_ranges); | ||
751 | |||
752 | if (!optimize_code_size) { | ||
753 | - qsort(value_index, descriptor_->value_count(), | ||
754 | - sizeof(ValueIndex), compare_value_indices_by_name); | ||
755 | + qsort(&value_index[0], | ||
756 | + value_index.size(), | ||
757 | + sizeof(ValueIndex), | ||
758 | + compare_value_indices_by_name); | ||
759 | printer->Print(vars, | ||
760 | "static const ProtobufCEnumValueIndex $lcclassname$__enum_values_by_name[$value_count$] =\n" | ||
761 | "{\n"); | ||
762 | @@ -319,9 +323,6 @@ void EnumGenerator::GenerateEnumDescriptor(google::protobuf::io::Printer* printe | ||
763 | " NULL,NULL,NULL,NULL /* reserved[1234] */\n" | ||
764 | "};\n"); | ||
765 | } | ||
766 | - | ||
767 | - delete[] value_index; | ||
768 | - delete[] name_index; | ||
769 | } | ||
770 | |||
771 | } // namespace protobuf_c | ||
772 | diff --git a/protoc-gen-c/c_helpers.cc b/protoc-gen-c/c_helpers.cc | ||
773 | index 1aecef93..dec9ce28 100644 | ||
774 | --- a/protoc-gen-c/c_helpers.cc | ||
775 | +++ b/protoc-gen-c/c_helpers.cc | ||
776 | @@ -261,7 +261,7 @@ int compare_name_indices_by_name(const void *a, const void *b) | ||
777 | { | ||
778 | const NameIndex *ni_a = (const NameIndex *) a; | ||
779 | const NameIndex *ni_b = (const NameIndex *) b; | ||
780 | - return strcmp (ni_a->name, ni_b->name); | ||
781 | + return ni_a->name.compare(ni_b->name); | ||
782 | } | ||
783 | |||
784 | std::string CEscape(compat::StringView src); | ||
785 | diff --git a/protoc-gen-c/c_helpers.h b/protoc-gen-c/c_helpers.h | ||
786 | index 985e4db6..69369997 100644 | ||
787 | --- a/protoc-gen-c/c_helpers.h | ||
788 | +++ b/protoc-gen-c/c_helpers.h | ||
789 | @@ -160,7 +160,7 @@ unsigned WriteIntRanges(google::protobuf::io::Printer* printer, int n_values, co | ||
790 | struct NameIndex | ||
791 | { | ||
792 | unsigned index; | ||
793 | - const char *name; | ||
794 | + compat::StringView name; | ||
795 | }; | ||
796 | int compare_name_indices_by_name(const void*, const void*); | ||
797 | |||
798 | diff --git a/protoc-gen-c/c_message.cc b/protoc-gen-c/c_message.cc | ||
799 | index 46413873..7252923c 100644 | ||
800 | --- a/protoc-gen-c/c_message.cc | ||
801 | +++ b/protoc-gen-c/c_message.cc | ||
802 | @@ -567,27 +567,26 @@ GenerateMessageDescriptor(google::protobuf::io::Printer* printer, bool gen_init) | ||
803 | "static const ProtobufCFieldDescriptor $lcclassname$__field_descriptors[$n_fields$] =\n" | ||
804 | "{\n"); | ||
805 | printer->Indent(); | ||
806 | - const google::protobuf::FieldDescriptor **sorted_fields = new const google::protobuf::FieldDescriptor *[descriptor_->field_count()]; | ||
807 | + | ||
808 | + std::vector<const google::protobuf::FieldDescriptor*> sorted_fields; | ||
809 | for (int i = 0; i < descriptor_->field_count(); i++) { | ||
810 | - sorted_fields[i] = descriptor_->field(i); | ||
811 | + sorted_fields.push_back(descriptor_->field(i)); | ||
812 | } | ||
813 | - qsort (sorted_fields, descriptor_->field_count(), | ||
814 | + qsort(&sorted_fields[0], sorted_fields.size(), | ||
815 | sizeof(const google::protobuf::FieldDescriptor*), | ||
816 | compare_pfields_by_number); | ||
817 | - for (int i = 0; i < descriptor_->field_count(); i++) { | ||
818 | - const google::protobuf::FieldDescriptor* field = sorted_fields[i]; | ||
819 | + for (auto field : sorted_fields) { | ||
820 | field_generators_.get(field).GenerateDescriptorInitializer(printer); | ||
821 | } | ||
822 | printer->Outdent(); | ||
823 | printer->Print(vars, "};\n"); | ||
824 | |||
825 | if (!optimize_code_size) { | ||
826 | - NameIndex *field_indices = new NameIndex [descriptor_->field_count()]; | ||
827 | - for (int i = 0; i < descriptor_->field_count(); i++) { | ||
828 | - field_indices[i].name = sorted_fields[i]->name().c_str(); | ||
829 | - field_indices[i].index = i; | ||
830 | + std::vector<NameIndex> field_indices; | ||
831 | + for (unsigned i = 0; i < descriptor_->field_count(); i++) { | ||
832 | + field_indices.push_back({ .index = i, .name = sorted_fields[i]->name() }); | ||
833 | } | ||
834 | - qsort (field_indices, descriptor_->field_count(), sizeof (NameIndex), | ||
835 | + qsort(&field_indices[0], field_indices.size(), sizeof(NameIndex), | ||
836 | compare_name_indices_by_name); | ||
837 | printer->Print(vars, "static const unsigned $lcclassname$__field_indices_by_name[] = {\n"); | ||
838 | for (int i = 0; i < descriptor_->field_count(); i++) { | ||
839 | @@ -596,19 +595,16 @@ GenerateMessageDescriptor(google::protobuf::io::Printer* printer, bool gen_init) | ||
840 | printer->Print(vars, " $index$, /* field[$index$] = $name$ */\n"); | ||
841 | } | ||
842 | printer->Print("};\n"); | ||
843 | - delete[] field_indices; | ||
844 | } | ||
845 | |||
846 | // create range initializers | ||
847 | - int *values = new int[descriptor_->field_count()]; | ||
848 | + std::vector<int> values; | ||
849 | for (int i = 0; i < descriptor_->field_count(); i++) { | ||
850 | - values[i] = sorted_fields[i]->number(); | ||
851 | + values.push_back(sorted_fields[i]->number()); | ||
852 | } | ||
853 | int n_ranges = WriteIntRanges(printer, | ||
854 | - descriptor_->field_count(), values, | ||
855 | + descriptor_->field_count(), &values[0], | ||
856 | vars["lcclassname"] + "__number_ranges"); | ||
857 | - delete [] values; | ||
858 | - delete [] sorted_fields; | ||
859 | |||
860 | vars["n_ranges"] = SimpleItoa(n_ranges); | ||
861 | } else { | ||
862 | diff --git a/protoc-gen-c/c_service.cc b/protoc-gen-c/c_service.cc | ||
863 | index ee4d4a95..2c3ddcf3 100644 | ||
864 | --- a/protoc-gen-c/c_service.cc | ||
865 | +++ b/protoc-gen-c/c_service.cc | ||
866 | @@ -184,19 +184,19 @@ void ServiceGenerator::GenerateInit(google::protobuf::io::Printer* printer) | ||
867 | "}\n"); | ||
868 | } | ||
869 | |||
870 | -struct MethodIndexAndName { unsigned i; const char *name; }; | ||
871 | +struct MethodIndexAndName { unsigned i; compat::StringView name; }; | ||
872 | static int | ||
873 | compare_method_index_and_name_by_name (const void *a, const void *b) | ||
874 | { | ||
875 | const MethodIndexAndName *ma = (const MethodIndexAndName *) a; | ||
876 | const MethodIndexAndName *mb = (const MethodIndexAndName *) b; | ||
877 | - return strcmp (ma->name, mb->name); | ||
878 | + return ma->name.compare(mb->name); | ||
879 | } | ||
880 | |||
881 | void ServiceGenerator::GenerateServiceDescriptor(google::protobuf::io::Printer* printer) | ||
882 | { | ||
883 | int n_methods = descriptor_->method_count(); | ||
884 | - MethodIndexAndName *mi_array = new MethodIndexAndName[n_methods]; | ||
885 | + std::vector<MethodIndexAndName> mi_array; | ||
886 | |||
887 | bool optimize_code_size = descriptor_->file()->options().has_optimize_for() && | ||
888 | descriptor_->file()->options().optimize_for() == | ||
889 | @@ -205,7 +205,7 @@ void ServiceGenerator::GenerateServiceDescriptor(google::protobuf::io::Printer* | ||
890 | vars_["n_methods"] = SimpleItoa(n_methods); | ||
891 | printer->Print(vars_, "static const ProtobufCMethodDescriptor $lcfullname$__method_descriptors[$n_methods$] =\n" | ||
892 | "{\n"); | ||
893 | - for (int i = 0; i < n_methods; i++) { | ||
894 | + for (unsigned i = 0; i < n_methods; i++) { | ||
895 | const google::protobuf::MethodDescriptor* method = descriptor_->method(i); | ||
896 | vars_["method"] = method->name(); | ||
897 | vars_["input_descriptor"] = "&" + FullNameToLower(method->input_type()->full_name(), method->input_type()->file()) + "__descriptor"; | ||
898 | @@ -217,14 +217,15 @@ void ServiceGenerator::GenerateServiceDescriptor(google::protobuf::io::Printer* | ||
899 | printer->Print(vars_, | ||
900 | " { \"$method$\", $input_descriptor$, $output_descriptor$ },\n"); | ||
901 | } | ||
902 | - mi_array[i].i = i; | ||
903 | - mi_array[i].name = method->name().c_str(); | ||
904 | + mi_array.push_back({i, method->name()}); | ||
905 | } | ||
906 | printer->Print(vars_, "};\n"); | ||
907 | |||
908 | if (!optimize_code_size) { | ||
909 | - qsort ((void*)mi_array, n_methods, sizeof (MethodIndexAndName), | ||
910 | - compare_method_index_and_name_by_name); | ||
911 | + qsort(&mi_array[0], | ||
912 | + mi_array.size(), | ||
913 | + sizeof(MethodIndexAndName), | ||
914 | + compare_method_index_and_name_by_name); | ||
915 | printer->Print(vars_, "const unsigned $lcfullname$__method_indices_by_name[] = {\n"); | ||
916 | for (int i = 0; i < n_methods; i++) { | ||
917 | vars_["i"] = SimpleItoa(mi_array[i].i); | ||
918 | @@ -258,8 +259,6 @@ void ServiceGenerator::GenerateServiceDescriptor(google::protobuf::io::Printer* | ||
919 | " $lcfullname$__method_indices_by_name\n" | ||
920 | "};\n"); | ||
921 | } | ||
922 | - | ||
923 | - delete[] mi_array; | ||
924 | } | ||
925 | |||
926 | void ServiceGenerator::GenerateCallersImplementations(google::protobuf::io::Printer* printer) | ||
927 | |||
928 | From ebeddac1a746393a16d9ba4cf80e3d12c3ab7d7f Mon Sep 17 00:00:00 2001 | ||
929 | From: Robert Edmonds <edmonds@users.noreply.github.com> | ||
930 | Date: Sat, 8 Feb 2025 20:56:48 -0500 | ||
931 | Subject: [PATCH 07/11] Fix indentation of | ||
932 | MessageGenerator::GenerateMessageDescriptor() | ||
933 | |||
934 | --- | ||
935 | protoc-gen-c/c_message.cc | 321 +++++++++++++++++++------------------- | ||
936 | 1 file changed, 159 insertions(+), 162 deletions(-) | ||
937 | |||
938 | diff --git a/protoc-gen-c/c_message.cc b/protoc-gen-c/c_message.cc | ||
939 | index 7252923c..2a3b2a2f 100644 | ||
940 | --- a/protoc-gen-c/c_message.cc | ||
941 | +++ b/protoc-gen-c/c_message.cc | ||
942 | @@ -461,199 +461,196 @@ GenerateHelperFunctionDefinitions(google::protobuf::io::Printer* printer, | ||
943 | |||
944 | void MessageGenerator:: | ||
945 | GenerateMessageDescriptor(google::protobuf::io::Printer* printer, bool gen_init) { | ||
946 | - std::map<std::string, std::string> vars; | ||
947 | - vars["fullname"] = descriptor_->full_name(); | ||
948 | - vars["classname"] = FullNameToC(descriptor_->full_name(), descriptor_->file()); | ||
949 | - vars["lcclassname"] = FullNameToLower(descriptor_->full_name(), descriptor_->file()); | ||
950 | - vars["shortname"] = ToCamel(descriptor_->name()); | ||
951 | - vars["n_fields"] = SimpleItoa(descriptor_->field_count()); | ||
952 | - vars["packagename"] = descriptor_->file()->package(); | ||
953 | - | ||
954 | - bool optimize_code_size = descriptor_->file()->options().has_optimize_for() && | ||
955 | - descriptor_->file()->options().optimize_for() == | ||
956 | - google::protobuf::FileOptions_OptimizeMode_CODE_SIZE; | ||
957 | - | ||
958 | - const ProtobufCMessageOptions opt = | ||
959 | - descriptor_->options().GetExtension(pb_c_msg); | ||
960 | - // Override parent settings, if needed | ||
961 | - if (opt.has_gen_init_helpers()) | ||
962 | - gen_init = opt.gen_init_helpers(); | ||
963 | - | ||
964 | - for (int i = 0; i < descriptor_->nested_type_count(); i++) { | ||
965 | - nested_generators_[i]->GenerateMessageDescriptor(printer, gen_init); | ||
966 | - } | ||
967 | + std::map<std::string, std::string> vars; | ||
968 | + vars["fullname"] = descriptor_->full_name(); | ||
969 | + vars["classname"] = FullNameToC(descriptor_->full_name(), descriptor_->file()); | ||
970 | + vars["lcclassname"] = FullNameToLower(descriptor_->full_name(), descriptor_->file()); | ||
971 | + vars["shortname"] = ToCamel(descriptor_->name()); | ||
972 | + vars["n_fields"] = SimpleItoa(descriptor_->field_count()); | ||
973 | + vars["packagename"] = descriptor_->file()->package(); | ||
974 | |||
975 | - for (int i = 0; i < descriptor_->enum_type_count(); i++) { | ||
976 | - enum_generators_[i]->GenerateEnumDescriptor(printer); | ||
977 | - } | ||
978 | + bool optimize_code_size = descriptor_->file()->options().has_optimize_for() && | ||
979 | + descriptor_->file()->options().optimize_for() == | ||
980 | + google::protobuf::FileOptions_OptimizeMode_CODE_SIZE; | ||
981 | |||
982 | - for (int i = 0; i < descriptor_->field_count(); i++) { | ||
983 | - const google::protobuf::FieldDescriptor* fd = descriptor_->field(i); | ||
984 | - if (fd->has_default_value()) { | ||
985 | - field_generators_.get(fd).GenerateDefaultValueImplementations(printer); | ||
986 | - } | ||
987 | - } | ||
988 | + const ProtobufCMessageOptions opt = descriptor_->options().GetExtension(pb_c_msg); | ||
989 | + // Override parent settings, if needed | ||
990 | + if (opt.has_gen_init_helpers()) { | ||
991 | + gen_init = opt.gen_init_helpers(); | ||
992 | + } | ||
993 | |||
994 | - for (int i = 0; i < descriptor_->field_count(); i++) { | ||
995 | - const google::protobuf::FieldDescriptor* fd = descriptor_->field(i); | ||
996 | - const ProtobufCFieldOptions opt = fd->options().GetExtension(pb_c_field); | ||
997 | - if (fd->has_default_value()) { | ||
998 | - | ||
999 | - bool already_defined = false; | ||
1000 | - vars["name"] = fd->name(); | ||
1001 | - vars["lcname"] = CamelToLower(fd->name()); | ||
1002 | - vars["maybe_static"] = "static "; | ||
1003 | - vars["field_dv_ctype_suffix"] = ""; | ||
1004 | - vars["default_value"] = field_generators_.get(fd).GetDefaultValue(); | ||
1005 | - switch (fd->cpp_type()) { | ||
1006 | - case google::protobuf::FieldDescriptor::CPPTYPE_INT32: | ||
1007 | - vars["field_dv_ctype"] = "int32_t"; | ||
1008 | - break; | ||
1009 | - case google::protobuf::FieldDescriptor::CPPTYPE_INT64: | ||
1010 | - vars["field_dv_ctype"] = "int64_t"; | ||
1011 | - break; | ||
1012 | - case google::protobuf::FieldDescriptor::CPPTYPE_UINT32: | ||
1013 | - vars["field_dv_ctype"] = "uint32_t"; | ||
1014 | - break; | ||
1015 | - case google::protobuf::FieldDescriptor::CPPTYPE_UINT64: | ||
1016 | - vars["field_dv_ctype"] = "uint64_t"; | ||
1017 | - break; | ||
1018 | - case google::protobuf::FieldDescriptor::CPPTYPE_FLOAT: | ||
1019 | - vars["field_dv_ctype"] = "float"; | ||
1020 | - break; | ||
1021 | - case google::protobuf::FieldDescriptor::CPPTYPE_DOUBLE: | ||
1022 | - vars["field_dv_ctype"] = "double"; | ||
1023 | - break; | ||
1024 | - case google::protobuf::FieldDescriptor::CPPTYPE_BOOL: | ||
1025 | - vars["field_dv_ctype"] = "protobuf_c_boolean"; | ||
1026 | - break; | ||
1027 | - | ||
1028 | - case google::protobuf::FieldDescriptor::CPPTYPE_MESSAGE: | ||
1029 | - // NOTE: not supported by protobuf | ||
1030 | - vars["maybe_static"] = ""; | ||
1031 | - vars["field_dv_ctype"] = "{ ... }"; | ||
1032 | - GOOGLE_LOG(FATAL) << "Messages can't have default values!"; | ||
1033 | - break; | ||
1034 | - case google::protobuf::FieldDescriptor::CPPTYPE_STRING: | ||
1035 | - if (fd->type() == google::protobuf::FieldDescriptor::TYPE_BYTES || opt.string_as_bytes()) | ||
1036 | - { | ||
1037 | - vars["field_dv_ctype"] = "ProtobufCBinaryData"; | ||
1038 | - } | ||
1039 | - else /* STRING type */ | ||
1040 | - { | ||
1041 | - already_defined = true; | ||
1042 | - vars["maybe_static"] = ""; | ||
1043 | - vars["field_dv_ctype"] = "char"; | ||
1044 | - vars["field_dv_ctype_suffix"] = "[]"; | ||
1045 | - } | ||
1046 | - break; | ||
1047 | - case google::protobuf::FieldDescriptor::CPPTYPE_ENUM: | ||
1048 | - { | ||
1049 | - const google::protobuf::EnumValueDescriptor* vd = fd->default_value_enum(); | ||
1050 | - vars["field_dv_ctype"] = FullNameToC(vd->type()->full_name(), vd->type()->file()); | ||
1051 | - break; | ||
1052 | - } | ||
1053 | - default: | ||
1054 | - GOOGLE_LOG(FATAL) << "Unknown CPPTYPE"; | ||
1055 | - break; | ||
1056 | - } | ||
1057 | - if (!already_defined) | ||
1058 | - printer->Print(vars, "$maybe_static$const $field_dv_ctype$ $lcclassname$__$lcname$__default_value$field_dv_ctype_suffix$ = $default_value$;\n"); | ||
1059 | - } | ||
1060 | - } | ||
1061 | + for (int i = 0; i < descriptor_->nested_type_count(); i++) { | ||
1062 | + nested_generators_[i]->GenerateMessageDescriptor(printer, gen_init); | ||
1063 | + } | ||
1064 | |||
1065 | - if ( descriptor_->field_count() ) { | ||
1066 | - printer->Print(vars, | ||
1067 | - "static const ProtobufCFieldDescriptor $lcclassname$__field_descriptors[$n_fields$] =\n" | ||
1068 | - "{\n"); | ||
1069 | - printer->Indent(); | ||
1070 | + for (int i = 0; i < descriptor_->enum_type_count(); i++) { | ||
1071 | + enum_generators_[i]->GenerateEnumDescriptor(printer); | ||
1072 | + } | ||
1073 | |||
1074 | - std::vector<const google::protobuf::FieldDescriptor*> sorted_fields; | ||
1075 | for (int i = 0; i < descriptor_->field_count(); i++) { | ||
1076 | - sorted_fields.push_back(descriptor_->field(i)); | ||
1077 | - } | ||
1078 | - qsort(&sorted_fields[0], sorted_fields.size(), | ||
1079 | - sizeof(const google::protobuf::FieldDescriptor*), | ||
1080 | - compare_pfields_by_number); | ||
1081 | - for (auto field : sorted_fields) { | ||
1082 | - field_generators_.get(field).GenerateDescriptorInitializer(printer); | ||
1083 | + const google::protobuf::FieldDescriptor* fd = descriptor_->field(i); | ||
1084 | + if (fd->has_default_value()) { | ||
1085 | + field_generators_.get(fd).GenerateDefaultValueImplementations(printer); | ||
1086 | + } | ||
1087 | } | ||
1088 | - printer->Outdent(); | ||
1089 | - printer->Print(vars, "};\n"); | ||
1090 | |||
1091 | - if (!optimize_code_size) { | ||
1092 | - std::vector<NameIndex> field_indices; | ||
1093 | - for (unsigned i = 0; i < descriptor_->field_count(); i++) { | ||
1094 | - field_indices.push_back({ .index = i, .name = sorted_fields[i]->name() }); | ||
1095 | + for (int i = 0; i < descriptor_->field_count(); i++) { | ||
1096 | + const google::protobuf::FieldDescriptor* fd = descriptor_->field(i); | ||
1097 | + const ProtobufCFieldOptions opt = fd->options().GetExtension(pb_c_field); | ||
1098 | + if (fd->has_default_value()) { | ||
1099 | + bool already_defined = false; | ||
1100 | + vars["name"] = fd->name(); | ||
1101 | + vars["lcname"] = CamelToLower(fd->name()); | ||
1102 | + vars["maybe_static"] = "static "; | ||
1103 | + vars["field_dv_ctype_suffix"] = ""; | ||
1104 | + vars["default_value"] = field_generators_.get(fd).GetDefaultValue(); | ||
1105 | + switch (fd->cpp_type()) { | ||
1106 | + case google::protobuf::FieldDescriptor::CPPTYPE_INT32: | ||
1107 | + vars["field_dv_ctype"] = "int32_t"; | ||
1108 | + break; | ||
1109 | + case google::protobuf::FieldDescriptor::CPPTYPE_INT64: | ||
1110 | + vars["field_dv_ctype"] = "int64_t"; | ||
1111 | + break; | ||
1112 | + case google::protobuf::FieldDescriptor::CPPTYPE_UINT32: | ||
1113 | + vars["field_dv_ctype"] = "uint32_t"; | ||
1114 | + break; | ||
1115 | + case google::protobuf::FieldDescriptor::CPPTYPE_UINT64: | ||
1116 | + vars["field_dv_ctype"] = "uint64_t"; | ||
1117 | + break; | ||
1118 | + case google::protobuf::FieldDescriptor::CPPTYPE_FLOAT: | ||
1119 | + vars["field_dv_ctype"] = "float"; | ||
1120 | + break; | ||
1121 | + case google::protobuf::FieldDescriptor::CPPTYPE_DOUBLE: | ||
1122 | + vars["field_dv_ctype"] = "double"; | ||
1123 | + break; | ||
1124 | + case google::protobuf::FieldDescriptor::CPPTYPE_BOOL: | ||
1125 | + vars["field_dv_ctype"] = "protobuf_c_boolean"; | ||
1126 | + break; | ||
1127 | + case google::protobuf::FieldDescriptor::CPPTYPE_MESSAGE: | ||
1128 | + // NOTE: not supported by protobuf | ||
1129 | + vars["maybe_static"] = ""; | ||
1130 | + vars["field_dv_ctype"] = "{ ... }"; | ||
1131 | + GOOGLE_LOG(FATAL) << "Messages can't have default values!"; | ||
1132 | + break; | ||
1133 | + case google::protobuf::FieldDescriptor::CPPTYPE_STRING: | ||
1134 | + if (fd->type() == google::protobuf::FieldDescriptor::TYPE_BYTES || opt.string_as_bytes()) { | ||
1135 | + vars["field_dv_ctype"] = "ProtobufCBinaryData"; | ||
1136 | + } else { | ||
1137 | + /* STRING type */ | ||
1138 | + already_defined = true; | ||
1139 | + vars["maybe_static"] = ""; | ||
1140 | + vars["field_dv_ctype"] = "char"; | ||
1141 | + vars["field_dv_ctype_suffix"] = "[]"; | ||
1142 | + } | ||
1143 | + break; | ||
1144 | + case google::protobuf::FieldDescriptor::CPPTYPE_ENUM: { | ||
1145 | + const google::protobuf::EnumValueDescriptor* vd = fd->default_value_enum(); | ||
1146 | + vars["field_dv_ctype"] = FullNameToC(vd->type()->full_name(), vd->type()->file()); | ||
1147 | + break; | ||
1148 | + } | ||
1149 | + default: | ||
1150 | + GOOGLE_LOG(FATAL) << "Unknown CPPTYPE"; | ||
1151 | + break; | ||
1152 | + } | ||
1153 | + if (!already_defined) { | ||
1154 | + printer->Print(vars, "$maybe_static$const $field_dv_ctype$ $lcclassname$__$lcname$__default_value$field_dv_ctype_suffix$ = $default_value$;\n"); | ||
1155 | + } | ||
1156 | } | ||
1157 | - qsort(&field_indices[0], field_indices.size(), sizeof(NameIndex), | ||
1158 | - compare_name_indices_by_name); | ||
1159 | - printer->Print(vars, "static const unsigned $lcclassname$__field_indices_by_name[] = {\n"); | ||
1160 | + } | ||
1161 | + | ||
1162 | + if (descriptor_->field_count()) { | ||
1163 | + printer->Print(vars, | ||
1164 | + "static const ProtobufCFieldDescriptor $lcclassname$__field_descriptors[$n_fields$] =\n" | ||
1165 | + "{\n"); | ||
1166 | + printer->Indent(); | ||
1167 | + | ||
1168 | + std::vector<const google::protobuf::FieldDescriptor*> sorted_fields; | ||
1169 | for (int i = 0; i < descriptor_->field_count(); i++) { | ||
1170 | - vars["index"] = SimpleItoa(field_indices[i].index); | ||
1171 | - vars["name"] = field_indices[i].name; | ||
1172 | - printer->Print(vars, " $index$, /* field[$index$] = $name$ */\n"); | ||
1173 | + sorted_fields.push_back(descriptor_->field(i)); | ||
1174 | } | ||
1175 | - printer->Print("};\n"); | ||
1176 | - } | ||
1177 | + qsort(&sorted_fields[0], | ||
1178 | + sorted_fields.size(), | ||
1179 | + sizeof(const google::protobuf::FieldDescriptor*), | ||
1180 | + compare_pfields_by_number); | ||
1181 | + for (auto field : sorted_fields) { | ||
1182 | + field_generators_.get(field).GenerateDescriptorInitializer(printer); | ||
1183 | + } | ||
1184 | + printer->Outdent(); | ||
1185 | + printer->Print(vars, "};\n"); | ||
1186 | |||
1187 | - // create range initializers | ||
1188 | - std::vector<int> values; | ||
1189 | - for (int i = 0; i < descriptor_->field_count(); i++) { | ||
1190 | - values.push_back(sorted_fields[i]->number()); | ||
1191 | - } | ||
1192 | - int n_ranges = WriteIntRanges(printer, | ||
1193 | - descriptor_->field_count(), &values[0], | ||
1194 | - vars["lcclassname"] + "__number_ranges"); | ||
1195 | + if (!optimize_code_size) { | ||
1196 | + std::vector<NameIndex> field_indices; | ||
1197 | + for (unsigned i = 0; i < descriptor_->field_count(); i++) { | ||
1198 | + field_indices.push_back({ .index = i, .name = sorted_fields[i]->name() }); | ||
1199 | + } | ||
1200 | + qsort(&field_indices[0], | ||
1201 | + field_indices.size(), | ||
1202 | + sizeof(NameIndex), | ||
1203 | + compare_name_indices_by_name); | ||
1204 | + printer->Print(vars, "static const unsigned $lcclassname$__field_indices_by_name[] = {\n"); | ||
1205 | + for (int i = 0; i < descriptor_->field_count(); i++) { | ||
1206 | + vars["index"] = SimpleItoa(field_indices[i].index); | ||
1207 | + vars["name"] = field_indices[i].name; | ||
1208 | + printer->Print(vars, " $index$, /* field[$index$] = $name$ */\n"); | ||
1209 | + } | ||
1210 | + printer->Print("};\n"); | ||
1211 | + } | ||
1212 | |||
1213 | - vars["n_ranges"] = SimpleItoa(n_ranges); | ||
1214 | - } else { | ||
1215 | - /* MS compiler can't handle arrays with zero size and empty | ||
1216 | - * initialization list. Furthermore it is an extension of GCC only but | ||
1217 | - * not a standard. */ | ||
1218 | - vars["n_ranges"] = "0"; | ||
1219 | - printer->Print(vars, | ||
1220 | - "#define $lcclassname$__field_descriptors NULL\n" | ||
1221 | - "#define $lcclassname$__field_indices_by_name NULL\n" | ||
1222 | - "#define $lcclassname$__number_ranges NULL\n"); | ||
1223 | + // create range initializers | ||
1224 | + std::vector<int> values; | ||
1225 | + for (int i = 0; i < descriptor_->field_count(); i++) { | ||
1226 | + values.push_back(sorted_fields[i]->number()); | ||
1227 | } | ||
1228 | + int n_ranges = WriteIntRanges(printer, | ||
1229 | + descriptor_->field_count(), | ||
1230 | + &values[0], | ||
1231 | + vars["lcclassname"] + "__number_ranges"); | ||
1232 | + | ||
1233 | + vars["n_ranges"] = SimpleItoa(n_ranges); | ||
1234 | + } else { | ||
1235 | + /* MS compiler can't handle arrays with zero size and empty | ||
1236 | + * initialization list. Furthermore it is an extension of GCC only but | ||
1237 | + * not a standard. */ | ||
1238 | + vars["n_ranges"] = "0"; | ||
1239 | + printer->Print(vars, | ||
1240 | + "#define $lcclassname$__field_descriptors NULL\n" | ||
1241 | + "#define $lcclassname$__field_indices_by_name NULL\n" | ||
1242 | + "#define $lcclassname$__number_ranges NULL\n"); | ||
1243 | + } | ||
1244 | |||
1245 | printer->Print(vars, | ||
1246 | - "const ProtobufCMessageDescriptor $lcclassname$__descriptor =\n" | ||
1247 | - "{\n" | ||
1248 | - " PROTOBUF_C__MESSAGE_DESCRIPTOR_MAGIC,\n"); | ||
1249 | + "const ProtobufCMessageDescriptor $lcclassname$__descriptor =\n" | ||
1250 | + "{\n" | ||
1251 | + " PROTOBUF_C__MESSAGE_DESCRIPTOR_MAGIC,\n"); | ||
1252 | if (optimize_code_size) { | ||
1253 | printer->Print(" NULL,NULL,NULL,NULL, /* CODE_SIZE */\n"); | ||
1254 | } else { | ||
1255 | printer->Print(vars, | ||
1256 | - " \"$fullname$\",\n" | ||
1257 | - " \"$shortname$\",\n" | ||
1258 | - " \"$classname$\",\n" | ||
1259 | - " \"$packagename$\",\n"); | ||
1260 | + " \"$fullname$\",\n" | ||
1261 | + " \"$shortname$\",\n" | ||
1262 | + " \"$classname$\",\n" | ||
1263 | + " \"$packagename$\",\n"); | ||
1264 | } | ||
1265 | printer->Print(vars, | ||
1266 | - " sizeof($classname$),\n" | ||
1267 | - " $n_fields$,\n" | ||
1268 | - " $lcclassname$__field_descriptors,\n"); | ||
1269 | + " sizeof($classname$),\n" | ||
1270 | + " $n_fields$,\n" | ||
1271 | + " $lcclassname$__field_descriptors,\n"); | ||
1272 | if (optimize_code_size) { | ||
1273 | printer->Print(" NULL, /* CODE_SIZE */\n"); | ||
1274 | } else { | ||
1275 | - printer->Print(vars, | ||
1276 | - " $lcclassname$__field_indices_by_name,\n"); | ||
1277 | + printer->Print(vars, " $lcclassname$__field_indices_by_name,\n"); | ||
1278 | } | ||
1279 | printer->Print(vars, | ||
1280 | - " $n_ranges$," | ||
1281 | - " $lcclassname$__number_ranges,\n"); | ||
1282 | + " $n_ranges$," | ||
1283 | + " $lcclassname$__number_ranges,\n"); | ||
1284 | if (gen_init) { | ||
1285 | - printer->Print(vars, | ||
1286 | - " (ProtobufCMessageInit) $lcclassname$__init,\n"); | ||
1287 | + printer->Print(vars, " (ProtobufCMessageInit) $lcclassname$__init,\n"); | ||
1288 | } else { | ||
1289 | - printer->Print(vars, | ||
1290 | - " NULL, /* gen_init_helpers = false */\n"); | ||
1291 | + printer->Print(vars, " NULL, /* gen_init_helpers = false */\n"); | ||
1292 | } | ||
1293 | printer->Print(vars, | ||
1294 | - " NULL,NULL,NULL /* reserved[123] */\n" | ||
1295 | - "};\n"); | ||
1296 | + " NULL,NULL,NULL /* reserved[123] */\n" | ||
1297 | + "};\n"); | ||
1298 | } | ||
1299 | |||
1300 | int MessageGenerator::GetOneofUnionOrder(const google::protobuf::FieldDescriptor* fd) | ||
1301 | |||
1302 | From c59b146aee2d97091ca2adeecd3f2741cb7f0082 Mon Sep 17 00:00:00 2001 | ||
1303 | From: Robert Edmonds <edmonds@users.noreply.github.com> | ||
1304 | Date: Sat, 8 Feb 2025 21:10:37 -0500 | ||
1305 | Subject: [PATCH 08/11] compat: Use absl::string_view instead of | ||
1306 | google::protobuf::internal::DescriptorStringView | ||
1307 | |||
1308 | Even though google::protobuf::internal::DescriptorStringView is exposed | ||
1309 | in public protobuf headers, it's probably not a good idea to rely on an | ||
1310 | "internal" typedef. | ||
1311 | |||
1312 | According to https://protobuf.dev/news/2024-10-02/#descriptor-apis: | ||
1313 | |||
1314 | v30 will update return types in descriptor (such as full_name) to be | ||
1315 | absl::string_view. | ||
1316 | |||
1317 | So `absl::string_view` is probably the right type to use here. | ||
1318 | --- | ||
1319 | protoc-gen-c/compat.h | 6 +++++- | ||
1320 | 1 file changed, 5 insertions(+), 1 deletion(-) | ||
1321 | |||
1322 | diff --git a/protoc-gen-c/compat.h b/protoc-gen-c/compat.h | ||
1323 | index fe8041b5..a70cef34 100644 | ||
1324 | --- a/protoc-gen-c/compat.h | ||
1325 | +++ b/protoc-gen-c/compat.h | ||
1326 | @@ -37,12 +37,16 @@ | ||
1327 | # define GOOGLE_LOG ABSL_LOG | ||
1328 | #endif | ||
1329 | |||
1330 | +#if GOOGLE_PROTOBUF_VERSION >= 6030000 | ||
1331 | +# include <absl/strings/string_view.h> | ||
1332 | +#endif | ||
1333 | + | ||
1334 | namespace protobuf_c { | ||
1335 | |||
1336 | namespace compat { | ||
1337 | |||
1338 | #if GOOGLE_PROTOBUF_VERSION >= 6030000 | ||
1339 | -typedef google::protobuf::internal::DescriptorStringView StringView; | ||
1340 | +typedef absl::string_view StringView; | ||
1341 | #else | ||
1342 | typedef const std::string& StringView; | ||
1343 | #endif | ||
1344 | |||
1345 | From 9c56038fd9d3cc2552c297457d7a66efe5cbd2c7 Mon Sep 17 00:00:00 2001 | ||
1346 | From: Robert Edmonds <edmonds@users.noreply.github.com> | ||
1347 | Date: Sat, 8 Feb 2025 21:37:30 -0500 | ||
1348 | Subject: [PATCH 09/11] Makefile.am: Add compat.h to | ||
1349 | protoc_gen_c_protoc_gen_c_SOURCES | ||
1350 | |||
1351 | --- | ||
1352 | Makefile.am | 1 + | ||
1353 | 1 file changed, 1 insertion(+) | ||
1354 | |||
1355 | diff --git a/Makefile.am b/Makefile.am | ||
1356 | index 77aa9d99..26d19f16 100644 | ||
1357 | --- a/Makefile.am | ||
1358 | +++ b/Makefile.am | ||
1359 | @@ -102,6 +102,7 @@ protoc_gen_c_protoc_gen_c_SOURCES = \ | ||
1360 | protoc-gen-c/c_service.h \ | ||
1361 | protoc-gen-c/c_string_field.cc \ | ||
1362 | protoc-gen-c/c_string_field.h \ | ||
1363 | + protoc-gen-c/compat.h \ | ||
1364 | protobuf-c/protobuf-c.pb.cc \ | ||
1365 | protobuf-c/protobuf-c.pb.h \ | ||
1366 | protoc-gen-c/main.cc | ||
1367 | |||
1368 | From 4ebd5cd8238d1f2ac6291b8c8925f34e16ce2123 Mon Sep 17 00:00:00 2001 | ||
1369 | From: Robert Edmonds <edmonds@users.noreply.github.com> | ||
1370 | Date: Sat, 8 Feb 2025 21:38:07 -0500 | ||
1371 | Subject: [PATCH 10/11] compat: Conditionalize the include of <string> | ||
1372 | |||
1373 | It is only needed on older protobuf versions where absl::string_view is | ||
1374 | not being used. | ||
1375 | --- | ||
1376 | protoc-gen-c/compat.h | 4 ++-- | ||
1377 | 1 file changed, 2 insertions(+), 2 deletions(-) | ||
1378 | |||
1379 | diff --git a/protoc-gen-c/compat.h b/protoc-gen-c/compat.h | ||
1380 | index a70cef34..f6ace7cb 100644 | ||
1381 | --- a/protoc-gen-c/compat.h | ||
1382 | +++ b/protoc-gen-c/compat.h | ||
1383 | @@ -28,8 +28,6 @@ | ||
1384 | #ifndef PROTOBUF_C_PROTOC_GEN_C_COMPAT_H__ | ||
1385 | #define PROTOBUF_C_PROTOC_GEN_C_COMPAT_H__ | ||
1386 | |||
1387 | -#include <string> | ||
1388 | - | ||
1389 | #if GOOGLE_PROTOBUF_VERSION >= 4022000 | ||
1390 | # define GOOGLE_ARRAYSIZE ABSL_ARRAYSIZE | ||
1391 | # define GOOGLE_CHECK_EQ ABSL_CHECK_EQ | ||
1392 | @@ -39,6 +37,8 @@ | ||
1393 | |||
1394 | #if GOOGLE_PROTOBUF_VERSION >= 6030000 | ||
1395 | # include <absl/strings/string_view.h> | ||
1396 | +#else | ||
1397 | +# include <string> | ||
1398 | #endif | ||
1399 | |||
1400 | namespace protobuf_c { | ||
1401 | |||
1402 | From 9a6b35e1e6956fb5cb044910448049b7a5339244 Mon Sep 17 00:00:00 2001 | ||
1403 | From: Robert Edmonds <edmonds@users.noreply.github.com> | ||
1404 | Date: Sat, 8 Feb 2025 21:44:42 -0500 | ||
1405 | Subject: [PATCH 11/11] Cater to Microsoft Visual C++ | ||
1406 | |||
1407 | Apparently MSVC doesn't support designated initializers for some reason. | ||
1408 | --- | ||
1409 | protoc-gen-c/c_enum.cc | 9 ++------- | ||
1410 | protoc-gen-c/c_message.cc | 2 +- | ||
1411 | 2 files changed, 3 insertions(+), 8 deletions(-) | ||
1412 | |||
1413 | diff --git a/protoc-gen-c/c_enum.cc b/protoc-gen-c/c_enum.cc | ||
1414 | index c7839edd..1940ba9d 100644 | ||
1415 | --- a/protoc-gen-c/c_enum.cc | ||
1416 | +++ b/protoc-gen-c/c_enum.cc | ||
1417 | @@ -195,14 +195,9 @@ void EnumGenerator::GenerateEnumDescriptor(google::protobuf::io::Printer* printe | ||
1418 | // Sort by name and value, dropping duplicate values if they appear later. | ||
1419 | // TODO: use a c++ paradigm for this! | ||
1420 | std::vector<ValueIndex> value_index; | ||
1421 | - for (unsigned j = 0; j < descriptor_->value_count(); j++) { | ||
1422 | + for (int j = 0; j < descriptor_->value_count(); j++) { | ||
1423 | const google::protobuf::EnumValueDescriptor *vd = descriptor_->value(j); | ||
1424 | - value_index.push_back({ | ||
1425 | - .value = vd->number(), | ||
1426 | - .index = j, | ||
1427 | - .final_index = 0, | ||
1428 | - .name = vd->name(), | ||
1429 | - }); | ||
1430 | + value_index.push_back({ vd->number(), (unsigned)j, 0, vd->name() }); | ||
1431 | } | ||
1432 | qsort(&value_index[0], | ||
1433 | value_index.size(), | ||
1434 | diff --git a/protoc-gen-c/c_message.cc b/protoc-gen-c/c_message.cc | ||
1435 | index 2a3b2a2f..94889179 100644 | ||
1436 | --- a/protoc-gen-c/c_message.cc | ||
1437 | +++ b/protoc-gen-c/c_message.cc | ||
1438 | @@ -581,7 +581,7 @@ GenerateMessageDescriptor(google::protobuf::io::Printer* printer, bool gen_init) | ||
1439 | if (!optimize_code_size) { | ||
1440 | std::vector<NameIndex> field_indices; | ||
1441 | for (unsigned i = 0; i < descriptor_->field_count(); i++) { | ||
1442 | - field_indices.push_back({ .index = i, .name = sorted_fields[i]->name() }); | ||
1443 | + field_indices.push_back({ i, sorted_fields[i]->name() }); | ||
1444 | } | ||
1445 | qsort(&field_indices[0], | ||
1446 | field_indices.size(), | ||
diff --git a/meta-oe/recipes-devtools/protobuf/protobuf-c_1.5.0.bb b/meta-oe/recipes-devtools/protobuf/protobuf-c_1.5.1.bb index 24de6b8119..30c9e19b16 100644 --- a/meta-oe/recipes-devtools/protobuf/protobuf-c_1.5.0.bb +++ b/meta-oe/recipes-devtools/protobuf/protobuf-c_1.5.1.bb | |||
@@ -8,16 +8,17 @@ has been split out into the protobuf-c-rpc project." | |||
8 | HOMEPAGE = "https://github.com/protobuf-c/protobuf-c" | 8 | HOMEPAGE = "https://github.com/protobuf-c/protobuf-c" |
9 | SECTION = "console/tools" | 9 | SECTION = "console/tools" |
10 | LICENSE = "BSD-2-Clause" | 10 | LICENSE = "BSD-2-Clause" |
11 | LIC_FILES_CHKSUM = "file://LICENSE;md5=d11077c6a2b5d2e64b9f32b61a9b78ba" | 11 | LIC_FILES_CHKSUM = "file://LICENSE;md5=bd8de4f63e06b1ccc06e9f8dc5b1aa97" |
12 | 12 | ||
13 | DEPENDS = "protobuf-native protobuf" | 13 | DEPENDS = "protobuf-native protobuf" |
14 | 14 | ||
15 | SRC_URI = "git://github.com/protobuf-c/protobuf-c.git;branch=master;protocol=https" | 15 | SRC_URI = "git://github.com/protobuf-c/protobuf-c.git;branch=master;protocol=https \ |
16 | file://protobuf-30.patch \ | ||
17 | " | ||
16 | SRC_URI:append:class-native = " file://0001-Makefile.am-do-not-compile-the-code-which-was-genera.patch" | 18 | SRC_URI:append:class-native = " file://0001-Makefile.am-do-not-compile-the-code-which-was-genera.patch" |
17 | 19 | ||
18 | SRCREV = "8c201f6e47a53feaab773922a743091eb6c8972a" | 20 | SRCREV = "185beed28e65494be7505b30c1afeaf199e19b23" |
19 | 21 | ||
20 | S = "${WORKDIR}/git" | ||
21 | 22 | ||
22 | inherit autotools pkgconfig | 23 | inherit autotools pkgconfig |
23 | 24 | ||
@@ -36,3 +37,6 @@ RDEPENDS:${PN}-compiler = "protobuf-compiler" | |||
36 | RDEPENDS:${PN}-dev += "${PN}-compiler" | 37 | RDEPENDS:${PN}-dev += "${PN}-compiler" |
37 | 38 | ||
38 | BBCLASSEXTEND = "native nativesdk" | 39 | BBCLASSEXTEND = "native nativesdk" |
40 | |||
41 | # No 64bit atomics | ||
42 | LDFLAGS:append:riscv32 = " -latomic" | ||
diff --git a/meta-oe/recipes-devtools/protobuf/protobuf/0001-Fix-build-on-mips-clang.patch b/meta-oe/recipes-devtools/protobuf/protobuf/0001-Fix-build-on-mips-clang.patch index 9f6116c4c4..1f5c9127de 100644 --- a/meta-oe/recipes-devtools/protobuf/protobuf/0001-Fix-build-on-mips-clang.patch +++ b/meta-oe/recipes-devtools/protobuf/protobuf/0001-Fix-build-on-mips-clang.patch | |||
@@ -1,26 +1,34 @@ | |||
1 | From 08e46feb6553af670754e65d94c3bb6fcd4e0cf9 Mon Sep 17 00:00:00 2001 | 1 | From cd6c5f36c0dc38e4734b74b03923489b7bfb9aba Mon Sep 17 00:00:00 2001 |
2 | From: Khem Raj <raj.khem@gmail.com> | 2 | From: Khem Raj <raj.khem@gmail.com> |
3 | Date: Sun, 31 Oct 2021 23:39:44 -0700 | 3 | Date: Mon, 10 Mar 2025 19:59:19 -0700 |
4 | Subject: [PATCH] Fix build on mips/clang | 4 | Subject: [PATCH] Fix build on mips/clang |
5 | 5 | ||
6 | clang13 crashes on mips, until its fixed upstream disable tailcall on | 6 | clang20 crashes on mips, until its fixed upstream disable tailcall on |
7 | mips | 7 | mips |
8 | 8 | ||
9 | https://bugs.llvm.org/show_bug.cgi?id=52367 | 9 | https://github.com/llvm/llvm-project/issues/51709 |
10 | 10 | ||
11 | Upstream-Status: Inappropriate [Clang workaround] | 11 | Upstream-Status: Inappropriate [Clang workaround] |
12 | Signed-off-by: Khem Raj <raj.khem@gmail.com> | 12 | Signed-off-by: Khem Raj <raj.khem@gmail.com> |
13 | |||
14 | Rebase to v5.29.4 | ||
15 | Signed-off-by: Hongxu Jia <hongxu.jia@windriver.com> | ||
13 | --- | 16 | --- |
14 | src/google/protobuf/port_def.inc | 2 +- | 17 | src/google/protobuf/port_def.inc | 1 + |
15 | 1 file changed, 1 insertion(+), 1 deletion(-) | 18 | 1 file changed, 1 insertion(+) |
16 | 19 | ||
20 | diff --git a/src/google/protobuf/port_def.inc b/src/google/protobuf/port_def.inc | ||
21 | index 56f995e45..428d096b3 100644 | ||
17 | --- a/src/google/protobuf/port_def.inc | 22 | --- a/src/google/protobuf/port_def.inc |
18 | +++ b/src/google/protobuf/port_def.inc | 23 | +++ b/src/google/protobuf/port_def.inc |
19 | @@ -255,6 +255,7 @@ | 24 | @@ -227,6 +227,7 @@ static_assert(PROTOBUF_ABSL_MIN(20230125, 3), |
20 | #error PROTOBUF_TAILCALL was previously defined | 25 | #error PROTOBUF_TAILCALL was previously defined |
21 | #endif | 26 | #endif |
22 | #if __has_cpp_attribute(clang::musttail) && !defined(__arm__) && \ | 27 | #if ABSL_HAVE_CPP_ATTRIBUTE(clang::musttail) && !defined(__arm__) && \ |
23 | + !defined(__mips__) && \ | 28 | + !defined(__mips__) && \ |
24 | !defined(_ARCH_PPC) && !defined(__wasm__) && \ | 29 | !defined(_ARCH_PPC) && !defined(__wasm__) && \ |
25 | !(defined(_MSC_VER) && defined(_M_IX86)) && \ | 30 | !(defined(_MSC_VER) && defined(_M_IX86)) && !defined(__i386__) |
26 | !(defined(__NDK_MAJOR__) && __NDK_MAJOR <= 24) | 31 | // Compilation fails on ARM32: b/195943306 |
32 | -- | ||
33 | 2.25.1 | ||
34 | |||
diff --git a/meta-oe/recipes-devtools/protobuf/protobuf/0001-examples-Makefile-respect-CXX-LDFLAGS-variables-fix-.patch b/meta-oe/recipes-devtools/protobuf/protobuf/0001-examples-Makefile-respect-CXX-LDFLAGS-variables-fix-.patch index 7c4bf260eb..53fdf7dece 100644 --- a/meta-oe/recipes-devtools/protobuf/protobuf/0001-examples-Makefile-respect-CXX-LDFLAGS-variables-fix-.patch +++ b/meta-oe/recipes-devtools/protobuf/protobuf/0001-examples-Makefile-respect-CXX-LDFLAGS-variables-fix-.patch | |||
@@ -1,13 +1,12 @@ | |||
1 | From e3fa241637ab5a7fa78c0d474802134cff75f91e Mon Sep 17 00:00:00 2001 | 1 | From f6a3554e37fb39f93e4b47a75318bbda53cfdb46 Mon Sep 17 00:00:00 2001 |
2 | From: Martin Jansa <Martin.Jansa@gmail.com> | 2 | From: Martin Jansa <Martin.Jansa@gmail.com> |
3 | Date: Fri, 28 Jun 2019 13:50:52 +0000 | 3 | Date: Thu, 20 Mar 2025 20:33:02 -0700 |
4 | Subject: [PATCH] examples/Makefile: respect CXX,LDFLAGS variables, fix build | 4 | Subject: [PATCH] examples/Makefile: respect CXX,LDFLAGS variables |
5 | with gold | ||
6 | 5 | ||
7 | * move pkg-config call to separate variable, so that the final version | 6 | * move pkg-config call to separate variable, so that the final version |
8 | of the whole command so it's shown in log.do_compile_ptest_base | 7 | of the whole command so it's shown in log.do_compile_ptest_base |
9 | * add ../src/google/protobuf/.libs/timestamp.pb.o when linking | 8 | * add ../src/google/protobuf/.libs/timestamp.pb.o when linking |
10 | add_person_cpp otherwise it fails to link with gold: | 9 | add_person_cpp otherwise it fails: |
11 | i686-oe-linux-g++ -m32 -march=core2 -mtune=core2 -msse3 -mfpmath=sse --sysroot=core2-32-oe-linux/protobuf/3.8.0-r0/recipe-sysroot -Wl,-O1 -Wl,--hash-style=gnu -Wl,--as-needed add_person.cc addressbook.pb.cc -o add_person_cpp `pkg-config --cflags --libs protobuf` | 10 | i686-oe-linux-g++ -m32 -march=core2 -mtune=core2 -msse3 -mfpmath=sse --sysroot=core2-32-oe-linux/protobuf/3.8.0-r0/recipe-sysroot -Wl,-O1 -Wl,--hash-style=gnu -Wl,--as-needed add_person.cc addressbook.pb.cc -o add_person_cpp `pkg-config --cflags --libs protobuf` |
12 | /tmp/cccjSJQs.o:addressbook.pb.cc:scc_info_Person_addressbook_2eproto: error: undefined reference to 'scc_info_Timestamp_google_2fprotobuf_2ftimestamp_2eproto' | 11 | /tmp/cccjSJQs.o:addressbook.pb.cc:scc_info_Person_addressbook_2eproto: error: undefined reference to 'scc_info_Timestamp_google_2fprotobuf_2ftimestamp_2eproto' |
13 | /tmp/cccjSJQs.o:addressbook.pb.cc:descriptor_table_addressbook_2eproto_deps: error: undefined reference to 'descriptor_table_google_2fprotobuf_2ftimestamp_2eproto' | 12 | /tmp/cccjSJQs.o:addressbook.pb.cc:descriptor_table_addressbook_2eproto_deps: error: undefined reference to 'descriptor_table_google_2fprotobuf_2ftimestamp_2eproto' |
@@ -25,37 +24,39 @@ Upstream-Status: Pending | |||
25 | Signed-off-by: Martin Jansa <Martin.Jansa@gmail.com> | 24 | Signed-off-by: Martin Jansa <Martin.Jansa@gmail.com> |
26 | Signed-off-by: Leon Anavi <leon.anavi@konsulko.com> | 25 | Signed-off-by: Leon Anavi <leon.anavi@konsulko.com> |
27 | 26 | ||
27 | Rebase to 5.29.4 | ||
28 | Signed-off-by: Hongxu Jia <hongxu.jia@windriver.com> | ||
28 | --- | 29 | --- |
29 | examples/Makefile | 6 ++++-- | 30 | examples/Makefile | 6 ++++-- |
30 | 1 file changed, 4 insertions(+), 2 deletions(-) | 31 | 1 file changed, 4 insertions(+), 2 deletions(-) |
31 | 32 | ||
32 | diff --git a/examples/Makefile b/examples/Makefile | 33 | diff --git a/examples/Makefile b/examples/Makefile |
33 | index ef7a4ef58..7206e14e1 100644 | 34 | index f7ee9b116..8cd1359e2 100644 |
34 | --- a/examples/Makefile | 35 | --- a/examples/Makefile |
35 | +++ b/examples/Makefile | 36 | +++ b/examples/Makefile |
36 | @@ -2,6 +2,8 @@ | 37 | @@ -4,6 +4,8 @@ |
37 | 38 | ||
38 | .PHONY: all cpp java python clean | 39 | all: cpp java python |
39 | 40 | ||
40 | +PROTOBUF := $(shell pkg-config --cflags --libs protobuf) | 41 | +PROTOBUF := $(shell pkg-config --cflags --libs protobuf) |
41 | + | 42 | + |
42 | all: cpp java python | ||
43 | |||
44 | cpp: add_person_cpp list_people_cpp | 43 | cpp: add_person_cpp list_people_cpp |
45 | @@ -41,11 +43,11 @@ protoc_middleman_dart: addressbook.proto | 44 | dart: add_person_dart list_people_dart |
45 | go: add_person_go list_people_go | ||
46 | @@ -46,11 +48,11 @@ protoc_middleman_ruby: addressbook.proto | ||
46 | 47 | ||
47 | add_person_cpp: add_person.cc protoc_middleman | 48 | add_person_cpp: add_person.cc protoc_middleman |
48 | pkg-config --cflags protobuf # fails if protobuf is not installed | 49 | pkg-config --cflags protobuf # fails if protobuf is not installed |
49 | - c++ -std=c++14 add_person.cc addressbook.pb.cc -o add_person_cpp `pkg-config --cflags --libs protobuf` | 50 | - c++ add_person.cc addressbook.pb.cc -o add_person_cpp `pkg-config --cflags --libs protobuf` |
50 | + $(CXX) $(CXXFLAGS) $(LDFLAGS) ../src/google/protobuf/.libs/timestamp.pb.o $(PROTOBUF) add_person.cc addressbook.pb.cc -o add_person_cpp #$(CXX) -std=c++17 $(PROTOBUF) add_person.cc addressbook.pb.cc -o add_person_cpp | 51 | + $(CXX) $(CXXFLAGS) $(LDFLAGS) ../src/google/protobuf/.libs/timestamp.pb.o $(PROTOBUF) add_person.cc addressbook.pb.cc -o add_person_cpp |
51 | 52 | ||
52 | list_people_cpp: list_people.cc protoc_middleman | 53 | list_people_cpp: list_people.cc protoc_middleman |
53 | pkg-config --cflags protobuf # fails if protobuf is not installed | 54 | pkg-config --cflags protobuf # fails if protobuf is not installed |
54 | - c++ -std=c++14 list_people.cc addressbook.pb.cc -o list_people_cpp `pkg-config --cflags --libs protobuf` | 55 | - c++ list_people.cc addressbook.pb.cc -o list_people_cpp `pkg-config --cflags --libs protobuf` |
55 | + $(CXX) $(CXXFLAGS) $(LDFLAGS) ../src/google/protobuf/.libs/timestamp.pb.o $(PROTOBUF) list_people.cc addressbook.pb.cc -o list_people_cpp #$(CXX) -std=c++17 $(PROTOBUF) list_people.cc addressbook.pb.cc -o list_people_cpp | 56 | + $(CXX) $(CXXFLAGS) $(LDFLAGS) ../src/google/protobuf/.libs/timestamp.pb.o $(PROTOBUF) list_people.cc addressbook.pb.cc -o list_people_cpp |
56 | 57 | ||
57 | add_person_dart: add_person.dart protoc_middleman_dart | 58 | add_person_dart: add_person.dart protoc_middleman_dart |
58 | 59 | ||
59 | -- | 60 | -- |
60 | 2.34.1 | 61 | 2.25.1 |
61 | 62 | ||
diff --git a/meta-oe/recipes-devtools/protobuf/protobuf/0001-fix-protobuf-native-build-failure-with-gcc-10.patch b/meta-oe/recipes-devtools/protobuf/protobuf/0001-fix-protobuf-native-build-failure-with-gcc-10.patch new file mode 100644 index 0000000000..2edba6b7eb --- /dev/null +++ b/meta-oe/recipes-devtools/protobuf/protobuf/0001-fix-protobuf-native-build-failure-with-gcc-10.patch | |||
@@ -0,0 +1,46 @@ | |||
1 | From 213f29fb63473304db098b3d12a0393fd50e4914 Mon Sep 17 00:00:00 2001 | ||
2 | From: Khem Raj <raj.khem@gmail.com> | ||
3 | Date: Mon, 17 Mar 2025 13:28:13 +0800 | ||
4 | Subject: [PATCH] fix protobuf-native build failure with gcc 10 | ||
5 | MIME-Version: 1.0 | ||
6 | Content-Type: text/plain; charset=UTF-8 | ||
7 | Content-Transfer-Encoding: 8bit | ||
8 | |||
9 | Build protobuf-native failed on ubuntu 20.04 which has gcc 10 | ||
10 | |||
11 | protobuf-native/4.30.0/git/src/google/protobuf/port_def.inc:105:48: | ||
12 | error: static assertion failed: Protobuf only supports C+ | ||
13 | ↪ +17 and newer. | ||
14 | | 105 | #define PROTOBUF_CPLUSPLUS_MIN(x) (__cplusplus >= x) | ||
15 | | | ~~~~~~~~~~~~~^~~~~ | ||
16 | | /home/kraj01/yoe/build/tmp/work/x86_64-linux/protobuf-native/4.30.0/git/src/google/protobuf/port_def.inc:119:15: | ||
17 | note: in expansion of macro ‘PROTOBUF_CPLUSPLUS_MIN’ | ||
18 | | 119 | static_assert(PROTOBUF_CPLUSPLUS_MIN(201703L), | ||
19 | | | ^~~~~~~~~~~~~~~~~~~~~~ | ||
20 | |||
21 | Upstream-Status: Pending | ||
22 | |||
23 | Signed-off-by: Khem Raj <raj.khem@gmail.com> | ||
24 | Signed-off-by: Hongxu Jia <hongxu.jia@windriver.com> | ||
25 | --- | ||
26 | CMakeLists.txt | 4 ++++ | ||
27 | 1 file changed, 4 insertions(+) | ||
28 | |||
29 | diff --git a/CMakeLists.txt b/CMakeLists.txt | ||
30 | index e90cb8aa2..3ffac1307 100644 | ||
31 | --- a/CMakeLists.txt | ||
32 | +++ b/CMakeLists.txt | ||
33 | @@ -14,6 +14,10 @@ endif() | ||
34 | # Project | ||
35 | project(protobuf C CXX) | ||
36 | |||
37 | +set(CMAKE_CXX_STANDARD 17) | ||
38 | +set(CMAKE_CXX_STANDARD_REQUIRED ON) | ||
39 | +set(CMAKE_CXX_EXTENSIONS OFF) | ||
40 | + | ||
41 | if(protobuf_DEPRECATED_CMAKE_SUBDIRECTORY_USAGE) | ||
42 | if(CMAKE_PROJECT_NAME STREQUAL "protobuf") | ||
43 | get_filename_component(CMAKE_SOURCE_DIR ${CMAKE_SOURCE_DIR} DIRECTORY) | ||
44 | -- | ||
45 | 2.25.1 | ||
46 | |||
diff --git a/meta-oe/recipes-devtools/protobuf/protobuf/0001-utf8_range-add-version-marker-to-library-19009.patch b/meta-oe/recipes-devtools/protobuf/protobuf/0001-utf8_range-add-version-marker-to-library-19009.patch new file mode 100644 index 0000000000..e58fdc1d19 --- /dev/null +++ b/meta-oe/recipes-devtools/protobuf/protobuf/0001-utf8_range-add-version-marker-to-library-19009.patch | |||
@@ -0,0 +1,43 @@ | |||
1 | From fd020ef700dbf2d324aecd087b8fcb6ff329feb6 Mon Sep 17 00:00:00 2001 | ||
2 | From: Jan Engelhardt <jengelh@inai.de> | ||
3 | Date: Thu, 21 Nov 2024 11:30:17 -0800 | ||
4 | Subject: [PATCH] utf8_range: add version marker to library (#19009) | ||
5 | |||
6 | Unversioned libraries / libraries without due ABI indicators are not allowed in certain Linux distributions because it precludes the concurrent presence of multiple versions. | ||
7 | |||
8 | If you have both /usr/lib/libprotobuf-lite.so.28.3.0 and /usr/lib/libprotobuf-lite.so.29.0.0, both of them want libutf8_validity.so, but if the ABI is different between utf8_range 28 and utf8_range 29, that's a problem. | ||
9 | |||
10 | Closes #19009 | ||
11 | |||
12 | COPYBARA_INTEGRATE_REVIEW=https://github.com/protocolbuffers/protobuf/pull/19009 from jengelh:master 1a5f8682be2f2b84da07fcdd32474baae8088959 | ||
13 | PiperOrigin-RevId: 698855702 | ||
14 | |||
15 | Upstream-Status: Backport [https://github.com/protocolbuffers/protobuf/commit/ced605d0e6a7ad20985375b596b2ca6720e07737] | ||
16 | Signed-off-by: Hongxu Jia <hongxu.jia@windriver.com> | ||
17 | --- | ||
18 | third_party/utf8_range/CMakeLists.txt | 9 +++++++++ | ||
19 | 1 file changed, 9 insertions(+) | ||
20 | |||
21 | diff --git a/third_party/utf8_range/CMakeLists.txt b/third_party/utf8_range/CMakeLists.txt | ||
22 | index 4276b97290..e054893c63 100644 | ||
23 | --- a/third_party/utf8_range/CMakeLists.txt | ||
24 | +++ b/third_party/utf8_range/CMakeLists.txt | ||
25 | @@ -19,6 +19,15 @@ add_library (utf8_range | ||
26 | # A heavier-weight C++ wrapper that supports Abseil. | ||
27 | add_library (utf8_validity utf8_validity.cc utf8_range.c) | ||
28 | |||
29 | +set_target_properties(utf8_range PROPERTIES | ||
30 | + VERSION ${protobuf_VERSION} | ||
31 | + OUTPUT_NAME ${LIB_PREFIX}utf8_range | ||
32 | +) | ||
33 | +set_target_properties(utf8_validity PROPERTIES | ||
34 | + VERSION ${protobuf_VERSION} | ||
35 | + OUTPUT_NAME ${LIB_PREFIX}utf8_validity | ||
36 | +) | ||
37 | + | ||
38 | # Load Abseil dependency. | ||
39 | if (NOT TARGET absl::strings) | ||
40 | if (NOT ABSL_ROOT_DIR) | ||
41 | -- | ||
42 | 2.34.1 | ||
43 | |||
diff --git a/meta-oe/recipes-devtools/protobuf/protobuf_4.25.3.bb b/meta-oe/recipes-devtools/protobuf/protobuf_6.31.1.bb index 3241345963..90be1179aa 100644 --- a/meta-oe/recipes-devtools/protobuf/protobuf_4.25.3.bb +++ b/meta-oe/recipes-devtools/protobuf/protobuf_6.31.1.bb | |||
@@ -4,22 +4,28 @@ efficient yet extensible format. Google uses Protocol Buffers for almost \ | |||
4 | all of its internal RPC protocols and file formats." | 4 | all of its internal RPC protocols and file formats." |
5 | HOMEPAGE = "https://github.com/google/protobuf" | 5 | HOMEPAGE = "https://github.com/google/protobuf" |
6 | SECTION = "console/tools" | 6 | SECTION = "console/tools" |
7 | LICENSE = "BSD-3-Clause" | 7 | LICENSE = "BSD-3-Clause & MIT" |
8 | LIC_FILES_CHKSUM = "file://LICENSE;md5=37b5762e07f0af8c74ce80a8bda4266b" | 8 | LIC_FILES_CHKSUM = " \ |
9 | file://LICENSE;md5=37b5762e07f0af8c74ce80a8bda4266b \ | ||
10 | file://third_party/utf8_range/LICENSE;md5=d4974d297231477b2ff507c35d61c13c \ | ||
11 | " | ||
9 | 12 | ||
10 | DEPENDS = "zlib abseil-cpp" | 13 | DEPENDS = "zlib abseil-cpp jsoncpp" |
11 | DEPENDS:append:class-target = " protobuf-native" | 14 | DEPENDS:append:class-target = " protobuf-native" |
12 | 15 | ||
13 | SRCREV = "4a2aef570deb2bfb8927426558701e8bfc26f2a4" | 16 | SRCREV = "74211c0dfc2777318ab53c2cd2c317a2ef9012de" |
14 | 17 | ||
15 | SRC_URI = "gitsm://github.com/protocolbuffers/protobuf.git;branch=25.x;protocol=https \ | 18 | SRC_URI = "git://github.com/protocolbuffers/protobuf.git;branch=31.x;protocol=https \ |
16 | file://run-ptest \ | 19 | file://run-ptest \ |
17 | file://0001-examples-Makefile-respect-CXX-LDFLAGS-variables-fix-.patch \ | 20 | file://0001-examples-Makefile-respect-CXX-LDFLAGS-variables-fix-.patch \ |
21 | file://0001-fix-protobuf-native-build-failure-with-gcc-10.patch \ | ||
18 | " | 22 | " |
19 | SRC_URI:append:mips:toolchain-clang = " file://0001-Fix-build-on-mips-clang.patch " | 23 | SRC_URI:append:mipsarcho32:toolchain-clang = " file://0001-Fix-build-on-mips-clang.patch " |
20 | SRC_URI:append:mipsel:toolchain-clang = " file://0001-Fix-build-on-mips-clang.patch " | 24 | |
25 | UPSTREAM_CHECK_GITTAGREGEX = "v(?P<pver>.(25\.(\d+)))" | ||
26 | |||
21 | 27 | ||
22 | S = "${WORKDIR}/git" | 28 | CVE_PRODUCT = "google:protobuf protobuf:protobuf google-protobuf protobuf-cpp" |
23 | 29 | ||
24 | inherit cmake pkgconfig ptest | 30 | inherit cmake pkgconfig ptest |
25 | 31 | ||
@@ -35,11 +41,15 @@ EXTRA_OECMAKE += "\ | |||
35 | -Dprotobuf_BUILD_TESTS=OFF \ | 41 | -Dprotobuf_BUILD_TESTS=OFF \ |
36 | -Dprotobuf_BUILD_EXAMPLES=OFF \ | 42 | -Dprotobuf_BUILD_EXAMPLES=OFF \ |
37 | -Dprotobuf_ABSL_PROVIDER="package" \ | 43 | -Dprotobuf_ABSL_PROVIDER="package" \ |
44 | -Dprotobuf_JSONCPP_PROVIDER="package" \ | ||
38 | " | 45 | " |
39 | 46 | ||
40 | TEST_SRC_DIR = "examples" | 47 | TEST_SRC_DIR = "examples" |
41 | LANG_SUPPORT = "cpp ${@bb.utils.contains('PACKAGECONFIG', 'python', 'python', '', d)}" | 48 | LANG_SUPPORT = "cpp ${@bb.utils.contains('PACKAGECONFIG', 'python', 'python', '', d)}" |
42 | 49 | ||
50 | CXXFLAGS:append:mipsarcho32 = " -latomic" | ||
51 | CXXFLAGS:append:riscv32 = " -latomic" | ||
52 | |||
43 | do_compile_ptest() { | 53 | do_compile_ptest() { |
44 | mkdir -p "${B}/${TEST_SRC_DIR}" | 54 | mkdir -p "${B}/${TEST_SRC_DIR}" |
45 | 55 | ||
@@ -105,14 +115,9 @@ FILES:${PN}-lite = "${libdir}/libprotobuf-lite${SOLIBS}" | |||
105 | SYSROOT_DIRS += "${bindir}" | 115 | SYSROOT_DIRS += "${bindir}" |
106 | 116 | ||
107 | RDEPENDS:${PN}-compiler = "${PN}" | 117 | RDEPENDS:${PN}-compiler = "${PN}" |
108 | RDEPENDS:${PN}-dev += "${PN}-compiler" | 118 | RDEPENDS:${PN}-dev += "${@bb.utils.contains('PACKAGECONFIG', 'compiler', '${PN}-compiler', '', d)}" |
109 | RDEPENDS:${PN}-ptest = "bash ${@bb.utils.contains('PACKAGECONFIG', 'python', 'python3-protobuf', '', d)}" | 119 | RDEPENDS:${PN}-ptest = "bash ${@bb.utils.contains('PACKAGECONFIG', 'python', 'python3-protobuf', '', d)}" |
110 | 120 | ||
111 | MIPS_INSTRUCTION_SET = "mips" | 121 | MIPS_INSTRUCTION_SET = "mips" |
112 | 122 | ||
113 | BBCLASSEXTEND = "native nativesdk" | 123 | BBCLASSEXTEND = "native nativesdk" |
114 | |||
115 | LDFLAGS:append:arm = " -latomic" | ||
116 | LDFLAGS:append:mips = " -latomic" | ||
117 | LDFLAGS:append:powerpc = " -latomic" | ||
118 | LDFLAGS:append:mipsel = " -latomic" | ||