|  | @@ -39,6 +39,35 @@ def get_target(name):
 | 
	
		
			
				|  |  |      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
 |