• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1# Copyright 2023 The Pigweed Authors
2#
3# Licensed under the Apache License, Version 2.0 (the "License"); you may not
4# use this file except in compliance with the License. You may obtain a copy of
5# the License at
6#
7#     https://www.apache.org/licenses/LICENSE-2.0
8#
9# Unless required by applicable law or agreed to in writing, software
10# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
11# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
12# License for the specific language governing permissions and limitations under
13# the License.
14
15load("@com_google_protobuf//bazel:java_lite_proto_library.bzl", "java_lite_proto_library")
16load("@com_google_protobuf//bazel:java_proto_library.bzl", "java_proto_library")
17load("@com_google_protobuf//bazel:proto_library.bzl", "proto_library")
18load("@rules_cc//cc:cc_library.bzl", "cc_library")
19load("@rules_python//python:proto.bzl", "py_proto_library")
20load("@rules_python//sphinxdocs:sphinx_docs_library.bzl", "sphinx_docs_library")
21load("//pw_build:compatibility.bzl", "incompatible_with_mcu")
22load("//pw_build:copy_to_bin.bzl", "copy_to_bin")
23load("//pw_fuzzer:fuzzer.bzl", "pw_cc_fuzz_test")
24load("//pw_perf_test:pw_cc_perf_test.bzl", "pw_cc_perf_test")
25load("//pw_protobuf_compiler:pw_proto_library.bzl", "pw_proto_filegroup", "pwpb_proto_library")
26load("//pw_unit_test:pw_cc_test.bzl", "pw_cc_test")
27
28package(
29    default_visibility = ["//visibility:public"],
30    features = ["-layering_check"],
31)
32
33licenses(["notice"])
34
35cc_library(
36    name = "config",
37    hdrs = ["public/pw_protobuf/config.h"],
38    strip_include_prefix = "public",
39    deps = [":config_override"],
40)
41
42label_flag(
43    name = "config_override",
44    build_setting_default = "//pw_build:default_module_config",
45)
46
47cc_library(
48    name = "pw_protobuf",
49    srcs = [
50        "decoder.cc",
51        "encoder.cc",
52        "find.cc",
53        "map_utils.cc",
54        "message.cc",
55        "stream_decoder.cc",
56    ],
57    hdrs = [
58        "public/pw_protobuf/decoder.h",
59        "public/pw_protobuf/encoder.h",
60        "public/pw_protobuf/find.h",
61        "public/pw_protobuf/internal/codegen.h",
62        "public/pw_protobuf/internal/proto_integer_base.h",
63        "public/pw_protobuf/map_utils.h",
64        "public/pw_protobuf/message.h",
65        "public/pw_protobuf/serialized_size.h",
66        "public/pw_protobuf/stream_decoder.h",
67        "public/pw_protobuf/wire_format.h",
68    ],
69    strip_include_prefix = "public",
70    deps = [
71        ":config",
72        "//pw_assert:assert",
73        "//pw_assert:check",
74        "//pw_bytes",
75        "//pw_bytes:bit",
76        "//pw_containers:vector",
77        "//pw_function",
78        "//pw_preprocessor",
79        "//pw_result",
80        "//pw_span",
81        "//pw_status",
82        "//pw_stream",
83        "//pw_stream:interval_reader",
84        "//pw_string:string",
85        "//pw_toolchain:sibling_cast",
86        "//pw_varint",
87        "//pw_varint:stream",
88    ],
89)
90
91cc_library(
92    name = "bytes_utils",
93    hdrs = ["public/pw_protobuf/bytes_utils.h"],
94    strip_include_prefix = "public",
95    deps = [
96        ":pw_protobuf",
97        "//pw_bytes",
98        "//pw_result",
99        "//pw_status",
100    ],
101)
102
103pw_cc_test(
104    name = "decoder_test",
105    srcs = ["decoder_test.cc"],
106    deps = [
107        ":pw_protobuf",
108        "//pw_fuzzer:fuzztest",
109        "//pw_fuzzer:libfuzzer",
110        "//pw_preprocessor",
111    ],
112)
113
114pw_cc_test(
115    name = "encoder_test",
116    srcs = ["encoder_test.cc"],
117    deps = [":pw_protobuf"],
118)
119
120pw_cc_fuzz_test(
121    name = "encoder_fuzz_test",
122    srcs = [
123        "encoder_fuzzer.cc",
124        "fuzz.h",
125    ],
126    deps = [
127        "//pw_protobuf",
128        "//pw_span",
129    ],
130)
131
132pw_cc_fuzz_test(
133    name = "decoder_fuzz_test",
134    srcs = [
135        "decoder_fuzzer.cc",
136        "fuzz.h",
137    ],
138    deps = [
139        "//pw_protobuf",
140        "//pw_span",
141    ],
142)
143
144pw_cc_test(
145    name = "find_test",
146    srcs = ["find_test.cc"],
147    deps = [
148        ":pw_protobuf",
149        "//pw_string",
150    ],
151)
152
153pw_cc_test(
154    name = "serialized_size_test",
155    srcs = ["serialized_size_test.cc"],
156    deps = [":pw_protobuf"],
157)
158
159pw_cc_test(
160    name = "stream_decoder_test",
161    srcs = ["stream_decoder_test.cc"],
162    deps = [":pw_protobuf"],
163)
164
165pw_cc_test(
166    name = "map_utils_test",
167    srcs = ["map_utils_test.cc"],
168    deps = [":pw_protobuf"],
169)
170
171pw_cc_test(
172    name = "message_test",
173    srcs = ["message_test.cc"],
174    deps = [":pw_protobuf"],
175)
176
177pw_cc_perf_test(
178    name = "encoder_perf_test",
179    srcs = ["encoder_perf_test.cc"],
180    deps = [
181        ":pw_protobuf",
182        "//pw_unit_test",
183    ],
184)
185
186proto_library(
187    name = "codegen_protos",
188    srcs = [
189        "pw_protobuf_codegen_protos/codegen_options.proto",
190    ],
191    strip_import_prefix = "/pw_protobuf",
192)
193
194py_proto_library(
195    name = "codegen_protos_pb2",
196    deps = [":codegen_protos"],
197)
198
199proto_library(
200    name = "common_proto",
201    srcs = [
202        "pw_protobuf_protos/common.proto",
203    ],
204    strip_import_prefix = "/pw_protobuf",
205)
206
207py_proto_library(
208    name = "common_py_pb2",
209    deps = [":common_proto"],
210)
211
212java_proto_library(
213    name = "common_java_proto",
214    deps = [":common_proto"],
215)
216
217java_lite_proto_library(
218    name = "common_java_proto_lite",
219    deps = [":common_proto"],
220)
221
222proto_library(
223    name = "field_options_proto",
224    srcs = [
225        "pw_protobuf_protos/field_options.proto",
226    ],
227    strip_import_prefix = "/pw_protobuf",
228    deps = [
229        "@com_google_protobuf//:descriptor_proto",
230    ],
231)
232
233py_proto_library(
234    name = "field_options_proto_pb2",
235    deps = [
236        ":field_options_proto",
237    ],
238)
239
240proto_library(
241    name = "status_proto",
242    srcs = [
243        "pw_protobuf_protos/status.proto",
244    ],
245    strip_import_prefix = "/pw_protobuf",
246)
247
248py_proto_library(
249    name = "status_proto_pb2",
250    deps = [":status_proto"],
251)
252
253pw_proto_filegroup(
254    name = "codegen_test_deps_protos_and_options",
255    srcs = [
256        "pw_protobuf_test_deps_protos/imported.proto",
257    ],
258    options_files = ["pw_protobuf_test_deps_protos/imported.pwpb_options"],
259)
260
261pw_proto_filegroup(
262    name = "codegen_import_test_deps_protos_and_options",
263    srcs = [
264        "pw_protobuf_test_deps_protos/test_prefix_imported.proto",
265    ],
266    options_files = ["pw_protobuf_test_deps_protos/test_prefix_imported.pwpb_options"],
267)
268
269proto_library(
270    name = "codegen_test_deps_protos",
271    srcs = [":codegen_test_deps_protos_and_options"],
272    strip_import_prefix = "/pw_protobuf",
273)
274
275# Test that options files are applied even on protos that are given an import path
276# that doesn't correspond to their real file path.
277proto_library(
278    name = "codegen_test_deps_protos_test_prefix",
279    srcs = [":codegen_import_test_deps_protos_and_options"],
280    import_prefix = "test_prefix",
281    strip_import_prefix = "/pw_protobuf/pw_protobuf_test_deps_protos",
282)
283
284pw_proto_filegroup(
285    name = "codegen_test_proto_and_options",
286    srcs = [
287        "pw_protobuf_test_protos/edition.proto",
288        "pw_protobuf_test_protos/edition_file_options.proto",
289        "pw_protobuf_test_protos/full_test.proto",
290        "pw_protobuf_test_protos/imported.proto",
291        "pw_protobuf_test_protos/importer.proto",
292        "pw_protobuf_test_protos/non_pw_package.proto",
293        "pw_protobuf_test_protos/optional.proto",
294        "pw_protobuf_test_protos/proto2.proto",
295        "pw_protobuf_test_protos/repeated.proto",
296        "pw_protobuf_test_protos/size_report.proto",
297    ],
298    options_files = [
299        "pw_protobuf_test_protos/edition.pwpb_options",
300        "pw_protobuf_test_protos/edition_file_options.pwpb_options",
301        "pw_protobuf_test_protos/full_test.pwpb_options",
302        "pw_protobuf_test_protos/optional.pwpb_options",
303        "pw_protobuf_test_protos/imported.pwpb_options",
304        "pw_protobuf_test_protos/repeated.pwpb_options",
305    ],
306)
307
308proto_library(
309    name = "codegen_test_proto",
310    srcs = [":codegen_test_proto_and_options"],
311    strip_import_prefix = "/pw_protobuf",
312    deps = [
313        ":codegen_test_deps_protos",
314        ":codegen_test_deps_protos_test_prefix",
315        ":common_proto",
316    ],
317)
318
319pwpb_proto_library(
320    name = "codegen_test_proto_pwpb",
321    deps = [":codegen_test_proto"],
322)
323
324pw_cc_test(
325    name = "codegen_decoder_test",
326    srcs = [
327        "codegen_decoder_test.cc",
328    ],
329    deps = [
330        ":codegen_test_proto_pwpb",
331        ":pw_protobuf",
332        "//pw_containers:vector",
333        "//pw_span",
334    ],
335)
336
337pw_cc_test(
338    name = "codegen_encoder_test",
339    srcs = [
340        "codegen_encoder_test.cc",
341    ],
342    deps = [
343        ":codegen_test_proto_pwpb",
344        ":pw_protobuf",
345        "//pw_bytes",
346        "//pw_span",
347    ],
348)
349
350pw_cc_test(
351    name = "codegen_message_test",
352    srcs = [
353        "codegen_message_test.cc",
354    ],
355    deps = [
356        ":codegen_test_proto_pwpb",
357        ":pw_protobuf",
358        "//pw_span",
359    ],
360)
361
362pw_cc_test(
363    name = "codegen_editions_test",
364    srcs = [
365        "codegen_editions_test.cc",
366    ],
367    deps = [
368        ":codegen_test_proto_pwpb",
369        ":pw_protobuf",
370        "//pw_preprocessor",
371        "//pw_span",
372        "//pw_status",
373        "//pw_stream",
374    ],
375)
376
377# TODO(frolv): Figure out how to add facade tests to Bazel.
378filegroup(
379    name = "varint_size_test",
380    srcs = [
381        "varint_size_test.cc",
382    ],
383)
384
385filegroup(
386    name = "doxygen",
387    srcs = [
388        "public/pw_protobuf/find.h",
389    ],
390)
391
392sphinx_docs_library(
393    name = "docs",
394    srcs = [
395        "docs.rst",
396        "pw_protobuf_test_protos/size_report.proto",
397        "pw_protobuf_test_protos/size_report.pwpb_options",
398        "size_report.rst",
399        "//pw_protobuf/size_report:decoder_incremental",
400        "//pw_protobuf/size_report:decoder_partial",
401        "//pw_protobuf/size_report:oneof_codegen_size_comparison",
402        "//pw_protobuf/size_report:protobuf_overview",
403        "//pw_protobuf/size_report:simple_codegen_size_comparison",
404    ],
405    prefix = "pw_protobuf/",
406    target_compatible_with = incompatible_with_mcu(),
407)
408
409copy_to_bin(
410    name = "js_protos",
411    srcs = [
412        "pw_protobuf_protos/common.proto",
413        "pw_protobuf_protos/field_options.proto",
414        "pw_protobuf_protos/status.proto",
415    ],
416)
417