aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/java/JavaToolchain.java39
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/java/JavaToolchainData.java46
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/java/JavaToolchainProvider.java27
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/java/JavaToolchainRule.java18
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/java/JavaToolchainSkylarkApiProvider.java31
5 files changed, 63 insertions, 98 deletions
diff --git a/src/main/java/com/google/devtools/build/lib/rules/java/JavaToolchain.java b/src/main/java/com/google/devtools/build/lib/rules/java/JavaToolchain.java
index b4df602f81..69bcc7374d 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/java/JavaToolchain.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/java/JavaToolchain.java
@@ -13,8 +13,12 @@
// limitations under the License.
package com.google.devtools.build.lib.rules.java;
+import static com.google.common.base.Strings.isNullOrEmpty;
+
+import com.google.common.base.Joiner;
import com.google.common.collect.ImmutableCollection;
import com.google.common.collect.ImmutableList;
+import com.google.common.collect.ImmutableList.Builder;
import com.google.common.collect.ImmutableListMultimap;
import com.google.common.collect.ImmutableMap;
import com.google.devtools.build.lib.actions.Artifact;
@@ -45,15 +49,11 @@ public final class JavaToolchain implements RuleConfiguredTargetFactory {
@Override
public ConfiguredTarget create(RuleContext ruleContext) throws RuleErrorException {
- String source = ruleContext.attributes().get("source_version", Type.STRING);
- String target = ruleContext.attributes().get("target_version", Type.STRING);
+ ImmutableList<String> javacopts = getJavacOpts(ruleContext);
NestedSet<Artifact> bootclasspath = PrerequisiteArtifacts.nestedSet(
ruleContext, "bootclasspath", Mode.HOST);
NestedSet<Artifact> extclasspath = PrerequisiteArtifacts.nestedSet(
ruleContext, "extclasspath", Mode.HOST);
- String encoding = ruleContext.attributes().get("encoding", Type.STRING);
- List<String> xlint = ruleContext.attributes().get("xlint", Type.STRING_LIST);
- List<String> misc = ruleContext.getExpander().withDataLocations().tokenized("misc");
boolean javacSupportsWorkers =
ruleContext.attributes().get("javac_supports_workers", Type.BOOLEAN);
Artifact javac = ruleContext.getPrerequisiteArtifact("javac", Mode.HOST);
@@ -89,13 +89,9 @@ public final class JavaToolchain implements RuleConfiguredTargetFactory {
JavaToolchainData toolchainData =
new JavaToolchainData(
- source,
- target,
Artifact.toExecPaths(bootclasspath),
Artifact.toExecPaths(extclasspath),
- encoding,
- xlint,
- misc,
+ javacopts,
jvmOpts,
javacSupportsWorkers ? SupportsWorkers.YES : SupportsWorkers.NO);
JavaConfiguration configuration = ruleContext.getFragment(JavaConfiguration.class);
@@ -131,6 +127,29 @@ public final class JavaToolchain implements RuleConfiguredTargetFactory {
return builder.build();
}
+ private ImmutableList<String> getJavacOpts(RuleContext ruleContext) {
+ Builder<String> javacopts = ImmutableList.builder();
+ String source = ruleContext.attributes().get("source_version", Type.STRING);
+ if (!isNullOrEmpty(source)) {
+ javacopts.add("-source").add(source);
+ }
+ String target = ruleContext.attributes().get("target_version", Type.STRING);
+ if (!isNullOrEmpty(target)) {
+ javacopts.add("-target").add(target);
+ }
+ String encoding = ruleContext.attributes().get("encoding", Type.STRING);
+ if (!isNullOrEmpty(encoding)) {
+ javacopts.add("-encoding", encoding);
+ }
+ List<String> xlint = ruleContext.attributes().get("xlint", Type.STRING_LIST);
+ if (!xlint.isEmpty()) {
+ javacopts.add("-Xlint:" + Joiner.on(",").join(xlint));
+ }
+ javacopts.addAll(ruleContext.getExpander().withDataLocations().tokenized("misc"));
+ javacopts.addAll(ruleContext.getExpander().withDataLocations().tokenized("javacopts"));
+ return javacopts.build();
+ }
+
private static ImmutableListMultimap<String, String> getCompatibleJavacOptions(
RuleContext ruleContext) {
ImmutableListMultimap.Builder<String, String> result = ImmutableListMultimap.builder();
diff --git a/src/main/java/com/google/devtools/build/lib/rules/java/JavaToolchainData.java b/src/main/java/com/google/devtools/build/lib/rules/java/JavaToolchainData.java
index 68ff205676..a150a76caa 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/java/JavaToolchainData.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/java/JavaToolchainData.java
@@ -15,9 +15,7 @@ package com.google.devtools.build.lib.rules.java;
import static com.google.common.base.Preconditions.checkNotNull;
-import com.google.common.base.Joiner;
import com.google.common.collect.ImmutableList;
-import com.google.common.collect.ImmutableList.Builder;
import com.google.devtools.build.lib.concurrent.ThreadSafety.Immutable;
import java.util.List;
@@ -35,54 +33,30 @@ public class JavaToolchainData {
YES
}
- private final String sourceVersion;
- private final String targetVersion;
private final Iterable<String> bootclasspath;
private final Iterable<String> extclasspath;
- private final String encoding;
- private final ImmutableList<String> options;
+ private final ImmutableList<String> javacopts;
private final ImmutableList<String> jvmOpts;
private boolean javacSupportsWorkers;
public JavaToolchainData(
- String sourceVersion,
- String targetVersion,
Iterable<String> bootclasspath,
Iterable<String> extclasspath,
- String encoding,
- List<String> xlint,
- List<String> misc,
+ ImmutableList<String> javacopts,
List<String> jvmOpts,
SupportsWorkers javacSupportsWorkers) {
- this.sourceVersion = checkNotNull(sourceVersion, "sourceVersion must not be null");
- this.targetVersion = checkNotNull(targetVersion, "targetVersion must not be null");
this.bootclasspath = checkNotNull(bootclasspath, "bootclasspath must not be null");
this.extclasspath = checkNotNull(extclasspath, "extclasspath must not be null");
- this.encoding = checkNotNull(encoding, "encoding must not be null");
-
this.jvmOpts = ImmutableList.copyOf(jvmOpts);
this.javacSupportsWorkers = javacSupportsWorkers.equals(SupportsWorkers.YES);
- Builder<String> builder = ImmutableList.<String>builder();
- if (!sourceVersion.isEmpty()) {
- builder.add("-source", sourceVersion);
- }
- if (!targetVersion.isEmpty()) {
- builder.add("-target", targetVersion);
- }
- if (!encoding.isEmpty()) {
- builder.add("-encoding", encoding);
- }
- if (!xlint.isEmpty()) {
- builder.add("-Xlint:" + Joiner.on(",").join(xlint));
- }
- this.options = builder.addAll(misc).build();
+ this.javacopts = checkNotNull(javacopts, "javacopts must not be null");
}
/**
* @return the list of options as given by the {@code java_toolchain} rule.
*/
public ImmutableList<String> getJavacOptions() {
- return options;
+ return javacopts;
}
/**
@@ -93,14 +67,6 @@ public class JavaToolchainData {
return jvmOpts;
}
- public String getSourceVersion() {
- return sourceVersion;
- }
-
- public String getTargetVersion() {
- return targetVersion;
- }
-
public Iterable<String> getBootclasspath() {
return bootclasspath;
}
@@ -109,10 +75,6 @@ public class JavaToolchainData {
return extclasspath;
}
- public String getEncoding() {
- return encoding;
- }
-
public boolean getJavacSupportsWorkers() {
return javacSupportsWorkers;
}
diff --git a/src/main/java/com/google/devtools/build/lib/rules/java/JavaToolchainProvider.java b/src/main/java/com/google/devtools/build/lib/rules/java/JavaToolchainProvider.java
index d1866203f2..2306e24b5b 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/java/JavaToolchainProvider.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/java/JavaToolchainProvider.java
@@ -84,11 +84,8 @@ public class JavaToolchainProvider extends ToolchainInfo {
ImmutableList<JavaPluginConfigurationProvider> pluginConfiguration) {
return new JavaToolchainProvider(
label,
- data.getSourceVersion(),
- data.getTargetVersion(),
bootclasspath,
extclasspath,
- data.getEncoding(),
javac,
tools,
javaBuilder,
@@ -114,11 +111,8 @@ public class JavaToolchainProvider extends ToolchainInfo {
}
private final Label label;
- private final String sourceVersion;
- private final String targetVersion;
private final NestedSet<Artifact> bootclasspath;
private final NestedSet<Artifact> extclasspath;
- private final String encoding;
private final Artifact javac;
private final NestedSet<Artifact> tools;
private final FilesToRunProvider javaBuilder;
@@ -139,11 +133,8 @@ public class JavaToolchainProvider extends ToolchainInfo {
private JavaToolchainProvider(
Label label,
- String sourceVersion,
- String targetVersion,
NestedSet<Artifact> bootclasspath,
NestedSet<Artifact> extclasspath,
- String encoding,
Artifact javac,
NestedSet<Artifact> tools,
FilesToRunProvider javaBuilder,
@@ -164,11 +155,8 @@ public class JavaToolchainProvider extends ToolchainInfo {
super(ImmutableMap.of(), Location.BUILTIN);
this.label = label;
- this.sourceVersion = sourceVersion;
- this.targetVersion = targetVersion;
this.bootclasspath = bootclasspath;
this.extclasspath = extclasspath;
- this.encoding = encoding;
this.javac = javac;
this.tools = tools;
this.javaBuilder = javaBuilder;
@@ -193,16 +181,6 @@ public class JavaToolchainProvider extends ToolchainInfo {
return label;
}
- /** @return the input Java language level */
- public String getSourceVersion() {
- return sourceVersion;
- }
-
- /** @return the target Java language level */
- public String getTargetVersion() {
- return targetVersion;
- }
-
/** @return the target Java bootclasspath */
public NestedSet<Artifact> getBootclasspath() {
return bootclasspath;
@@ -213,11 +191,6 @@ public class JavaToolchainProvider extends ToolchainInfo {
return extclasspath;
}
- /** @return the encoding for Java source files */
- public String getEncoding() {
- return encoding;
- }
-
/** Returns the {@link Artifact} of the javac jar */
public Artifact getJavac() {
return javac;
diff --git a/src/main/java/com/google/devtools/build/lib/rules/java/JavaToolchainRule.java b/src/main/java/com/google/devtools/build/lib/rules/java/JavaToolchainRule.java
index d6961cbf1b..f3cdf60d5d 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/java/JavaToolchainRule.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/java/JavaToolchainRule.java
@@ -50,18 +50,18 @@ public final class JavaToolchainRule implements RuleDefinition {
The Java source version (e.g., '6' or '7'). It specifies which set of code structures
are allowed in the Java source code.
<!-- #END_BLAZE_RULE.ATTRIBUTE --> */
- .add(attr("source_version", STRING).mandatory()) // javac -source flag value.
+ .add(attr("source_version", STRING)) // javac -source flag value.
/* <!-- #BLAZE_RULE(java_toolchain).ATTRIBUTE(target_version) -->
The Java target version (e.g., '6' or '7'). It specifies for which Java runtime the class
should be build.
<!-- #END_BLAZE_RULE.ATTRIBUTE --> */
- .add(attr("target_version", STRING).mandatory()) // javac -target flag value.
+ .add(attr("target_version", STRING)) // javac -target flag value.
/* <!-- #BLAZE_RULE(java_toolchain).ATTRIBUTE(bootclasspath) -->
The Java target bootclasspath entries. Corresponds to javac's -bootclasspath flag.
<!-- #END_BLAZE_RULE.ATTRIBUTE --> */
.add(
attr("bootclasspath", LABEL_LIST)
- .mandatory()
+ .value(ImmutableList.of())
.cfg(HOST)
.allowedFileTypes(FileTypeSet.ANY_FILE))
/* <!-- #BLAZE_RULE(java_toolchain).ATTRIBUTE(extclasspath) -->
@@ -69,23 +69,27 @@ public final class JavaToolchainRule implements RuleDefinition {
<!-- #END_BLAZE_RULE.ATTRIBUTE --> */
.add(
attr("extclasspath", LABEL_LIST)
- .mandatory()
+ .value(ImmutableList.of())
.cfg(HOST)
.allowedFileTypes(FileTypeSet.ANY_FILE))
/* <!-- #BLAZE_RULE(java_toolchain).ATTRIBUTE(encoding) -->
The encoding of the java files (e.g., 'UTF-8').
<!-- #END_BLAZE_RULE.ATTRIBUTE --> */
- .add(attr("encoding", STRING).mandatory()) // javac -encoding flag value.
+ .add(attr("encoding", STRING)) // javac -encoding flag value.
/* <!-- #BLAZE_RULE(java_toolchain).ATTRIBUTE(xlint) -->
The list of warning to add or removes from default list. Precedes it with a dash to
removes it. Please see the Javac documentation on the -Xlint options for more information.
<!-- #END_BLAZE_RULE.ATTRIBUTE --> */
.add(attr("xlint", STRING_LIST).value(ImmutableList.<String>of()))
- /* <!-- #BLAZE_RULE(java_toolchain).ATTRIBUTE(misc) -->
+ .add(
+ attr("misc", STRING_LIST)
+ .undocumented("use javacopts instead")
+ .value(ImmutableList.<String>of()))
+ /* <!-- #BLAZE_RULE(java_toolchain).ATTRIBUTE(javacopts) -->
The list of extra arguments for the Java compiler. Please refer to the Java compiler
documentation for the extensive list of possible Java compiler flags.
<!-- #END_BLAZE_RULE.ATTRIBUTE --> */
- .add(attr("misc", STRING_LIST).value(ImmutableList.<String>of()))
+ .add(attr("javacopts", STRING_LIST).value(ImmutableList.<String>of()))
/* <!-- #BLAZE_RULE(java_toolchain).ATTRIBUTE(jvm_opts) -->
The list of arguments for the JVM when invoking the Java compiler. Please refer to the Java
virtual machine documentation for the extensive list of possible flags for this option.
diff --git a/src/main/java/com/google/devtools/build/lib/rules/java/JavaToolchainSkylarkApiProvider.java b/src/main/java/com/google/devtools/build/lib/rules/java/JavaToolchainSkylarkApiProvider.java
index c8ac5f2689..25bcc94278 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/java/JavaToolchainSkylarkApiProvider.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/java/JavaToolchainSkylarkApiProvider.java
@@ -18,6 +18,7 @@ import com.google.devtools.build.lib.actions.Artifact;
import com.google.devtools.build.lib.analysis.skylark.SkylarkApiProvider;
import com.google.devtools.build.lib.skylarkinterface.SkylarkCallable;
import com.google.devtools.build.lib.skylarkinterface.SkylarkModule;
+import java.util.Iterator;
/**
* A class that exposes the java_toolchain providers to Skylark. It is intended to provide a
@@ -32,27 +33,33 @@ public final class JavaToolchainSkylarkApiProvider extends SkylarkApiProvider {
public static final String NAME = "java_toolchain";
/** @return the input Java language level */
- @SkylarkCallable(
- name = "source_version",
- doc = "The java source version.",
- structField = true
- )
+ // TODO(cushon): remove this API; it bakes a deprecated detail of the javac API into Bazel
+ @SkylarkCallable(name = "source_version", doc = "The java source version.", structField = true)
public String getSourceVersion() {
JavaToolchainProvider javaToolchainProvider =
JavaToolchainProvider.from(getInfo());
- return javaToolchainProvider.getSourceVersion();
+ Iterator<String> it = javaToolchainProvider.getJavacOptions().iterator();
+ while (it.hasNext()) {
+ if (it.next().equals("-source") && it.hasNext()) {
+ return it.next();
+ }
+ }
+ return System.getProperty("java.specification.version");
}
/** @return the target Java language level */
- @SkylarkCallable(
- name = "target_version",
- doc = "The java target version.",
- structField = true
- )
+ // TODO(cushon): remove this API; it bakes a deprecated detail of the javac API into Bazel
+ @SkylarkCallable(name = "target_version", doc = "The java target version.", structField = true)
public String getTargetVersion() {
JavaToolchainProvider javaToolchainProvider =
JavaToolchainProvider.from(getInfo());
- return javaToolchainProvider.getTargetVersion();
+ Iterator<String> it = javaToolchainProvider.getJavacOptions().iterator();
+ while (it.hasNext()) {
+ if (it.next().equals("-target") && it.hasNext()) {
+ return it.next();
+ }
+ }
+ return System.getProperty("java.specification.version");
}
/** @return The {@link Artifact} of the javac jar */