| #!/usr/bin/env python3 | |
| # | |
| # Copyright 2013 The Flutter Authors. All rights reserved. | |
| # Use of this source code is governed by a BSD-style license that can be | |
| # found in the LICENSE file. | |
| """ Generate a Fuchsia FAR Archive from an asset manifest. | |
| """ | |
| import argparse | |
| import collections | |
| import json | |
| import os | |
| import subprocess | |
| import sys | |
| from gather_flutter_runner_artifacts import CreateMetaPackage | |
| # Generates the manifest and returns the file. | |
| def GenerateManifest(package_dir): | |
| full_paths = [] | |
| for root, dirs, files in os.walk(package_dir): | |
| for f in files: | |
| common_prefix = os.path.commonprefix([root, package_dir]) | |
| rel_path = os.path.relpath(os.path.join(root, f), common_prefix) | |
| from_package = os.path.abspath(os.path.join(package_dir, rel_path)) | |
| assert from_package, 'Failed to create from_package for %s' % os.path.join(root, f) | |
| full_paths.append('%s=%s' % (rel_path, from_package)) | |
| parent_dir = os.path.abspath(os.path.join(package_dir, os.pardir)) | |
| manifest_file_name = os.path.basename(package_dir) + '.manifest' | |
| manifest_path = os.path.join(parent_dir, manifest_file_name) | |
| with open(manifest_path, 'w') as f: | |
| for item in full_paths: | |
| f.write("%s\n" % item) | |
| return manifest_path | |
| def CreateFarPackage(pm_bin, package_dir, signing_key, dst_dir, api_level): | |
| manifest_path = GenerateManifest(package_dir) | |
| pm_command_base = [ | |
| pm_bin, '-m', manifest_path, '-k', signing_key, '-o', dst_dir, '--api-level', api_level | |
| ] | |
| # Build the package | |
| subprocess.check_output(pm_command_base + ['build']) | |
| # Archive the package | |
| subprocess.check_output(pm_command_base + ['archive']) | |
| return 0 | |
| def main(): | |
| parser = argparse.ArgumentParser() | |
| parser.add_argument('--pm-bin', dest='pm_bin', action='store', required=True) | |
| parser.add_argument('--package-dir', dest='package_dir', action='store', required=True) | |
| parser.add_argument('--manifest-file', dest='manifest_file', action='store', required=False) | |
| parser.add_argument( | |
| '--manifest-json-file', dest='manifest_json_file', action='store', required=True | |
| ) | |
| parser.add_argument('--far-name', dest='far_name', action='store', required=False) | |
| parser.add_argument('--api-level', dest='api_level', action='store', required=False) | |
| args = parser.parse_args() | |
| assert os.path.exists(args.pm_bin) | |
| assert os.path.exists(args.package_dir) | |
| pkg_dir = args.package_dir | |
| if not os.path.exists(os.path.join(pkg_dir, 'meta', 'package')): | |
| CreateMetaPackage(pkg_dir, args.far_name) | |
| output_dir = os.path.abspath(pkg_dir + '_out') | |
| if not os.path.exists(output_dir): | |
| os.makedirs(output_dir) | |
| manifest_file = None | |
| if args.manifest_file is not None: | |
| assert os.path.exists(args.manifest_file) | |
| manifest_file = args.manifest_file | |
| else: | |
| manifest_file = GenerateManifest(args.package_dir) | |
| pm_command_base = [ | |
| args.pm_bin, | |
| '-o', | |
| output_dir, | |
| '-n', | |
| args.far_name, | |
| '-m', | |
| manifest_file, | |
| ] | |
| # Build and then archive the package | |
| # Use check_output so if anything goes wrong we get the output. | |
| try: | |
| build_command = ['build', '--output-package-manifest', args.manifest_json_file] | |
| if args.api_level is not None: | |
| build_command = ['--api-level', args.api_level] + build_command | |
| archive_command = [ | |
| 'archive', '--output=' + os.path.join(os.path.dirname(output_dir), args.far_name + "-0") | |
| ] | |
| pm_commands = [build_command, archive_command] | |
| for pm_command in pm_commands: | |
| subprocess.check_output(pm_command_base + pm_command) | |
| except subprocess.CalledProcessError as e: | |
| print('==================== Manifest contents =========================================') | |
| with open(manifest_file, 'r') as manifest: | |
| sys.stdout.write(manifest.read()) | |
| print('==================== End manifest contents =====================================') | |
| meta_contents_path = os.path.join(output_dir, 'meta', 'contents') | |
| if os.path.exists(meta_contents_path): | |
| print('==================== meta/contents =============================================') | |
| with open(meta_contents_path, 'r') as meta_contents: | |
| sys.stdout.write(meta_contents.read()) | |
| print('==================== End meta/contents =========================================') | |
| raise | |
| return 0 | |
| if __name__ == '__main__': | |
| sys.exit(main()) |