xref: /aosp_15_r20/external/grpc-grpc/tools/distrib/fix_build_deps.py (revision cc02d7e222339f7a4f6ba5f422e6413f4bd931f2)
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