blob: 564af7c745e7fb6f847ca02c9ea15b8cf86093a3 [file] [log] [blame]
#!/usr/bin/env fuchsia-vendored-python
# Copyright 2018 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
def main():
parser = argparse.ArgumentParser("Builds a metadata file")
parser.add_argument("--out", help="Path to the output file", required=True)
parser.add_argument("--name", help="Name of the library", required=True)
parser.add_argument(
"--format",
help="Format of the library",
choices=["shared", "static"],
required=True,
)
parser.add_argument(
"--root", help="Root of the library in the SDK", required=True
)
parser.add_argument(
"--deps", help="Path to metadata files of dependencies", nargs="*"
)
parser.add_argument("--headers", help="List of public headers", nargs="*")
parser.add_argument(
"--include-dir", help="Path to the include directory", required=True
)
parser.add_argument(
"--arch", help="Name of the target architecture", required=True
)
parser.add_argument(
"--lib-link",
help="Path to the link-time library in the SDK",
required=True,
)
parser.add_argument(
"--lib-dist",
help="Path to the library to add to Fuchsia packages in the SDK",
required=False,
)
parser.add_argument(
"--dist-path",
help="Path to the library in Fuchsia packages",
required=False,
)
parser.add_argument(
"--lib-debug-file",
help="Path to the source debug version of the library",
required=False,
)
parser.add_argument(
"--debug-mapping",
help="Path to the file where to write the file mapping for the debug library",
required=False,
)
parser.add_argument(
"--ifs", help="Path to an llvm .ifs file", required=False
)
parser.add_argument("--api-level", help="The API level", required=False)
args = parser.parse_args()
metadata = {
"type": "cc_prebuilt_library",
"name": args.name,
"root": args.root,
"format": args.format,
"headers": args.headers,
"include_dir": args.include_dir,
}
metadata["binaries"] = {
args.arch: {
"link": args.lib_link,
},
}
if args.ifs:
metadata["ifs"] = args.ifs
if args.lib_debug_file:
# The path of the debug file in the SDK depends on its build id.
debug_path = binaries.get_sdk_debug_path(args.lib_debug_file)
with open(args.debug_mapping, "w") as mappings_file:
mappings_file.write(debug_path + "=" + args.lib_debug_file + "\n")
metadata["binaries"][args.arch]["debug"] = debug_path
if args.lib_dist:
metadata["binaries"][args.arch]["dist"] = args.lib_dist
metadata["binaries"][args.arch]["dist_path"] = args.dist_path
deps = []
for spec in args.deps:
with open(spec, "r") as spec_file:
data = json.load(spec_file)
type = data["type"]
name = data["name"]
# TODO(https://fxbug.dev/42131085): verify that source libraries are header-only.
if type == "cc_source_library" or type == "cc_prebuilt_library":
deps.append(name)
else:
raise Exception("Unsupported dependency type: %s" % type)
metadata["deps"] = sorted(set(deps))
if args.api_level:
binary = metadata["binaries"][args.arch]
variant = {
"constraints": {
"arch": args.arch,
"api_level": int(args.api_level),
},
"values": {},
}
if "dist" in binary:
variant["values"]["dist_lib"] = binary["dist"]
if "dist_path" in binary:
variant["values"]["dist_lib_dest"] = binary["dist_path"]
if "link" in binary:
variant["values"]["link_lib"] = binary["link"]
if "debug" in binary:
variant["values"]["debug"] = binary["debug"]
metadata["variants"] = [variant]
del metadata["binaries"]
with open(args.out, "w") as out_file:
json.dump(
metadata, out_file, indent=2, sort_keys=True, separators=(",", ": ")
)
return 0
if __name__ == "__main__":
sys.exit(main())