diff options
author | 2017-12-11 16:19:27 -0800 | |
---|---|---|
committer | 2017-12-11 16:19:27 -0800 | |
commit | 8face3d49bf0985fd4a3c259f72b26fa9c60e045 (patch) | |
tree | dcb2648d28d1d6eed3aba5c1b1e58348cea512a1 | |
parent | b2cf1bcba2913ff08ce7848f61e9b2bfa337d806 (diff) | |
parent | 38466bc00ebbe1c7ed3bfb119fd53e476f904440 (diff) |
Merge pull request #13700 from jtattermusch/faster_header_check
Speed up sanity's check_sources_and_headers.py
-rwxr-xr-x | tools/run_tests/sanity/check_sources_and_headers.py | 42 |
1 files changed, 36 insertions, 6 deletions
diff --git a/tools/run_tests/sanity/check_sources_and_headers.py b/tools/run_tests/sanity/check_sources_and_headers.py index cae175cfc3..986b626b49 100755 --- a/tools/run_tests/sanity/check_sources_and_headers.py +++ b/tools/run_tests/sanity/check_sources_and_headers.py @@ -29,28 +29,58 @@ assert re_inc1.match('#include "foo"').group(1) == 'foo' re_inc2 = re.compile(r'^#\s*include\s*<((grpc|grpc\+\+)/[^"]*)>') assert re_inc2.match('#include <grpc++/foo>').group(1) == 'grpc++/foo' + def get_target(name): for target in js: if target['name'] == name: return target assert False, 'no target %s' % name + +def get_headers_transitive(): + """Computes set of headers transitively provided by each target""" + target_headers_transitive = {} + for target in js: + target_name = target['name'] + assert not target_headers_transitive.has_key(target_name) + target_headers_transitive[target_name] = set(target['headers']) + + # Make sure each target's transitive headers contain those + # of their dependencies. If not, add them and continue doing + # so until we get a full pass over all targets without any updates. + closure_changed = True + while closure_changed: + closure_changed = False + for target in js: + target_name = target['name'] + for dep in target['deps']: + headers = target_headers_transitive[target_name] + old_count = len(headers) + headers.update(target_headers_transitive[dep]) + if old_count != len(headers): + closure_changed=True + return target_headers_transitive + + +# precompute transitive closure of headers provided by each target +target_headers_transitive = get_headers_transitive() + + def target_has_header(target, name): - if name.startswith('absl/'): return True - # print target['name'], name - if name in target['headers']: + if name in target_headers_transitive[target['name']]: + return True + if name.startswith('absl/'): return True - for dep in target['deps']: - if target_has_header(get_target(dep), name): - return True if name in ['src/core/lib/profiling/stap_probes.h', 'src/proto/grpc/reflection/v1alpha/reflection.grpc.pb.h']: return True return False + def produces_object(name): return os.path.splitext(name)[1] in ['.c', '.cc'] + c_ish = {} obj_producer_to_source = {'c': c_ish, 'c++': c_ish, 'csharp': {}} |