gerrit/tools/default.defs
David Ostrovsky 8b73d9cb56 Buck: Activate error prone checks
Given that Bazel activates error prone static analyzer per default,
allow to activate it for Buck as well.  We already monkey patch
java_library and java_test rules, so it's trivial to munge javac_jar
and compiler_class_name attributes as well.

Due to compile performance coniderations and some issues that were
reported with error prone activated by default in Buck driven build,
we make the integration optional and disabled by default. There are
two option to activate it:

1. Add these lines to your private .buckconfig.local to permanently
activate error prone checks:

  [sanitizers]
    error_prone = 1

2. Use this config option to instantly run error prone check:

  buck build --config sanitizers.error_prone=1  gerrit

Error prone has an issue with naming artifact with all transitive
dependencies included: while it has the suffix "ant", it should be
just called "all". But, TBH, we don't care.

Error Prone is Google library and is released under Apache 2 license.

Change-Id: I2bbe0313ad3e54df1d52968cc28d7e13db36d83f
2016-12-12 08:38:23 +00:00

232 lines
6.2 KiB
Plaintext

# Copyright (C) 2013 The Android Open Source Project
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
# Rule definitions loaded by default into every BUCK file.
include_defs('//lib/auto/auto_value.defs')
include_defs('//tools/gwt-constants.defs')
include_defs('//tools/java_doc.defs')
include_defs('//tools/java_sources.defs')
include_defs('//tools/git.defs')
import copy
import traceback
import os
from multiprocessing import cpu_count
# Set defaults on java rules:
# - Add AutoValue annotation processing support.
# - Treat source files as UTF-8.
_buck_java_library = java_library
def java_library(*args, **kwargs):
_munge_args(kwargs)
_buck_java_library(*args, **kwargs)
_buck_java_test = java_test
def java_test(*args, **kwargs):
_munge_args(kwargs)
_buck_java_test(*args, **kwargs)
# Munge kwargs to set Gerrit-specific defaults.
def _munge_args(kwargs):
if read_config('sanitizers', 'error_prone'):
_set_error_prone(kwargs)
_set_auto_value(kwargs)
_set_extra_arguments(kwargs)
def _set_error_prone(kwargs):
kwargs['javac_jar'] = '//lib:errorprone'
kwargs['compiler_class_name'] = 'com.google.errorprone.ErrorProneJavaCompiler'
def _set_extra_arguments(kwargs):
ext = 'extra_arguments'
if ext not in kwargs:
kwargs[ext] = []
extra_args = kwargs[ext]
for arg in extra_args:
if arg.startswith('-encoding'):
return
extra_args.extend(['-encoding', 'UTF-8'])
def _set_auto_value(kwargs):
apk = 'annotation_processors'
if apk not in kwargs:
kwargs[apk] = []
aps = kwargs.get(apk, [])
apdk = 'annotation_processor_deps'
if apdk not in kwargs:
kwargs[apdk] = []
apds = kwargs.get(apdk, [])
all_deps = kwargs.get('deps', []) + kwargs.get('exported_deps', [])
if AUTO_VALUE_DEP in all_deps:
aps.extend(AUTO_VALUE_PROCESSORS)
apds.extend(AUTO_VALUE_PROCESSOR_DEPS)
# Add 'license' argument to genrule.
_buck_genrule = genrule
def genrule(*args, **kwargs):
license = kwargs.pop('license', None)
if license:
license = '//lib:LICENSE-%s' % license
# genrule has no deps attribute, but locations listed in the command show
# up as deps of the target with buck audit.
kwargs['cmd'] = 'true $(location %s); %s' % (license, kwargs['cmd'])
_buck_genrule(*args, **kwargs)
def genantlr(
name,
srcs,
out):
genrule(
name = name,
srcs = srcs,
cmd = '$(exe //lib/antlr:antlr-tool) -o $TMP $SRCS;' +
'cd $TMP;' +
'zip -qr $OUT .',
out = out,
)
def gwt_module(gwt_xml=None, **kwargs):
kw = copy.deepcopy(kwargs)
if 'resources' not in kw:
kw['resources'] = []
if gwt_xml:
kw['resources'] += [gwt_xml]
if 'srcs' in kw:
kw['resources'] += kw['srcs']
# Buck does not accept duplicate resources. Callers may have
# included gwt_xml or srcs as part of resources, so de-dupe.
kw['resources'] = list(set(kw['resources']))
java_library(**kw)
def gerrit_extension(
name,
deps = [],
provided_deps = [],
srcs = [],
resources = [],
manifest_file = None,
manifest_entries = [],
visibility = ['PUBLIC']):
gerrit_plugin(
name = name,
deps = deps,
provided_deps = provided_deps,
srcs = srcs,
resources = resources,
manifest_file = manifest_file,
manifest_entries = manifest_entries,
type = 'extension',
visibility = visibility,
)
def gerrit_plugin(
name,
deps = [],
provided_deps = [],
srcs = [],
resources = [],
gwt_module = None,
manifest_file = None,
manifest_entries = [],
type = 'plugin',
visibility = ['PUBLIC'],
target_suffix = ''):
tb = traceback.extract_stack()
calling_BUCK_file = tb[-2][0]
calling_BUCK_dir = os.path.abspath(os.path.dirname(calling_BUCK_file))
mf_cmd = 'v=%s;' % git_describe(calling_BUCK_dir)
if manifest_file:
mf_src = [manifest_file]
mf_cmd += 'sed "s:@VERSION@:$v:g" $SRCS >$OUT'
else:
mf_src = []
mf_cmd += 'echo "Manifest-Version: 1.0" >$OUT;'
mf_cmd += 'echo "Gerrit-ApiType: %s" >>$OUT;' % type
mf_cmd += 'echo "Implementation-Version: $v" >>$OUT;'
mf_cmd += 'echo "Implementation-Vendor: Gerrit Code Review" >>$OUT'
for line in manifest_entries:
line = line.replace('$', '\$')
mf_cmd += ';echo "%s" >> $OUT' % line
genrule(
name = name + '__manifest',
cmd = mf_cmd,
srcs = mf_src,
out = 'MANIFEST.MF',
)
static_jars = []
if gwt_module:
static_jars = [':%s-static-jar' % name]
java_library(
name = name + '__plugin',
srcs = srcs,
resources = resources,
deps = deps,
provided_deps = ['//gerrit-%s-api:lib' % type] +
provided_deps +
GWT_PLUGIN_DEPS,
visibility = ['PUBLIC'],
)
if gwt_module:
java_library(
name = name + '__gwt_module',
srcs = [],
resources = list(set(srcs + resources)),
deps = deps,
provided_deps = GWT_PLUGIN_DEPS,
visibility = ['PUBLIC'],
)
prebuilt_jar(
name = '%s-static-jar' % name,
binary_jar = ':%s-static' % name,
)
genrule(
name = '%s-static' % name,
cmd = 'mkdir -p $TMP/static' +
';unzip -qd $TMP/static $(location %s)' %
':%s__gwt_application' % name +
';cd $TMP' +
';zip -qr $OUT .',
out = '%s-static.jar' % name,
)
gwt_binary(
name = name + '__gwt_application',
modules = [gwt_module],
deps = GWT_PLUGIN_DEPS + GWT_TRANSITIVE_DEPS + ['//lib/gwt:dev'],
module_deps = [':%s__gwt_module' % name],
local_workers = cpu_count(),
strict = True,
experimental_args = GWT_COMPILER_ARGS,
vm_args = GWT_JVM_ARGS,
)
java_binary(
name = name + target_suffix,
manifest_file = ':%s__manifest' % name,
merge_manifests = False,
deps = [
':%s__plugin' % name,
] + static_jars,
visibility = visibility,
)