blob: f00837f24872d7f8f399e2323c3bff096afd917f [file] [log] [blame]
#!/usr/bin/env fuchsia-vendored-python
# Copyright 2019 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.
import argparse
import json
import os
import sys
sys.path.append(
os.path.join(
os.path.dirname(__file__),
os.pardir,
"cpp",
)
)
import binaries
# Rewrite a debug file name (or list of them) into its .build-id/...
# name for publication, collecting the mappings in the `manifest` dict.
def rewrite(debug, manifest):
if isinstance(debug, list):
return [rewrite(x, manifest) for x in debug]
id_path = binaries.get_sdk_debug_path(debug)
manifest[id_path] = debug
return id_path
def main():
parser = argparse.ArgumentParser()
parser.add_argument(
"--input",
type=argparse.FileType("r"),
help="Input JSON file",
required=True,
)
parser.add_argument(
"--output",
type=argparse.FileType("w"),
help="Output JSON file",
required=True,
)
parser.add_argument(
"--manifest",
type=argparse.FileType("w"),
help="Output manifest file",
required=True,
)
parser.add_argument(
"--depfile",
type=argparse.FileType("w"),
required=True,
)
parser.add_argument("--location", help="JSON pointer", required=False)
args = parser.parse_args()
# Read in the original JSON tree.
data = json.load(args.input)
# Poor man's JSON pointer: /foo/bar/baz looks up in dicts.
manifest = {}
if args.location:
ptr = args.location.split("/")
assert ptr[0] == "", (
"%s should be absolute JSON pointer" % args.location
)
# Follow the pointer steps until the last one, so walk[ptr[0]] points
# at the requested location in the JSON tree.
walk = {"": data}
while len(ptr) > 1:
walk = walk[ptr[0]]
ptr = ptr[1:]
# Apply the rewrites to the string or list at that spot in the tree.
walk[ptr[0]] = rewrite(walk[ptr[0]], manifest)
else:
# If no location argument is passed in, we will find the value from the variants section
debug = data["variants"][0]["values"]["debug_libs"]
data["variants"][0]["values"]["debug_libs"] = rewrite(debug, manifest)
# Write out the manifest collected while rewriting original debug files
# names to .build-id/... names for publication.
#
# Original debug files are read during the rewrite above, so include them in
# a depfile.
mappings = []
deps = []
for dest, source in manifest.items():
mappings.append(f"{dest}={source}")
deps.append(os.path.relpath(source))
args.manifest.write("\n".join(mappings))
args.depfile.write(
"{} {}: {}\n".format(
args.manifest.name, args.output.name, " ".join(deps)
)
)
# Write out the modified JSON tree.
json.dump(data, args.output, indent=2, sort_keys=True)
return 0
if __name__ == "__main__":
sys.exit(main())