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