aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/main/java/com
diff options
context:
space:
mode:
authorGravatar gregce <gregce@google.com>2017-04-17 19:42:12 +0200
committerGravatar Klaus Aehlig <aehlig@google.com>2017-04-18 11:32:26 +0200
commited666fc2d54366fef2170d4451ae0ed9d0421e60 (patch)
tree8ea0b75687c228814b39f4dc19b05a5282e2ea83 /src/main/java/com
parent36355da02cfbfd1ab8361309543a4f4a4f8f9c7a (diff)
Expose Bazel's Android data binding support to users.
The logic is already in Bazel but wasn't available to build rules. This change makes it available, but still requires data binding's {build|run}time libraries to be checked into appropriate depot spots for everything to work. Followup changes will make those libraries easily available. Issue: #2694 PiperOrigin-RevId: 153359861
Diffstat (limited to 'src/main/java/com')
-rw-r--r--src/main/java/com/google/devtools/build/lib/BUILD1
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/android/AndroidCommon.java2
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/android/AndroidRuleClasses.java42
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/android/DataBinding.java4
4 files changed, 46 insertions, 3 deletions
diff --git a/src/main/java/com/google/devtools/build/lib/BUILD b/src/main/java/com/google/devtools/build/lib/BUILD
index 51b444d586..a3707e7b65 100644
--- a/src/main/java/com/google/devtools/build/lib/BUILD
+++ b/src/main/java/com/google/devtools/build/lib/BUILD
@@ -979,6 +979,7 @@ java_library(
),
resources = [
"rules/android/android_device_stub_template.txt",
+ "rules/android/databinding_annotation_template.txt",
],
deps = [
":build-base",
diff --git a/src/main/java/com/google/devtools/build/lib/rules/android/AndroidCommon.java b/src/main/java/com/google/devtools/build/lib/rules/android/AndroidCommon.java
index 279f252fac..feafff567a 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/android/AndroidCommon.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/android/AndroidCommon.java
@@ -740,6 +740,8 @@ public class AndroidCommon {
builder, skylarkApiProvider, filesToBuild, classJar, ANDROID_COLLECTION_SPEC);
javaCommon.addGenJarsProvider(builder, skylarkApiProvider, genClassJar, genSourceJar);
+ DataBinding.maybeAddProvider(builder, ruleContext);
+
return builder
.setFilesToBuild(filesToBuild)
.addSkylarkTransitiveInfo(JavaSkylarkApiProvider.NAME, skylarkApiProvider.build())
diff --git a/src/main/java/com/google/devtools/build/lib/rules/android/AndroidRuleClasses.java b/src/main/java/com/google/devtools/build/lib/rules/android/AndroidRuleClasses.java
index 7c289e3ccb..81c141d954 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/android/AndroidRuleClasses.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/android/AndroidRuleClasses.java
@@ -35,10 +35,12 @@ import com.google.devtools.build.lib.analysis.RuleDefinitionEnvironment;
import com.google.devtools.build.lib.analysis.config.BuildConfiguration;
import com.google.devtools.build.lib.analysis.config.BuildOptions;
import com.google.devtools.build.lib.cmdline.Label;
+import com.google.devtools.build.lib.packages.Attribute;
import com.google.devtools.build.lib.packages.Attribute.AllowedValueSet;
import com.google.devtools.build.lib.packages.Attribute.LateBoundLabel;
import com.google.devtools.build.lib.packages.Attribute.SplitTransition;
import com.google.devtools.build.lib.packages.AttributeMap;
+import com.google.devtools.build.lib.packages.BuildType;
import com.google.devtools.build.lib.packages.ImplicitOutputsFunction;
import com.google.devtools.build.lib.packages.ImplicitOutputsFunction.SafeImplicitOutputsFunction;
import com.google.devtools.build.lib.packages.Rule;
@@ -55,6 +57,7 @@ import com.google.devtools.build.lib.rules.java.JavaSemantics;
import com.google.devtools.build.lib.rules.java.ProguardHelper;
import com.google.devtools.build.lib.skylarkinterface.SkylarkValue;
import com.google.devtools.build.lib.syntax.Printer;
+import com.google.devtools.build.lib.syntax.Type;
import com.google.devtools.build.lib.util.FileType;
import java.util.List;
@@ -440,7 +443,7 @@ public final class AndroidRuleClasses {
*/
public static final class AndroidResourceSupportRule implements RuleDefinition {
@Override
- public RuleClass build(RuleClass.Builder builder, RuleDefinitionEnvironment env) {
+ public RuleClass build(RuleClass.Builder builder, final RuleDefinitionEnvironment env) {
return builder
/* <!-- #BLAZE_RULE($android_resource_support).ATTRIBUTE(manifest) -->
The name of the Android manifest file, normally <code>AndroidManifest.xml</code>.
@@ -491,6 +494,43 @@ public final class AndroidRuleClasses {
libraries that will only be detected at runtime.
<!-- #END_BLAZE_RULE.ATTRIBUTE --> */
.add(attr("custom_package", STRING))
+ /* <!-- #BLAZE_RULE($android_resource_support).ATTRIBUTE(enable_data_binding) -->
+ If true, this rule processes
+ <a href="https://developer.android.com/topic/libraries/data-binding/index.html">data
+ binding</a> expressions in layout resources included through the
+ <a href="${link android_binary.resource_files}">resource_files</a> attribute. Without this
+ setting, data binding expressions produce build failures.
+ <p>
+ To build an Android app with data binding, you must also do the following:
+ <ol>
+ <li>Set this attribute for all Android rules that transitively depend on this one.
+ This is because of resource merging: when a rule declares data binding XML expressions
+ its dependers implicitly inherit those expressions. So they also need to build with
+ data binding in order to parse those expressions correctly.
+ <li>Add a <code>deps =</code> entry for the data binding runtime library to all targets
+ that set this attribute. The location of this library depends on your depot setup.
+ </ol>
+ <!-- #END_BLAZE_RULE.ATTRIBUTE --> */
+ .add(attr("enable_data_binding", Type.BOOLEAN))
+ // The javac annotation processor from Android's data binding library that turns
+ // processed XML expressions into Java code.
+ .add(attr(DataBinding.DATABINDING_ANNOTATION_PROCESSOR_ATTR, BuildType.LABEL)
+ // This has to be a computed default because the annotation processor is a
+ // java_plugin, which means it needs the Jvm configuration fragment. That conflicts
+ // with Android builds that use --experimental_disable_jvm.
+ // TODO(gregce): The Jvm dependency is only needed for the host configuration.
+ // --experimental_disable_jvm is really intended for target configurations without
+ // a JDK. So this case isn't conceptually a conflict. Clean this up so we can remove
+ // this computed default.
+ .value(new Attribute.ComputedDefault("enable_data_binding") {
+ @Override
+ public Object getDefault(AttributeMap rule) {
+ return rule.get("enable_data_binding", Type.BOOLEAN)
+ ? env.getToolsLabel("//tools/android:databinding_annotation_processor")
+ : null;
+ }
+ }))
+
.build();
}
diff --git a/src/main/java/com/google/devtools/build/lib/rules/android/DataBinding.java b/src/main/java/com/google/devtools/build/lib/rules/android/DataBinding.java
index 6b74a7270d..eae687073f 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/android/DataBinding.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/android/DataBinding.java
@@ -61,9 +61,9 @@ import java.util.List;
*/
public final class DataBinding {
/**
- * The rule attribute supplying the data binding annotation processor.
+ * The rule attribute supplying data binding's annotation processor.
*/
- private static final String DATABINDING_ANNOTATION_PROCESSOR_ATTR =
+ public static final String DATABINDING_ANNOTATION_PROCESSOR_ATTR =
"$databinding_annotation_processor";
/**