summaryrefslogtreecommitdiffstats
path: root/build/android/gyp
diff options
context:
space:
mode:
authorjbudorick <jbudorick@chromium.org>2016-03-21 09:43:40 -0700
committerCommit bot <commit-bot@chromium.org>2016-03-21 16:44:33 +0000
commitc2b563ca5489aaf7579a4b9f389533b7af336187 (patch)
tree8e523e85431f7fdf1378526c512d224dda773006 /build/android/gyp
parent6e47685c9153b1d26ce5d2f955ebd6aea67e09d3 (diff)
downloadchromium_src-c2b563ca5489aaf7579a4b9f389533b7af336187.zip
chromium_src-c2b563ca5489aaf7579a4b9f389533b7af336187.tar.gz
chromium_src-c2b563ca5489aaf7579a4b9f389533b7af336187.tar.bz2
[Android] Run lint using a cache in the output directory.
BUG=583661 Review URL: https://codereview.chromium.org/1815563005 Cr-Commit-Position: refs/heads/master@{#382306}
Diffstat (limited to 'build/android/gyp')
-rwxr-xr-xbuild/android/gyp/lint.py228
-rw-r--r--build/android/gyp/util/build_utils.py4
2 files changed, 140 insertions, 92 deletions
diff --git a/build/android/gyp/lint.py b/build/android/gyp/lint.py
index bc761ff..2d3c79b 100755
--- a/build/android/gyp/lint.py
+++ b/build/android/gyp/lint.py
@@ -7,7 +7,7 @@
"""Runs Android's lint tool."""
-import optparse
+import argparse
import os
import sys
import traceback
@@ -22,7 +22,8 @@ _SRC_ROOT = os.path.abspath(os.path.join(os.path.dirname(__file__),
def _OnStaleMd5(changes, lint_path, config_path, processed_config_path,
manifest_path, result_path, product_dir, sources, jar_path,
- resource_dir=None, can_fail_build=False):
+ cache_dir, resource_dir=None, can_fail_build=False,
+ silent=False):
def _RelativizePath(path):
"""Returns relative path to top-level src dir.
@@ -33,6 +34,8 @@ def _OnStaleMd5(changes, lint_path, config_path, processed_config_path,
return os.path.relpath(os.path.abspath(path), _SRC_ROOT)
def _ProcessConfigFile():
+ if not config_path or not processed_config_path:
+ return
if not build_utils.IsTimeStale(processed_config_path, [config_path]):
return
@@ -54,23 +57,24 @@ def _OnStaleMd5(changes, lint_path, config_path, processed_config_path,
def _ParseAndShowResultFile():
dom = minidom.parse(result_path)
issues = dom.getElementsByTagName('issue')
- print >> sys.stderr
- for issue in issues:
- issue_id = issue.attributes['id'].value
- message = issue.attributes['message'].value
- location_elem = issue.getElementsByTagName('location')[0]
- path = location_elem.attributes['file'].value
- line = location_elem.getAttribute('line')
- if line:
- error = '%s:%s %s: %s [warning]' % (path, line, message, issue_id)
- else:
- # Issues in class files don't have a line number.
- error = '%s %s: %s [warning]' % (path, message, issue_id)
- print >> sys.stderr, error.encode('utf-8')
- for attr in ['errorLine1', 'errorLine2']:
- error_line = issue.getAttribute(attr)
- if error_line:
- print >> sys.stderr, error_line.encode('utf-8')
+ if not silent:
+ print >> sys.stderr
+ for issue in issues:
+ issue_id = issue.attributes['id'].value
+ message = issue.attributes['message'].value
+ location_elem = issue.getElementsByTagName('location')[0]
+ path = location_elem.attributes['file'].value
+ line = location_elem.getAttribute('line')
+ if line:
+ error = '%s:%s %s: %s [warning]' % (path, line, message, issue_id)
+ else:
+ # Issues in class files don't have a line number.
+ error = '%s %s: %s [warning]' % (path, message, issue_id)
+ print >> sys.stderr, error.encode('utf-8')
+ for attr in ['errorLine1', 'errorLine2']:
+ error_line = issue.getAttribute(attr)
+ if error_line:
+ print >> sys.stderr, error_line.encode('utf-8')
return len(issues)
# Need to include all sources when a resource_dir is set so that resources are
@@ -84,10 +88,12 @@ def _OnStaleMd5(changes, lint_path, config_path, processed_config_path,
cmd = [
_RelativizePath(lint_path), '-Werror', '--exitcode', '--showall',
- '--config', _RelativizePath(processed_config_path),
- '--classpath', _RelativizePath(jar_path),
'--xml', _RelativizePath(result_path),
]
+ if jar_path:
+ cmd.extend(['--classpath', _RelativizePath(jar_path)])
+ if processed_config_path:
+ cmd.extend(['--config', _RelativizePath(processed_config_path)])
if resource_dir:
cmd.extend(['--resources', _RelativizePath(resource_dir)])
@@ -117,13 +123,18 @@ def _OnStaleMd5(changes, lint_path, config_path, processed_config_path,
src_dir = NewSourceDir()
os.symlink(os.path.abspath(src), PathInDir(src_dir, src))
- cmd.append(_RelativizePath(os.path.join(manifest_path, os.pardir)))
+ if manifest_path:
+ cmd.append(_RelativizePath(os.path.join(manifest_path, os.pardir)))
if os.path.exists(result_path):
os.remove(result_path)
+ env = {}
+ if cache_dir:
+ env['_JAVA_OPTIONS'] = '-Duser.home=%s' % _RelativizePath(cache_dir)
+
try:
- build_utils.CheckOutput(cmd, cwd=_SRC_ROOT)
+ build_utils.CheckOutput(cmd, cwd=_SRC_ROOT, env=env or None)
except build_utils.CalledProcessError:
if can_fail_build:
traceback.print_exc()
@@ -137,92 +148,129 @@ def _OnStaleMd5(changes, lint_path, config_path, processed_config_path,
try:
num_issues = _ParseAndShowResultFile()
except Exception: # pylint: disable=broad-except
- print 'Lint created unparseable xml file...'
- print 'File contents:'
- with open(result_path) as f:
- print f.read()
+ if not silent:
+ print 'Lint created unparseable xml file...'
+ print 'File contents:'
+ with open(result_path) as f:
+ print f.read()
raise
_ProcessResultFile()
msg = ('\nLint found %d new issues.\n'
- ' - For full explanation refer to %s\n'
- ' - Wanna suppress these issues?\n'
- ' 1. Read comment in %s\n'
- ' 2. Run "python %s %s"\n' %
+ ' - For full explanation refer to %s\n' %
(num_issues,
- _RelativizePath(result_path),
- _RelativizePath(config_path),
- _RelativizePath(os.path.join(_SRC_ROOT, 'build', 'android',
- 'lint', 'suppress.py')),
_RelativizePath(result_path)))
- print >> sys.stderr, msg
+ if config_path:
+ msg += (' - Wanna suppress these issues?\n'
+ ' 1. Read comment in %s\n'
+ ' 2. Run "python %s %s"\n' %
+ (_RelativizePath(config_path),
+ _RelativizePath(os.path.join(_SRC_ROOT, 'build', 'android',
+ 'lint', 'suppress.py')),
+ _RelativizePath(result_path)))
+ if not silent:
+ print >> sys.stderr, msg
if can_fail_build:
raise Exception('Lint failed.')
def main():
- parser = optparse.OptionParser()
+ parser = argparse.ArgumentParser()
build_utils.AddDepfileOption(parser)
- parser.add_option('--lint-path', help='Path to lint executable.')
- parser.add_option('--config-path', help='Path to lint suppressions file.')
- parser.add_option('--processed-config-path',
- help='Path to processed lint suppressions file.')
- parser.add_option('--manifest-path', help='Path to AndroidManifest.xml')
- parser.add_option('--result-path', help='Path to XML lint result file.')
- parser.add_option('--product-dir', help='Path to product dir.')
- parser.add_option('--src-dirs', help='Directories containing java files.')
- parser.add_option('--java-files', help='Paths to java files.')
- parser.add_option('--jar-path', help='Jar file containing class files.')
- parser.add_option('--resource-dir', help='Path to resource dir.')
- parser.add_option('--can-fail-build', action='store_true',
- help='If set, script will exit with nonzero exit status'
- ' if lint errors are present')
- parser.add_option('--stamp', help='Path to touch on success.')
- parser.add_option('--enable', action='store_true',
- help='Run lint instead of just touching stamp.')
-
- options, _ = parser.parse_args()
-
- build_utils.CheckOptions(
- options, parser, required=['lint_path', 'config_path',
- 'processed_config_path', 'manifest_path',
- 'result_path', 'product_dir',
- 'jar_path'])
-
- if options.enable:
+
+ parser.add_argument('--lint-path', required=True,
+ help='Path to lint executable.')
+ parser.add_argument('--product-dir', required=True,
+ help='Path to product dir.')
+ parser.add_argument('--result-path', required=True,
+ help='Path to XML lint result file.')
+
+ parser.add_argument('--build-tools-version',
+ help='Version of the build tools in the Android SDK.')
+ parser.add_argument('--cache-dir',
+ help='Path to the directory in which the android cache '
+ 'directory tree should be stored.')
+ parser.add_argument('--can-fail-build', action='store_true',
+ help='If set, script will exit with nonzero exit status'
+ ' if lint errors are present')
+ parser.add_argument('--config-path',
+ help='Path to lint suppressions file.')
+ parser.add_argument('--enable', action='store_true',
+ help='Run lint instead of just touching stamp.')
+ parser.add_argument('--jar-path',
+ help='Jar file containing class files.')
+ parser.add_argument('--java-files',
+ help='Paths to java files.')
+ parser.add_argument('--manifest-path',
+ help='Path to AndroidManifest.xml')
+ parser.add_argument('--platform-xml-path',
+ help='Path to api-platforms.xml')
+ parser.add_argument('--processed-config-path',
+ help='Path to processed lint suppressions file.')
+ parser.add_argument('--resource-dir',
+ help='Path to resource dir.')
+ parser.add_argument('--silent', action='store_true',
+ help='If set, script will not log anything.')
+ parser.add_argument('--src-dirs',
+ help='Directories containing java files.')
+ parser.add_argument('--stamp',
+ help='Path to touch on success.')
+
+ args = parser.parse_args()
+
+ if args.enable:
sources = []
- if options.src_dirs:
- src_dirs = build_utils.ParseGypList(options.src_dirs)
+ if args.src_dirs:
+ src_dirs = build_utils.ParseGypList(args.src_dirs)
sources = build_utils.FindInDirectories(src_dirs, '*.java')
- elif options.java_files:
- sources = build_utils.ParseGypList(options.java_files)
- else:
- print 'One of --src-dirs or --java-files must be specified.'
- return 1
+ elif args.java_files:
+ sources = build_utils.ParseGypList(args.java_files)
+
+ if args.config_path and not args.processed_config_path:
+ parser.error('--config-path specified without --processed-config-path')
+ elif args.processed_config_path and not args.config_path:
+ parser.error('--processed-config-path specified without --config-path')
input_paths = [
- options.lint_path,
- options.config_path,
- options.manifest_path,
- options.jar_path,
+ args.lint_path,
]
- input_paths.extend(sources)
- if options.resource_dir:
- input_paths.extend(build_utils.FindInDirectory(options.resource_dir, '*'))
-
- input_strings = [ options.processed_config_path ]
- output_paths = [ options.result_path ]
+ if args.config_path:
+ input_paths.append(args.config_path)
+ if args.jar_path:
+ input_paths.append(args.jar_path)
+ if args.manifest_path:
+ input_paths.append(args.manifest_path)
+ if args.platform_xml_path:
+ input_paths.append(args.platform_xml_path)
+ if args.resource_dir:
+ input_paths.extend(build_utils.FindInDirectory(args.resource_dir, '*'))
+ if sources:
+ input_paths.extend(sources)
+
+ input_strings = []
+ if args.processed_config_path:
+ input_strings.append(args.processed_config_path)
+
+ output_paths = [ args.result_path ]
+ if args.cache_dir:
+ if not args.build_tools_version:
+ parser.error('--cache-dir specified without --build-tools-version')
+ output_paths.append(os.path.join(
+ args.cache_dir, '.android', 'cache',
+ 'api-versions-6-%s.bin' % args.build_tools_version))
build_utils.CallAndWriteDepfileIfStale(
- lambda changes: _OnStaleMd5(changes, options.lint_path,
- options.config_path,
- options.processed_config_path,
- options.manifest_path, options.result_path,
- options.product_dir, sources,
- options.jar_path,
- resource_dir=options.resource_dir,
- can_fail_build=options.can_fail_build),
- options,
+ lambda changes: _OnStaleMd5(changes, args.lint_path,
+ args.config_path,
+ args.processed_config_path,
+ args.manifest_path, args.result_path,
+ args.product_dir, sources,
+ args.jar_path,
+ args.cache_dir,
+ resource_dir=args.resource_dir,
+ can_fail_build=args.can_fail_build,
+ silent=args.silent),
+ args,
input_paths=input_paths,
input_strings=input_strings,
output_paths=output_paths,
diff --git a/build/android/gyp/util/build_utils.py b/build/android/gyp/util/build_utils.py
index 3fa91aa..5e088b7 100644
--- a/build/android/gyp/util/build_utils.py
+++ b/build/android/gyp/util/build_utils.py
@@ -152,7 +152,7 @@ class CalledProcessError(Exception):
# This can be used in most cases like subprocess.check_output(). The output,
# particularly when the command fails, better highlights the command's failure.
# If the command fails, raises a build_utils.CalledProcessError.
-def CheckOutput(args, cwd=None,
+def CheckOutput(args, cwd=None, env=None,
print_stdout=False, print_stderr=True,
stdout_filter=None,
stderr_filter=None,
@@ -161,7 +161,7 @@ def CheckOutput(args, cwd=None,
cwd = os.getcwd()
child = subprocess.Popen(args,
- stdout=subprocess.PIPE, stderr=subprocess.PIPE, cwd=cwd)
+ stdout=subprocess.PIPE, stderr=subprocess.PIPE, cwd=cwd, env=env)
stdout, stderr = child.communicate()
if stdout_filter is not None: