blob: e7d1146b198873d6199aac703f29712b0f148a61 [file] [log] [blame]
# 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
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# See the License for the specific language governing permissions and
# limitations under the License.
""" Definition of javadoc_library. """
def _check_non_empty(value, name):
if not value:
fail("%s must be non-empty" % name)
def _android_jar(android_api_level):
if android_api_level == -1:
return None
return Label("@androidsdk//:platforms/android-%s/android.jar" % android_api_level)
def _javadoc_library(ctx):
_check_non_empty(ctx.attr.root_packages, "root_packages")
transitive_deps = [ for dep in ctx.attr.deps]
if ctx.attr._android_jar:
classpath = depset([], transitive = transitive_deps).to_list()
include_packages = ":".join(ctx.attr.root_packages)
javadoc_command = [
"%s/bin/javadoc" % ctx.attr._jdk[java_common.JavaRuntimeInfo].java_home,
"-sourcepath srcs",
"-encoding UTF8",
":".join([jar.path for jar in classpath]),
"-d tmp",
if ctx.attr.doctitle:
javadoc_command.append('-doctitle "%s"' % ctx.attr.doctitle)
if ctx.attr.exclude_packages:
javadoc_command.append("-exclude %s" % ":".join(ctx.attr.exclude_packages))
for link in ctx.attr.external_javadoc_links:
javadoc_command.append("-linkoffline {0} {0}".format(link))
if ctx.attr.bottom_text:
javadoc_command.append("-bottom '%s'" % ctx.attr.bottom_text)
srcs = depset(transitive = [src.files for src in ctx.attr.srcs]).to_list()
prepare_srcs_command = "mkdir srcs && "
path_prefixes = [x.replace(".", "/") for x in ctx.attr.root_packages]
for path_prefix in path_prefixes:
prepare_srcs_command = "mkdir -p srcs/%s && " % (path_prefix)
for src in srcs:
if src.path.endswith(".jar"):
prepare_srcs_command += "unzip -qq -B %s -d srcs && " % src.path
elif src.path.endswith(".java"):
for path_prefix in path_prefixes:
if path_prefix in src.path:
prepare_srcs_command += "cp %s srcs/%s && " % (src.path, path_prefix)
jar_binary = "%s/bin/jar" % ctx.attr._jdk[java_common.JavaRuntimeInfo].java_home
jar_command = "%s cf %s -C tmp ." % (jar_binary, ctx.outputs.jar.path)
inputs = srcs + classpath + ctx.files._jdk,
command = "%s %s && %s" % (prepare_srcs_command, " ".join(javadoc_command), jar_command),
outputs = [ctx.outputs.jar],
javadoc_library = rule(
attrs = {
"srcs": attr.label_list(allow_files = True),
"deps": attr.label_list(),
"doctitle": attr.string(default = ""),
"root_packages": attr.string_list(),
"exclude_packages": attr.string_list(),
"android_api_level": = -1),
"bottom_text": attr.string(default = ""),
"external_javadoc_links": attr.string_list(),
"_android_jar": attr.label(
default = _android_jar,
allow_single_file = True,
"_jdk": attr.label(
default = Label("@bazel_tools//tools/jdk:current_java_runtime"),
allow_files = True,
providers = [java_common.JavaRuntimeInfo],
outputs = {"jar": "%{name}.jar"},
implementation = _javadoc_library,
Generates a Javadoc jar path/to/target/<name>.jar.
srcs: source files to process. This might contain .java files or gen_rule that
generates source jars.
deps: targets that contain references to other types referenced in Javadoc. This can be the
java_library/android_library target(s) for the same sources
root_packages: Java packages to include in generated Javadoc. Any subpackages not listed in
exclude_packages will be included as well
exclude_packages: Java packages to exclude from generated Javadoc
android_api_level: If Android APIs are used, the API level to compile against to generate
doctitle: title for Javadoc's index.html. See javadoc -doctitle
bottom_text: text passed to javadoc's `-bottom` flag
external_javadoc_links: a list of URLs that are passed to Javadoc's `-linkoffline` flag