diff options
Diffstat (limited to 'src/main/java/com/google/devtools')
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); + } +} |