blob: 6b71126a7b5d35492165d8ee211e534f5d51e605 [file] [log] [blame]
#!/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
if dest == "bin/grand_unified_binary":
# This binary may arrive via multiple deps because it's commonly
# renamed and reused. Ignore it so as not to create conflicting
# shebang files.
continue
shebang_file = os.path.join(args.output_directory, "__shebang__", 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())