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