1# Copyright 2019 Google LLC 2# 3# Licensed under the Apache License, Version 2.0 (the "License"); 4# you may not use this file except in compliance with the License. 5# You may obtain a copy of the License at 6# 7# http://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, 11# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12# See the License for the specific language governing permissions and 13# limitations under the License. 14 15load("//fcp:config.bzl", "FCP_COPTS") 16load("@org_tensorflow//tensorflow/core/platform:build_config.bzl", "tf_proto_library") 17load("@com_github_grpc_grpc//bazel:python_rules.bzl", "py_proto_library") 18load("@bazel_skylib//rules:common_settings.bzl", "bool_flag") 19 20package( 21 default_visibility = [ 22 "//fcp:internal", 23 ], 24 licenses = ["notice"], # Apache 2.0 25) 26 27cc_library( 28 name = "grpc_bidi_channel", 29 hdrs = ["grpc_bidi_channel.h"], 30 copts = FCP_COPTS, 31 deps = [ 32 "//fcp/base", 33 "@com_github_grpc_grpc//:grpc++", 34 "@com_google_absl//absl/base:core_headers", 35 "@com_google_absl//absl/strings", 36 ], 37) 38 39cc_test( 40 name = "grpc_bidi_channel_test", 41 srcs = ["grpc_bidi_channel_test.cc"], 42 copts = FCP_COPTS, 43 tags = ["local"], # The certificate path is not accessible from a sandbox. 44 deps = [ 45 ":grpc_bidi_stream", 46 "//fcp/protos:cc_grpc", 47 "//fcp/testing", 48 "@com_google_absl//absl/status", 49 "@com_google_googletest//:gtest_main", 50 ], 51) 52 53cc_library( 54 name = "grpc_bidi_stream", 55 srcs = ["grpc_bidi_stream.cc"], 56 hdrs = ["grpc_bidi_stream.h"], 57 copts = FCP_COPTS, 58 deps = [ 59 ":grpc_bidi_channel", 60 "//fcp/base", 61 "//fcp/base:status_converters", 62 "//fcp/protocol:grpc_chunked_bidi_stream", 63 "//fcp/protos:cc_grpc", 64 "@com_github_grpc_grpc//:grpc++", 65 "@com_google_absl//absl/base:core_headers", 66 "@com_google_absl//absl/status", 67 "@com_google_absl//absl/synchronization", 68 ], 69) 70 71cc_test( 72 name = "grpc_bidi_stream_test", 73 srcs = ["grpc_bidi_stream_test.cc"], 74 copts = FCP_COPTS, 75 deps = [ 76 ":fake_server", 77 ":grpc_bidi_stream", 78 ":test_helpers", 79 "//fcp/base", 80 "//fcp/base:scheduler", 81 "//fcp/testing", 82 "@com_github_grpc_grpc//:grpc++", 83 "@com_google_absl//absl/status", 84 "@com_google_absl//absl/strings", 85 "@com_google_absl//absl/time", 86 "@com_google_googletest//:gtest_main", 87 ], 88) 89 90cc_library( 91 name = "fake_server", 92 testonly = 1, 93 srcs = ["fake_server.cc"], 94 hdrs = ["fake_server.h"], 95 copts = FCP_COPTS, 96 visibility = ["//visibility:public"], 97 deps = [ 98 ":grpc_bidi_stream", 99 "//fcp/base", 100 "//fcp/base:status_converters", 101 "//fcp/protocol:grpc_chunked_bidi_stream", 102 "//fcp/protos:cc_grpc", 103 "//fcp/protos:federated_api_cc_proto", 104 "@com_github_grpc_grpc//:grpc++", 105 "@com_google_absl//absl/status", 106 "@com_google_absl//absl/synchronization", 107 "@com_google_googletest//:gtest", 108 ], 109) 110 111# Interfaces used by the engine & protocol. These require platform specific 112# implementations. 113cc_library( 114 name = "interfaces", 115 srcs = [], 116 hdrs = [ 117 "event_publisher.h", 118 "files.h", 119 "flags.h", 120 "log_manager.h", 121 "secagg_event_publisher.h", 122 "stats.h", 123 ], 124 visibility = ["//visibility:public"], 125 deps = [ 126 ":diag_codes_cc_proto", 127 ":histogram_counters_cc_proto", 128 "//fcp/client/engine:engine_cc_proto", 129 "@com_google_absl//absl/container:flat_hash_map", 130 "@com_google_absl//absl/status", 131 "@com_google_absl//absl/status:statusor", 132 "@com_google_absl//absl/strings", 133 "@com_google_absl//absl/time", 134 ], 135) 136 137cc_library( 138 name = "federated_protocol", 139 hdrs = ["federated_protocol.h"], 140 deps = [ 141 ":interfaces", 142 "//fcp/client/engine:engine_cc_proto", 143 "//fcp/protos:federated_api_cc_proto", 144 "//fcp/protos:plan_cc_proto", 145 "//fcp/protos/federatedcompute:federated_compute_cc_proto", 146 "@com_google_absl//absl/container:node_hash_map", 147 "@com_google_absl//absl/status", 148 "@com_google_absl//absl/status:statusor", 149 ], 150) 151 152cc_library( 153 name = "federated_protocol_util", 154 srcs = ["federated_protocol_util.cc"], 155 hdrs = ["federated_protocol_util.h"], 156 deps = [ 157 ":diag_codes_cc_proto", 158 ":interfaces", 159 "//fcp/base", 160 "//fcp/base:time_util", 161 "//fcp/protos:federated_api_cc_proto", 162 "@com_google_absl//absl/random", 163 "@com_google_absl//absl/status:statusor", 164 "@com_google_absl//absl/time", 165 "@com_google_protobuf//:protobuf", 166 ], 167) 168 169cc_test( 170 name = "federated_protocol_util_test", 171 srcs = ["federated_protocol_util_test.cc"], 172 deps = [ 173 ":diag_codes_cc_proto", 174 ":federated_protocol_util", 175 ":test_helpers", 176 "//fcp/testing", 177 "@com_google_googletest//:gtest_main", 178 ], 179) 180 181cc_library( 182 name = "grpc_federated_protocol", 183 srcs = ["grpc_federated_protocol.cc"], 184 hdrs = [ 185 "grpc_federated_protocol.h", 186 ], 187 deps = [ 188 ":diag_codes_cc_proto", 189 ":federated_protocol", 190 ":federated_protocol_util", 191 ":fl_runner_cc_proto", 192 ":grpc_bidi_stream", 193 ":interfaces", 194 ":interruptible_runner", 195 ":secagg_runner", 196 ":selector_context_cc_proto", 197 "//fcp/base", 198 "//fcp/base:time_util", 199 "//fcp/base:wall_clock_stopwatch", 200 "//fcp/client/cache:resource_cache", 201 "//fcp/client/engine:engine_cc_proto", 202 "//fcp/client/http:http_client", 203 "//fcp/client/http:in_memory_request_response", 204 "//fcp/client/opstats:opstats_logger", 205 "//fcp/protocol:grpc_chunked_bidi_stream", 206 "//fcp/protos:federated_api_cc_proto", 207 "//fcp/protos:plan_cc_proto", 208 "//fcp/secagg/client", 209 "//fcp/secagg/client:state_transition_listener", 210 "//fcp/secagg/shared", 211 "//fcp/secagg/shared:cc_proto", 212 "@com_google_absl//absl/container:flat_hash_map", 213 "@com_google_absl//absl/container:flat_hash_set", 214 "@com_google_absl//absl/container:node_hash_map", 215 "@com_google_absl//absl/random", 216 "@com_google_absl//absl/status", 217 "@com_google_absl//absl/status:statusor", 218 "@com_google_absl//absl/time", 219 "@com_google_absl//absl/types:span", 220 "@com_google_protobuf//:protobuf", 221 ], 222) 223 224cc_test( 225 name = "grpc_federated_protocol_test", 226 srcs = ["grpc_federated_protocol_test.cc"], 227 deps = [ 228 ":diag_codes_cc_proto", 229 ":grpc_bidi_stream", 230 ":grpc_federated_protocol", 231 ":interfaces", 232 ":interruptible_runner", 233 ":test_helpers", 234 "//fcp/base", 235 "//fcp/client/cache:test_helpers", 236 "//fcp/client/engine:engine_cc_proto", 237 "//fcp/client/http:http_client", 238 "//fcp/client/http/testing:test_helpers", 239 "//fcp/protos:federated_api_cc_proto", 240 "//fcp/secagg/client", 241 "//fcp/secagg/shared", 242 "//fcp/secagg/testing:client_mocks", 243 "//fcp/secagg/testing:common_mocks", 244 "//fcp/testing", 245 "@com_google_absl//absl/random", 246 "@com_google_absl//absl/status", 247 "@com_google_absl//absl/synchronization", 248 "@com_google_absl//absl/time", 249 "@com_google_googletest//:gtest_main", 250 "@com_google_protobuf//:protobuf", 251 ], 252) 253 254cc_library( 255 name = "simple_task_environment", 256 srcs = ["simple_task_environment.cc"], 257 hdrs = ["simple_task_environment.h"], 258 copts = FCP_COPTS, 259 visibility = ["//visibility:public"], 260 deps = [ 261 ":selector_context_cc_proto", 262 "//fcp/base", 263 "//fcp/client/http:http_client", 264 "//fcp/protos:plan_cc_proto", 265 "@com_google_absl//absl/status:statusor", 266 "@com_google_absl//absl/time", 267 ], 268) 269 270cc_test( 271 name = "simple_task_environment_test", 272 srcs = ["simple_task_environment_test.cc"], 273 deps = [ 274 ":simple_task_environment", 275 ":test_helpers", 276 "//fcp/testing", 277 "@com_google_absl//absl/time", 278 "@com_google_googletest//:gtest_main", 279 ], 280) 281 282bool_flag( 283 name = "support_tfmobile", 284 build_setting_default = True, 285) 286 287bool_flag( 288 name = "support_grpc", 289 build_setting_default = True, 290) 291 292config_setting( 293 name = "client_support_tfmobile", 294 flag_values = {":support_tfmobile": "True"}, 295) 296 297config_setting( 298 name = "client_support_grpc", 299 flag_values = {":support_grpc": "True"}, 300) 301 302TF_OPTIONAL_DEPS = select({ 303 ":client_support_tfmobile": [ 304 "//fcp/client/engine:plan_engine", 305 ], 306 "//conditions:default": [], 307}) 308 309TF_OPTIONAL_DEFINES = select({ 310 ":client_support_tfmobile": [ 311 "FCP_CLIENT_SUPPORT_TFMOBILE", 312 ], 313 "//conditions:default": [], 314}) 315 316GRPC_OPTIONAL_DEFINES = select( 317 { 318 ":client_support_grpc": ["FCP_CLIENT_SUPPORT_GRPC"], 319 "//conditions:default": [], 320 }, 321) 322 323GRPC_OPTIONAL_DEPS = select( 324 { 325 ":client_support_grpc": [":grpc_federated_protocol"], 326 "//conditions:default": [], 327 }, 328) 329 330cc_library( 331 name = "fl_runner", 332 srcs = ["fl_runner.cc"], 333 hdrs = [ 334 "fl_runner.h", 335 ], 336 copts = FCP_COPTS, 337 defines = TF_OPTIONAL_DEFINES + GRPC_OPTIONAL_DEFINES, 338 visibility = ["//visibility:public"], 339 deps = [ 340 ":federated_protocol", 341 ":federated_protocol_util", 342 ":federated_select", 343 ":fl_runner_cc_proto", 344 ":histogram_counters_cc_proto", 345 ":interfaces", 346 ":interruptible_runner", 347 ":parsing_utils", 348 ":phase_logger", 349 ":phase_logger_impl", 350 ":secagg_runner", 351 ":selector_context_cc_proto", 352 ":simple_task_environment", 353 "//fcp/base", 354 "//fcp/base:clock", 355 "//fcp/client/cache:file_backed_resource_cache", 356 "//fcp/client/cache:resource_cache", 357 "//fcp/client/engine:common", 358 "//fcp/client/engine:engine_cc_proto", 359 "//fcp/client/engine:example_iterator_factory", 360 "//fcp/client/engine:example_query_plan_engine", 361 "//fcp/client/engine:plan_engine_helpers", 362 "//fcp/client/engine:tflite_plan_engine", 363 "//fcp/client/http:http_client", 364 "//fcp/client/http:http_federated_protocol", 365 "//fcp/client/opstats:opstats_example_store", 366 "//fcp/client/opstats:opstats_logger", 367 "//fcp/client/opstats:opstats_utils", 368 "//fcp/protos:federated_api_cc_proto", 369 "//fcp/protos:opstats_cc_proto", 370 "//fcp/protos:plan_cc_proto", 371 "//fcp/protos/federatedcompute:federated_compute_cc_proto", 372 "@boringssl//:crypto", 373 "@com_google_absl//absl/status", 374 "@com_google_absl//absl/status:statusor", 375 "@com_google_absl//absl/strings:cord", 376 "@com_google_absl//absl/time", 377 "@org_tensorflow//tensorflow/core:framework", 378 "@org_tensorflow//tensorflow/core:protos_all_cc", 379 ] + TF_OPTIONAL_DEPS + GRPC_OPTIONAL_DEPS, 380) 381 382cc_library( 383 name = "lc_runner", 384 srcs = ["lc_runner.cc"], 385 hdrs = [ 386 "lc_runner.h", 387 ], 388 copts = FCP_COPTS, 389 defines = TF_OPTIONAL_DEFINES, 390 visibility = ["//visibility:public"], 391 deps = [ 392 ":interfaces", 393 ":phase_logger", 394 ":phase_logger_impl", 395 ":selector_context_cc_proto", 396 ":simple_task_environment", 397 "//fcp/base", 398 "//fcp/client/engine:example_iterator_factory", 399 "//fcp/client/engine:plan_engine_helpers", 400 "//fcp/client/engine:tflite_plan_engine", 401 "//fcp/client/opstats:opstats_example_store", 402 "//fcp/client/opstats:opstats_logger", 403 "//fcp/protos:plan_cc_proto", 404 "@com_google_absl//absl/container:flat_hash_map", 405 "@com_google_absl//absl/status", 406 "@com_google_absl//absl/status:statusor", 407 "@com_google_absl//absl/time", 408 "@org_tensorflow//tensorflow/core:framework", 409 "@org_tensorflow//tensorflow/core:protos_all_cc", 410 ] + TF_OPTIONAL_DEPS, 411) 412 413cc_library( 414 name = "phase_logger", 415 hdrs = ["phase_logger.h"], 416 deps = [ 417 ":interfaces", 418 "//fcp/client/opstats:opstats_logger", 419 "//fcp/protos:federated_api_cc_proto", 420 "@com_google_absl//absl/strings", 421 ], 422) 423 424cc_library( 425 name = "phase_logger_impl", 426 srcs = ["phase_logger_impl.cc"], 427 hdrs = ["phase_logger_impl.h"], 428 deps = [ 429 ":interfaces", 430 ":phase_logger", 431 "//fcp/base", 432 "//fcp/client/opstats:opstats_logger", 433 "//fcp/protos:federated_api_cc_proto", 434 "@com_google_absl//absl/strings", 435 "@com_google_absl//absl/time", 436 ], 437) 438 439cc_test( 440 name = "phase_logger_impl_test", 441 srcs = ["phase_logger_impl_test.cc"], 442 deps = [ 443 ":phase_logger_impl", 444 ":test_helpers", 445 "//fcp/testing", 446 "@com_google_absl//absl/status", 447 "@com_google_absl//absl/time", 448 "@com_google_googletest//:gtest_main", 449 "@com_google_protobuf//:protobuf", 450 ], 451) 452 453cc_library( 454 name = "secagg_runner", 455 srcs = ["secagg_runner.cc"], 456 hdrs = ["secagg_runner.h"], 457 deps = [ 458 ":federated_protocol", 459 ":interfaces", 460 ":interruptible_runner", 461 "//fcp/secagg/client", 462 "//fcp/secagg/shared", 463 "//fcp/secagg/shared:cc_proto", 464 ], 465) 466 467cc_library( 468 name = "federated_select", 469 srcs = ["federated_select.cc"], 470 hdrs = ["federated_select.h"], 471 deps = [ 472 ":diag_codes_cc_proto", 473 ":interfaces", 474 ":interruptible_runner", 475 ":simple_task_environment", 476 "//fcp/base", 477 "//fcp/base:wall_clock_stopwatch", 478 "//fcp/client/engine:example_iterator_factory", 479 "//fcp/client/http:http_client", 480 "//fcp/client/http:http_client_util", 481 "//fcp/client/http:in_memory_request_response", 482 "//fcp/protos:plan_cc_proto", 483 "@com_google_absl//absl/status:statusor", 484 "@com_google_absl//absl/strings", 485 "@com_google_absl//absl/strings:cord", 486 "@com_google_absl//absl/time", 487 "@com_google_protobuf//:protobuf", 488 ], 489) 490 491cc_library( 492 name = "parsing_utils", 493 hdrs = ["parsing_utils.h"], 494 deps = ["@com_google_absl//absl/strings:cord"], 495) 496 497cc_test( 498 name = "federated_select_test", 499 srcs = ["federated_select_test.cc"], 500 deps = [ 501 ":client_runner", 502 ":diag_codes_cc_proto", 503 ":federated_select", 504 ":interfaces", 505 ":interruptible_runner", 506 ":test_helpers", 507 "//fcp/base", 508 "//fcp/client/engine:example_iterator_factory", 509 "//fcp/client/http:http_client", 510 "//fcp/client/http:in_memory_request_response", 511 "//fcp/client/http/testing:test_helpers", 512 "//fcp/protos:plan_cc_proto", 513 "//fcp/testing", 514 "@com_google_absl//absl/status", 515 "@com_google_absl//absl/synchronization", 516 "@com_google_absl//absl/time", 517 "@com_google_googletest//:gtest_main", 518 "@com_google_protobuf//:protobuf", 519 ], 520) 521 522cc_library( 523 name = "interruptible_runner", 524 srcs = ["interruptible_runner.cc"], 525 hdrs = ["interruptible_runner.h"], 526 visibility = ["//visibility:public"], 527 deps = [ 528 ":diag_codes_cc_proto", 529 ":interfaces", 530 "//fcp/base", 531 "//fcp/base:future", 532 "//fcp/base:scheduler", 533 "@com_google_absl//absl/status", 534 "@com_google_absl//absl/time", 535 ], 536) 537 538cc_library( 539 name = "fake_log_manager", 540 hdrs = ["fake_log_manager.h"], 541 visibility = ["//visibility:public"], 542 deps = [ 543 ":diag_codes_cc_proto", 544 ":interfaces", 545 "//fcp/base", 546 ], 547) 548 549cc_library( 550 name = "fake_event_publisher", 551 hdrs = ["fake_event_publisher.h"], 552 visibility = ["//visibility:public"], 553 deps = [ 554 ":interfaces", 555 "//fcp/base", 556 "@com_google_absl//absl/strings", 557 "@com_google_absl//absl/time", 558 ], 559) 560 561cc_test( 562 name = "interruptible_runner_test", 563 srcs = ["interruptible_runner_test.cc"], 564 copts = FCP_COPTS, 565 deps = [ 566 ":diag_codes_cc_proto", 567 ":interruptible_runner", 568 ":test_helpers", 569 "//fcp/testing", 570 "@com_google_absl//absl/status", 571 "@com_google_absl//absl/synchronization", 572 "@com_google_absl//absl/time", 573 "@com_google_googletest//:gtest_main", 574 ], 575) 576 577# Misc. classes to support embedding a fake client in unit or integration tests. 578cc_library( 579 name = "client_runner", 580 testonly = True, 581 hdrs = ["client_runner.h"], 582 deps = [ 583 ":client_runner_example_data_cc_proto", 584 ":diag_codes_cc_proto", 585 ":fake_event_publisher", 586 ":histogram_counters_cc_proto", 587 ":interfaces", 588 ":simple_task_environment", 589 "//fcp/base", 590 "//fcp/client/http/curl:curl_http_client", 591 "//fcp/protos:plan_cc_proto", 592 "@com_google_absl//absl/container:flat_hash_map", 593 "@com_google_absl//absl/status:statusor", 594 "@com_google_absl//absl/strings", 595 "@com_google_absl//absl/time", 596 "@com_google_googletest//:gtest", 597 "@com_google_protobuf//:protobuf", 598 ], 599) 600 601# A command line executable running most of the client side code to 602# use for debugging and illustrating an example integration. 603cc_library( 604 name = "client_runner_main_lib", 605 testonly = True, 606 srcs = ["client_runner_main.cc"], 607 deps = [ 608 ":client_runner", 609 ":client_runner_example_data_cc_proto", 610 ":fake_event_publisher", 611 ":fl_runner", 612 "//fcp/base", 613 "//fcp/tensorflow:external_dataset_op_lib", 614 "//fcp/tensorflow:task_eligibility_info_ops_lib", 615 "@com_google_absl//absl/flags:flag", 616 "@com_google_absl//absl/flags:parse", 617 "@com_google_absl//absl/flags:usage", 618 "@com_google_absl//absl/status", 619 "@com_google_absl//absl/status:statusor", 620 "@com_google_absl//absl/strings", 621 ], 622) 623 624cc_binary( 625 name = "client_runner_main", 626 testonly = True, 627 deps = [ 628 ":client_runner_main_lib", 629 "@org_tensorflow//tensorflow/core:tensorflow_opensource", 630 ], 631) 632 633cc_library( 634 name = "test_helpers", 635 testonly = True, 636 srcs = ["test_helpers.cc"], 637 hdrs = ["test_helpers.h"], 638 deps = [ 639 ":federated_protocol", 640 ":federated_select", 641 ":interfaces", 642 ":phase_logger", 643 ":secagg_runner", 644 ":simple_task_environment", 645 "//fcp/base", 646 "//fcp/client/engine:example_iterator_factory", 647 "//fcp/client/http:http_client", 648 "//fcp/client/opstats:opstats_db", 649 "//fcp/client/opstats:opstats_logger", 650 "@com_google_absl//absl/status", 651 "@com_google_absl//absl/status:statusor", 652 "@com_google_absl//absl/strings", 653 "@com_google_googletest//:gtest_main", 654 "@com_google_protobuf//:protobuf", 655 "@org_tensorflow//tensorflow/core:protos_all_cc", 656 ], 657) 658 659# Protocol buffers for logging. Those get serialized. 660proto_library( 661 name = "histogram_counters_proto", 662 srcs = ["histogram_counters.proto"], 663) 664 665java_proto_library( 666 name = "histogram_counters_java_proto", 667 deps = [":histogram_counters_proto"], 668) 669 670cc_proto_library( 671 name = "histogram_counters_cc_proto", 672 deps = [":histogram_counters_proto"], 673) 674 675# Protocol buffers for FL Runner. These do not get serialized to disk. 676tf_proto_library( 677 name = "fl_runner_proto", 678 srcs = ["fl_runner.proto"], 679 protodeps = [ 680 "//fcp/client/engine:engine_proto", 681 "@org_tensorflow//tensorflow/core:protos_all", 682 ], 683 visibility = ["//visibility:public"], 684) 685 686java_proto_library( 687 name = "fl_runner_java_proto", 688 visibility = ["//visibility:public"], 689 deps = [":fl_runner_proto"], 690) 691 692# Allowing to refer to the cc library generated by the rule above in usual way: 693alias( 694 name = "fl_runner_cc_proto", 695 actual = "fl_runner_proto_cc", 696 visibility = ["//visibility:public"], 697) 698 699# Protocol buffers for logging. Those get serialized. 700proto_library( 701 name = "diag_codes_proto", 702 srcs = ["diag_codes.proto"], 703) 704 705java_proto_library( 706 name = "diag_codes_java_proto", 707 deps = [":diag_codes_proto"], 708) 709 710cc_proto_library( 711 name = "diag_codes_cc_proto", 712 deps = [":diag_codes_proto"], 713) 714 715# Protocol buffers for providing example data to client_runner_main. 716proto_library( 717 name = "client_runner_example_data_proto", 718 testonly = True, 719 srcs = ["client_runner_example_data.proto"], 720) 721 722cc_proto_library( 723 name = "client_runner_example_data_cc_proto", 724 testonly = True, 725 deps = [":client_runner_example_data_proto"], 726) 727 728py_proto_library( 729 name = "client_runner_example_data_py_pb2", 730 testonly = True, 731 deps = [":client_runner_example_data_proto"], 732) 733 734# -------------------------------------------------------------------- 735# selector_context.proto 736 737proto_library( 738 name = "selector_context_proto", 739 srcs = ["selector_context.proto"], 740 deps = [ 741 "@com_google_protobuf//:timestamp_proto", 742 ], 743) 744 745cc_proto_library( 746 name = "selector_context_cc_proto", 747 visibility = ["//visibility:public"], 748 deps = [":selector_context_proto"], 749) 750 751java_proto_library( 752 name = "selector_context_java_proto", 753 visibility = ["//visibility:public"], 754 deps = [":selector_context_proto"], 755) 756 757# -------------------------------------------------------------------- 758# example_query_result.proto 759 760proto_library( 761 name = "example_query_result_proto", 762 srcs = ["example_query_result.proto"], 763) 764 765java_proto_library( 766 name = "example_query_result_java_proto", 767 deps = [":example_query_result_proto"], 768) 769 770cc_proto_library( 771 name = "example_query_result_cc_proto", 772 deps = [":example_query_result_proto"], 773) 774