aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/main/java/com/google/devtools/build/lib
diff options
context:
space:
mode:
authorGravatar elenairina <elenairina@google.com>2018-01-31 11:06:52 -0800
committerGravatar Copybara-Service <copybara-piper@google.com>2018-01-31 11:08:13 -0800
commit223ed93582dbb730eb92c80cc6350dcec116ec0a (patch)
treefa8e9f5012cd484950169ff08e331ef1f45da854 /src/main/java/com/google/devtools/build/lib
parentaaab11fcf4eacfc17900daf11f35703fbef13194 (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')
-rw-r--r--src/main/java/com/google/devtools/build/lib/BUILD1
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/java/JavaCommon.java29
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/java/JavaCompilationArgs.java31
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/java/JavaCompilationArgsHelper.java80
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/java/JavaInfoBuildHelper.java19
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/java/JavaLibraryHelper.java46
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/java/JavaSkylarkCommon.java11
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/java/proto/JavaLiteProtoAspect.java3
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/java/proto/JavaProtoAspect.java3
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() {