| #!/usr/bin/env python3.8 |
| # Copyright 2017 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 os |
| import subprocess |
| import sys |
| |
| FUCHSIA_ROOT = os.path.dirname( # $root |
| os.path.dirname( # build |
| os.path.dirname( # dart |
| os.path.abspath(__file__)))) |
| |
| if sys.version_info[0] >= 3: |
| sys.path += [os.path.join(FUCHSIA_ROOT, 'third_party', 'pyyaml', 'lib3')] |
| else: |
| sys.path += [os.path.join(FUCHSIA_ROOT, 'third_party', 'pyyaml', 'lib')] |
| |
| import yaml |
| |
| |
| def main(): |
| parser = argparse.ArgumentParser('Runs analysis on a given package') |
| parser.add_argument( |
| '--source-file', help='Path to the list of sources', required=True) |
| parser.add_argument( |
| '--dot-packages', help='Path to the .packages file', required=True) |
| parser.add_argument( |
| '--dartanalyzer', |
| help='Path to the Dart analyzer executable', |
| required=True) |
| parser.add_argument( |
| '--dart-sdk', help='Path to the Dart SDK', required=True) |
| parser.add_argument( |
| '--options', help='Path to analysis options', required=True) |
| parser.add_argument( |
| '--stamp', help='File to touch when analysis succeeds', required=True) |
| parser.add_argument( |
| '--depname', help='Name of the depfile target', required=True) |
| parser.add_argument( |
| '--depfile', help='Path to the depfile to generate', required=True) |
| args = parser.parse_args() |
| |
| with open(args.source_file, 'r') as source_file: |
| sources = source_file.read().strip().split('\n') |
| |
| with open(args.depfile, 'w') as depfile: |
| depfile.write('%s: ' % args.depname) |
| |
| def add_dep(path): |
| depfile.write('%s ' % path) |
| |
| options = args.options |
| while True: |
| if not os.path.isabs(options): |
| print('Expected absolute path, got %s' % options) |
| return 1 |
| if not os.path.exists(options): |
| print('Could not find options file: %s' % options) |
| return 1 |
| add_dep(options) |
| with open(options, 'r') as options_file: |
| content = yaml.safe_load(options_file) |
| if not 'include' in content: |
| break |
| included = content['include'] |
| if not os.path.isabs(included): |
| included = os.path.join(os.path.dirname(options), included) |
| options = included |
| |
| call_args = [ |
| args.dartanalyzer, |
| '--packages=%s' % args.dot_packages, |
| '--dart-sdk=%s' % args.dart_sdk, |
| '--options=%s' % args.options, |
| '--fatal-warnings', |
| '--fatal-hints', |
| '--fatal-lints', |
| '--enable-experiment', |
| 'non-nullable', |
| ] + sources |
| |
| # Call Dart anaylzer. |
| call = subprocess.Popen( |
| call_args, stdout=subprocess.PIPE, stderr=subprocess.PIPE) |
| stdout, stderr = call.communicate() |
| |
| # Convert output to strings, assuming UTF-8 output from dart. |
| stdout = stdout.decode('utf-8') |
| stderr = stderr.decode('utf-8') |
| |
| if call.returncode: |
| print(stdout + stderr) |
| return 1 |
| |
| with open(args.stamp, 'w') as stamp: |
| stamp.write('Success!') |
| |
| |
| if __name__ == '__main__': |
| sys.exit(main()) |