aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/main/java/com/google/devtools/build/lib/rules/java/JavaConfiguration.java
diff options
context:
space:
mode:
Diffstat (limited to 'src/main/java/com/google/devtools/build/lib/rules/java/JavaConfiguration.java')
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/java/JavaConfiguration.java260
1 files changed, 260 insertions, 0 deletions
diff --git a/src/main/java/com/google/devtools/build/lib/rules/java/JavaConfiguration.java b/src/main/java/com/google/devtools/build/lib/rules/java/JavaConfiguration.java
new file mode 100644
index 0000000000..e1c6dc2b2e
--- /dev/null
+++ b/src/main/java/com/google/devtools/build/lib/rules/java/JavaConfiguration.java
@@ -0,0 +1,260 @@
+// Copyright 2014 Google Inc. 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.common.base.Joiner;
+import com.google.common.collect.ImmutableList;
+import com.google.common.collect.ImmutableMap.Builder;
+import com.google.devtools.build.lib.analysis.config.BuildConfiguration.Fragment;
+import com.google.devtools.build.lib.analysis.config.BuildConfiguration.StrictDepsMode;
+import com.google.devtools.build.lib.analysis.config.BuildOptions;
+import com.google.devtools.build.lib.analysis.config.InvalidConfigurationException;
+import com.google.devtools.build.lib.concurrent.ThreadSafety.Immutable;
+import com.google.devtools.build.lib.events.Event;
+import com.google.devtools.build.lib.events.EventHandler;
+import com.google.devtools.build.lib.syntax.Label;
+import com.google.devtools.build.lib.syntax.Label.SyntaxException;
+import com.google.devtools.build.lib.syntax.SkylarkCallable;
+import com.google.devtools.build.lib.syntax.SkylarkModule;
+import com.google.devtools.common.options.TriState;
+
+import java.util.List;
+
+/**
+ * A java compiler configuration containing the flags required for compilation.
+ */
+@Immutable
+@SkylarkModule(name = "java_configuration", doc = "A java compiler configuration")
+public final class JavaConfiguration extends Fragment {
+ /**
+ * Values for the --experimental_java_classpath option
+ */
+ public static enum JavaClasspathMode {
+ /** Use full transitive classpaths, the default behavior. */
+ OFF,
+ /** JavaBuilder computes the reduced classpath before invoking javac. */
+ JAVABUILDER,
+ /** Blaze computes the reduced classpath before invoking JavaBuilder. */
+ BLAZE
+ }
+
+ private final ImmutableList<String> commandLineJavacFlags;
+ private final Label javaLauncherLabel;
+ private final Label javaBuilderTop;
+ private final ImmutableList<String> defaultJavaBuilderJvmOpts;
+ private final Label javaLangtoolsJar;
+ private final boolean useIjars;
+ private final boolean generateJavaDeps;
+ private final JavaClasspathMode experimentalJavaClasspath;
+ private final ImmutableList<String> javaWarns;
+ private final ImmutableList<String> defaultJvmFlags;
+ private final ImmutableList<String> checkedConstraints;
+ private final StrictDepsMode strictJavaDeps;
+ private final Label javacBootclasspath;
+ private final ImmutableList<String> javacOpts;
+ private final TriState bundleTranslations;
+ private final ImmutableList<Label> translationTargets;
+ private final String javaCpu;
+
+ private final String cacheKey;
+ private Label javaToolchain;
+
+ JavaConfiguration(boolean generateJavaDeps,
+ List<String> defaultJvmFlags, JavaOptions javaOptions, Label javaToolchain, String javaCpu,
+ ImmutableList<String> defaultJavaBuilderJvmOpts) throws InvalidConfigurationException {
+ this.commandLineJavacFlags =
+ ImmutableList.copyOf(JavaHelper.tokenizeJavaOptions(javaOptions.javacOpts));
+ this.javaLauncherLabel = javaOptions.javaLauncher;
+ this.javaBuilderTop = javaOptions.javaBuilderTop;
+ this.defaultJavaBuilderJvmOpts = defaultJavaBuilderJvmOpts;
+ this.javaLangtoolsJar = javaOptions.javaLangtoolsJar;
+ this.useIjars = javaOptions.useIjars;
+ this.generateJavaDeps = generateJavaDeps;
+ this.experimentalJavaClasspath = javaOptions.experimentalJavaClasspath;
+ this.javaWarns = ImmutableList.copyOf(javaOptions.javaWarns);
+ this.defaultJvmFlags = ImmutableList.copyOf(defaultJvmFlags);
+ this.checkedConstraints = ImmutableList.copyOf(javaOptions.checkedConstraints);
+ this.strictJavaDeps = javaOptions.strictJavaDeps;
+ this.javacBootclasspath = javaOptions.javacBootclasspath;
+ this.javacOpts = ImmutableList.copyOf(javaOptions.javacOpts);
+ this.bundleTranslations = javaOptions.bundleTranslations;
+ this.javaCpu = javaCpu;
+ this.javaToolchain = javaToolchain;
+
+ ImmutableList.Builder<Label> translationsBuilder = ImmutableList.builder();
+ for (String s : javaOptions.translationTargets) {
+ try {
+ Label label = Label.parseAbsolute(s);
+ translationsBuilder.add(label);
+ } catch (SyntaxException e) {
+ throw new InvalidConfigurationException("Invalid translations target '" + s + "', make " +
+ "sure it uses correct absolute path syntax.", e);
+ }
+ }
+ this.translationTargets = translationsBuilder.build();
+
+ this.cacheKey = Joiner.on(" ").join(commandLineJavacFlags);
+ }
+
+ @SkylarkCallable(name = "default_javac_flags", structField = true,
+ doc = "The default flags for the Java compiler.")
+ // TODO(bazel-team): this is the command-line passed options, we should remove from skylark
+ // probably.
+ public List<String> getDefaultJavacFlags() {
+ return commandLineJavacFlags;
+ }
+
+ @Override
+ public String cacheKey() {
+ return cacheKey;
+ }
+
+ @Override
+ public void reportInvalidOptions(EventHandler reporter, BuildOptions buildOptions) {
+ if ((bundleTranslations == TriState.YES) && translationTargets.isEmpty()) {
+ reporter.handle(Event.error("Translations enabled, but no message translations specified. " +
+ "Use '--message_translations' to select the message translations to use"));
+ }
+ }
+
+ @Override
+ public void addGlobalMakeVariables(Builder<String, String> globalMakeEnvBuilder) {
+ globalMakeEnvBuilder.put("JAVA_TRANSLATIONS", buildTranslations() ? "1" : "0");
+ globalMakeEnvBuilder.put("JAVA_CPU", javaCpu);
+ }
+
+ /**
+ * Returns the Java cpu.
+ */
+ public String getJavaCpu() {
+ return javaCpu;
+ }
+
+ /**
+ * Returns the default javabuilder jar
+ */
+ public Label getDefaultJavaBuilderJar() {
+ return javaBuilderTop;
+ }
+
+ /**
+ * Returns the default JVM flags to be used when invoking javabuilder.
+ */
+ public ImmutableList<String> getDefaultJavaBuilderJvmFlags() {
+ return defaultJavaBuilderJvmOpts;
+ }
+
+ /**
+ * Returns the default java langtools jar
+ */
+ public Label getDefaultJavaLangtoolsJar() {
+ return javaLangtoolsJar;
+ }
+
+ /**
+ * Returns true iff Java compilation should use ijars.
+ */
+ public boolean getUseIjars() {
+ return useIjars;
+ }
+
+ /**
+ * Returns true iff dependency information is generated after compilation.
+ */
+ public boolean getGenerateJavaDeps() {
+ return generateJavaDeps;
+ }
+
+ public JavaClasspathMode getReduceJavaClasspath() {
+ return experimentalJavaClasspath;
+ }
+
+ /**
+ * Returns the extra warnings enabled for Java compilation.
+ */
+ public List<String> getJavaWarns() {
+ return javaWarns;
+ }
+
+ public List<String> getDefaultJvmFlags() {
+ return defaultJvmFlags;
+ }
+
+ public List<String> getCheckedConstraints() {
+ return checkedConstraints;
+ }
+
+ public StrictDepsMode getStrictJavaDeps() {
+ return strictJavaDeps;
+ }
+
+ public StrictDepsMode getFilteredStrictJavaDeps() {
+ StrictDepsMode strict = getStrictJavaDeps();
+ switch (strict) {
+ case STRICT:
+ case DEFAULT:
+ return StrictDepsMode.ERROR;
+ default: // OFF, WARN, ERROR
+ return strict;
+ }
+ }
+
+ /**
+ * @return proper label only if --java_launcher= is specified, otherwise null.
+ */
+ public Label getJavaLauncherLabel() {
+ return javaLauncherLabel;
+ }
+
+ public Label getJavacBootclasspath() {
+ return javacBootclasspath;
+ }
+
+ public List<String> getJavacOpts() {
+ return javacOpts;
+ }
+
+ @Override
+ public String getName() {
+ return "Java";
+ }
+
+ /**
+ * Returns the raw translation targets.
+ */
+ public List<Label> getTranslationTargets() {
+ return translationTargets;
+ }
+
+ /**
+ * Returns true if the we should build translations.
+ */
+ public boolean buildTranslations() {
+ return (bundleTranslations != TriState.NO) && !translationTargets.isEmpty();
+ }
+
+ /**
+ * Returns whether translations were explicitly disabled.
+ */
+ public boolean isTranslationsDisabled() {
+ return bundleTranslations == TriState.NO;
+ }
+
+ /**
+ * Returns the label of the default java_toolchain rule
+ */
+ public Label getToolchainLabel() {
+ return javaToolchain;
+ }
+}