| # Copyright (C) 2016 The Android Open Source Project |
| # |
| # 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. |
| |
| # Javadoc rule. |
| |
| def _impl(ctx): |
| zip_output = ctx.outputs.zip |
| |
| transitive_jars = depset(transitive = [j[JavaInfo].transitive_deps for j in ctx.attr.libs]) |
| |
| # TODO(davido): Remove list to depset conversion on source_jars, when this issue is fixed: |
| # https://github.com/bazelbuild/bazel/issues/4221 |
| source_jars = depset(transitive = [depset(j[JavaInfo].source_jars) for j in ctx.attr.libs]) |
| |
| transitive_jar_paths = [j.path for j in transitive_jars.to_list()] |
| dir = ctx.outputs.zip.path + ".dir" |
| source = ctx.outputs.zip.path + ".source" |
| external_docs = ["https://docs.oracle.com/en/java/javase/11/docs/api"] + ctx.attr.external_docs |
| cmd = [ |
| "TZ=UTC", |
| "export TZ", |
| "rm -rf %s" % source, |
| "mkdir %s" % source, |
| " && ".join(["unzip -qoud %s %s" % (source, j.path) for j in source_jars.to_list()]), |
| "rm -rf %s" % dir, |
| "mkdir %s" % dir, |
| " ".join([ |
| "%s/bin/javadoc" % ctx.attr._jdk[java_common.JavaRuntimeInfo].java_home, |
| "-Xdoclint:-missing", |
| "-protected", |
| "-encoding UTF-8", |
| "-charset UTF-8", |
| "-notimestamp", |
| "-quiet", |
| "-windowtitle '%s'" % ctx.attr.title, |
| " ".join(["-link %s" % url for url in external_docs]), |
| "-sourcepath %s" % source, |
| "-subpackages ", |
| ":".join(ctx.attr.pkgs), |
| " -classpath ", |
| ":".join(transitive_jar_paths), |
| "-d %s" % dir, |
| ]), |
| "find %s -exec touch -t 198001010000 '{}' ';'" % dir, |
| "(cd %s && zip -Xqr ../%s *)" % (dir, ctx.outputs.zip.basename), |
| ] |
| ctx.actions.run_shell( |
| inputs = transitive_jars.to_list() + source_jars.to_list() + ctx.files._jdk, |
| outputs = [zip_output], |
| command = " && ".join(cmd), |
| ) |
| |
| _java_doc = rule( |
| attrs = { |
| "external_docs": attr.string_list(), |
| "libs": attr.label_list(allow_files = False), |
| "pkgs": attr.string_list(), |
| "title": attr.string(), |
| "_jdk": attr.label( |
| default = Label("@bazel_tools//tools/jdk:current_host_java_runtime"), |
| allow_files = True, |
| providers = [java_common.JavaRuntimeInfo], |
| ), |
| }, |
| outputs = {"zip": "%{name}.zip"}, |
| implementation = _impl, |
| ) |
| |
| def java_doc(**kwargs): |
| libs = kwargs.get("libs", []) |
| libs = libs + select({ |
| "//:java11": [], |
| "//:java_next": [], |
| # TODO(davido): Remove this dependency, when Java 8 support is removed. |
| # auto-value generates @javax.annotation.Generated annotation on generated |
| # classes when Java 8 source compatibility level is used, but Java 11 and |
| # later don't have this class any more. |
| "//conditions:default": ["//lib:javax-annotation"], |
| }) |
| _java_doc(**dict(kwargs, libs = libs)) |