blob: 6b0d69b30545a011bc15c2e4fbc914c35968b864 [file] [log] [blame]
#!/usr/bin/env fuchsia-vendored-python
#
# 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())