19 from doctest
import SKIP
27 ROOT = os.path.abspath(os.path.join(os.path.dirname(sys.argv[0]),
'../..'))
30 vendors = collections.defaultdict(list)
31 scores = collections.defaultdict(int)
32 avoidness = collections.defaultdict(int)
35 buildozer_commands = []
36 needs_codegen_base_src =
set()
38 original_external_deps = {}
43 'absl/base/attributes.h':
44 'absl/base:core_headers',
45 'absl/base/call_once.h':
48 'absl/base/internal/endian.h':
50 'absl/base/thread_annotations.h':
51 'absl/base:core_headers',
52 'absl/container/flat_hash_map.h':
53 'absl/container:flat_hash_map',
54 'absl/container/flat_hash_set.h':
55 'absl/container:flat_hash_set',
56 'absl/container/inlined_vector.h':
57 'absl/container:inlined_vector',
58 'absl/cleanup/cleanup.h':
60 'absl/functional/bind_front.h':
61 'absl/functional:bind_front',
62 'absl/functional/function_ref.h':
63 'absl/functional:function_ref',
66 'absl/memory/memory.h':
68 'absl/meta/type_traits.h':
69 'absl/meta:type_traits',
70 'absl/random/random.h':
72 'absl/status/status.h':
74 'absl/status/statusor.h':
75 'absl/status:statusor',
76 'absl/strings/ascii.h':
78 'absl/strings/cord.h':
80 'absl/strings/escaping.h':
82 'absl/strings/match.h':
84 'absl/strings/numbers.h':
86 'absl/strings/str_cat.h':
88 'absl/strings/str_format.h':
89 'absl/strings:str_format',
90 'absl/strings/str_join.h':
92 'absl/strings/str_replace.h':
94 'absl/strings/str_split.h':
96 'absl/strings/string_view.h':
98 'absl/strings/strip.h':
100 'absl/strings/substitute.h':
102 'absl/synchronization/mutex.h':
103 'absl/synchronization',
104 'absl/synchronization/notification.h':
105 'absl/synchronization',
110 'absl/types/optional.h':
111 'absl/types:optional',
114 'absl/types/variant.h':
115 'absl/types:variant',
116 'absl/utility/utility.h':
118 'address_sorting/address_sorting.h':
126 'opencensus/trace/context_util.h':
127 'opencensus-trace-context_util',
128 'opencensus/trace/propagation/grpc_trace_bin.h':
129 'opencensus-trace-propagation',
130 'opencensus/tags/context_util.h':
131 'opencensus-tags-context_util',
173 'upb_textformat_lib',
187 'google/api/expr/v1alpha1/syntax.upb.h':
188 'google_type_expr_upb',
189 'google/rpc/status.upb.h':
190 'google_rpc_status_upb',
191 'google/protobuf/any.upb.h':
193 'google/protobuf/duration.upb.h':
194 'protobuf_duration_upb',
195 'google/protobuf/struct.upb.h':
196 'protobuf_struct_upb',
197 'google/protobuf/timestamp.upb.h':
198 'protobuf_timestamp_upb',
199 'google/protobuf/wrappers.upb.h':
200 'protobuf_wrappers_upb',
203 'src/proto/grpc/channelz/channelz.grpc.pb.h':
204 '//src/proto/grpc/channelz:channelz_proto',
205 'src/proto/grpc/core/stats.pb.h':
206 '//src/proto/grpc/core:stats_proto',
207 'src/proto/grpc/health/v1/health.upb.h':
209 'src/proto/grpc/lb/v1/load_reporter.grpc.pb.h':
210 '//src/proto/grpc/lb/v1:load_reporter_proto',
211 'src/proto/grpc/lb/v1/load_balancer.upb.h':
213 'src/proto/grpc/reflection/v1alpha/reflection.grpc.pb.h':
214 '//src/proto/grpc/reflection/v1alpha:reflection_proto',
215 'src/proto/grpc/gcp/transport_security_common.upb.h':
217 'src/proto/grpc/gcp/altscontext.upb.h':
219 'src/proto/grpc/lookup/v1/rls.upb.h':
221 'src/proto/grpc/lookup/v1/rls_config.upb.h':
223 'src/proto/grpc/lookup/v1/rls_config.upbdefs.h':
224 'rls_config_upbdefs',
225 'src/proto/grpc/testing/xds/v3/csds.grpc.pb.h':
226 '//src/proto/grpc/testing/xds/v3:csds_proto',
227 'xds/data/orca/v3/orca_load_report.upb.h':
229 'xds/service/orca/v3/orca.upb.h':
230 'xds_orca_service_upb',
231 'xds/type/v3/typed_struct.upb.h':
251 if select_deps
or 'nofixdeps' in tags
or 'grpc-autodeps' not in tags:
253 scores[name] =
len(public_hdrs + hdrs)
257 if 'avoid_dep' in tags
or 'grpc_avoid_dep' in tags:
258 avoidness[name] += 10
259 if 'nofixdeps' in tags:
261 for hdr
in hdrs + public_hdrs:
262 vendors[hdr].append(name)
264 original_deps[name] = frozenset(deps)
265 original_external_deps[name] = frozenset(external_deps)
266 for src
in hdrs + public_hdrs + srcs:
267 for line
in open(src):
268 m = re.search(
r'#include <(.*)>', line)
271 m = re.search(
r'#include "(.*)"', line)
274 if 'grpc::g_glip' in line
or 'grpc:g_core_codegen_interface' in line:
275 needs_codegen_base_src.add(name)
276 consumes[name] = list(inc)
280 buildozer_commands.append(
'%s|%s' % (cmd, target))
287 adjust = via
if via
else name
288 buildozer(
'set %s %s' % (adjust,
' '.join(
'"%s"' % s
for s
in values)),
292 buildozer(
'rename %s %s' % (via, name), target)
296 """Score a proposed change primarily by edit distance"""
299 if p
not in existing:
302 if e
not in proposed:
308 return sum(scores[dep]
for dep
in proposal)
312 return sum(avoidness[dep]
for dep
in proposal)
316 """Score a proposed change primarily by number of dependencies"""
321 """Score a proposed change primarily by dependency score"""
326 'edit_distance': score_edit_distance,
327 'list_size': score_list_size,
331 parser = argparse.ArgumentParser(description=
'Fix build dependencies')
332 parser.add_argument(
'targets',
335 help=
'targets to fix (empty => all)')
336 parser.add_argument(
'--score',
338 default=
'edit_distance',
339 help=
'scoring function to use: one of ' +
340 ', '.join(SCORERS.keys()))
341 args = parser.parse_args()
345 'load':
lambda filename, *args:
None,
346 'licenses':
lambda licenses:
None,
347 'package':
lambda **kwargs:
None,
348 'exports_files':
lambda files:
None,
349 'config_setting':
lambda **kwargs:
None,
351 'python_config_settings':
lambda **kwargs:
None,
352 'grpc_cc_library': grpc_cc_library,
353 'select':
lambda d: d[
"//conditions:default"],
354 'grpc_upb_proto_library':
lambda name, **kwargs:
None,
355 'grpc_upb_proto_reflection_library':
lambda name, **kwargs:
None,
356 'grpc_generate_one_off_targets':
lambda:
None,
357 'filegroup':
lambda name, **kwargs:
None,
373 for append_choice
in choices:
375 new_choices.add(choice.union([append_choice]))
384 new_choices.add(choice.difference([remove]))
391 if best
is None or final_scorer(choice) < final_scorer(best):
397 for library
in sorted(consumes.keys()):
398 if library
in no_update:
400 if args.targets
and library
not in args.targets:
402 hdrs = sorted(consumes[library])
406 if hdr ==
'src/core/lib/profiling/stap_probes.h':
409 if hdr
in INTERNAL_DEPS:
410 deps.add(INTERNAL_DEPS[hdr])
414 deps.add_one_of(vendors[hdr])
417 if 'include/' + hdr
in vendors:
418 deps.add_one_of(vendors[
'include/' + hdr])
425 if hdr
in EXTERNAL_DEPS:
426 external_deps.add(EXTERNAL_DEPS[hdr])
429 if hdr.startswith(
'opencensus/'):
430 trail = hdr[
len(
'opencensus/'):]
431 trail = trail[:trail.find(
'/')]
432 external_deps.add(
'opencensus-' + trail)
435 if hdr.startswith(
'envoy/'):
436 path, file = os.path.split(hdr)
437 file = file.split(
'.')
438 path = path.split(
'/')
439 dep =
'_'.join(path[:-1] + [file[1]])
443 if hdr.startswith(
'google/protobuf/')
and not hdr.endswith(
'.upb.h'):
444 external_deps.add(
'protobuf_headers')
451 is_sys_include =
False
462 if hdr.startswith(sys_path +
'/'):
463 is_sys_include =
True
469 print(
"# ERROR: can't categorize header: %s" % hdr)
472 if library
in needs_codegen_base_src:
473 deps.add(
'grpc++_codegen_base_src')
478 deps.best(
lambda x: SCORERS[args.score](x, original_deps[library])))
479 external_deps = sorted(
480 external_deps.best(
lambda x: SCORERS[args.score]
481 (x, original_external_deps[library])))
482 target =
':' + library
486 if buildozer_commands:
488 temp = tempfile.NamedTemporaryFile()
489 open(temp.name,
'w').
write(
'\n'.join(buildozer_commands))
490 c = [
'tools/distrib/buildozer.sh',
'-f', temp.name]
491 r = subprocess.call(c)
492 if r
not in ok_statuses:
493 print(
'{} failed with status {}'.
format(c, r))