2020-03-27 03:26:10 +03:00
|
|
|
# Copyright (c) 2020 Digital Asset (Switzerland) GmbH and/or its affiliates. All rights reserved.
|
2019-06-25 22:12:25 +03:00
|
|
|
# SPDX-License-Identifier: Apache-2.0
|
|
|
|
|
|
|
|
# This is a mixture of the javadoc_library rule in
|
|
|
|
# https://github.com/google/bazel-common and the one in
|
|
|
|
# https://github.com/stackb/rules_proto.
|
|
|
|
|
|
|
|
# The main two factors for why we need this are
|
|
|
|
|
|
|
|
# 1. We only have a source jar for java_proto_library.
|
|
|
|
# The rules in bazel-common do not support this.
|
|
|
|
|
|
|
|
# 2. We need to get the source jar via the JavaInfo provider.
|
|
|
|
# The rules in rules_proto do not support this.
|
|
|
|
|
|
|
|
# We probably want to clean this up and upstream it at some point.
|
|
|
|
|
|
|
|
def _javadoc_library(ctx):
|
|
|
|
transitive_deps = []
|
|
|
|
for dep in ctx.attr.deps:
|
|
|
|
if JavaInfo in dep:
|
|
|
|
transitive_deps.append(dep[JavaInfo].transitive_deps)
|
|
|
|
elif hasattr(dep, "java"):
|
|
|
|
transitive_deps.append(dep.java.transitive_deps)
|
|
|
|
|
|
|
|
classpath = depset([], transitive = transitive_deps).to_list()
|
|
|
|
|
|
|
|
java_home = str(ctx.attr._jdk[java_common.JavaRuntimeInfo].java_home)
|
|
|
|
|
|
|
|
javadoc_command = [
|
|
|
|
java_home + "/bin/javadoc",
|
2020-04-07 10:53:26 +03:00
|
|
|
# this is an ugly hack to provide all directories ending with `java` as a "source root"
|
|
|
|
'-sourcepath $(find . -type d -name "*java" -printf "%P:").',
|
2019-06-25 22:12:25 +03:00
|
|
|
" ".join(ctx.attr.root_packages),
|
|
|
|
"-use",
|
|
|
|
"-subpackages",
|
|
|
|
":".join(ctx.attr.root_packages),
|
|
|
|
"-encoding UTF8",
|
|
|
|
"-classpath",
|
|
|
|
":".join([jar.path for jar in classpath]),
|
|
|
|
"-notimestamp",
|
|
|
|
"-d tmp",
|
|
|
|
"-Xdoclint:-missing",
|
|
|
|
"-quiet",
|
|
|
|
]
|
|
|
|
|
|
|
|
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)
|
|
|
|
|
|
|
|
jar_command = "%s/bin/jar cf %s -C tmp ." % (java_home, ctx.outputs.jar.path)
|
|
|
|
|
2020-04-07 10:53:26 +03:00
|
|
|
unjar_params = []
|
|
|
|
srcs = []
|
|
|
|
for src in ctx.attr.srcs:
|
|
|
|
# this is for when the provided src is a java_library target
|
|
|
|
if JavaInfo in src:
|
|
|
|
for jar in src[JavaInfo].source_jars:
|
|
|
|
unjar_params.append(jar.path)
|
|
|
|
srcs.append(jar)
|
|
|
|
|
|
|
|
elif DefaultInfo in src:
|
|
|
|
srcs.extend(src[DefaultInfo].files.to_list())
|
|
|
|
unjar_command = "%s/bin/jar xf %s" % (java_home, " ".join(unjar_params))
|
2019-06-25 22:12:25 +03:00
|
|
|
|
|
|
|
ctx.actions.run_shell(
|
|
|
|
inputs = srcs + classpath + ctx.files._jdk,
|
|
|
|
command = "%s && %s && %s" % (unjar_command, " ".join(javadoc_command), jar_command),
|
|
|
|
outputs = [ctx.outputs.jar],
|
|
|
|
)
|
|
|
|
|
|
|
|
javadoc_library = rule(
|
|
|
|
attrs = {
|
|
|
|
"srcs": attr.label_list(
|
|
|
|
allow_empty = False,
|
|
|
|
allow_files = True,
|
|
|
|
),
|
|
|
|
"deps": attr.label_list(),
|
|
|
|
"doctitle": attr.string(default = ""),
|
|
|
|
"root_packages": attr.string_list(),
|
|
|
|
"exclude_packages": attr.string_list(),
|
|
|
|
"android_api_level": attr.int(default = -1),
|
|
|
|
"bottom_text": attr.string(default = ""),
|
|
|
|
"external_javadoc_links": attr.string_list(),
|
|
|
|
"_jdk": attr.label(
|
|
|
|
default = Label("@bazel_tools//tools/jdk:current_java_runtime"),
|
|
|
|
providers = [java_common.JavaRuntimeInfo],
|
|
|
|
),
|
|
|
|
},
|
|
|
|
outputs = {"jar": "%{name}.jar"},
|
|
|
|
implementation = _javadoc_library,
|
|
|
|
)
|