blob: 93fc1a45dc4dcc94ea575cde97567812fcd4fdbe [file] [log] [blame]
// 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.starlarkbuildapi.java;
import com.google.devtools.build.docgen.annot.DocCategory;
import com.google.devtools.build.docgen.annot.StarlarkConstructor;
import com.google.devtools.build.lib.collect.nestedset.Depset;
import com.google.devtools.build.lib.packages.RuleClass.ConfiguredTargetFactory.RuleErrorException;
import com.google.devtools.build.lib.packages.semantics.BuildLanguageOptions;
import com.google.devtools.build.lib.starlarkbuildapi.FileApi;
import com.google.devtools.build.lib.starlarkbuildapi.core.ProviderApi;
import com.google.devtools.build.lib.starlarkbuildapi.core.StructApi;
import com.google.devtools.build.lib.starlarkbuildapi.cpp.CcInfoApi;
import com.google.devtools.build.lib.starlarkbuildapi.java.JavaPluginInfoApi.JavaPluginDataApi;
import javax.annotation.Nullable;
import net.starlark.java.annot.Param;
import net.starlark.java.annot.ParamType;
import net.starlark.java.annot.StarlarkBuiltin;
import net.starlark.java.annot.StarlarkMethod;
import net.starlark.java.eval.EvalException;
import net.starlark.java.eval.NoneType;
import net.starlark.java.eval.Sequence;
import net.starlark.java.eval.StarlarkThread;
/** Info object encapsulating all information by java rules. */
@StarlarkBuiltin(
name = "JavaInfo",
doc = "A provider encapsulating information about Java and Java-like targets.",
category = DocCategory.PROVIDER)
public interface JavaInfoApi<
FileT extends FileApi,
JavaOutputT extends JavaOutputApi<FileT>,
JavaPluginDataT extends JavaPluginDataApi>
extends StructApi, JavaPluginInfoApi<FileT, JavaPluginDataT, JavaOutputT> {
@StarlarkMethod(
name = "transitive_runtime_jars",
doc = "Returns a transitive set of Jars required on the target's runtime classpath.",
structField = true)
Depset getTransitiveRuntimeJars();
@StarlarkMethod(
name = "transitive_compile_time_jars",
doc = "Returns the transitive set of Jars required to build the target.",
structField = true)
Depset getTransitiveCompileTimeJars();
@StarlarkMethod(
name = "compile_jars",
doc =
"Returns the Jars required by this target directly at compile time. They can be"
+ " interface jars (ijar or hjar), regular jars or both, depending on whether rule"
+ " implementations chose to create interface jars or not.",
structField = true)
Depset getCompileTimeJars();
@StarlarkMethod(
name = "full_compile_jars",
doc =
"Returns the regular, full compile time Jars required by this target directly. They can"
+ " be <ul><li> the corresponding regular Jars of the interface Jars returned by"
+ " <code><a class=\"anchor\""
+ " href=\"#compile_jars\">JavaInfo.compile_jars</a></code></li><li>"
+ " the regular (full) Jars returned by <code><a class=\"anchor\""
+ " href=\"#compile_jars\">JavaInfo.compile_jars</a></code></li></ul>"
+ "<p>Note: <code><a class=\"anchor\""
+ " href=\"#compile_jars\">JavaInfo.compile_jars</a></code> can return"
+ " a mix of interface Jars and regular Jars.<p>Only use this method if interface"
+ " Jars don't work with your rule set(s) (e.g. some Scala targets) If you're"
+ " working with Java-only targets it's preferable to use interface Jars via"
+ " <code><a class=\"anchor\""
+ " href=\"#compile_jars\">JavaInfo.compile_jars</a></code></li>",
structField = true)
Depset getFullCompileTimeJars();
@StarlarkMethod(
name = "source_jars",
doc =
"Returns a list of Jars with all the source files (including those generated by"
+ " annotations) of the target itself, i.e. NOT including the sources of the"
+ " transitive dependencies.",
structField = true)
Sequence<FileT> getSourceJars();
@StarlarkMethod(
name = "outputs",
doc =
"Returns information about outputs of this Java/Java-like target. Deprecated: use"
+ " java_outputs.",
structField = true,
allowReturnNones = true)
@Nullable
@Deprecated
JavaRuleOutputJarsProviderApi<?> getOutputJars();
@StarlarkMethod(
name = "annotation_processing",
structField = true,
allowReturnNones = true,
doc =
"Returns information about annotation processors applied on this Java/Java-like target."
+ "<p>Deprecated: Please use <code>plugins</code> instead (which returns information "
+ "about annotation processors to be applied by consuming targets).")
@Nullable
JavaAnnotationProcessingApi<?> getGenJarsProvider();
@StarlarkMethod(
name = "compilation_info",
structField = true,
allowReturnNones = true,
doc = "Returns compilation information for this Java/Java-like target.")
@Nullable
JavaCompilationInfoProviderApi<?> getCompilationInfoProvider();
@StarlarkMethod(
name = "runtime_output_jars",
doc = "Returns a list of runtime Jars created by this Java/Java-like target.",
structField = true)
Sequence<FileT> getRuntimeOutputJars();
@StarlarkMethod(
name = "transitive_deps",
doc =
"Deprecated: Please use <code><a class=\"anchor\" "
+ "href=\"#transitive_compile_time_jars\">JavaInfo.transitive_compile_time_jars</a></code>"
+ " instead. It returns the same value.",
structField = true)
Depset /*<FileT>*/ getTransitiveDeps();
@StarlarkMethod(
name = "transitive_runtime_deps",
doc =
"Deprecated: please use <code><a class=\"anchor\""
+ " href=\"#transitive_runtime_jars\">JavaInfo.transitive_runtime_jars"
+ "</a></code> instead. It returns the same value",
structField = true)
Depset /*<FileT>*/ getTransitiveRuntimeDeps();
@StarlarkMethod(
name = "transitive_source_jars",
doc =
"Returns the Jars containing source files of the current target and all of its"
+ " transitive dependencies.",
structField = true)
Depset /*<FileT>*/ getTransitiveSourceJars();
@StarlarkMethod(
name = "transitive_native_libraries",
structField = true,
doc = "Returns the transitive set of CC native libraries required by the target.")
Depset /*<LibraryToLink>*/ getTransitiveNativeLibrariesForStarlark();
@StarlarkMethod(
name = "cc_link_params_info",
structField = true,
doc = "C++ libraries to be linked into Java targets.",
enableOnlyWithFlag = BuildLanguageOptions.EXPERIMENTAL_GOOGLE_LEGACY_API)
CcInfoApi<FileT> getCcLinkParamInfo();
@StarlarkMethod(
name = "module_flags_info",
doc = "Returns the Java module flag configuration.",
structField = true)
JavaModuleFlagsProviderApi getJavaModuleFlagsInfo();
@StarlarkMethod(
name = "_transitive_full_compile_time_jars",
documented = false,
structField = true)
Depset getTransitiveFullCompileJars();
@StarlarkMethod(name = "_compile_time_java_dependencies", documented = false, structField = true)
Depset getCompileTimeJavaDependencies();
/** Provider class for {@link JavaInfoApi} objects. */
@StarlarkBuiltin(name = "Provider", documented = false, doc = "")
interface JavaInfoProviderApi extends ProviderApi {
@StarlarkMethod(
name = "JavaInfo",
doc = "The <code>JavaInfo</code> constructor.",
parameters = {
@Param(
name = "output_jar",
named = true,
doc =
"The jar that was created as a result of a compilation "
+ "(e.g. javac, scalac, etc)."),
@Param(
name = "compile_jar",
allowedTypes = {
@ParamType(type = FileApi.class),
@ParamType(type = NoneType.class),
},
named = true,
doc =
"A jar that is added as the compile-time dependency in lieu of "
+ "<code>output_jar</code>. Typically this is the ijar produced by "
+ "<code><a class=\"anchor\" href=\"../toplevel/java_common.html#run_ijar\">"
+ "run_ijar</a></code>. "
+ "If you cannot use ijar, consider instead using the output of "
+ "<code><a class=\"anchor\" href=\"../toplevel/java_common.html#stamp_jar\">"
+ "stamp_ijar</a></code>. If you do not wish to use either, "
+ "you can simply pass <code>output_jar</code>. "
+ "There are a couple of special cases when this parameter may be set to "
+ "<code>None</code>, for example adding a jar with resources or when used in"
+ " a terminal rule like <code>java_binary</code>."),
@Param(
name = "source_jar",
allowedTypes = {
@ParamType(type = FileApi.class),
@ParamType(type = NoneType.class),
},
named = true,
defaultValue = "None",
doc =
"The source jar that was used to create the output jar. Use <code><a"
+ " class=\"anchor\""
+ " href=\"../toplevel/java_common.html#pack_sources\">pack_sources</a>"
+ "</code> to produce this source jar."),
@Param(
name = "compile_jdeps",
allowedTypes = {
@ParamType(type = FileApi.class),
@ParamType(type = NoneType.class),
},
named = true,
defaultValue = "None",
doc =
"jdeps information about compile time dependencies to be consumed by"
+ " JavaCompileAction. This should be a binary proto encoded using the"
+ " deps.proto protobuf included with Bazel. If available this file is"
+ " typically produced by a header compiler."),
@Param(
name = "generated_class_jar",
allowedTypes = {
@ParamType(type = FileApi.class),
@ParamType(type = NoneType.class),
},
named = true,
defaultValue = "None",
doc =
"A jar file containing class files compiled from sources generated during"
+ " annotation processing."),
@Param(
name = "generated_source_jar",
allowedTypes = {
@ParamType(type = FileApi.class),
@ParamType(type = NoneType.class),
},
named = true,
defaultValue = "None",
doc = "The source jar that was created as a result of annotation processing."),
@Param(
name = "native_headers_jar",
allowedTypes = {
@ParamType(type = FileApi.class),
@ParamType(type = NoneType.class),
},
named = true,
defaultValue = "None",
doc =
"A jar containing CC header files supporting native method implementation"
+ " (typically output of javac -h)."),
@Param(
name = "manifest_proto",
allowedTypes = {
@ParamType(type = FileApi.class),
@ParamType(type = NoneType.class),
},
named = true,
defaultValue = "None",
doc =
"Manifest information for the rule output (if available). This should be a"
+ " binary proto encoded using the manifest.proto protobuf included with"
+ " Bazel. IDEs and other tools can use this information for more efficient"
+ " processing."),
@Param(
name = "neverlink",
named = true,
defaultValue = "False",
doc = "If true only use this library for compilation and not at runtime."),
@Param(
name = "deps",
allowedTypes = {@ParamType(type = Sequence.class, generic1 = JavaInfoApi.class)},
named = true,
defaultValue = "[]",
doc = "Compile time dependencies that were used to create the output jar."),
@Param(
name = "runtime_deps",
allowedTypes = {@ParamType(type = Sequence.class, generic1 = JavaInfoApi.class)},
named = true,
defaultValue = "[]",
doc = "Runtime dependencies that are needed for this library."),
@Param(
name = "exports",
allowedTypes = {@ParamType(type = Sequence.class, generic1 = JavaInfoApi.class)},
named = true,
defaultValue = "[]",
doc =
"Libraries to make available for users of this library. See also <a"
+ " class=\"anchor\""
+ " href=\"$BE_ROOT/java.html#java_library.exports\">"
+ "java_library.exports</a>."),
@Param(
name = "exported_plugins",
named = true,
allowedTypes = {
@ParamType(type = Sequence.class, generic1 = JavaPluginInfoApi.class)
},
defaultValue = "[]",
doc = "A list of exported plugins. Optional."),
@Param(
name = "jdeps",
allowedTypes = {
@ParamType(type = FileApi.class),
@ParamType(type = NoneType.class),
},
named = true,
defaultValue = "None",
doc =
"jdeps information for the rule output (if available). This should be a binary"
+ " proto encoded using the deps.proto protobuf included with Bazel. If"
+ " available this file is typically produced by a compiler. IDEs and other"
+ " tools can use this information for more efficient processing."),
@Param(
name = "native_libraries",
allowedTypes = {@ParamType(type = Sequence.class, generic1 = CcInfoApi.class)},
named = true,
defaultValue = "[]",
doc = "CC native library dependencies that are needed for this library."),
},
selfCall = true,
useStarlarkThread = true)
@StarlarkConstructor
JavaInfoApi<?, ?, ?> javaInfo(
FileApi outputJarApi,
Object compileJarApi,
Object sourceJarApi,
Object compileJdepsApi,
Object generatedClassJarApi,
Object generatedSourceJarApi,
Object nativeHeadersJarApi,
Object manifestProtoApi,
Boolean neverlink,
Sequence<?> deps,
Sequence<?> runtimeDeps,
Sequence<?> exports,
Sequence<?> exportedPlugins,
Object jdepsApi,
Sequence<?> nativeLibraries,
StarlarkThread thread)
throws EvalException, RuleErrorException;
}
}