| #!/usr/bin/env python3.8 |
| # |
| # Copyright 2016 The Fuchsia Authors. All rights reserved. |
| # Use of this source code is governed by a BSD-style license that can be |
| # found in the LICENSE file. |
| """Make a mapping of dependencies for fidl files. |
| |
| The map contains one line per mapping, each of which is from a fidl file location |
| to a sequence of GN build targets. If the mapping is public (ie directly from the |
| source or through a public_deps dependency) then it is prepended with "pub ". |
| |
| The sequence of targets has length greater than 1 if the file can be referenced |
| from this module through a sequence of dependencies. |
| |
| An example entry is: |
| |
| pub //garnet/public/lib/ui/views/fidl/views.fidl: //garnet/public/lib/media/fidl:services //garnet/public/lib/ui/base_view/cpp:cpp |
| """ |
| |
| import ast |
| import optparse |
| import os |
| import sys |
| import zipfile |
| |
| |
| # for some reason, gn seems to tack on an extra element in the directory |
| def fix_label(label): |
| split_tag = label.split(':') |
| split_label = split_tag[0].split('/') |
| split_label.pop() |
| split_tag[0] = '/'.join(split_label) |
| return ':'.join(split_tag) |
| |
| |
| def rel_label(label, relpath): |
| split_label = label.split(':')[0].split('/') |
| for el in relpath.split('/'): |
| if el == '..': |
| split_label.pop() |
| else: |
| split_label.append(el) |
| return '/'.join(split_label) |
| |
| |
| def handle_map_deps(o, depsmap, covered, target, is_public): |
| #o.write('#pass-through from %s (public %s)\n' % (depsmap, is_public)) |
| for dep in file(depsmap): |
| parts = dep.split() |
| if parts[0] != 'pub': |
| continue |
| fileref = parts[1].rstrip(':') |
| if fileref in covered: |
| continue |
| pubstr = 'pub ' if is_public else '' |
| o.write( |
| '%s%s: %s %s\n' % (pubstr, fileref, target, ' '.join(parts[2:]))) |
| |
| |
| def make_map(output, sources, map_deps, map_public_deps, target): |
| target = fix_label(target) |
| o = file(output, 'w') |
| covered = set() |
| for i in sources: |
| covered.add(i) |
| new_path = rel_label(target, i) |
| o.write('pub %s: %s\n' % (new_path, target)) |
| for m in map_deps: |
| handle_map_deps(o, m, covered, target, False) |
| for m in map_public_deps: |
| handle_map_deps(o, m, covered, target, True) |
| |
| |
| def main(): |
| parser = optparse.OptionParser() |
| |
| parser.add_option('--sources', help='List of source files.') |
| parser.add_option('--target', help='Name of current target.') |
| parser.add_option( |
| '--map-deps', help='List of map files of deps to aggregate.') |
| parser.add_option( |
| '--map-public-deps', |
| help='List of map files of public deps to aggregate.') |
| parser.add_option('--output', help='Path to output archive.') |
| |
| options, _ = parser.parse_args() |
| |
| sources = [] |
| if (options.sources): |
| sources = ast.literal_eval(options.sources) |
| map_deps = [] |
| if options.map_deps: |
| map_deps = ast.literal_eval(options.map_deps) |
| map_public_deps = [] |
| if options.map_public_deps: |
| map_public_deps = ast.literal_eval(options.map_public_deps) |
| output = options.output |
| target = options.target |
| |
| make_map(output, sources, map_deps, map_public_deps, target) |
| |
| |
| if __name__ == '__main__': |
| sys.exit(main()) |