blob: bcaddff8d887bb1fd1c11d78ed87b7479ca2753e [file] [log] [blame]
#!/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")
help='Path to the root build directory',
help='Path to the list of runtime deps',
help='Path to the target\'s SDK manifest file',
'--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:
if __name__ == '__main__':