| #!/usr/bin/env python3.8 |
| # Copyright 2020 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. |
| # Lint as: python3 |
| |
| import argparse |
| import json |
| import os |
| import sys |
| |
| |
| # Generates shebang files for binaries so they can be invoked from the shell. |
| # Generated files look like this: |
| # #!resolve fuchsia-pkg://fuchsia.com/<package-name>#bin/<bin-name> |
| def main(): |
| parser = argparse.ArgumentParser( |
| 'Generate shebang files for shell binaries') |
| parser.add_argument('--package-name', required=True) |
| parser.add_argument( |
| '--input-distribution-manifest', |
| required=True, |
| type=argparse.FileType('r'), |
| help='Path to a distribution manifest with all shell binaries') |
| parser.add_argument( |
| '--output-directory', |
| required=True, |
| help='Path to a directory to store generated shebang files') |
| parser.add_argument( |
| '--output-distribution-manifest', |
| required=True, |
| type=argparse.FileType('w'), |
| help='Path to write output distribution manifest') |
| parser.add_argument( |
| '--depfile', |
| required=True, |
| type=argparse.FileType('w'), |
| help='Depfile for listing generated shebang files as additional inputs') |
| args = parser.parse_args() |
| |
| input_dist = json.load(args.input_distribution_manifest) |
| output_dist = [] |
| shebang_files = [] |
| |
| for dist in input_dist: |
| dest = dist["destination"] |
| if not dest.startswith("bin/"): |
| continue |
| shebang_file = os.path.join( |
| args.output_directory, "__untraced_shebangs__", dest) |
| shebang_files.append(shebang_file) |
| os.makedirs(os.path.dirname(shebang_file), exist_ok=True) |
| with open(shebang_file, 'w') as f: |
| f.write( |
| f'#!resolve fuchsia-pkg://fuchsia.com/{args.package_name}#{dest}\n' |
| ) |
| output_dist.append(dict(dist, source=shebang_file)) |
| |
| json.dump( |
| output_dist, |
| args.output_distribution_manifest, |
| indent=2, |
| sort_keys=True, |
| separators=(',', ': ')) |
| |
| args.depfile.write( |
| '{}: {}\n'.format( |
| args.output_distribution_manifest.name, ' '.join(shebang_files))) |
| |
| return 0 |
| |
| |
| if __name__ == '__main__': |
| sys.exit(main()) |