| #!/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()) |