diff options
author | 2018-01-31 11:06:52 -0800 | |
---|---|---|
committer | 2018-01-31 11:08:13 -0800 | |
commit | 223ed93582dbb730eb92c80cc6350dcec116ec0a (patch) | |
tree | fa8e9f5012cd484950169ff08e331ef1f45da854 /src/main/java/com/google/devtools/build/lib | |
parent | aaab11fcf4eacfc17900daf11f35703fbef13194 (diff) |
Add neverlink support to java_common.compile.
Fixes #3735.
RELNOTES: java_common.compile supports neverlink
PiperOrigin-RevId: 184017410
Diffstat (limited to 'src/main/java/com/google/devtools/build/lib')
9 files changed, 179 insertions, 44 deletions
diff --git a/src/main/java/com/google/devtools/build/lib/BUILD b/src/main/java/com/google/devtools/build/lib/BUILD index e49840ae71..3c43f0874b 100644 --- a/src/main/java/com/google/devtools/build/lib/BUILD +++ b/src/main/java/com/google/devtools/build/lib/BUILD @@ -868,6 +868,7 @@ java_library( "rules/java/JavaBuildInfoFactory.java", "rules/java/JavaCommon.java", "rules/java/JavaCompilationArgs.java", + "rules/java/JavaCompilationArgsHelper.java", "rules/java/JavaCompilationArgsProvider.java", "rules/java/JavaCompilationArtifacts.java", "rules/java/JavaCompilationHelper.java", 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 42841ab3c6..458ac578d1 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 @@ -262,22 +262,21 @@ public class JavaCommon { * * @param recursive Whether to scan dependencies recursively. * @param isNeverLink Whether the target has the 'neverlink' attr. - * @param srcLessDepsExport If srcs is omitted, deps are exported - * (deprecated behaviour for android_library only) + * @param srcLessDepsExport If srcs is omitted, deps are exported (deprecated behaviour for + * android_library only) */ - public JavaCompilationArgs collectJavaCompilationArgs(boolean recursive, boolean isNeverLink, - boolean srcLessDepsExport) { - ClasspathType type = isNeverLink ? ClasspathType.COMPILE_ONLY : ClasspathType.BOTH; - JavaCompilationArgs.Builder builder = JavaCompilationArgs.builder() - .merge(getJavaCompilationArtifacts(), isNeverLink) - .addTransitiveTargets(getExports(ruleContext), recursive, type); - // TODO(bazel-team): remove srcs-less behaviour after android_library users are refactored - if (recursive || srcLessDepsExport) { - builder - .addTransitiveTargets(targetsTreatedAsDeps(ClasspathType.COMPILE_ONLY), recursive, type) - .addTransitiveTargets(getRuntimeDeps(ruleContext), recursive, ClasspathType.RUNTIME_ONLY); - } - return builder.build(); + public JavaCompilationArgs collectJavaCompilationArgs( + boolean recursive, boolean isNeverLink, boolean srcLessDepsExport) { + return JavaLibraryHelper.getJavaCompilationArgs( + JavaCompilationArgsHelper.builder() + .setRecursive(recursive) + .setIsNeverLink(isNeverLink) + .setSrcLessDepsExport(srcLessDepsExport) + .setCompilationArtifacts(getJavaCompilationArtifacts()) + .setDeps(targetsTreatedAsDeps(ClasspathType.COMPILE_ONLY)) + .setRuntimeDeps(getRuntimeDeps(ruleContext)) + .setExports(getExports(ruleContext)) + .build()); } /** diff --git a/src/main/java/com/google/devtools/build/lib/rules/java/JavaCompilationArgs.java b/src/main/java/com/google/devtools/build/lib/rules/java/JavaCompilationArgs.java index 1dc527b81f..d82796de0f 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/java/JavaCompilationArgs.java +++ b/src/main/java/com/google/devtools/build/lib/rules/java/JavaCompilationArgs.java @@ -197,6 +197,14 @@ public abstract class JavaCompilationArgs { return this; } + public Builder addTransitiveCompilationArgs( + Iterable<JavaCompilationArgsProvider> args, boolean recursive, ClasspathType type) { + for (JavaCompilationArgsProvider provider : args) { + addTransitiveCompilationArgs(provider, recursive, type); + } + return this; + } + /** * Merges the artifacts of another target. */ @@ -240,6 +248,13 @@ public abstract class JavaCompilationArgs { /** * Merges the artifacts of a collection of targets. */ + public Builder addTransitiveTargets(Iterable<? extends TransitiveInfoCollection> deps) { + return addTransitiveTargets(deps, /*recursive=*/true, ClasspathType.BOTH); + } + + /** + * Merges the artifacts of a collection of targets. + */ public Builder addTransitiveDependencies(Iterable<JavaCompilationArgsProvider> deps, boolean recursive) { for (JavaCompilationArgsProvider dep : deps) { @@ -248,6 +263,15 @@ public abstract class JavaCompilationArgs { return this; } + /** Merges the artifacts of a collection of targets. */ + public Builder addTransitiveDependencies( + Iterable<JavaCompilationArgsProvider> deps, boolean recursive, ClasspathType type) { + for (JavaCompilationArgsProvider dep : deps) { + addTransitiveDependency(dep, recursive, type); + } + return this; + } + /** * Merges the artifacts of another target. */ @@ -261,13 +285,6 @@ public abstract class JavaCompilationArgs { } /** - * Merges the artifacts of a collection of targets. - */ - public Builder addTransitiveTargets(Iterable<? extends TransitiveInfoCollection> deps) { - return addTransitiveTargets(deps, /*recursive=*/true, ClasspathType.BOTH); - } - - /** * Includes the contents of another instance of {@link JavaCompilationArgs}. * * @param args the {@link JavaCompilationArgs} instance diff --git a/src/main/java/com/google/devtools/build/lib/rules/java/JavaCompilationArgsHelper.java b/src/main/java/com/google/devtools/build/lib/rules/java/JavaCompilationArgsHelper.java new file mode 100644 index 0000000000..b25234d86b --- /dev/null +++ b/src/main/java/com/google/devtools/build/lib/rules/java/JavaCompilationArgsHelper.java @@ -0,0 +1,80 @@ +// Copyright 2018 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.java; + +import com.google.auto.value.AutoValue; +import com.google.common.collect.ImmutableList; +import com.google.devtools.build.lib.analysis.TransitiveInfoCollection; +import java.util.List; + +@AutoValue +abstract class JavaCompilationArgsHelper { + abstract boolean recursive(); + + abstract boolean isNeverLink(); + + abstract boolean srcLessDepsExport(); + + abstract JavaCompilationArtifacts compilationArtifacts(); + + abstract List<JavaCompilationArgsProvider> depsCompilationArgs(); + + abstract Iterable<? extends TransitiveInfoCollection> deps(); + + abstract List<JavaCompilationArgsProvider> runtimeDepsCompilationArgs(); + + abstract Iterable<? extends TransitiveInfoCollection> runtimeDeps(); + + abstract List<JavaCompilationArgsProvider> exportsCompilationArgs(); + + abstract Iterable<? extends TransitiveInfoCollection> exports(); + + static Builder builder() { + return new AutoValue_JavaCompilationArgsHelper.Builder() + .setDepsCompilationArgs(ImmutableList.of()) + .setDeps(ImmutableList.of()) + .setRuntimeDepsCompilationArgs(ImmutableList.of()) + .setRuntimeDeps(ImmutableList.of()) + .setExportsCompilationArgs(ImmutableList.of()) + .setExports(ImmutableList.of()); + } + + public abstract Builder toBuilder(); + + @AutoValue.Builder + abstract static class Builder { + abstract Builder setRecursive(boolean value); + + abstract Builder setIsNeverLink(boolean value); + + abstract Builder setSrcLessDepsExport(boolean value); + + abstract Builder setCompilationArtifacts(JavaCompilationArtifacts value); + + abstract Builder setDepsCompilationArgs(List<JavaCompilationArgsProvider> value); + + abstract Builder setDeps(Iterable<? extends TransitiveInfoCollection> value); + + abstract Builder setRuntimeDepsCompilationArgs(List<JavaCompilationArgsProvider> value); + + abstract Builder setRuntimeDeps(Iterable<? extends TransitiveInfoCollection> value); + + abstract Builder setExportsCompilationArgs(List<JavaCompilationArgsProvider> value); + + abstract Builder setExports(Iterable<? extends TransitiveInfoCollection> value); + + abstract JavaCompilationArgsHelper build(); + } +} diff --git a/src/main/java/com/google/devtools/build/lib/rules/java/JavaInfoBuildHelper.java b/src/main/java/com/google/devtools/build/lib/rules/java/JavaInfoBuildHelper.java index e551fb0355..6c9c5b65cb 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/java/JavaInfoBuildHelper.java +++ b/src/main/java/com/google/devtools/build/lib/rules/java/JavaInfoBuildHelper.java @@ -146,6 +146,13 @@ final class JavaInfoBuildHelper { return javaInfoBuilder.build(); } + /** Creates a {@link JavaSourceJarsProvider} from the given lists of source jars. */ + private static JavaSourceJarsProvider createJavaSourceJarsProvider( + List<Artifact> sourceJars, NestedSet<Artifact> transitiveSourceJars) { + NestedSet<Artifact> javaSourceJars = NestedSetBuilder.wrap(Order.STABLE_ORDER, sourceJars); + return JavaSourceJarsProvider.create(transitiveSourceJars, javaSourceJars); + } + private JavaSourceJarsProvider createJavaSourceJarsProvider( Iterable<Artifact> sourceJars, Iterable<JavaInfo> transitiveDeps) { NestedSetBuilder<Artifact> transitiveSourceJars = NestedSetBuilder.stableOrder(); @@ -279,6 +286,7 @@ final class JavaInfoBuildHelper { ConfiguredTarget hostJavabase, SkylarkList<Artifact> sourcepathEntries, SkylarkList<Artifact> resources, + Boolean neverlink, JavaSemantics javaSemantics) throws EvalException, InterruptedException { if (sourceJars.isEmpty() && sourceFiles.isEmpty() && exports.isEmpty()) { @@ -331,7 +339,7 @@ final class JavaInfoBuildHelper { outputSourceJar); JavaCompilationArgsProvider javaCompilationArgsProvider = - helper.buildCompilationArgsProvider(artifacts, true); + helper.buildCompilationArgsProvider(artifacts, true, neverlink); Runfiles runfiles = new Runfiles.Builder(skylarkRuleContext.getWorkspaceName()) .addTransitiveArtifactsWrappedInStableOrder( @@ -363,6 +371,7 @@ final class JavaInfoBuildHelper { .addProvider(JavaRuleOutputJarsProvider.class, outputJarsBuilder.build()) .addProvider(JavaRunfilesProvider.class, new JavaRunfilesProvider(runfiles)) .addProvider(JavaPluginInfoProvider.class, transitivePluginsProvider) + .setNeverlink(neverlink) .build(); } @@ -444,12 +453,4 @@ final class JavaInfoBuildHelper { return JavaCompilationHelper.derivedArtifact( skylarkRuleContext.getRuleContext(), outputJar, "", "-src.jar"); } - - /** Creates a {@link JavaSourceJarsProvider} from the given lists of source jars. */ - private static JavaSourceJarsProvider createJavaSourceJarsProvider( - List<Artifact> sourceJars, NestedSet<Artifact> transitiveSourceJars) { - NestedSet<Artifact> javaSourceJars = - NestedSetBuilder.<Artifact>stableOrder().addAll(sourceJars).build(); - return JavaSourceJarsProvider.create(transitiveSourceJars, javaSourceJars); - } } diff --git a/src/main/java/com/google/devtools/build/lib/rules/java/JavaLibraryHelper.java b/src/main/java/com/google/devtools/build/lib/rules/java/JavaLibraryHelper.java index 4d84125bc6..0ba0cda601 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/java/JavaLibraryHelper.java +++ b/src/main/java/com/google/devtools/build/lib/rules/java/JavaLibraryHelper.java @@ -16,7 +16,6 @@ package com.google.devtools.build.lib.rules.java; import static com.google.common.base.Preconditions.checkNotNull; import static com.google.devtools.build.lib.analysis.config.BuildConfiguration.StrictDepsMode.OFF; -import static com.google.devtools.build.lib.rules.java.JavaCompilationArgs.ClasspathType.BOTH; import com.google.common.base.Preconditions; import com.google.common.collect.ImmutableList; @@ -27,6 +26,7 @@ import com.google.devtools.build.lib.analysis.config.BuildConfiguration.StrictDe 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.rules.java.JavaCompilationArgs.ClasspathType; import com.google.devtools.build.lib.rules.java.JavaConfiguration.JavaClasspathMode; import com.google.devtools.build.lib.rules.java.JavaRuleOutputJarsProvider.OutputJar; import java.util.ArrayList; @@ -242,16 +242,21 @@ public final class JavaLibraryHelper { * compilation. Contrast this with {@link #setCompilationStrictDepsMode}. */ public JavaCompilationArgsProvider buildCompilationArgsProvider( - JavaCompilationArtifacts artifacts, boolean isReportedAsStrict) { - JavaCompilationArgs directArgs = JavaCompilationArgs.builder() - .merge(artifacts) - .addTransitiveDependencies(exports, true /* recursive */) - .build(); - JavaCompilationArgs transitiveArgs = - JavaCompilationArgs.builder() - .addTransitiveArgs(directArgs, BOTH) - .addTransitiveDependencies(deps, true /* recursive */) + JavaCompilationArtifacts artifacts, boolean isReportedAsStrict, boolean isNeverlink) { + JavaCompilationArgsHelper compilationArgsHelper = + JavaCompilationArgsHelper.builder() + .setRecursive(false) + .setIsNeverLink(isNeverlink) + .setSrcLessDepsExport(false) + .setCompilationArtifacts(artifacts) + .setDepsCompilationArgs(deps) + .setExportsCompilationArgs(exports) .build(); + + JavaCompilationArgs directArgs = getJavaCompilationArgs(compilationArgsHelper); + JavaCompilationArgs transitiveArgs = + getJavaCompilationArgs(compilationArgsHelper.toBuilder().setRecursive(true).build()); + Artifact compileTimeDepArtifact = artifacts.getCompileTimeDependencyArtifact(); NestedSet<Artifact> compileTimeJavaDepArtifacts = compileTimeDepArtifact != null ? NestedSetBuilder.create(Order.STABLE_ORDER, compileTimeDepArtifact) @@ -288,6 +293,27 @@ public final class JavaLibraryHelper { .getCompileTimeJars(); } + static JavaCompilationArgs getJavaCompilationArgs(JavaCompilationArgsHelper helper) { + ClasspathType type = helper.isNeverLink() ? ClasspathType.COMPILE_ONLY : ClasspathType.BOTH; + JavaCompilationArgs.Builder builder = + JavaCompilationArgs.builder() + .merge(helper.compilationArtifacts(), helper.isNeverLink()) + .addTransitiveTargets(helper.exports(), helper.recursive(), type) + .addTransitiveCompilationArgs( + helper.exportsCompilationArgs(), helper.recursive(), type); + // TODO(bazel-team): remove srcs-less behaviour after android_library users are refactored + if (helper.recursive() || helper.srcLessDepsExport()) { + builder + .addTransitiveCompilationArgs(helper.depsCompilationArgs(), helper.recursive(), type) + .addTransitiveTargets(helper.deps(), helper.recursive(), type) + .addTransitiveCompilationArgs( + helper.runtimeDepsCompilationArgs(), helper.recursive(), ClasspathType.RUNTIME_ONLY) + .addTransitiveTargets( + helper.runtimeDeps(), helper.recursive(), ClasspathType.RUNTIME_ONLY); + } + return builder.build(); + } + private boolean isStrict() { return strictDepsMode != OFF; } diff --git a/src/main/java/com/google/devtools/build/lib/rules/java/JavaSkylarkCommon.java b/src/main/java/com/google/devtools/build/lib/rules/java/JavaSkylarkCommon.java index 932834b91e..f8e5af668e 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/java/JavaSkylarkCommon.java +++ b/src/main/java/com/google/devtools/build/lib/rules/java/JavaSkylarkCommon.java @@ -311,6 +311,13 @@ public class JavaSkylarkCommon { type = SkylarkList.class, generic1 = Artifact.class, defaultValue = "[]" + ), + @Param( + name = "neverlink", + positional = false, + named = true, + type = Boolean.class, + defaultValue = "False" ) } ) @@ -328,7 +335,8 @@ public class JavaSkylarkCommon { ConfiguredTarget javaToolchain, ConfiguredTarget hostJavabase, SkylarkList<Artifact> sourcepathEntries, - SkylarkList<Artifact> resources) throws EvalException, InterruptedException { + SkylarkList<Artifact> resources, + Boolean neverlink) throws EvalException, InterruptedException { return JavaInfoBuildHelper.getInstance() .createJavaCompileAction( @@ -346,6 +354,7 @@ public class JavaSkylarkCommon { hostJavabase, sourcepathEntries, resources, + neverlink, javaSemantics); } diff --git a/src/main/java/com/google/devtools/build/lib/rules/java/proto/JavaLiteProtoAspect.java b/src/main/java/com/google/devtools/build/lib/rules/java/proto/JavaLiteProtoAspect.java index 060cf7eb1a..ce11372257 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/java/proto/JavaLiteProtoAspect.java +++ b/src/main/java/com/google/devtools/build/lib/rules/java/proto/JavaLiteProtoAspect.java @@ -277,7 +277,8 @@ public class JavaLiteProtoAspect extends NativeAspectClass implements Configured JavaRuleOutputJarsProvider.builder(), /*createOutputSourceJar*/ false, /*outputSourceJar=*/ null); - return helper.buildCompilationArgsProvider(artifacts, true /* isReportedAsStrict */); + return helper.buildCompilationArgsProvider( + artifacts, /*isReportedAsStrict=*/ true, /*isNeverlink=*/ false); } private ImmutableList<TransitiveInfoCollection> getProtoRuntimeDeps() { diff --git a/src/main/java/com/google/devtools/build/lib/rules/java/proto/JavaProtoAspect.java b/src/main/java/com/google/devtools/build/lib/rules/java/proto/JavaProtoAspect.java index aae8f932ee..a60b6a2ea1 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/java/proto/JavaProtoAspect.java +++ b/src/main/java/com/google/devtools/build/lib/rules/java/proto/JavaProtoAspect.java @@ -312,7 +312,8 @@ public class JavaProtoAspect extends NativeAspectClass implements ConfiguredAspe JavaRuleOutputJarsProvider.builder(), /*createOutputSourceJar*/ false, /*outputSourceJar=*/ null), - true /* isReportedAsStrict */); + /*isReportedAsStrict=*/ true, + /*isNeverlink=*/ false); } private ImmutableList<TransitiveInfoCollection> getProtoRuntimeDeps() { |