diff options
author | Alex Humesky <ahumesky@google.com> | 2015-10-19 20:09:40 +0000 |
---|---|---|
committer | Philipp Wollermann <philwo@google.com> | 2015-10-20 16:36:15 +0000 |
commit | 49ceb1b6c3d57af1dea95af999f963501efd3668 (patch) | |
tree | a87f498b8491672bb83f74ec75c22988f4412d3e /src | |
parent | 98ea68a20ddd58f1ee4bb67410484a1c8794556a (diff) |
Also forward the exported_plugins of the rules in the deps of an
android_library rule when the android_library is being used as a forwarding rule
(i.e., has no sources).
RELNOTES: When used as a forwarding rule (i.e., has no sources), android_library
will also forward any exported_plugins in its dependencies.
--
MOS_MIGRATED_REVID=105787789
Diffstat (limited to 'src')
4 files changed, 37 insertions, 17 deletions
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 59f7ac7770..37328e6b64 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 @@ -55,6 +55,7 @@ import com.google.devtools.build.lib.rules.java.JavaCompilationArgsProvider; import com.google.devtools.build.lib.rules.java.JavaCompilationArtifacts; import com.google.devtools.build.lib.rules.java.JavaCompilationHelper; import com.google.devtools.build.lib.rules.java.JavaNativeLibraryProvider; +import com.google.devtools.build.lib.rules.java.JavaPluginInfoProvider; import com.google.devtools.build.lib.rules.java.JavaRuleOutputJarsProvider; import com.google.devtools.build.lib.rules.java.JavaRuntimeJarProvider; import com.google.devtools.build.lib.rules.java.JavaSemantics; @@ -88,6 +89,7 @@ public class AndroidCommon { private NestedSet<Artifact> transitiveSourceJars = NestedSetBuilder.emptySet(Order.STABLE_ORDER); private JavaCompilationArgs javaCompilationArgs = JavaCompilationArgs.EMPTY_ARGS; private JavaCompilationArgs recursiveJavaCompilationArgs = JavaCompilationArgs.EMPTY_ARGS; + private JavaPluginInfoProvider transitiveJavaPluginInfoProvider = JavaPluginInfoProvider.EMPTY; private JackCompilationHelper jackCompilationHelper; private Artifact classJar; private Artifact iJar; @@ -566,8 +568,16 @@ public class AndroidCommon { topLevelSourceJars = ImmutableList.of(srcJar); transitiveSourceJars = javaCommon.collectTransitiveSourceJars(srcJar); + boolean hasSources = attributes.hasSourceFiles() || attributes.hasSourceJars(); + + if (!hasSources) { + // If this android rule has no sources, then it's a forwarding rule, so also forward + // any exported java plugins from its deps. + this.transitiveJavaPluginInfoProvider = JavaPluginInfoProvider.merge( + javaCommon.getPluginInfoProvidersForAttribute("deps", Mode.TARGET)); + } + if (collectJavaCompilationArgs) { - boolean hasSources = attributes.hasSourceFiles() || attributes.hasSourceJars(); this.javaCompilationArgs = collectJavaCompilationArgs(ruleContext, exportDeps, asNeverLink, hasSources); this.recursiveJavaCompilationArgs = collectJavaCompilationArgs( @@ -616,6 +626,7 @@ public class AndroidCommon { asNeverLink ? jackCompilationHelper.compileAsNeverlinkLibrary() : jackCompilationHelper.compileAsLibrary()) + .add(JavaPluginInfoProvider.class, transitiveJavaPluginInfoProvider) .addOutputGroup( OutputGroupProvider.HIDDEN_TOP_LEVEL, collectHiddenTopLevelArtifacts(ruleContext)) .addOutputGroup(JavaSemantics.SOURCE_JARS_OUTPUT_GROUP, transitiveSourceJars); diff --git a/src/main/java/com/google/devtools/build/lib/rules/java/JavaCommon.java b/src/main/java/com/google/devtools/build/lib/rules/java/JavaCommon.java index fd9825f32b..b7e6f785bc 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/java/JavaCommon.java +++ b/src/main/java/com/google/devtools/build/lib/rules/java/JavaCommon.java @@ -665,7 +665,7 @@ public class JavaCommon { return ImmutableList.copyOf(result); } - Iterable<JavaPluginInfoProvider> getPluginInfoProvidersForAttribute(String attribute, + public Iterable<JavaPluginInfoProvider> getPluginInfoProvidersForAttribute(String attribute, Mode mode) { if (ruleContext.attributes().has(attribute, BuildType.LABEL_LIST)) { return ruleContext.getPrerequisites(attribute, mode, JavaPluginInfoProvider.class); diff --git a/src/main/java/com/google/devtools/build/lib/rules/java/JavaLibrary.java b/src/main/java/com/google/devtools/build/lib/rules/java/JavaLibrary.java index 38b3b697a3..65b024f900 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/java/JavaLibrary.java +++ b/src/main/java/com/google/devtools/build/lib/rules/java/JavaLibrary.java @@ -162,19 +162,9 @@ public class JavaLibrary implements RuleConfiguredTargetFactory { NestedSet<LinkerInput> transitiveJavaNativeLibraries = common.collectTransitiveJavaNativeLibraries(); - ImmutableList<String> exportedProcessorClasses = ImmutableList.of(); - NestedSet<Artifact> exportedProcessorClasspath = - NestedSetBuilder.emptySet(Order.NAIVE_LINK_ORDER); - ImmutableList.Builder<String> processorClasses = ImmutableList.builder(); - NestedSetBuilder<Artifact> processorClasspath = NestedSetBuilder.naiveLinkOrder(); - for (JavaPluginInfoProvider provider : Iterables.concat( - common.getPluginInfoProvidersForAttribute("exported_plugins", Mode.HOST), - common.getPluginInfoProvidersForAttribute("exports", Mode.TARGET))) { - processorClasses.addAll(provider.getProcessorClasses()); - processorClasspath.addTransitive(provider.getProcessorClasspath()); - } - exportedProcessorClasses = processorClasses.build(); - exportedProcessorClasspath = processorClasspath.build(); + JavaPluginInfoProvider javaPluginInfoProvider = JavaPluginInfoProvider.merge(Iterables.concat( + common.getPluginInfoProvidersForAttribute("exported_plugins", Mode.HOST), + common.getPluginInfoProvidersForAttribute("exports", Mode.TARGET))); CcLinkParamsStore ccLinkParamsStore = new CcLinkParamsStore() { @Override @@ -249,8 +239,7 @@ public class JavaLibrary implements RuleConfiguredTargetFactory { .add(JavaSourceJarsProvider.class, new JavaSourceJarsProvider( transitiveSourceJars, ImmutableList.of(srcJar))) // TODO(bazel-team): this should only happen for java_plugin - .add(JavaPluginInfoProvider.class, new JavaPluginInfoProvider( - exportedProcessorClasses, exportedProcessorClasspath)) + .add(JavaPluginInfoProvider.class, javaPluginInfoProvider) .add(ProguardSpecProvider.class, new ProguardSpecProvider(proguardSpecs)) .addOutputGroup(JavaSemantics.SOURCE_JARS_OUTPUT_GROUP, transitiveSourceJars) .addOutputGroup(OutputGroupProvider.HIDDEN_TOP_LEVEL, proguardSpecs); diff --git a/src/main/java/com/google/devtools/build/lib/rules/java/JavaPluginInfoProvider.java b/src/main/java/com/google/devtools/build/lib/rules/java/JavaPluginInfoProvider.java index 3b88b03261..14339d9d6f 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/java/JavaPluginInfoProvider.java +++ b/src/main/java/com/google/devtools/build/lib/rules/java/JavaPluginInfoProvider.java @@ -18,6 +18,8 @@ import com.google.common.collect.ImmutableList; import com.google.devtools.build.lib.actions.Artifact; import com.google.devtools.build.lib.analysis.TransitiveInfoProvider; import com.google.devtools.build.lib.collect.nestedset.NestedSet; +import com.google.devtools.build.lib.collect.nestedset.NestedSetBuilder; +import com.google.devtools.build.lib.collect.nestedset.Order; import com.google.devtools.build.lib.concurrent.ThreadSafety.Immutable; /** @@ -25,7 +27,25 @@ import com.google.devtools.build.lib.concurrent.ThreadSafety.Immutable; */ @Immutable public final class JavaPluginInfoProvider implements TransitiveInfoProvider { + + public static final JavaPluginInfoProvider EMPTY = + new JavaPluginInfoProvider( + ImmutableList.<String>of(), + NestedSetBuilder.<Artifact>emptySet(Order.STABLE_ORDER)); + public static JavaPluginInfoProvider merge(Iterable<JavaPluginInfoProvider> providers) { + + ImmutableList.Builder<String> processorClasses = ImmutableList.builder(); + NestedSetBuilder<Artifact> processorClasspath = NestedSetBuilder.naiveLinkOrder(); + + for (JavaPluginInfoProvider provider : providers) { + processorClasses.addAll(provider.getProcessorClasses()); + processorClasspath.addTransitive(provider.getProcessorClasspath()); + } + + return new JavaPluginInfoProvider(processorClasses.build(), processorClasspath.build()); + } + private final ImmutableList<String> processorClasses; private final NestedSet<Artifact> processorClasspath; |