diff options
author | 2017-04-17 19:42:12 +0200 | |
---|---|---|
committer | 2017-04-18 11:32:26 +0200 | |
commit | ed666fc2d54366fef2170d4451ae0ed9d0421e60 (patch) | |
tree | 8ea0b75687c228814b39f4dc19b05a5282e2ea83 /src/main/java/com | |
parent | 36355da02cfbfd1ab8361309543a4f4a4f8f9c7a (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')
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"; /** |