diff --git a/private/rules/javadoc.bzl b/private/rules/javadoc.bzl index 9b90570..c9b6f09 100644 --- a/private/rules/javadoc.bzl +++ b/private/rules/javadoc.bzl @@ -12,10 +12,43 @@ def generate_javadoc(ctx, javadoc, source_jars, classpath, javadocopts, output): arguments = [args], ) +def _get_prefix_strings(third_party_prefixes): + path_prefixes = [] + for prefix in third_party_prefixes: + if prefix.find(":") != -1: + fail("Target prefixes may only contain paths, not specific targets: %s" % prefix) + + if prefix.startswith("@"): + if len(prefix) > 1: + path_prefixes.append("external/%s" % prefix[1:].replace("//", "/")) + else: + # Allow all external dependencies to be ignored + path_prefixes.append("external/") + elif prefix.startswith("//"): + if len(prefix) < 3: + fail("Prefixes for targets within this workspace must contain a path") + path_prefixes.append(prefix[2:]) + + # Now we have the prefixes, ensure that they do not end with a slash + return [path[:-1] if path.endswith("/") else path for path in path_prefixes] + +def _path_match(file, prefixes): + short_path = file.dirname[len(file.root.path) + 1:] + + for prefix in prefixes: + if short_path.startswith(prefix): + return True + return False + def _javadoc_impl(ctx): + path_prefixes = _get_prefix_strings(ctx.attr.third_party_prefixes) sources = [] + for dep in ctx.attr.deps: - sources.extend(dep[JavaInfo].source_jars) + dep_srcs = dep[JavaInfo].transitive_source_jars.to_list() if ctx.attr.transitive else dep[JavaInfo].source_jars + for jar in dep_srcs: + if not _path_match(jar, path_prefixes): + sources.append(jar) jar_file = ctx.actions.declare_file("%s.jar" % ctx.attr.name) @@ -41,13 +74,23 @@ javadoc = rule( doc = """The java libraries to generate javadocs for. The source jars of each dep will be used to generate the javadocs. - Currently docs for transitive dependencies are not generated. + By default docs for transitive dependencies are not generated. """, mandatory = True, providers = [ [JavaInfo], ], ), + "transitive": attr.bool( + doc = "Whether to generate docs for transitive dependencies too.", + default = False, + ), + "third_party_prefixes": attr.string_list( + doc = """Label prefixes to exclude from javadoc generation. This designed + to allow merging of all first party javadocs into a single jar whilst not + including any javadocs for third party packages the code may depend on.""", + default = ["@maven//"], + ), "javadocopts": attr.string_list( doc = """javadoc options. Note sources and classpath are derived from the deps. Any additional