aboutsummaryrefslogtreecommitdiffhomepage
path: root/src
diff options
context:
space:
mode:
authorGravatar Michael Staib <mstaib@google.com>2016-01-27 00:12:06 +0000
committerGravatar Kristina Chodorow <kchodorow@google.com>2016-01-27 15:09:37 +0000
commite15da02b3105162f76a2f7a611198187a9ac2f1d (patch)
tree1a29c7ca137d731e277cc2efafeb9b98a552e1cf /src
parent79c68c26d40409fddd38104a97f5df6af522a6ec (diff)
Readds the JackAspect for Jack support for Java dependencies.
This creates a JackAspect which is calculated for Java dependencies of Android libraries and binaries and their Java dependencies. Note that this only applies to java_library and java_import at this time because they are the only ones exporting the necessary provider. -- MOS_MIGRATED_REVID=113107408
Diffstat (limited to 'src')
-rw-r--r--src/main/java/com/google/devtools/build/lib/bazel/rules/java/BazelJavaImportRule.java2
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/android/AndroidLibraryBaseRule.java8
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/android/AndroidRuleClasses.java3
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/android/JackAspect.java104
4 files changed, 114 insertions, 3 deletions
diff --git a/src/main/java/com/google/devtools/build/lib/bazel/rules/java/BazelJavaImportRule.java b/src/main/java/com/google/devtools/build/lib/bazel/rules/java/BazelJavaImportRule.java
index 11359005e8..f6d920a89f 100644
--- a/src/main/java/com/google/devtools/build/lib/bazel/rules/java/BazelJavaImportRule.java
+++ b/src/main/java/com/google/devtools/build/lib/bazel/rules/java/BazelJavaImportRule.java
@@ -26,6 +26,7 @@ import com.google.devtools.build.lib.packages.RuleClass;
import com.google.devtools.build.lib.packages.RuleClass.Builder;
import com.google.devtools.build.lib.rules.java.JavaImportBaseRule;
import com.google.devtools.build.lib.rules.java.JavaSemantics;
+import com.google.devtools.build.lib.rules.java.JavaSourceInfoProvider;
import java.util.Set;
@@ -67,6 +68,7 @@ public final class BazelJavaImportRule implements RuleDefinition {
.allowedFileTypes(JavaSemantics.JAR)
.allowedRuleClasses(ALLOWED_DEPS)
.skipAnalysisTimeFileTypeCheck())
+ .advertiseProvider(JavaSourceInfoProvider.class)
.build();
}
diff --git a/src/main/java/com/google/devtools/build/lib/rules/android/AndroidLibraryBaseRule.java b/src/main/java/com/google/devtools/build/lib/rules/android/AndroidLibraryBaseRule.java
index 32b10b4ac7..1d4ac6db81 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/android/AndroidLibraryBaseRule.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/android/AndroidLibraryBaseRule.java
@@ -74,7 +74,9 @@ public final class AndroidLibraryBaseRule implements RuleDefinition {
<!-- #END_BLAZE_RULE.ATTRIBUTE --> */
.override(builder.copy("deps")
.allowedRuleClasses(AndroidRuleClasses.ALLOWED_DEPENDENCIES)
- .allowedFileTypes())
+ .allowedFileTypes()
+ .aspect(JackAspect.class)
+ .aspect(AndroidNeverlinkAspect.class))
/* <!-- #BLAZE_RULE(android_library).ATTRIBUTE(exports) -->
The transitive closure of all rules reached via <code>exports</code> attributes
are considered direct dependencies of any rule that directly depends on the
@@ -84,7 +86,9 @@ public final class AndroidLibraryBaseRule implements RuleDefinition {
<!-- #END_BLAZE_RULE.ATTRIBUTE --> */
.add(attr("exports", LABEL_LIST)
.allowedRuleClasses(AndroidRuleClasses.ALLOWED_DEPENDENCIES)
- .allowedFileTypes(/*May not have files in exports!*/))
+ .allowedFileTypes(/*May not have files in exports!*/)
+ .aspect(JackAspect.class)
+ .aspect(AndroidNeverlinkAspect.class))
.add(attr("alwayslink", BOOLEAN).undocumented("purely informational for now"))
/* <!-- #BLAZE_RULE(android_library).ATTRIBUTE(neverlink) -->
Only use this library for compilation and not at runtime.
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 6dda4d0552..56ea050514 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
@@ -561,7 +561,8 @@ public final class AndroidRuleClasses {
.cfg(ANDROID_SPLIT_TRANSITION)
.allowedRuleClasses(ALLOWED_DEPENDENCIES)
.allowedFileTypes()
- .aspect(AndroidNeverlinkAspect.class))
+ .aspect(AndroidNeverlinkAspect.class)
+ .aspect(JackAspect.class))
// Proguard rule specifying master list of classes to keep during legacy multidexing.
.add(attr("$build_incremental_dexmanifest", LABEL).cfg(HOST).exec()
.value(env.getLabel(AndroidRuleClasses.BUILD_INCREMENTAL_DEXMANIFEST_LABEL)))
diff --git a/src/main/java/com/google/devtools/build/lib/rules/android/JackAspect.java b/src/main/java/com/google/devtools/build/lib/rules/android/JackAspect.java
new file mode 100644
index 0000000000..b76690df11
--- /dev/null
+++ b/src/main/java/com/google/devtools/build/lib/rules/android/JackAspect.java
@@ -0,0 +1,104 @@
+// Copyright 2015 The Bazel Authors. All rights reserved.
+//
+// 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.
+
+package com.google.devtools.build.lib.rules.android;
+
+import static com.google.devtools.build.lib.packages.Attribute.attr;
+import static com.google.devtools.build.lib.packages.BuildType.LABEL;
+import static com.google.devtools.build.lib.packages.BuildType.LABEL_LIST;
+
+import com.google.common.collect.ImmutableList;
+import com.google.devtools.build.lib.actions.Artifact;
+import com.google.devtools.build.lib.analysis.ConfiguredAspect;
+import com.google.devtools.build.lib.analysis.ConfiguredAspectFactory;
+import com.google.devtools.build.lib.analysis.ConfiguredTarget;
+import com.google.devtools.build.lib.analysis.RuleConfiguredTarget.Mode;
+import com.google.devtools.build.lib.analysis.RuleContext;
+import com.google.devtools.build.lib.analysis.TransitiveInfoCollection;
+import com.google.devtools.build.lib.packages.AspectDefinition;
+import com.google.devtools.build.lib.packages.AspectParameters;
+import com.google.devtools.build.lib.packages.NativeAspectClass.NativeAspectFactory;
+import com.google.devtools.build.lib.rules.java.JavaCommon;
+import com.google.devtools.build.lib.rules.java.JavaSourceInfoProvider;
+import com.google.devtools.build.lib.vfs.PathFragment;
+
+import java.util.List;
+
+/** Aspect to provide Jack support to rules which have java sources. */
+public final class JackAspect implements NativeAspectFactory, ConfiguredAspectFactory {
+ public static final String NAME = "JackAspect";
+
+ @Override
+ public AspectDefinition getDefinition(AspectParameters params) {
+ return new AspectDefinition.Builder("JackAspect")
+ .requireProvider(JavaSourceInfoProvider.class)
+ .add(attr(":android_sdk", LABEL)
+ .allowedRuleClasses("android_sdk")
+ .value(AndroidRuleClasses.ANDROID_SDK))
+ .attributeAspect("deps", JackAspect.class)
+ .attributeAspect("exports", JackAspect.class)
+ .attributeAspect("runtime_deps", JackAspect.class)
+ .requiresConfigurationFragments(AndroidConfiguration.class)
+ .build();
+ }
+
+ @Override
+ public ConfiguredAspect create(
+ ConfiguredTarget base, RuleContext ruleContext, AspectParameters params) {
+ JavaSourceInfoProvider sourceProvider = base.getProvider(JavaSourceInfoProvider.class);
+ PathFragment rulePath = ruleContext.getLabel().toPathFragment();
+ PathFragment jackLibraryPath = rulePath.replaceName("lib" + rulePath.getBaseName() + ".jack");
+ Artifact jackLibraryOutput =
+ ruleContext
+ .getAnalysisEnvironment()
+ .getDerivedArtifact(jackLibraryPath, ruleContext.getBinOrGenfilesDirectory());
+ AndroidSdkProvider androidSdk = AndroidSdkProvider.fromRuleContext(ruleContext);
+ JackCompilationHelper jackHelper =
+ new JackCompilationHelper.Builder()
+ // blaze infrastructure
+ .setRuleContext(ruleContext)
+ // configuration
+ .setOutputArtifact(jackLibraryOutput)
+ // tools
+ .setAndroidSdk(androidSdk)
+ // sources
+ .addJavaSources(sourceProvider.getSourceFiles())
+ .addSourceJars(sourceProvider.getSourceJars())
+ .addCompiledJars(sourceProvider.getJarFiles())
+ .addResources(sourceProvider.getResources())
+ .addProcessorNames(sourceProvider.getProcessorNames())
+ .addProcessorClasspathJars(sourceProvider.getProcessorPath())
+ // dependencies
+ .addExports(getPotentialDependency(ruleContext, "exports"))
+ .addDeps(getPotentialDependency(ruleContext, "deps"))
+ .addRuntimeDeps(getPotentialDependency(ruleContext, "runtime_deps"))
+ .build();
+ JackLibraryProvider result =
+ JavaCommon.isNeverLink(ruleContext)
+ ? jackHelper.compileAsNeverlinkLibrary()
+ : jackHelper.compileAsLibrary();
+ return new ConfiguredAspect.Builder(NAME, ruleContext)
+ .addProvider(JackLibraryProvider.class, result)
+ .build();
+ }
+
+ /** Gets a list of targets on the given LABEL_LIST attribute if it exists, else an empty list. */
+ private static List<? extends TransitiveInfoCollection> getPotentialDependency(
+ RuleContext context, String attribute) {
+ if (!context.getRule().getRuleClassObject().hasAttr(attribute, LABEL_LIST)) {
+ return ImmutableList.of();
+ }
+ return context.getPrerequisites(attribute, Mode.TARGET);
+ }
+}