// Copyright 2014 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.common.collect.ImmutableListMultimap;
import com.google.devtools.build.lib.actions.Artifact;
import com.google.devtools.build.lib.analysis.FilesToRunProvider;
import com.google.devtools.build.lib.analysis.RuleConfiguredTarget.Mode;
import com.google.devtools.build.lib.analysis.RuleContext;
import com.google.devtools.build.lib.analysis.TransitiveInfoProvider;
import com.google.devtools.build.lib.cmdline.Label;
import com.google.devtools.build.lib.collect.nestedset.NestedSet;
import com.google.devtools.build.lib.concurrent.ThreadSafety.Immutable;
import java.util.List;
import javax.annotation.Nullable;
/**
* Information about the JDK used by the <code>java_*</code> rules.
*/
@AutoValue
@Immutable
public abstract class JavaToolchainProvider implements TransitiveInfoProvider {
/** Returns the Java Toolchain associated with the rule being analyzed or {@code null}. */
public static JavaToolchainProvider fromRuleContext(RuleContext ruleContext) {
return ruleContext.getPrerequisite(":java_toolchain", Mode.TARGET, JavaToolchainProvider.class);
}
public static JavaToolchainProvider create(
Label label,
JavaToolchainData data,
NestedSet<Artifact> bootclasspath,
NestedSet<Artifact> extclasspath,
List<String> defaultJavacFlags,
Artifact javac,
Artifact javaBuilder,
@Nullable Artifact headerCompiler,
boolean forciblyDisableHeaderCompilation,
Artifact singleJar,
Artifact oneVersion,
Artifact oneVersionWhitelist,
Artifact genClass,
@Nullable Artifact resourceJarBuilder,
@Nullable Artifact timezoneData,
FilesToRunProvider ijar,
ImmutableListMultimap<String, String> compatibleJavacOptions) {
return new AutoValue_JavaToolchainProvider(
label,
data.getSourceVersion(),
data.getTargetVersion(),
bootclasspath,
extclasspath,
data.getEncoding(),
javac,
javaBuilder,
headerCompiler,
forciblyDisableHeaderCompilation,
singleJar,
oneVersion,
oneVersionWhitelist,
genClass,
resourceJarBuilder,
timezoneData,
ijar,
compatibleJavacOptions,
// merges the defaultJavacFlags from
// {@link JavaConfiguration} with the flags from the {@code java_toolchain} rule.
ImmutableList.<String>builder()
.addAll(data.getJavacOptions())
.addAll(defaultJavacFlags)
.build(),
data.getJvmOptions(),
data.getJavacSupportsWorkers());
}
/** Returns the label for this {@code java_toolchain}. */
public abstract Label getToolchainLabel();
/** @return the input Java language level */
public abstract String getSourceVersion();
/** @return the target Java language level */
public abstract String getTargetVersion();
/** @return the target Java bootclasspath */
public abstract NestedSet<Artifact> getBootclasspath();
/** @return the target Java extclasspath */
public abstract NestedSet<Artifact> getExtclasspath();
/** @return the encoding for Java source files */
public abstract String getEncoding();
/** Returns the {@link Artifact} of the javac jar */
public abstract Artifact getJavac();
/** Returns the {@link Artifact} of the JavaBuilder deploy jar */
public abstract Artifact getJavaBuilder();
/** @return the {@link Artifact} of the Header Compiler deploy jar */
@Nullable public abstract Artifact getHeaderCompiler();
/**
* Returns true if header compilation should be forcibly disabled, overriding
* --java_header_compilation.
*/
public abstract boolean getForciblyDisableHeaderCompilation();
/** Returns the {@link Artifact} of the SingleJar deploy jar */
public abstract Artifact getSingleJar();
/**
* Return the {@link Artifact} of the binary that enforces one-version compliance of java
* binaries.
*/
@Nullable
public abstract Artifact getOneVersionBinary();
/** Return the {@link Artifact} of the whitelist used by the one-version compliance checker. */
@Nullable
public abstract Artifact getOneVersionWhitelist();
/** Returns the {@link Artifact} of the GenClass deploy jar */
public abstract Artifact getGenClass();
@Nullable
public abstract Artifact getResourceJarBuilder();
/**
* Returns the {@link Artifact} of the latest timezone data resource jar that can be loaded by
* Java 8 binaries.
*/
@Nullable
public abstract Artifact getTimezoneData();
/** Returns the ijar executable */
public abstract FilesToRunProvider getIjar();
abstract ImmutableListMultimap<String, String> getCompatibleJavacOptions();
/** @return the map of target environment-specific javacopts. */
public ImmutableList<String> getCompatibleJavacOptions(String key) {
return getCompatibleJavacOptions().get(key);
}
/** @return the list of default options for the java compiler */
public abstract ImmutableList<String> getJavacOptions();
/**
* @return the list of default options for the JVM running the java compiler and associated tools.
*/
public abstract ImmutableList<String> getJvmOptions();
/** @return whether JavaBuilders supports running as a persistent worker or not */
public abstract boolean getJavacSupportsWorkers();
JavaToolchainProvider() {}
}