1*cc02d7e2SAndroid Build Coastguard Worker#!/usr/bin/env python3 2*cc02d7e2SAndroid Build Coastguard Worker 3*cc02d7e2SAndroid Build Coastguard Worker# Copyright 2022 gRPC authors. 4*cc02d7e2SAndroid Build Coastguard Worker# 5*cc02d7e2SAndroid Build Coastguard Worker# Licensed under the Apache License, Version 2.0 (the "License"); 6*cc02d7e2SAndroid Build Coastguard Worker# you may not use this file except in compliance with the License. 7*cc02d7e2SAndroid Build Coastguard Worker# You may obtain a copy of the License at 8*cc02d7e2SAndroid Build Coastguard Worker# 9*cc02d7e2SAndroid Build Coastguard Worker# http://www.apache.org/licenses/LICENSE-2.0 10*cc02d7e2SAndroid Build Coastguard Worker# 11*cc02d7e2SAndroid Build Coastguard Worker# Unless required by applicable law or agreed to in writing, software 12*cc02d7e2SAndroid Build Coastguard Worker# distributed under the License is distributed on an "AS IS" BASIS, 13*cc02d7e2SAndroid Build Coastguard Worker# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14*cc02d7e2SAndroid Build Coastguard Worker# See the License for the specific language governing permissions and 15*cc02d7e2SAndroid Build Coastguard Worker# limitations under the License. 16*cc02d7e2SAndroid Build Coastguard Worker 17*cc02d7e2SAndroid Build Coastguard Workerimport argparse 18*cc02d7e2SAndroid Build Coastguard Workerimport collections 19*cc02d7e2SAndroid Build Coastguard Workerfrom doctest import SKIP 20*cc02d7e2SAndroid Build Coastguard Workerimport multiprocessing 21*cc02d7e2SAndroid Build Coastguard Workerimport os 22*cc02d7e2SAndroid Build Coastguard Workerimport re 23*cc02d7e2SAndroid Build Coastguard Workerimport sys 24*cc02d7e2SAndroid Build Coastguard Worker 25*cc02d7e2SAndroid Build Coastguard Workerimport run_buildozer 26*cc02d7e2SAndroid Build Coastguard Worker 27*cc02d7e2SAndroid Build Coastguard Worker# find our home 28*cc02d7e2SAndroid Build Coastguard WorkerROOT = os.path.abspath(os.path.join(os.path.dirname(sys.argv[0]), "../..")) 29*cc02d7e2SAndroid Build Coastguard Workeros.chdir(ROOT) 30*cc02d7e2SAndroid Build Coastguard Worker 31*cc02d7e2SAndroid Build Coastguard Workervendors = collections.defaultdict(list) 32*cc02d7e2SAndroid Build Coastguard Workerscores = collections.defaultdict(int) 33*cc02d7e2SAndroid Build Coastguard Workeravoidness = collections.defaultdict(int) 34*cc02d7e2SAndroid Build Coastguard Workerconsumes = {} 35*cc02d7e2SAndroid Build Coastguard Workerno_update = set() 36*cc02d7e2SAndroid Build Coastguard Workerbuildozer_commands = [] 37*cc02d7e2SAndroid Build Coastguard Workeroriginal_deps = {} 38*cc02d7e2SAndroid Build Coastguard Workeroriginal_external_deps = {} 39*cc02d7e2SAndroid Build Coastguard Workerskip_headers = collections.defaultdict(set) 40*cc02d7e2SAndroid Build Coastguard Worker 41*cc02d7e2SAndroid Build Coastguard Worker# TODO(ctiller): ideally we wouldn't hardcode a bunch of paths here. 42*cc02d7e2SAndroid Build Coastguard Worker# We can likely parse out BUILD files from dependencies to generate this index. 43*cc02d7e2SAndroid Build Coastguard WorkerEXTERNAL_DEPS = { 44*cc02d7e2SAndroid Build Coastguard Worker "absl/algorithm/container.h": "absl/algorithm:container", 45*cc02d7e2SAndroid Build Coastguard Worker "absl/base/attributes.h": "absl/base:core_headers", 46*cc02d7e2SAndroid Build Coastguard Worker "absl/base/call_once.h": "absl/base", 47*cc02d7e2SAndroid Build Coastguard Worker "absl/base/config.h": "absl/base:config", 48*cc02d7e2SAndroid Build Coastguard Worker # TODO(ctiller) remove this 49*cc02d7e2SAndroid Build Coastguard Worker "absl/base/internal/endian.h": "absl/base:endian", 50*cc02d7e2SAndroid Build Coastguard Worker "absl/base/thread_annotations.h": "absl/base:core_headers", 51*cc02d7e2SAndroid Build Coastguard Worker "absl/container/flat_hash_map.h": "absl/container:flat_hash_map", 52*cc02d7e2SAndroid Build Coastguard Worker "absl/container/flat_hash_set.h": "absl/container:flat_hash_set", 53*cc02d7e2SAndroid Build Coastguard Worker "absl/container/inlined_vector.h": "absl/container:inlined_vector", 54*cc02d7e2SAndroid Build Coastguard Worker "absl/cleanup/cleanup.h": "absl/cleanup", 55*cc02d7e2SAndroid Build Coastguard Worker "absl/debugging/failure_signal_handler.h": ( 56*cc02d7e2SAndroid Build Coastguard Worker "absl/debugging:failure_signal_handler" 57*cc02d7e2SAndroid Build Coastguard Worker ), 58*cc02d7e2SAndroid Build Coastguard Worker "absl/debugging/stacktrace.h": "absl/debugging:stacktrace", 59*cc02d7e2SAndroid Build Coastguard Worker "absl/debugging/symbolize.h": "absl/debugging:symbolize", 60*cc02d7e2SAndroid Build Coastguard Worker "absl/flags/flag.h": "absl/flags:flag", 61*cc02d7e2SAndroid Build Coastguard Worker "absl/flags/marshalling.h": "absl/flags:marshalling", 62*cc02d7e2SAndroid Build Coastguard Worker "absl/flags/parse.h": "absl/flags:parse", 63*cc02d7e2SAndroid Build Coastguard Worker "absl/functional/any_invocable.h": "absl/functional:any_invocable", 64*cc02d7e2SAndroid Build Coastguard Worker "absl/functional/bind_front.h": "absl/functional:bind_front", 65*cc02d7e2SAndroid Build Coastguard Worker "absl/functional/function_ref.h": "absl/functional:function_ref", 66*cc02d7e2SAndroid Build Coastguard Worker "absl/hash/hash.h": "absl/hash", 67*cc02d7e2SAndroid Build Coastguard Worker "absl/memory/memory.h": "absl/memory", 68*cc02d7e2SAndroid Build Coastguard Worker "absl/meta/type_traits.h": "absl/meta:type_traits", 69*cc02d7e2SAndroid Build Coastguard Worker "absl/numeric/int128.h": "absl/numeric:int128", 70*cc02d7e2SAndroid Build Coastguard Worker "absl/random/random.h": "absl/random", 71*cc02d7e2SAndroid Build Coastguard Worker "absl/random/bit_gen_ref.h": "absl/random:bit_gen_ref", 72*cc02d7e2SAndroid Build Coastguard Worker "absl/random/mocking_bit_gen.h": "absl/random:mocking_bit_gen", 73*cc02d7e2SAndroid Build Coastguard Worker "absl/random/distributions.h": "absl/random:distributions", 74*cc02d7e2SAndroid Build Coastguard Worker "absl/random/uniform_int_distribution.h": "absl/random:distributions", 75*cc02d7e2SAndroid Build Coastguard Worker "absl/status/status.h": "absl/status", 76*cc02d7e2SAndroid Build Coastguard Worker "absl/status/statusor.h": "absl/status:statusor", 77*cc02d7e2SAndroid Build Coastguard Worker "absl/strings/ascii.h": "absl/strings", 78*cc02d7e2SAndroid Build Coastguard Worker "absl/strings/cord.h": "absl/strings:cord", 79*cc02d7e2SAndroid Build Coastguard Worker "absl/strings/escaping.h": "absl/strings", 80*cc02d7e2SAndroid Build Coastguard Worker "absl/strings/match.h": "absl/strings", 81*cc02d7e2SAndroid Build Coastguard Worker "absl/strings/numbers.h": "absl/strings", 82*cc02d7e2SAndroid Build Coastguard Worker "absl/strings/str_cat.h": "absl/strings", 83*cc02d7e2SAndroid Build Coastguard Worker "absl/strings/str_format.h": "absl/strings:str_format", 84*cc02d7e2SAndroid Build Coastguard Worker "absl/strings/str_join.h": "absl/strings", 85*cc02d7e2SAndroid Build Coastguard Worker "absl/strings/str_replace.h": "absl/strings", 86*cc02d7e2SAndroid Build Coastguard Worker "absl/strings/str_split.h": "absl/strings", 87*cc02d7e2SAndroid Build Coastguard Worker "absl/strings/string_view.h": "absl/strings", 88*cc02d7e2SAndroid Build Coastguard Worker "absl/strings/strip.h": "absl/strings", 89*cc02d7e2SAndroid Build Coastguard Worker "absl/strings/substitute.h": "absl/strings", 90*cc02d7e2SAndroid Build Coastguard Worker "absl/synchronization/mutex.h": "absl/synchronization", 91*cc02d7e2SAndroid Build Coastguard Worker "absl/synchronization/notification.h": "absl/synchronization", 92*cc02d7e2SAndroid Build Coastguard Worker "absl/time/clock.h": "absl/time", 93*cc02d7e2SAndroid Build Coastguard Worker "absl/time/time.h": "absl/time", 94*cc02d7e2SAndroid Build Coastguard Worker "absl/types/optional.h": "absl/types:optional", 95*cc02d7e2SAndroid Build Coastguard Worker "absl/types/span.h": "absl/types:span", 96*cc02d7e2SAndroid Build Coastguard Worker "absl/types/variant.h": "absl/types:variant", 97*cc02d7e2SAndroid Build Coastguard Worker "absl/utility/utility.h": "absl/utility", 98*cc02d7e2SAndroid Build Coastguard Worker "address_sorting/address_sorting.h": "address_sorting", 99*cc02d7e2SAndroid Build Coastguard Worker "google/cloud/opentelemetry/resource_detector.h": "google_cloud_cpp:opentelemetry", 100*cc02d7e2SAndroid Build Coastguard Worker "opentelemetry/common/attribute_value.h": "otel/api", 101*cc02d7e2SAndroid Build Coastguard Worker "opentelemetry/common/key_value_iterable.h": "otel/api", 102*cc02d7e2SAndroid Build Coastguard Worker "opentelemetry/nostd/function_ref.h": "otel/api", 103*cc02d7e2SAndroid Build Coastguard Worker "opentelemetry/nostd/string_view.h": "otel/api", 104*cc02d7e2SAndroid Build Coastguard Worker "opentelemetry/context/context.h": "otel/api", 105*cc02d7e2SAndroid Build Coastguard Worker "opentelemetry/metrics/meter.h": "otel/api", 106*cc02d7e2SAndroid Build Coastguard Worker "opentelemetry/metrics/meter_provider.h": "otel/api", 107*cc02d7e2SAndroid Build Coastguard Worker "opentelemetry/metrics/provider.h": "otel/api", 108*cc02d7e2SAndroid Build Coastguard Worker "opentelemetry/metrics/sync_instruments.h": "otel/api", 109*cc02d7e2SAndroid Build Coastguard Worker "opentelemetry/nostd/shared_ptr.h": "otel/api", 110*cc02d7e2SAndroid Build Coastguard Worker "opentelemetry/nostd/unique_ptr.h": "otel/api", 111*cc02d7e2SAndroid Build Coastguard Worker "opentelemetry/sdk/metrics/meter_provider.h": "otel/sdk/src/metrics", 112*cc02d7e2SAndroid Build Coastguard Worker "opentelemetry/sdk/common/attribute_utils.h": "otel/sdk:headers", 113*cc02d7e2SAndroid Build Coastguard Worker "opentelemetry/sdk/resource/resource.h": "otel/sdk:headers", 114*cc02d7e2SAndroid Build Coastguard Worker "opentelemetry/sdk/resource/resource_detector.h": "otel/sdk:headers", 115*cc02d7e2SAndroid Build Coastguard Worker "opentelemetry/sdk/resource/semantic_conventions.h": "otel/sdk:headers", 116*cc02d7e2SAndroid Build Coastguard Worker "ares.h": "cares", 117*cc02d7e2SAndroid Build Coastguard Worker "fuzztest/fuzztest.h": ["fuzztest", "fuzztest_main"], 118*cc02d7e2SAndroid Build Coastguard Worker "google/api/monitored_resource.pb.h": ( 119*cc02d7e2SAndroid Build Coastguard Worker "google/api:monitored_resource_cc_proto" 120*cc02d7e2SAndroid Build Coastguard Worker ), 121*cc02d7e2SAndroid Build Coastguard Worker "google/devtools/cloudtrace/v2/tracing.grpc.pb.h": ( 122*cc02d7e2SAndroid Build Coastguard Worker "googleapis_trace_grpc_service" 123*cc02d7e2SAndroid Build Coastguard Worker ), 124*cc02d7e2SAndroid Build Coastguard Worker "google/logging/v2/logging.grpc.pb.h": "googleapis_logging_grpc_service", 125*cc02d7e2SAndroid Build Coastguard Worker "google/logging/v2/logging.pb.h": "googleapis_logging_cc_proto", 126*cc02d7e2SAndroid Build Coastguard Worker "google/logging/v2/log_entry.pb.h": "googleapis_logging_cc_proto", 127*cc02d7e2SAndroid Build Coastguard Worker "google/monitoring/v3/metric_service.grpc.pb.h": ( 128*cc02d7e2SAndroid Build Coastguard Worker "googleapis_monitoring_grpc_service" 129*cc02d7e2SAndroid Build Coastguard Worker ), 130*cc02d7e2SAndroid Build Coastguard Worker "gmock/gmock.h": "gtest", 131*cc02d7e2SAndroid Build Coastguard Worker "gtest/gtest.h": "gtest", 132*cc02d7e2SAndroid Build Coastguard Worker "opencensus/exporters/stats/stackdriver/stackdriver_exporter.h": ( 133*cc02d7e2SAndroid Build Coastguard Worker "opencensus-stats-stackdriver_exporter" 134*cc02d7e2SAndroid Build Coastguard Worker ), 135*cc02d7e2SAndroid Build Coastguard Worker "opencensus/exporters/trace/stackdriver/stackdriver_exporter.h": ( 136*cc02d7e2SAndroid Build Coastguard Worker "opencensus-trace-stackdriver_exporter" 137*cc02d7e2SAndroid Build Coastguard Worker ), 138*cc02d7e2SAndroid Build Coastguard Worker "opencensus/trace/context_util.h": "opencensus-trace-context_util", 139*cc02d7e2SAndroid Build Coastguard Worker "opencensus/trace/propagation/grpc_trace_bin.h": ( 140*cc02d7e2SAndroid Build Coastguard Worker "opencensus-trace-propagation" 141*cc02d7e2SAndroid Build Coastguard Worker ), 142*cc02d7e2SAndroid Build Coastguard Worker "opencensus/tags/context_util.h": "opencensus-tags-context_util", 143*cc02d7e2SAndroid Build Coastguard Worker "opencensus/trace/span_context.h": "opencensus-trace-span_context", 144*cc02d7e2SAndroid Build Coastguard Worker "openssl/base.h": "libssl", 145*cc02d7e2SAndroid Build Coastguard Worker "openssl/bio.h": "libssl", 146*cc02d7e2SAndroid Build Coastguard Worker "openssl/bn.h": "libcrypto", 147*cc02d7e2SAndroid Build Coastguard Worker "openssl/buffer.h": "libcrypto", 148*cc02d7e2SAndroid Build Coastguard Worker "openssl/crypto.h": "libcrypto", 149*cc02d7e2SAndroid Build Coastguard Worker "openssl/digest.h": "libssl", 150*cc02d7e2SAndroid Build Coastguard Worker "openssl/engine.h": "libcrypto", 151*cc02d7e2SAndroid Build Coastguard Worker "openssl/err.h": "libcrypto", 152*cc02d7e2SAndroid Build Coastguard Worker "openssl/evp.h": "libcrypto", 153*cc02d7e2SAndroid Build Coastguard Worker "openssl/hmac.h": "libcrypto", 154*cc02d7e2SAndroid Build Coastguard Worker "openssl/mem.h": "libcrypto", 155*cc02d7e2SAndroid Build Coastguard Worker "openssl/param_build.h": "libcrypto", 156*cc02d7e2SAndroid Build Coastguard Worker "openssl/pem.h": "libcrypto", 157*cc02d7e2SAndroid Build Coastguard Worker "openssl/rsa.h": "libcrypto", 158*cc02d7e2SAndroid Build Coastguard Worker "openssl/sha.h": "libcrypto", 159*cc02d7e2SAndroid Build Coastguard Worker "openssl/ssl.h": "libssl", 160*cc02d7e2SAndroid Build Coastguard Worker "openssl/tls1.h": "libssl", 161*cc02d7e2SAndroid Build Coastguard Worker "openssl/x509.h": "libcrypto", 162*cc02d7e2SAndroid Build Coastguard Worker "openssl/x509v3.h": "libcrypto", 163*cc02d7e2SAndroid Build Coastguard Worker "re2/re2.h": "re2", 164*cc02d7e2SAndroid Build Coastguard Worker "upb/base/status.hpp": "upb_base_lib", 165*cc02d7e2SAndroid Build Coastguard Worker "upb/base/string_view.h": "upb_base_lib", 166*cc02d7e2SAndroid Build Coastguard Worker "upb/message/map.h": "upb_message_lib", 167*cc02d7e2SAndroid Build Coastguard Worker "upb/reflection/def.h": "upb_reflection", 168*cc02d7e2SAndroid Build Coastguard Worker "upb/json/encode.h": "upb_json_lib", 169*cc02d7e2SAndroid Build Coastguard Worker "upb/mem/arena.h": "upb_mem_lib", 170*cc02d7e2SAndroid Build Coastguard Worker "upb/mem/arena.hpp": "upb_mem_lib", 171*cc02d7e2SAndroid Build Coastguard Worker "upb/text/encode.h": "upb_textformat_lib", 172*cc02d7e2SAndroid Build Coastguard Worker "upb/reflection/def.hpp": "upb_reflection", 173*cc02d7e2SAndroid Build Coastguard Worker "upb/upb.h": "upb_amalgamation_lib", 174*cc02d7e2SAndroid Build Coastguard Worker "xxhash.h": "xxhash", 175*cc02d7e2SAndroid Build Coastguard Worker "zlib.h": "madler_zlib", 176*cc02d7e2SAndroid Build Coastguard Worker} 177*cc02d7e2SAndroid Build Coastguard Worker 178*cc02d7e2SAndroid Build Coastguard WorkerINTERNAL_DEPS = { 179*cc02d7e2SAndroid Build Coastguard Worker "test/core/event_engine/fuzzing_event_engine/fuzzing_event_engine.h": ( 180*cc02d7e2SAndroid Build Coastguard Worker "//test/core/event_engine/fuzzing_event_engine" 181*cc02d7e2SAndroid Build Coastguard Worker ), 182*cc02d7e2SAndroid Build Coastguard Worker "test/core/event_engine/fuzzing_event_engine/fuzzing_event_engine.pb.h": "//test/core/event_engine/fuzzing_event_engine:fuzzing_event_engine_proto", 183*cc02d7e2SAndroid Build Coastguard Worker "test/core/experiments/test_experiments.h": "//test/core/experiments:test_experiments_lib", 184*cc02d7e2SAndroid Build Coastguard Worker "google/api/expr/v1alpha1/syntax.upb.h": "google_api_expr_v1alpha1_syntax_upb", 185*cc02d7e2SAndroid Build Coastguard Worker "google/rpc/status.upb.h": "google_rpc_status_upb", 186*cc02d7e2SAndroid Build Coastguard Worker "google/protobuf/any.upb.h": "protobuf_any_upb", 187*cc02d7e2SAndroid Build Coastguard Worker "google/protobuf/duration.upb.h": "protobuf_duration_upb", 188*cc02d7e2SAndroid Build Coastguard Worker "google/protobuf/struct.upb.h": "protobuf_struct_upb", 189*cc02d7e2SAndroid Build Coastguard Worker "google/protobuf/timestamp.upb.h": "protobuf_timestamp_upb", 190*cc02d7e2SAndroid Build Coastguard Worker "google/protobuf/wrappers.upb.h": "protobuf_wrappers_upb", 191*cc02d7e2SAndroid Build Coastguard Worker "grpc/status.h": "grpc_public_hdrs", 192*cc02d7e2SAndroid Build Coastguard Worker "src/proto/grpc/channelz/channelz.grpc.pb.h": ( 193*cc02d7e2SAndroid Build Coastguard Worker "//src/proto/grpc/channelz:channelz_proto" 194*cc02d7e2SAndroid Build Coastguard Worker ), 195*cc02d7e2SAndroid Build Coastguard Worker "src/proto/grpc/core/stats.pb.h": "//src/proto/grpc/core:stats_proto", 196*cc02d7e2SAndroid Build Coastguard Worker "src/proto/grpc/health/v1/health.upb.h": "grpc_health_upb", 197*cc02d7e2SAndroid Build Coastguard Worker "src/proto/grpc/lb/v1/load_reporter.grpc.pb.h": ( 198*cc02d7e2SAndroid Build Coastguard Worker "//src/proto/grpc/lb/v1:load_reporter_proto" 199*cc02d7e2SAndroid Build Coastguard Worker ), 200*cc02d7e2SAndroid Build Coastguard Worker "src/proto/grpc/lb/v1/load_balancer.upb.h": "grpc_lb_upb", 201*cc02d7e2SAndroid Build Coastguard Worker "src/proto/grpc/reflection/v1alpha/reflection.grpc.pb.h": ( 202*cc02d7e2SAndroid Build Coastguard Worker "//src/proto/grpc/reflection/v1alpha:reflection_proto" 203*cc02d7e2SAndroid Build Coastguard Worker ), 204*cc02d7e2SAndroid Build Coastguard Worker "src/proto/grpc/gcp/transport_security_common.upb.h": "alts_upb", 205*cc02d7e2SAndroid Build Coastguard Worker "src/proto/grpc/gcp/handshaker.upb.h": "alts_upb", 206*cc02d7e2SAndroid Build Coastguard Worker "src/proto/grpc/gcp/altscontext.upb.h": "alts_upb", 207*cc02d7e2SAndroid Build Coastguard Worker "src/proto/grpc/lookup/v1/rls.upb.h": "rls_upb", 208*cc02d7e2SAndroid Build Coastguard Worker "src/proto/grpc/lookup/v1/rls_config.upb.h": "rls_config_upb", 209*cc02d7e2SAndroid Build Coastguard Worker "src/proto/grpc/lookup/v1/rls_config.upbdefs.h": "rls_config_upbdefs", 210*cc02d7e2SAndroid Build Coastguard Worker "src/proto/grpc/testing/xds/v3/csds.grpc.pb.h": ( 211*cc02d7e2SAndroid Build Coastguard Worker "//src/proto/grpc/testing/xds/v3:csds_proto" 212*cc02d7e2SAndroid Build Coastguard Worker ), 213*cc02d7e2SAndroid Build Coastguard Worker "xds/data/orca/v3/orca_load_report.upb.h": "xds_orca_upb", 214*cc02d7e2SAndroid Build Coastguard Worker "xds/service/orca/v3/orca.upb.h": "xds_orca_service_upb", 215*cc02d7e2SAndroid Build Coastguard Worker "xds/type/v3/typed_struct.upb.h": "xds_type_upb", 216*cc02d7e2SAndroid Build Coastguard Worker} 217*cc02d7e2SAndroid Build Coastguard Worker 218*cc02d7e2SAndroid Build Coastguard Worker 219*cc02d7e2SAndroid Build Coastguard Workerclass FakeSelects: 220*cc02d7e2SAndroid Build Coastguard Worker def config_setting_group(self, **kwargs): 221*cc02d7e2SAndroid Build Coastguard Worker pass 222*cc02d7e2SAndroid Build Coastguard Worker 223*cc02d7e2SAndroid Build Coastguard Worker 224*cc02d7e2SAndroid Build Coastguard Workernum_cc_libraries = 0 225*cc02d7e2SAndroid Build Coastguard Workernum_opted_out_cc_libraries = 0 226*cc02d7e2SAndroid Build Coastguard Workerparsing_path = None 227*cc02d7e2SAndroid Build Coastguard Worker 228*cc02d7e2SAndroid Build Coastguard Worker 229*cc02d7e2SAndroid Build Coastguard Worker# Convert the source or header target to a relative path. 230*cc02d7e2SAndroid Build Coastguard Workerdef _get_filename(name, parsing_path): 231*cc02d7e2SAndroid Build Coastguard Worker filename = "%s%s" % ( 232*cc02d7e2SAndroid Build Coastguard Worker ( 233*cc02d7e2SAndroid Build Coastguard Worker parsing_path + "/" 234*cc02d7e2SAndroid Build Coastguard Worker if (parsing_path and not name.startswith("//")) 235*cc02d7e2SAndroid Build Coastguard Worker else "" 236*cc02d7e2SAndroid Build Coastguard Worker ), 237*cc02d7e2SAndroid Build Coastguard Worker name, 238*cc02d7e2SAndroid Build Coastguard Worker ) 239*cc02d7e2SAndroid Build Coastguard Worker filename = filename.replace("//:", "") 240*cc02d7e2SAndroid Build Coastguard Worker filename = filename.replace("//src/core:", "src/core/") 241*cc02d7e2SAndroid Build Coastguard Worker filename = filename.replace( 242*cc02d7e2SAndroid Build Coastguard Worker "//src/cpp/ext/filters/census:", "src/cpp/ext/filters/census/" 243*cc02d7e2SAndroid Build Coastguard Worker ) 244*cc02d7e2SAndroid Build Coastguard Worker return filename 245*cc02d7e2SAndroid Build Coastguard Worker 246*cc02d7e2SAndroid Build Coastguard Worker 247*cc02d7e2SAndroid Build Coastguard Workerdef grpc_cc_library( 248*cc02d7e2SAndroid Build Coastguard Worker name, 249*cc02d7e2SAndroid Build Coastguard Worker hdrs=[], 250*cc02d7e2SAndroid Build Coastguard Worker public_hdrs=[], 251*cc02d7e2SAndroid Build Coastguard Worker srcs=[], 252*cc02d7e2SAndroid Build Coastguard Worker select_deps=None, 253*cc02d7e2SAndroid Build Coastguard Worker tags=[], 254*cc02d7e2SAndroid Build Coastguard Worker deps=[], 255*cc02d7e2SAndroid Build Coastguard Worker external_deps=[], 256*cc02d7e2SAndroid Build Coastguard Worker proto=None, 257*cc02d7e2SAndroid Build Coastguard Worker **kwargs, 258*cc02d7e2SAndroid Build Coastguard Worker): 259*cc02d7e2SAndroid Build Coastguard Worker global args 260*cc02d7e2SAndroid Build Coastguard Worker global num_cc_libraries 261*cc02d7e2SAndroid Build Coastguard Worker global num_opted_out_cc_libraries 262*cc02d7e2SAndroid Build Coastguard Worker global parsing_path 263*cc02d7e2SAndroid Build Coastguard Worker assert parsing_path is not None 264*cc02d7e2SAndroid Build Coastguard Worker name = "//%s:%s" % (parsing_path, name) 265*cc02d7e2SAndroid Build Coastguard Worker num_cc_libraries += 1 266*cc02d7e2SAndroid Build Coastguard Worker if select_deps or "nofixdeps" in tags: 267*cc02d7e2SAndroid Build Coastguard Worker if args.whats_left and not select_deps and "nofixdeps" not in tags: 268*cc02d7e2SAndroid Build Coastguard Worker num_opted_out_cc_libraries += 1 269*cc02d7e2SAndroid Build Coastguard Worker print("Not opted in: {}".format(name)) 270*cc02d7e2SAndroid Build Coastguard Worker no_update.add(name) 271*cc02d7e2SAndroid Build Coastguard Worker scores[name] = len(public_hdrs + hdrs) 272*cc02d7e2SAndroid Build Coastguard Worker # avoid_dep is the internal way of saying prefer something else 273*cc02d7e2SAndroid Build Coastguard Worker # we add grpc_avoid_dep to allow internal grpc-only stuff to avoid each 274*cc02d7e2SAndroid Build Coastguard Worker # other, whilst not biasing dependent projects 275*cc02d7e2SAndroid Build Coastguard Worker if "avoid_dep" in tags or "grpc_avoid_dep" in tags: 276*cc02d7e2SAndroid Build Coastguard Worker avoidness[name] += 10 277*cc02d7e2SAndroid Build Coastguard Worker if proto: 278*cc02d7e2SAndroid Build Coastguard Worker proto_hdr = "%s%s" % ( 279*cc02d7e2SAndroid Build Coastguard Worker (parsing_path + "/" if parsing_path else ""), 280*cc02d7e2SAndroid Build Coastguard Worker proto.replace(".proto", ".pb.h"), 281*cc02d7e2SAndroid Build Coastguard Worker ) 282*cc02d7e2SAndroid Build Coastguard Worker skip_headers[name].add(proto_hdr) 283*cc02d7e2SAndroid Build Coastguard Worker 284*cc02d7e2SAndroid Build Coastguard Worker for hdr in hdrs + public_hdrs: 285*cc02d7e2SAndroid Build Coastguard Worker vendors[_get_filename(hdr, parsing_path)].append(name) 286*cc02d7e2SAndroid Build Coastguard Worker inc = set() 287*cc02d7e2SAndroid Build Coastguard Worker original_deps[name] = frozenset(deps) 288*cc02d7e2SAndroid Build Coastguard Worker original_external_deps[name] = frozenset(external_deps) 289*cc02d7e2SAndroid Build Coastguard Worker for src in hdrs + public_hdrs + srcs: 290*cc02d7e2SAndroid Build Coastguard Worker for line in open(_get_filename(src, parsing_path)): 291*cc02d7e2SAndroid Build Coastguard Worker m = re.search(r"^#include <(.*)>", line) 292*cc02d7e2SAndroid Build Coastguard Worker if m: 293*cc02d7e2SAndroid Build Coastguard Worker inc.add(m.group(1)) 294*cc02d7e2SAndroid Build Coastguard Worker m = re.search(r'^#include "(.*)"', line) 295*cc02d7e2SAndroid Build Coastguard Worker if m: 296*cc02d7e2SAndroid Build Coastguard Worker inc.add(m.group(1)) 297*cc02d7e2SAndroid Build Coastguard Worker consumes[name] = list(inc) 298*cc02d7e2SAndroid Build Coastguard Worker 299*cc02d7e2SAndroid Build Coastguard Worker 300*cc02d7e2SAndroid Build Coastguard Workerdef grpc_proto_library(name, srcs, **kwargs): 301*cc02d7e2SAndroid Build Coastguard Worker global parsing_path 302*cc02d7e2SAndroid Build Coastguard Worker assert parsing_path is not None 303*cc02d7e2SAndroid Build Coastguard Worker name = "//%s:%s" % (parsing_path, name) 304*cc02d7e2SAndroid Build Coastguard Worker for src in srcs: 305*cc02d7e2SAndroid Build Coastguard Worker proto_hdr = src.replace(".proto", ".pb.h") 306*cc02d7e2SAndroid Build Coastguard Worker vendors[_get_filename(proto_hdr, parsing_path)].append(name) 307*cc02d7e2SAndroid Build Coastguard Worker 308*cc02d7e2SAndroid Build Coastguard Worker 309*cc02d7e2SAndroid Build Coastguard Workerdef buildozer(cmd, target): 310*cc02d7e2SAndroid Build Coastguard Worker buildozer_commands.append("%s|%s" % (cmd, target)) 311*cc02d7e2SAndroid Build Coastguard Worker 312*cc02d7e2SAndroid Build Coastguard Worker 313*cc02d7e2SAndroid Build Coastguard Workerdef buildozer_set_list(name, values, target, via=""): 314*cc02d7e2SAndroid Build Coastguard Worker if not values: 315*cc02d7e2SAndroid Build Coastguard Worker buildozer("remove %s" % name, target) 316*cc02d7e2SAndroid Build Coastguard Worker return 317*cc02d7e2SAndroid Build Coastguard Worker adjust = via if via else name 318*cc02d7e2SAndroid Build Coastguard Worker buildozer( 319*cc02d7e2SAndroid Build Coastguard Worker "set %s %s" % (adjust, " ".join('"%s"' % s for s in values)), target 320*cc02d7e2SAndroid Build Coastguard Worker ) 321*cc02d7e2SAndroid Build Coastguard Worker if via: 322*cc02d7e2SAndroid Build Coastguard Worker buildozer("remove %s" % name, target) 323*cc02d7e2SAndroid Build Coastguard Worker buildozer("rename %s %s" % (via, name), target) 324*cc02d7e2SAndroid Build Coastguard Worker 325*cc02d7e2SAndroid Build Coastguard Worker 326*cc02d7e2SAndroid Build Coastguard Workerdef score_edit_distance(proposed, existing): 327*cc02d7e2SAndroid Build Coastguard Worker """Score a proposed change primarily by edit distance""" 328*cc02d7e2SAndroid Build Coastguard Worker sum = 0 329*cc02d7e2SAndroid Build Coastguard Worker for p in proposed: 330*cc02d7e2SAndroid Build Coastguard Worker if p not in existing: 331*cc02d7e2SAndroid Build Coastguard Worker sum += 1 332*cc02d7e2SAndroid Build Coastguard Worker for e in existing: 333*cc02d7e2SAndroid Build Coastguard Worker if e not in proposed: 334*cc02d7e2SAndroid Build Coastguard Worker sum += 1 335*cc02d7e2SAndroid Build Coastguard Worker return sum 336*cc02d7e2SAndroid Build Coastguard Worker 337*cc02d7e2SAndroid Build Coastguard Worker 338*cc02d7e2SAndroid Build Coastguard Workerdef total_score(proposal): 339*cc02d7e2SAndroid Build Coastguard Worker return sum(scores[dep] for dep in proposal) 340*cc02d7e2SAndroid Build Coastguard Worker 341*cc02d7e2SAndroid Build Coastguard Worker 342*cc02d7e2SAndroid Build Coastguard Workerdef total_avoidness(proposal): 343*cc02d7e2SAndroid Build Coastguard Worker return sum(avoidness[dep] for dep in proposal) 344*cc02d7e2SAndroid Build Coastguard Worker 345*cc02d7e2SAndroid Build Coastguard Worker 346*cc02d7e2SAndroid Build Coastguard Workerdef score_list_size(proposed, existing): 347*cc02d7e2SAndroid Build Coastguard Worker """Score a proposed change primarily by number of dependencies""" 348*cc02d7e2SAndroid Build Coastguard Worker return len(proposed) 349*cc02d7e2SAndroid Build Coastguard Worker 350*cc02d7e2SAndroid Build Coastguard Worker 351*cc02d7e2SAndroid Build Coastguard Workerdef score_best(proposed, existing): 352*cc02d7e2SAndroid Build Coastguard Worker """Score a proposed change primarily by dependency score""" 353*cc02d7e2SAndroid Build Coastguard Worker return 0 354*cc02d7e2SAndroid Build Coastguard Worker 355*cc02d7e2SAndroid Build Coastguard Worker 356*cc02d7e2SAndroid Build Coastguard WorkerSCORERS = { 357*cc02d7e2SAndroid Build Coastguard Worker "edit_distance": score_edit_distance, 358*cc02d7e2SAndroid Build Coastguard Worker "list_size": score_list_size, 359*cc02d7e2SAndroid Build Coastguard Worker "best": score_best, 360*cc02d7e2SAndroid Build Coastguard Worker} 361*cc02d7e2SAndroid Build Coastguard Worker 362*cc02d7e2SAndroid Build Coastguard Workerparser = argparse.ArgumentParser(description="Fix build dependencies") 363*cc02d7e2SAndroid Build Coastguard Workerparser.add_argument("targets", nargs="+", help="targets to fix") 364*cc02d7e2SAndroid Build Coastguard Workerparser.add_argument( 365*cc02d7e2SAndroid Build Coastguard Worker "--score", 366*cc02d7e2SAndroid Build Coastguard Worker type=str, 367*cc02d7e2SAndroid Build Coastguard Worker default="edit_distance", 368*cc02d7e2SAndroid Build Coastguard Worker help="scoring function to use: one of " + ", ".join(SCORERS.keys()), 369*cc02d7e2SAndroid Build Coastguard Worker) 370*cc02d7e2SAndroid Build Coastguard Workerparser.add_argument( 371*cc02d7e2SAndroid Build Coastguard Worker "--whats_left", 372*cc02d7e2SAndroid Build Coastguard Worker action="store_true", 373*cc02d7e2SAndroid Build Coastguard Worker default=False, 374*cc02d7e2SAndroid Build Coastguard Worker help="show what is left to opt in", 375*cc02d7e2SAndroid Build Coastguard Worker) 376*cc02d7e2SAndroid Build Coastguard Workerparser.add_argument( 377*cc02d7e2SAndroid Build Coastguard Worker "--explain", 378*cc02d7e2SAndroid Build Coastguard Worker action="store_true", 379*cc02d7e2SAndroid Build Coastguard Worker default=False, 380*cc02d7e2SAndroid Build Coastguard Worker help="try to explain some decisions", 381*cc02d7e2SAndroid Build Coastguard Worker) 382*cc02d7e2SAndroid Build Coastguard Workerparser.add_argument( 383*cc02d7e2SAndroid Build Coastguard Worker "--why", 384*cc02d7e2SAndroid Build Coastguard Worker type=str, 385*cc02d7e2SAndroid Build Coastguard Worker default=None, 386*cc02d7e2SAndroid Build Coastguard Worker help="with --explain, target why a given dependency is needed", 387*cc02d7e2SAndroid Build Coastguard Worker) 388*cc02d7e2SAndroid Build Coastguard Workerargs = parser.parse_args() 389*cc02d7e2SAndroid Build Coastguard Worker 390*cc02d7e2SAndroid Build Coastguard Workerfor dirname in [ 391*cc02d7e2SAndroid Build Coastguard Worker "", 392*cc02d7e2SAndroid Build Coastguard Worker "src/core", 393*cc02d7e2SAndroid Build Coastguard Worker "src/cpp/ext/gcp", 394*cc02d7e2SAndroid Build Coastguard Worker "src/cpp/ext/csm", 395*cc02d7e2SAndroid Build Coastguard Worker "src/cpp/ext/otel", 396*cc02d7e2SAndroid Build Coastguard Worker "test/core/backoff", 397*cc02d7e2SAndroid Build Coastguard Worker "test/core/experiments", 398*cc02d7e2SAndroid Build Coastguard Worker "test/core/uri", 399*cc02d7e2SAndroid Build Coastguard Worker "test/core/util", 400*cc02d7e2SAndroid Build Coastguard Worker "test/core/end2end", 401*cc02d7e2SAndroid Build Coastguard Worker "test/core/event_engine", 402*cc02d7e2SAndroid Build Coastguard Worker "test/core/filters", 403*cc02d7e2SAndroid Build Coastguard Worker "test/core/promise", 404*cc02d7e2SAndroid Build Coastguard Worker "test/core/resource_quota", 405*cc02d7e2SAndroid Build Coastguard Worker "test/core/transport/chaotic_good", 406*cc02d7e2SAndroid Build Coastguard Worker "test/core/transport/test_suite", 407*cc02d7e2SAndroid Build Coastguard Worker "fuzztest", 408*cc02d7e2SAndroid Build Coastguard Worker "fuzztest/core/channel", 409*cc02d7e2SAndroid Build Coastguard Worker "fuzztest/core/transport/chttp2", 410*cc02d7e2SAndroid Build Coastguard Worker]: 411*cc02d7e2SAndroid Build Coastguard Worker parsing_path = dirname 412*cc02d7e2SAndroid Build Coastguard Worker exec( 413*cc02d7e2SAndroid Build Coastguard Worker open("%sBUILD" % (dirname + "/" if dirname else ""), "r").read(), 414*cc02d7e2SAndroid Build Coastguard Worker { 415*cc02d7e2SAndroid Build Coastguard Worker "load": lambda filename, *args: None, 416*cc02d7e2SAndroid Build Coastguard Worker "licenses": lambda licenses: None, 417*cc02d7e2SAndroid Build Coastguard Worker "package": lambda **kwargs: None, 418*cc02d7e2SAndroid Build Coastguard Worker "exports_files": lambda files, visibility=None: None, 419*cc02d7e2SAndroid Build Coastguard Worker "bool_flag": lambda **kwargs: None, 420*cc02d7e2SAndroid Build Coastguard Worker "config_setting": lambda **kwargs: None, 421*cc02d7e2SAndroid Build Coastguard Worker "selects": FakeSelects(), 422*cc02d7e2SAndroid Build Coastguard Worker "python_config_settings": lambda **kwargs: None, 423*cc02d7e2SAndroid Build Coastguard Worker "grpc_cc_binary": grpc_cc_library, 424*cc02d7e2SAndroid Build Coastguard Worker "grpc_cc_library": grpc_cc_library, 425*cc02d7e2SAndroid Build Coastguard Worker "grpc_cc_test": grpc_cc_library, 426*cc02d7e2SAndroid Build Coastguard Worker "grpc_core_end2end_test": lambda **kwargs: None, 427*cc02d7e2SAndroid Build Coastguard Worker "grpc_transport_test": lambda **kwargs: None, 428*cc02d7e2SAndroid Build Coastguard Worker "grpc_fuzzer": grpc_cc_library, 429*cc02d7e2SAndroid Build Coastguard Worker "grpc_fuzz_test": grpc_cc_library, 430*cc02d7e2SAndroid Build Coastguard Worker "grpc_proto_fuzzer": grpc_cc_library, 431*cc02d7e2SAndroid Build Coastguard Worker "grpc_proto_library": grpc_proto_library, 432*cc02d7e2SAndroid Build Coastguard Worker "select": lambda d: d["//conditions:default"], 433*cc02d7e2SAndroid Build Coastguard Worker "glob": lambda files, **kwargs: None, 434*cc02d7e2SAndroid Build Coastguard Worker "grpc_end2end_tests": lambda: None, 435*cc02d7e2SAndroid Build Coastguard Worker "grpc_upb_proto_library": lambda name, **kwargs: None, 436*cc02d7e2SAndroid Build Coastguard Worker "grpc_upb_proto_reflection_library": lambda name, **kwargs: None, 437*cc02d7e2SAndroid Build Coastguard Worker "grpc_generate_one_off_targets": lambda: None, 438*cc02d7e2SAndroid Build Coastguard Worker "grpc_generate_one_off_internal_targets": lambda: None, 439*cc02d7e2SAndroid Build Coastguard Worker "grpc_package": lambda **kwargs: None, 440*cc02d7e2SAndroid Build Coastguard Worker "filegroup": lambda name, **kwargs: None, 441*cc02d7e2SAndroid Build Coastguard Worker "sh_library": lambda name, **kwargs: None, 442*cc02d7e2SAndroid Build Coastguard Worker "platform": lambda name, **kwargs: None, 443*cc02d7e2SAndroid Build Coastguard Worker }, 444*cc02d7e2SAndroid Build Coastguard Worker {}, 445*cc02d7e2SAndroid Build Coastguard Worker ) 446*cc02d7e2SAndroid Build Coastguard Worker parsing_path = None 447*cc02d7e2SAndroid Build Coastguard Worker 448*cc02d7e2SAndroid Build Coastguard Workerif args.whats_left: 449*cc02d7e2SAndroid Build Coastguard Worker print( 450*cc02d7e2SAndroid Build Coastguard Worker "{}/{} libraries are opted in".format( 451*cc02d7e2SAndroid Build Coastguard Worker num_cc_libraries - num_opted_out_cc_libraries, num_cc_libraries 452*cc02d7e2SAndroid Build Coastguard Worker ) 453*cc02d7e2SAndroid Build Coastguard Worker ) 454*cc02d7e2SAndroid Build Coastguard Worker 455*cc02d7e2SAndroid Build Coastguard Worker 456*cc02d7e2SAndroid Build Coastguard Workerdef make_relative_path(dep, lib): 457*cc02d7e2SAndroid Build Coastguard Worker if lib is None: 458*cc02d7e2SAndroid Build Coastguard Worker return dep 459*cc02d7e2SAndroid Build Coastguard Worker lib_path = lib[: lib.rfind(":") + 1] 460*cc02d7e2SAndroid Build Coastguard Worker if dep.startswith(lib_path): 461*cc02d7e2SAndroid Build Coastguard Worker return dep[len(lib_path) :] 462*cc02d7e2SAndroid Build Coastguard Worker return dep 463*cc02d7e2SAndroid Build Coastguard Worker 464*cc02d7e2SAndroid Build Coastguard Worker 465*cc02d7e2SAndroid Build Coastguard Workerif args.whats_left: 466*cc02d7e2SAndroid Build Coastguard Worker print( 467*cc02d7e2SAndroid Build Coastguard Worker "{}/{} libraries are opted in".format( 468*cc02d7e2SAndroid Build Coastguard Worker num_cc_libraries - num_opted_out_cc_libraries, num_cc_libraries 469*cc02d7e2SAndroid Build Coastguard Worker ) 470*cc02d7e2SAndroid Build Coastguard Worker ) 471*cc02d7e2SAndroid Build Coastguard Worker 472*cc02d7e2SAndroid Build Coastguard Worker 473*cc02d7e2SAndroid Build Coastguard Worker# Keeps track of all possible sets of dependencies that could satify the 474*cc02d7e2SAndroid Build Coastguard Worker# problem. (models the list monad in Haskell!) 475*cc02d7e2SAndroid Build Coastguard Workerclass Choices: 476*cc02d7e2SAndroid Build Coastguard Worker def __init__(self, library, substitutions): 477*cc02d7e2SAndroid Build Coastguard Worker self.library = library 478*cc02d7e2SAndroid Build Coastguard Worker self.to_add = [] 479*cc02d7e2SAndroid Build Coastguard Worker self.to_remove = [] 480*cc02d7e2SAndroid Build Coastguard Worker self.substitutions = substitutions 481*cc02d7e2SAndroid Build Coastguard Worker 482*cc02d7e2SAndroid Build Coastguard Worker def add_one_of(self, choices, trigger): 483*cc02d7e2SAndroid Build Coastguard Worker if not choices: 484*cc02d7e2SAndroid Build Coastguard Worker return 485*cc02d7e2SAndroid Build Coastguard Worker choices = sum( 486*cc02d7e2SAndroid Build Coastguard Worker [self.apply_substitutions(choice) for choice in choices], [] 487*cc02d7e2SAndroid Build Coastguard Worker ) 488*cc02d7e2SAndroid Build Coastguard Worker if args.explain and (args.why is None or args.why in choices): 489*cc02d7e2SAndroid Build Coastguard Worker print( 490*cc02d7e2SAndroid Build Coastguard Worker "{}: Adding one of {} for {}".format( 491*cc02d7e2SAndroid Build Coastguard Worker self.library, choices, trigger 492*cc02d7e2SAndroid Build Coastguard Worker ) 493*cc02d7e2SAndroid Build Coastguard Worker ) 494*cc02d7e2SAndroid Build Coastguard Worker self.to_add.append( 495*cc02d7e2SAndroid Build Coastguard Worker tuple( 496*cc02d7e2SAndroid Build Coastguard Worker make_relative_path(choice, self.library) for choice in choices 497*cc02d7e2SAndroid Build Coastguard Worker ) 498*cc02d7e2SAndroid Build Coastguard Worker ) 499*cc02d7e2SAndroid Build Coastguard Worker 500*cc02d7e2SAndroid Build Coastguard Worker def add(self, choice, trigger): 501*cc02d7e2SAndroid Build Coastguard Worker self.add_one_of([choice], trigger) 502*cc02d7e2SAndroid Build Coastguard Worker 503*cc02d7e2SAndroid Build Coastguard Worker def remove(self, remove): 504*cc02d7e2SAndroid Build Coastguard Worker for remove in self.apply_substitutions(remove): 505*cc02d7e2SAndroid Build Coastguard Worker self.to_remove.append(make_relative_path(remove, self.library)) 506*cc02d7e2SAndroid Build Coastguard Worker 507*cc02d7e2SAndroid Build Coastguard Worker def apply_substitutions(self, dep): 508*cc02d7e2SAndroid Build Coastguard Worker if dep in self.substitutions: 509*cc02d7e2SAndroid Build Coastguard Worker return self.substitutions[dep] 510*cc02d7e2SAndroid Build Coastguard Worker return [dep] 511*cc02d7e2SAndroid Build Coastguard Worker 512*cc02d7e2SAndroid Build Coastguard Worker def best(self, scorer): 513*cc02d7e2SAndroid Build Coastguard Worker choices = set() 514*cc02d7e2SAndroid Build Coastguard Worker choices.add(frozenset()) 515*cc02d7e2SAndroid Build Coastguard Worker 516*cc02d7e2SAndroid Build Coastguard Worker for add in sorted(set(self.to_add), key=lambda x: (len(x), x)): 517*cc02d7e2SAndroid Build Coastguard Worker new_choices = set() 518*cc02d7e2SAndroid Build Coastguard Worker for append_choice in add: 519*cc02d7e2SAndroid Build Coastguard Worker for choice in choices: 520*cc02d7e2SAndroid Build Coastguard Worker new_choices.add(choice.union([append_choice])) 521*cc02d7e2SAndroid Build Coastguard Worker choices = new_choices 522*cc02d7e2SAndroid Build Coastguard Worker for remove in sorted(set(self.to_remove)): 523*cc02d7e2SAndroid Build Coastguard Worker new_choices = set() 524*cc02d7e2SAndroid Build Coastguard Worker for choice in choices: 525*cc02d7e2SAndroid Build Coastguard Worker new_choices.add(choice.difference([remove])) 526*cc02d7e2SAndroid Build Coastguard Worker choices = new_choices 527*cc02d7e2SAndroid Build Coastguard Worker 528*cc02d7e2SAndroid Build Coastguard Worker best = None 529*cc02d7e2SAndroid Build Coastguard Worker 530*cc02d7e2SAndroid Build Coastguard Worker def final_scorer(x): 531*cc02d7e2SAndroid Build Coastguard Worker return (total_avoidness(x), scorer(x), total_score(x)) 532*cc02d7e2SAndroid Build Coastguard Worker 533*cc02d7e2SAndroid Build Coastguard Worker for choice in choices: 534*cc02d7e2SAndroid Build Coastguard Worker if best is None or final_scorer(choice) < final_scorer(best): 535*cc02d7e2SAndroid Build Coastguard Worker best = choice 536*cc02d7e2SAndroid Build Coastguard Worker return best 537*cc02d7e2SAndroid Build Coastguard Worker 538*cc02d7e2SAndroid Build Coastguard Worker 539*cc02d7e2SAndroid Build Coastguard Workerdef make_library(library): 540*cc02d7e2SAndroid Build Coastguard Worker error = False 541*cc02d7e2SAndroid Build Coastguard Worker hdrs = sorted(consumes[library]) 542*cc02d7e2SAndroid Build Coastguard Worker # we need a little trickery here since grpc_base has channel.cc, which calls grpc_init 543*cc02d7e2SAndroid Build Coastguard Worker # which is in grpc, which is illegal but hard to change 544*cc02d7e2SAndroid Build Coastguard Worker # once EventEngine lands we can clean this up 545*cc02d7e2SAndroid Build Coastguard Worker deps = Choices( 546*cc02d7e2SAndroid Build Coastguard Worker library, 547*cc02d7e2SAndroid Build Coastguard Worker {"//:grpc_base": ["//:grpc", "//:grpc_unsecure"]} 548*cc02d7e2SAndroid Build Coastguard Worker if library.startswith("//test/") 549*cc02d7e2SAndroid Build Coastguard Worker else {}, 550*cc02d7e2SAndroid Build Coastguard Worker ) 551*cc02d7e2SAndroid Build Coastguard Worker external_deps = Choices(None, {}) 552*cc02d7e2SAndroid Build Coastguard Worker for hdr in hdrs: 553*cc02d7e2SAndroid Build Coastguard Worker if hdr in skip_headers[library]: 554*cc02d7e2SAndroid Build Coastguard Worker continue 555*cc02d7e2SAndroid Build Coastguard Worker 556*cc02d7e2SAndroid Build Coastguard Worker if hdr == "systemd/sd-daemon.h": 557*cc02d7e2SAndroid Build Coastguard Worker continue 558*cc02d7e2SAndroid Build Coastguard Worker 559*cc02d7e2SAndroid Build Coastguard Worker if hdr == "src/core/lib/profiling/stap_probes.h": 560*cc02d7e2SAndroid Build Coastguard Worker continue 561*cc02d7e2SAndroid Build Coastguard Worker 562*cc02d7e2SAndroid Build Coastguard Worker if hdr.startswith("src/libfuzzer/"): 563*cc02d7e2SAndroid Build Coastguard Worker continue 564*cc02d7e2SAndroid Build Coastguard Worker 565*cc02d7e2SAndroid Build Coastguard Worker if hdr == "grpc/grpc.h" and library.startswith("//test:"): 566*cc02d7e2SAndroid Build Coastguard Worker # not the root build including grpc.h ==> //:grpc 567*cc02d7e2SAndroid Build Coastguard Worker deps.add_one_of(["//:grpc", "//:grpc_unsecure"], hdr) 568*cc02d7e2SAndroid Build Coastguard Worker continue 569*cc02d7e2SAndroid Build Coastguard Worker 570*cc02d7e2SAndroid Build Coastguard Worker if hdr in INTERNAL_DEPS: 571*cc02d7e2SAndroid Build Coastguard Worker dep = INTERNAL_DEPS[hdr] 572*cc02d7e2SAndroid Build Coastguard Worker if isinstance(dep, list): 573*cc02d7e2SAndroid Build Coastguard Worker for d in dep: 574*cc02d7e2SAndroid Build Coastguard Worker deps.add(d, hdr) 575*cc02d7e2SAndroid Build Coastguard Worker else: 576*cc02d7e2SAndroid Build Coastguard Worker if not ("//" in dep): 577*cc02d7e2SAndroid Build Coastguard Worker dep = "//:" + dep 578*cc02d7e2SAndroid Build Coastguard Worker deps.add(dep, hdr) 579*cc02d7e2SAndroid Build Coastguard Worker continue 580*cc02d7e2SAndroid Build Coastguard Worker 581*cc02d7e2SAndroid Build Coastguard Worker if hdr in vendors: 582*cc02d7e2SAndroid Build Coastguard Worker deps.add_one_of(vendors[hdr], hdr) 583*cc02d7e2SAndroid Build Coastguard Worker continue 584*cc02d7e2SAndroid Build Coastguard Worker 585*cc02d7e2SAndroid Build Coastguard Worker if "include/" + hdr in vendors: 586*cc02d7e2SAndroid Build Coastguard Worker deps.add_one_of(vendors["include/" + hdr], hdr) 587*cc02d7e2SAndroid Build Coastguard Worker continue 588*cc02d7e2SAndroid Build Coastguard Worker 589*cc02d7e2SAndroid Build Coastguard Worker if "." not in hdr: 590*cc02d7e2SAndroid Build Coastguard Worker # assume a c++ system include 591*cc02d7e2SAndroid Build Coastguard Worker continue 592*cc02d7e2SAndroid Build Coastguard Worker 593*cc02d7e2SAndroid Build Coastguard Worker if hdr in EXTERNAL_DEPS: 594*cc02d7e2SAndroid Build Coastguard Worker if isinstance(EXTERNAL_DEPS[hdr], list): 595*cc02d7e2SAndroid Build Coastguard Worker for dep in EXTERNAL_DEPS[hdr]: 596*cc02d7e2SAndroid Build Coastguard Worker external_deps.add(dep, hdr) 597*cc02d7e2SAndroid Build Coastguard Worker else: 598*cc02d7e2SAndroid Build Coastguard Worker external_deps.add(EXTERNAL_DEPS[hdr], hdr) 599*cc02d7e2SAndroid Build Coastguard Worker continue 600*cc02d7e2SAndroid Build Coastguard Worker 601*cc02d7e2SAndroid Build Coastguard Worker if hdr.startswith("opencensus/"): 602*cc02d7e2SAndroid Build Coastguard Worker trail = hdr[len("opencensus/") :] 603*cc02d7e2SAndroid Build Coastguard Worker trail = trail[: trail.find("/")] 604*cc02d7e2SAndroid Build Coastguard Worker external_deps.add("opencensus-" + trail, hdr) 605*cc02d7e2SAndroid Build Coastguard Worker continue 606*cc02d7e2SAndroid Build Coastguard Worker 607*cc02d7e2SAndroid Build Coastguard Worker if hdr.startswith("envoy/"): 608*cc02d7e2SAndroid Build Coastguard Worker path, file = os.path.split(hdr) 609*cc02d7e2SAndroid Build Coastguard Worker file = file.split(".") 610*cc02d7e2SAndroid Build Coastguard Worker path = path.split("/") 611*cc02d7e2SAndroid Build Coastguard Worker dep = "_".join(path[:-1] + [file[1]]) 612*cc02d7e2SAndroid Build Coastguard Worker deps.add(dep, hdr) 613*cc02d7e2SAndroid Build Coastguard Worker continue 614*cc02d7e2SAndroid Build Coastguard Worker 615*cc02d7e2SAndroid Build Coastguard Worker if hdr.startswith("google/protobuf/") and not hdr.endswith(".upb.h"): 616*cc02d7e2SAndroid Build Coastguard Worker external_deps.add("protobuf_headers", hdr) 617*cc02d7e2SAndroid Build Coastguard Worker continue 618*cc02d7e2SAndroid Build Coastguard Worker 619*cc02d7e2SAndroid Build Coastguard Worker if "/" not in hdr: 620*cc02d7e2SAndroid Build Coastguard Worker # assume a system include 621*cc02d7e2SAndroid Build Coastguard Worker continue 622*cc02d7e2SAndroid Build Coastguard Worker 623*cc02d7e2SAndroid Build Coastguard Worker is_sys_include = False 624*cc02d7e2SAndroid Build Coastguard Worker for sys_path in [ 625*cc02d7e2SAndroid Build Coastguard Worker "sys", 626*cc02d7e2SAndroid Build Coastguard Worker "arpa", 627*cc02d7e2SAndroid Build Coastguard Worker "gperftools", 628*cc02d7e2SAndroid Build Coastguard Worker "netinet", 629*cc02d7e2SAndroid Build Coastguard Worker "linux", 630*cc02d7e2SAndroid Build Coastguard Worker "android", 631*cc02d7e2SAndroid Build Coastguard Worker "mach", 632*cc02d7e2SAndroid Build Coastguard Worker "net", 633*cc02d7e2SAndroid Build Coastguard Worker "CoreFoundation", 634*cc02d7e2SAndroid Build Coastguard Worker ]: 635*cc02d7e2SAndroid Build Coastguard Worker if hdr.startswith(sys_path + "/"): 636*cc02d7e2SAndroid Build Coastguard Worker is_sys_include = True 637*cc02d7e2SAndroid Build Coastguard Worker break 638*cc02d7e2SAndroid Build Coastguard Worker if is_sys_include: 639*cc02d7e2SAndroid Build Coastguard Worker # assume a system include 640*cc02d7e2SAndroid Build Coastguard Worker continue 641*cc02d7e2SAndroid Build Coastguard Worker 642*cc02d7e2SAndroid Build Coastguard Worker print( 643*cc02d7e2SAndroid Build Coastguard Worker "# ERROR: can't categorize header: %s used by %s" % (hdr, library) 644*cc02d7e2SAndroid Build Coastguard Worker ) 645*cc02d7e2SAndroid Build Coastguard Worker error = True 646*cc02d7e2SAndroid Build Coastguard Worker 647*cc02d7e2SAndroid Build Coastguard Worker deps.remove(library) 648*cc02d7e2SAndroid Build Coastguard Worker 649*cc02d7e2SAndroid Build Coastguard Worker deps = sorted( 650*cc02d7e2SAndroid Build Coastguard Worker deps.best(lambda x: SCORERS[args.score](x, original_deps[library])) 651*cc02d7e2SAndroid Build Coastguard Worker ) 652*cc02d7e2SAndroid Build Coastguard Worker external_deps = sorted( 653*cc02d7e2SAndroid Build Coastguard Worker external_deps.best( 654*cc02d7e2SAndroid Build Coastguard Worker lambda x: SCORERS[args.score](x, original_external_deps[library]) 655*cc02d7e2SAndroid Build Coastguard Worker ) 656*cc02d7e2SAndroid Build Coastguard Worker ) 657*cc02d7e2SAndroid Build Coastguard Worker 658*cc02d7e2SAndroid Build Coastguard Worker return (library, error, deps, external_deps) 659*cc02d7e2SAndroid Build Coastguard Worker 660*cc02d7e2SAndroid Build Coastguard Worker 661*cc02d7e2SAndroid Build Coastguard Workerdef matches_target(library, target): 662*cc02d7e2SAndroid Build Coastguard Worker if not target.startswith("//"): 663*cc02d7e2SAndroid Build Coastguard Worker if "/" in target: 664*cc02d7e2SAndroid Build Coastguard Worker target = "//" + target 665*cc02d7e2SAndroid Build Coastguard Worker else: 666*cc02d7e2SAndroid Build Coastguard Worker target = "//:" + target 667*cc02d7e2SAndroid Build Coastguard Worker if target == "..." or target == "//...": 668*cc02d7e2SAndroid Build Coastguard Worker return True 669*cc02d7e2SAndroid Build Coastguard Worker if target.endswith("/..."): 670*cc02d7e2SAndroid Build Coastguard Worker return library.startswith(target[:-4]) 671*cc02d7e2SAndroid Build Coastguard Worker return library == target 672*cc02d7e2SAndroid Build Coastguard Worker 673*cc02d7e2SAndroid Build Coastguard Worker 674*cc02d7e2SAndroid Build Coastguard Workerdef main() -> None: 675*cc02d7e2SAndroid Build Coastguard Worker update_libraries = [] 676*cc02d7e2SAndroid Build Coastguard Worker for library in sorted(consumes.keys()): 677*cc02d7e2SAndroid Build Coastguard Worker if library in no_update: 678*cc02d7e2SAndroid Build Coastguard Worker continue 679*cc02d7e2SAndroid Build Coastguard Worker for target in args.targets: 680*cc02d7e2SAndroid Build Coastguard Worker if matches_target(library, target): 681*cc02d7e2SAndroid Build Coastguard Worker update_libraries.append(library) 682*cc02d7e2SAndroid Build Coastguard Worker break 683*cc02d7e2SAndroid Build Coastguard Worker with multiprocessing.Pool(processes=multiprocessing.cpu_count()) as p: 684*cc02d7e2SAndroid Build Coastguard Worker updated_libraries = p.map(make_library, update_libraries, 1) 685*cc02d7e2SAndroid Build Coastguard Worker 686*cc02d7e2SAndroid Build Coastguard Worker error = False 687*cc02d7e2SAndroid Build Coastguard Worker for library, lib_error, deps, external_deps in updated_libraries: 688*cc02d7e2SAndroid Build Coastguard Worker if lib_error: 689*cc02d7e2SAndroid Build Coastguard Worker error = True 690*cc02d7e2SAndroid Build Coastguard Worker continue 691*cc02d7e2SAndroid Build Coastguard Worker buildozer_set_list("external_deps", external_deps, library, via="deps") 692*cc02d7e2SAndroid Build Coastguard Worker buildozer_set_list("deps", deps, library) 693*cc02d7e2SAndroid Build Coastguard Worker 694*cc02d7e2SAndroid Build Coastguard Worker run_buildozer.run_buildozer(buildozer_commands) 695*cc02d7e2SAndroid Build Coastguard Worker 696*cc02d7e2SAndroid Build Coastguard Worker if error: 697*cc02d7e2SAndroid Build Coastguard Worker sys.exit(1) 698*cc02d7e2SAndroid Build Coastguard Worker 699*cc02d7e2SAndroid Build Coastguard Worker 700*cc02d7e2SAndroid Build Coastguard Workerif __name__ == "__main__": 701*cc02d7e2SAndroid Build Coastguard Worker main() 702