| #!/usr/bin/env python2.7 |
| # 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 |
| |
| |
| def has_packaged_file(needed_file, deps): |
| """Returns true if the given file could be found in the given deps.""" |
| for dep in deps: |
| for file in dep['files']: |
| if needed_file == os.path.normpath(file['source']): |
| return True |
| return False |
| |
| |
| def has_missing_files(runtime_files, package_deps): |
| """Returns true if a runtime file is missing from the given deps.""" |
| has_missing_files = False |
| for file in runtime_files: |
| # Some libraries are only known to GN as ABI stubs, whereas the real |
| # runtime dependency is generated in parallel as a ".so.impl" file. |
| if (not has_packaged_file(file, package_deps) and |
| not has_packaged_file('%s.impl' % file, package_deps)): |
| print('No package dependency generates %s' % file) |
| has_missing_files = True |
| return has_missing_files |
| |
| |
| def main(): |
| parser = argparse.ArgumentParser( |
| "Verifies a prebuilt library's runtime dependencies") |
| parser.add_argument('--root-build-dir', |
| help='Path to the root build directory', |
| required=True) |
| parser.add_argument('--runtime-deps-file', |
| help='Path to the list of runtime deps', |
| required=True) |
| parser.add_argument('--manifest', |
| help='Path to the target\'s SDK manifest file', |
| required=True) |
| parser.add_argument('--stamp', |
| help='Path to the stamp file to generate', |
| required=True) |
| args = parser.parse_args() |
| |
| # Read the list of runtime dependencies generated by GN. |
| def normalize_dep(dep): |
| return os.path.normpath(os.path.join(args.root_build_dir, dep.strip())) |
| with open(args.runtime_deps_file, 'r') as runtime_deps_file: |
| runtime_files = map(normalize_dep, runtime_deps_file.readlines()) |
| |
| # Read the list of package dependencies for the library's SDK incarnation. |
| with open(args.manifest, 'r') as manifest_file: |
| manifest = json.load(manifest_file) |
| atom_id = manifest['ids'][0] |
| def find_atom(id): |
| return next(a for a in manifest['atoms'] if a['id'] == id) |
| atom = find_atom(atom_id) |
| deps = map(lambda a: find_atom(a), atom['deps']) |
| deps += [atom] |
| |
| # Check whether all runtime files are available for packaging. |
| if has_missing_files(runtime_files, deps): |
| return 1 |
| |
| with open(args.stamp, 'w') as stamp: |
| stamp.write('Success!') |
| |
| |
| if __name__ == '__main__': |
| sys.exit(main()) |