aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/main/java/com
diff options
context:
space:
mode:
authorGravatar lberki <lberki@google.com>2017-07-11 11:39:59 +0200
committerGravatar László Csomor <laszlocsomor@google.com>2017-07-11 11:42:00 +0200
commit4634ff903d1aaec59d545bd28a139d6cf2b95e0d (patch)
tree8e39ea1f67cae6e27c9c53fa657b1af707789c5c /src/main/java/com
parente0ea0f6c3f0121ca5e5ac54b0a6ffabc53efbc67 (diff)
Make information about the Java runtime in use available in Skylark using a dependency.
RELNOTES: None. PiperOrigin-RevId: 161504700
Diffstat (limited to 'src/main/java/com')
-rw-r--r--src/main/java/com/google/devtools/build/lib/bazel/rules/BazelRuleClassProvider.java4
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/java/JavaRuntime.java7
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/java/JavaRuntimeProvider.java67
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/java/JavaRuntimeSuite.java3
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/java/JavaSkylarkCommon.java34
5 files changed, 100 insertions, 15 deletions
diff --git a/src/main/java/com/google/devtools/build/lib/bazel/rules/BazelRuleClassProvider.java b/src/main/java/com/google/devtools/build/lib/bazel/rules/BazelRuleClassProvider.java
index 6a5c3d2b1d..f021bec6c8 100644
--- a/src/main/java/com/google/devtools/build/lib/bazel/rules/BazelRuleClassProvider.java
+++ b/src/main/java/com/google/devtools/build/lib/bazel/rules/BazelRuleClassProvider.java
@@ -519,8 +519,8 @@ public class BazelRuleClassProvider {
builder.addRuleDefinition(new AndroidDeviceRule());
builder.addSkylarkAccessibleTopLevels("android_common", new AndroidSkylarkCommon());
- builder.addSkylarkAccessibleTopLevels(
- "java_common", new JavaSkylarkCommon(BazelJavaSemantics.INSTANCE));
+ builder.addSkylarkAccessibleTopLevels("java_common", new JavaSkylarkCommon(
+ BazelJavaSemantics.INSTANCE, builder.getToolsRepository()));
builder.addSkylarkAccessibleTopLevels("java_proto_common", JavaProtoSkylarkCommon.class);
try {
diff --git a/src/main/java/com/google/devtools/build/lib/rules/java/JavaRuntime.java b/src/main/java/com/google/devtools/build/lib/rules/java/JavaRuntime.java
index 73f9f09c51..108edd055c 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/java/JavaRuntime.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/java/JavaRuntime.java
@@ -73,6 +73,9 @@ public class JavaRuntime implements RuleConfiguredTargetFactory {
.addTransitiveArtifacts(filesToBuild)
.build();
+ JavaRuntimeProvider javaRuntime = new JavaRuntimeProvider(
+ filesToBuild, javaHome, javaBinaryExecPath, javaBinaryRunfilesPath);
+
MakeVariableProvider makeVariableProvider = new MakeVariableProvider(ImmutableMap.of(
"JAVA", javaBinaryExecPath.getPathString(),
"JAVABASE", javaHome.getPathString()));
@@ -80,8 +83,8 @@ public class JavaRuntime implements RuleConfiguredTargetFactory {
return new RuleConfiguredTargetBuilder(ruleContext)
.addProvider(RunfilesProvider.class, RunfilesProvider.simple(runfiles))
.setFilesToBuild(filesToBuild)
- .addProvider(JavaRuntimeProvider.class, JavaRuntimeProvider.create(
- filesToBuild, javaHome, javaBinaryExecPath, javaBinaryRunfilesPath))
+ .addProvider(JavaRuntimeProvider.class, javaRuntime)
+ .addNativeDeclaredProvider(javaRuntime)
.addProvider(MiddlemanProvider.class, new MiddlemanProvider(middleman))
.addProvider(makeVariableProvider)
.addNativeDeclaredProvider(makeVariableProvider)
diff --git a/src/main/java/com/google/devtools/build/lib/rules/java/JavaRuntimeProvider.java b/src/main/java/com/google/devtools/build/lib/rules/java/JavaRuntimeProvider.java
index 7df3efcb7a..33235a3d04 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/java/JavaRuntimeProvider.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/java/JavaRuntimeProvider.java
@@ -14,34 +14,81 @@
package com.google.devtools.build.lib.rules.java;
-import com.google.auto.value.AutoValue;
+import com.google.common.collect.ImmutableMap;
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.concurrent.ThreadSafety.Immutable;
+import com.google.devtools.build.lib.packages.ClassObjectConstructor;
+import com.google.devtools.build.lib.packages.NativeClassObjectConstructor;
+import com.google.devtools.build.lib.packages.SkylarkClassObject;
+import com.google.devtools.build.lib.skylarkinterface.SkylarkCallable;
+import com.google.devtools.build.lib.skylarkinterface.SkylarkModule;
import com.google.devtools.build.lib.vfs.PathFragment;
/** Information about the Java runtime used by the <code>java_*</code> rules. */
-@AutoValue
+@SkylarkModule(
+ name = "JavaRuntimeInfo",
+ doc = "Information about the Java runtime being used."
+)
@Immutable
-public abstract class JavaRuntimeProvider implements TransitiveInfoProvider {
+public class JavaRuntimeProvider extends SkylarkClassObject
+ implements TransitiveInfoProvider {
+ public static final String SKYLARK_NAME = "JavaRuntimeInfo";
- public static JavaRuntimeProvider create(
+ public static final ClassObjectConstructor SKYLARK_CONSTRUCTOR =
+ new NativeClassObjectConstructor(JavaToolchainProvider.class, SKYLARK_NAME) {};
+
+ private final NestedSet<Artifact> javaBaseInputs;
+ private final PathFragment javaHome;
+ private final PathFragment javaBinaryExecPath;
+ private final PathFragment javaBinaryRunfilesPath;
+
+ public JavaRuntimeProvider(
NestedSet<Artifact> javaBaseInputs, PathFragment javaHome,
PathFragment javaBinaryExecPath, PathFragment javaBinaryRunfilesPath) {
- return new AutoValue_JavaRuntimeProvider(
- javaBaseInputs, javaHome, javaBinaryExecPath, javaBinaryRunfilesPath);
+ super(SKYLARK_CONSTRUCTOR, ImmutableMap.<String, Object>of());
+ this.javaBaseInputs = javaBaseInputs;
+ this.javaHome = javaHome;
+ this.javaBinaryExecPath = javaBinaryExecPath;
+ this.javaBinaryRunfilesPath = javaBinaryRunfilesPath;
}
/** All input artifacts in the javabase. */
- public abstract NestedSet<Artifact> javaBaseInputs();
+ public NestedSet<Artifact> javaBaseInputs() {
+ return javaBaseInputs;
+ }
/** The root directory of the Java installation. */
- public abstract PathFragment javaHome();
+ public PathFragment javaHome() {
+ return javaHome;
+ }
+ @SkylarkCallable(
+ name = "java_executable_exec_path",
+ doc = "Returns the execpath of the Java executable.",
+ structField = true
+ )
/** The execpath of the Java binary. */
- public abstract PathFragment javaBinaryExecPath();
+ public PathFragment javaBinaryExecPath() {
+ return javaBinaryExecPath;
+ }
/** The runfiles path of the Java binary. */
- public abstract PathFragment javaBinaryRunfilesPath();
+ public PathFragment javaBinaryRunfilesPath() {
+ return javaBinaryRunfilesPath;
+ }
+
+ // Not all of JavaRuntimeProvider is exposed to Skylark, which makes implementing deep equality
+ // impossible: if Java-only parts are considered, the behavior is surprising in Skylark, if they
+ // are not, the behavior is surprising in Java. Thus, object identity it is.
+ @Override
+ public boolean equals(Object other) {
+ return other == this;
+ }
+
+ @Override
+ public int hashCode() {
+ return System.identityHashCode(this);
+ }
}
diff --git a/src/main/java/com/google/devtools/build/lib/rules/java/JavaRuntimeSuite.java b/src/main/java/com/google/devtools/build/lib/rules/java/JavaRuntimeSuite.java
index dfde6fd937..cab0d2c481 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/java/JavaRuntimeSuite.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/java/JavaRuntimeSuite.java
@@ -35,14 +35,17 @@ public class JavaRuntimeSuite implements RuleConfiguredTargetFactory {
if (runtime == null) {
runtime = ruleContext.getPrerequisite("default", Mode.TARGET);
}
+
if (runtime == null) {
ruleContext.throwWithRuleError(
"could not resolve runtime for cpu " + ruleContext.getConfiguration().getCpu());
}
MakeVariableProvider makeVariableProvider = runtime.getProvider(MakeVariableProvider.class);
+
return new RuleConfiguredTargetBuilder(ruleContext)
.addProvider(JavaRuntimeProvider.class, runtime.getProvider(JavaRuntimeProvider.class))
+ .addNativeDeclaredProvider(runtime.get(JavaRuntimeProvider.SKYLARK_CONSTRUCTOR.getKey()))
.addProvider(RunfilesProvider.class, runtime.getProvider(RunfilesProvider.class))
.addProvider(MiddlemanProvider.class, runtime.getProvider(MiddlemanProvider.class))
.addProvider(makeVariableProvider)
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 7ac14a5c4e..4d3359161c 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
@@ -16,6 +16,7 @@ package com.google.devtools.build.lib.rules.java;
import com.google.common.collect.ImmutableList;
import com.google.common.collect.Iterables;
import com.google.devtools.build.lib.actions.Artifact;
+import com.google.devtools.build.lib.analysis.ConfiguredRuleClassProvider;
import com.google.devtools.build.lib.analysis.ConfiguredTarget;
import com.google.devtools.build.lib.analysis.MiddlemanProvider;
import com.google.devtools.build.lib.analysis.RuleContext;
@@ -24,7 +25,10 @@ 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.packages.Attribute;
+import com.google.devtools.build.lib.packages.BuildType;
import com.google.devtools.build.lib.packages.ClassObjectConstructor;
+import com.google.devtools.build.lib.rules.SkylarkAttr;
import com.google.devtools.build.lib.rules.SkylarkRuleContext;
import com.google.devtools.build.lib.rules.java.proto.StrictDepsUtils;
import com.google.devtools.build.lib.skylarkinterface.Param;
@@ -40,9 +44,11 @@ import java.util.List;
@SkylarkModule(name = "java_common", doc = "Utilities for Java compilation support in Skylark.")
public class JavaSkylarkCommon {
private final JavaSemantics javaSemantics;
+ private final String toolsRepository;
- public JavaSkylarkCommon(JavaSemantics javaSemantics) {
+ public JavaSkylarkCommon(JavaSemantics javaSemantics, String toolsrepository) {
this.javaSemantics = javaSemantics;
+ this.toolsRepository = toolsrepository;
}
@SkylarkCallable(
@@ -452,4 +458,30 @@ public class JavaSkylarkCommon {
+ " Only OFF and ERROR values are accepted.");
}
}
+
+ @SkylarkCallable(
+ name = JavaRuntimeProvider.SKYLARK_NAME,
+ doc = "The key used to retrieve the provider that contains information about the Java "
+ + "runtime being used.",
+ structField = true
+ )
+ public static ClassObjectConstructor getJavaRuntimeProvider() {
+ return JavaRuntimeProvider.SKYLARK_CONSTRUCTOR;
+ }
+
+ @SkylarkCallable(
+ name = "java_runtime_attr",
+ doc = "A value that, when passed as a value in the attribute dictionary of a rule "
+ + "definition, will yield a dependency that describes the current Java runtime in use.",
+ documented = false,
+ structField = true
+ )
+ public SkylarkAttr.Descriptor getJvmAttribute() {
+ ConfiguredRuleClassProvider.Builder env = new ConfiguredRuleClassProvider.Builder();
+ env.setToolsRepository(toolsRepository);
+ return new SkylarkAttr.Descriptor(
+ "java_runtime_attr",
+ new Attribute.Builder<>("", BuildType.LABEL)
+ .value(JavaSemantics.jvmAttribute(env)));
+ }
}