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