xref: /aosp_15_r20/external/pigweed/pw_protobuf/BUILD.bazel (revision 61c4878ac05f98d0ceed94b57d316916de578985)
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("@rules_proto//proto:defs.bzl", "proto_library")
16load("@rules_python//python:proto.bzl", "py_proto_library")
17load("//pw_fuzzer:fuzzer.bzl", "pw_cc_fuzz_test")
18load("//pw_perf_test:pw_cc_perf_test.bzl", "pw_cc_perf_test")
19load("//pw_protobuf_compiler:pw_proto_library.bzl", "pw_proto_filegroup", "pwpb_proto_library")
20load("//pw_unit_test:pw_cc_test.bzl", "pw_cc_test")
21
22package(default_visibility = ["//visibility:public"])
23
24licenses(["notice"])
25
26cc_library(
27    name = "config",
28    hdrs = ["public/pw_protobuf/config.h"],
29    strip_include_prefix = "public",
30    deps = [":config_override"],
31)
32
33label_flag(
34    name = "config_override",
35    build_setting_default = "//pw_build:default_module_config",
36)
37
38cc_library(
39    name = "pw_protobuf",
40    srcs = [
41        "decoder.cc",
42        "encoder.cc",
43        "find.cc",
44        "map_utils.cc",
45        "message.cc",
46        "stream_decoder.cc",
47    ],
48    hdrs = [
49        "public/pw_protobuf/decoder.h",
50        "public/pw_protobuf/encoder.h",
51        "public/pw_protobuf/find.h",
52        "public/pw_protobuf/internal/codegen.h",
53        "public/pw_protobuf/internal/proto_integer_base.h",
54        "public/pw_protobuf/map_utils.h",
55        "public/pw_protobuf/message.h",
56        "public/pw_protobuf/serialized_size.h",
57        "public/pw_protobuf/stream_decoder.h",
58        "public/pw_protobuf/wire_format.h",
59    ],
60    strip_include_prefix = "public",
61    deps = [
62        ":config",
63        "//pw_assert",
64        "//pw_bytes",
65        "//pw_bytes:bit",
66        "//pw_containers:vector",
67        "//pw_function",
68        "//pw_preprocessor",
69        "//pw_result",
70        "//pw_span",
71        "//pw_status",
72        "//pw_stream",
73        "//pw_stream:interval_reader",
74        "//pw_string:string",
75        "//pw_toolchain:sibling_cast",
76        "//pw_varint",
77        "//pw_varint:stream",
78    ],
79)
80
81cc_library(
82    name = "bytes_utils",
83    hdrs = ["public/pw_protobuf/bytes_utils.h"],
84    strip_include_prefix = "public",
85    deps = [
86        ":pw_protobuf",
87        "//pw_bytes",
88        "//pw_result",
89        "//pw_status",
90    ],
91)
92
93pw_cc_test(
94    name = "decoder_test",
95    srcs = ["decoder_test.cc"],
96    deps = [
97        ":pw_protobuf",
98        "//pw_preprocessor",
99        "//pw_unit_test",
100    ],
101)
102
103pw_cc_test(
104    name = "encoder_test",
105    srcs = ["encoder_test.cc"],
106    deps = [
107        ":pw_protobuf",
108        "//pw_unit_test",
109    ],
110)
111
112pw_cc_fuzz_test(
113    name = "encoder_fuzz_test",
114    srcs = [
115        "encoder_fuzzer.cc",
116        "fuzz.h",
117    ],
118    deps = [
119        "//pw_protobuf",
120        "//pw_span",
121    ],
122)
123
124pw_cc_fuzz_test(
125    name = "decoder_fuzz_test",
126    srcs = [
127        "decoder_fuzzer.cc",
128        "fuzz.h",
129    ],
130    deps = [
131        "//pw_protobuf",
132        "//pw_span",
133    ],
134)
135
136pw_cc_test(
137    name = "find_test",
138    srcs = ["find_test.cc"],
139    deps = [
140        ":pw_protobuf",
141        "//pw_string",
142        "//pw_unit_test",
143    ],
144)
145
146pw_cc_test(
147    name = "serialized_size_test",
148    srcs = ["serialized_size_test.cc"],
149    deps = [
150        ":pw_protobuf",
151        "//pw_unit_test",
152    ],
153)
154
155pw_cc_test(
156    name = "stream_decoder_test",
157    srcs = ["stream_decoder_test.cc"],
158    deps = [
159        ":pw_protobuf",
160        "//pw_unit_test",
161    ],
162)
163
164pw_cc_test(
165    name = "map_utils_test",
166    srcs = ["map_utils_test.cc"],
167    deps = [
168        ":pw_protobuf",
169        "//pw_unit_test",
170    ],
171)
172
173pw_cc_test(
174    name = "message_test",
175    srcs = ["message_test.cc"],
176    deps = [
177        ":pw_protobuf",
178        "//pw_unit_test",
179    ],
180)
181
182pw_cc_perf_test(
183    name = "encoder_perf_test",
184    srcs = ["encoder_perf_test.cc"],
185    deps = [
186        ":pw_protobuf",
187        "//pw_unit_test",
188    ],
189)
190
191proto_library(
192    name = "codegen_protos",
193    srcs = [
194        "pw_protobuf_codegen_protos/codegen_options.proto",
195    ],
196    strip_import_prefix = "/pw_protobuf",
197)
198
199py_proto_library(
200    name = "codegen_protos_pb2",
201    deps = [":codegen_protos"],
202)
203
204proto_library(
205    name = "common_proto",
206    srcs = [
207        "pw_protobuf_protos/common.proto",
208    ],
209    strip_import_prefix = "/pw_protobuf",
210)
211
212py_proto_library(
213    name = "common_py_pb2",
214    deps = [":common_proto"],
215)
216
217java_proto_library(
218    name = "common_java_proto",
219    deps = [":common_proto"],
220)
221
222java_lite_proto_library(
223    name = "common_java_proto_lite",
224    deps = [":common_proto"],
225)
226
227proto_library(
228    name = "field_options_proto",
229    srcs = [
230        "pw_protobuf_protos/field_options.proto",
231    ],
232    strip_import_prefix = "/pw_protobuf",
233    deps = [
234        "@com_google_protobuf//:descriptor_proto",
235    ],
236)
237
238py_proto_library(
239    name = "field_options_proto_pb2",
240    deps = [
241        ":field_options_proto",
242    ],
243)
244
245proto_library(
246    name = "status_proto",
247    srcs = [
248        "pw_protobuf_protos/status.proto",
249    ],
250    strip_import_prefix = "/pw_protobuf",
251)
252
253py_proto_library(
254    name = "status_proto_pb2",
255    deps = [":status_proto"],
256)
257
258pw_proto_filegroup(
259    name = "codegen_test_deps_protos_and_options",
260    srcs = [
261        "pw_protobuf_test_deps_protos/imported.proto",
262    ],
263    options_files = ["pw_protobuf_test_deps_protos/imported.pwpb_options"],
264)
265
266pw_proto_filegroup(
267    name = "codegen_import_test_deps_protos_and_options",
268    srcs = [
269        "pw_protobuf_test_deps_protos/test_prefix_imported.proto",
270    ],
271    options_files = ["pw_protobuf_test_deps_protos/test_prefix_imported.pwpb_options"],
272)
273
274proto_library(
275    name = "codegen_test_deps_protos",
276    srcs = [":codegen_test_deps_protos_and_options"],
277    strip_import_prefix = "/pw_protobuf",
278)
279
280# Test that options files are applied even on protos that are given an import path
281# that doesn't correspond to their real file path.
282proto_library(
283    name = "codegen_test_deps_protos_test_prefix",
284    srcs = [":codegen_import_test_deps_protos_and_options"],
285    import_prefix = "test_prefix",
286    strip_import_prefix = "/pw_protobuf/pw_protobuf_test_deps_protos",
287)
288
289pw_proto_filegroup(
290    name = "codegen_test_proto_and_options",
291    srcs = [
292        "pw_protobuf_test_protos/full_test.proto",
293        "pw_protobuf_test_protos/imported.proto",
294        "pw_protobuf_test_protos/importer.proto",
295        "pw_protobuf_test_protos/non_pw_package.proto",
296        "pw_protobuf_test_protos/optional.proto",
297        "pw_protobuf_test_protos/proto2.proto",
298        "pw_protobuf_test_protos/repeated.proto",
299        "pw_protobuf_test_protos/size_report.proto",
300    ],
301    options_files = [
302        "pw_protobuf_test_protos/full_test.pwpb_options",
303        "pw_protobuf_test_protos/optional.pwpb_options",
304        "pw_protobuf_test_protos/imported.pwpb_options",
305        "pw_protobuf_test_protos/repeated.pwpb_options",
306    ],
307)
308
309proto_library(
310    name = "codegen_test_proto",
311    srcs = [":codegen_test_proto_and_options"],
312    strip_import_prefix = "/pw_protobuf",
313    deps = [
314        ":codegen_test_deps_protos",
315        ":codegen_test_deps_protos_test_prefix",
316        ":common_proto",
317    ],
318)
319
320pwpb_proto_library(
321    name = "codegen_test_proto_pwpb",
322    deps = [":codegen_test_proto"],
323)
324
325pw_cc_test(
326    name = "codegen_decoder_test",
327    srcs = [
328        "codegen_decoder_test.cc",
329    ],
330    deps = [
331        ":codegen_test_proto_pwpb",
332        ":pw_protobuf",
333        "//pw_span",
334        "//pw_unit_test",
335    ],
336)
337
338pw_cc_test(
339    name = "codegen_encoder_test",
340    srcs = [
341        "codegen_encoder_test.cc",
342    ],
343    deps = [
344        ":codegen_test_proto_pwpb",
345        ":pw_protobuf",
346        "//pw_bytes",
347        "//pw_span",
348        "//pw_unit_test",
349    ],
350)
351
352pw_cc_test(
353    name = "codegen_message_test",
354    srcs = [
355        "codegen_message_test.cc",
356    ],
357    deps = [
358        ":codegen_test_proto_pwpb",
359        ":pw_protobuf",
360        "//pw_span",
361        "//pw_unit_test",
362    ],
363)
364
365# TODO: https://pwbug.dev/366316523 - Bazel's protoc version does not support
366# editions, and extra compiler options cannot be passed to a proto_library
367# target, so `editions.proto` cannot be compiled until we upgrade Protobuf.
368filegroup(
369    name = "codegen_editions_test",
370    srcs = [
371        "codegen_editions_test.cc",
372    ],
373)
374
375# TODO(frolv): Figure out how to add facade tests to Bazel.
376filegroup(
377    name = "varint_size_test",
378    srcs = [
379        "varint_size_test.cc",
380    ],
381)
382
383# TODO(frolv): Figure out what to do about size reports in Bazel.
384filegroup(
385    name = "size_reports",
386    srcs = glob([
387        "size_report/*.cc",
388    ]),
389)
390
391filegroup(
392    name = "doxygen",
393    srcs = [
394        "public/pw_protobuf/find.h",
395    ],
396)
397