From f7c08ec6d73ef691b03f843e0c2c3dbe766df584 Mon Sep 17 00:00:00 2001 From: Simon Mavi Stewart Date: Wed, 19 Jan 2022 17:33:23 +0000 Subject: [PATCH] Make PMD binary configurable To follow in the lead of spotbugs and checkstyle. --- README.md | 45 ++++++++++++++++++++++++++++- docs/stardoc-input.bzl | 2 ++ java/BUILD.bazel | 5 ++-- java/defs.bzl | 3 +- java/private/pmd.bzl | 13 +++------ java/private/pmd_ruleset.bzl | 56 ++++++++++++++++++++++++++++++++++++ 6 files changed, 110 insertions(+), 14 deletions(-) diff --git a/README.md b/README.md index c62bc548..6b81eb10 100644 --- a/README.md +++ b/README.md @@ -110,7 +110,7 @@ Use checkstyle to lint the `srcs`. ## pmd_ruleset
-pmd_ruleset(name, format, rulesets, shallow)
+pmd_ruleset(name, format, pmd_binary, rulesets, shallow)
 
Select a rule set for PMD tests. @@ -122,6 +122,7 @@ Select a rule set for PMD tests. | :------------- | :------------- | :------------- | :------------- | :------------- | | name | A unique name for this target. | Name | required | | | format | Generate report in the given format. One of html, text, or xml (default is xml) | String | optional | "xml" | +| pmd_binary | PMD binary to use. | Label | optional | //java:pmd | | rulesets | Use these rulesets. | List of labels | optional | [] | | shallow | Use the targetted output to increase PMD's depth of processing | Boolean | optional | True | @@ -394,6 +395,48 @@ attribute to allow all the tests to be run in one go. | kwargs |

-

| none | + + +## pmd_binary + +
+pmd_binary(name, main_class, deps, runtime_deps, srcs, visibility, kwargs)
+
+ +Macro for quickly generating a `java_binary` target for use with `pmd_ruleset`. + +By default, this will set the `main_class` to point to the default one used by PMD +but it's ultimately a drop-replacement for a regular `java_binary` target. + +At least one of `runtime_deps`, `deps`, and `srcs` must be specified so that the +`java_binary` target will be valid. + +An example would be: + +```starlark +pmd_binary( + name = "pmd", + runtime_deps = [ + artifact("net.sourceforge.pmd:pmd-dist"), + ], +) +``` + + +**PARAMETERS** + + +| Name | Description | Default Value | +| :------------- | :------------- | :------------- | +| name | The name of the target | none | +| main_class | The main class to use for PMD. | "net.sourceforge.pmd.PMD" | +| deps | The deps required for compiling this binary. May be omitted. | None | +| runtime_deps | The deps required by PMD at runtime. May be omitted. | None | +| srcs | If you're compiling your own PMD binary, the sources to use. | None | +| visibility |

-

| ["//visibility:public"] | +| kwargs |

-

| none | + + ## spotbugs_binary diff --git a/docs/stardoc-input.bzl b/docs/stardoc-input.bzl index c35f5d98..cd1ba9f2 100644 --- a/docs/stardoc-input.bzl +++ b/docs/stardoc-input.bzl @@ -9,6 +9,7 @@ load( _java_library = "java_library", _java_test = "java_test", _java_test_suite = "java_test_suite", + _pmd_binary = "pmd_binary", _pmd_ruleset = "pmd_ruleset", _pmd_test = "pmd_test", _spotbugs_binary = "spotbugs_binary", @@ -25,6 +26,7 @@ java_library = _java_library java_junit5_test = _java_junit5_test java_test = _java_test java_test_suite = _java_test_suite +pmd_binary = _pmd_binary pmd_ruleset = _pmd_ruleset pmd_test = _pmd_test spotbugs_binary = _spotbugs_binary diff --git a/java/BUILD.bazel b/java/BUILD.bazel index 7899d188..1956977e 100644 --- a/java/BUILD.bazel +++ b/java/BUILD.bazel @@ -1,8 +1,8 @@ load("@bazel_skylib//:bzl_library.bzl", "bzl_library") load("//java/private:artifact.bzl", "artifact") load("//java/private:checkstyle_config.bzl", "checkstyle_binary", "checkstyle_config") +load("//java/private:pmd_ruleset.bzl", "pmd_binary", "pmd_ruleset") load("//java/private:spotbugs_config.bzl", "spotbugs_binary", "spotbugs_config") -load("//java/private:pmd_ruleset.bzl", "pmd_ruleset") package(default_visibility = ["//visibility:public"]) @@ -33,9 +33,8 @@ checkstyle_binary( ] ) -java_binary( +pmd_binary( name = "pmd", - main_class = "net.sourceforge.pmd.PMD", runtime_deps = [ artifact("net.sourceforge.pmd:pmd-dist"), ], diff --git a/java/defs.bzl b/java/defs.bzl index be89571e..36ee498b 100644 --- a/java/defs.bzl +++ b/java/defs.bzl @@ -18,7 +18,7 @@ load( _java_test = "java_test", ) load("//java/private:pmd.bzl", _pmd_test = "pmd_test") -load("//java/private:pmd_ruleset.bzl", _pmd_ruleset = "pmd_ruleset") +load("//java/private:pmd_ruleset.bzl", _pmd_binary = "pmd_binary", _pmd_ruleset = "pmd_ruleset") load("//java/private:spotbugs.bzl", _spotbugs_test = "spotbugs_test") load( "//java/private:spotbugs_config.bzl", @@ -36,6 +36,7 @@ java_test = _java_test java_test_suite = _java_test_suite JUNIT5_DEPS = _JUNIT5_DEPS JUNIT5_VINTAGE_DEPS = _JUNIT5_VINTAGE_DEPS +pmd_binary = _pmd_binary pmd_ruleset = _pmd_ruleset pmd_test = _pmd_test spotbugs_binary = _spotbugs_binary diff --git a/java/private/pmd.bzl b/java/private/pmd.bzl index a381405f..389d727d 100644 --- a/java/private/pmd.bzl +++ b/java/private/pmd.bzl @@ -1,8 +1,10 @@ load(":pmd_ruleset.bzl", "PmdInfo") def _pmd_test_impl(ctx): + pmd_info = ctx.attr.ruleset[PmdInfo] + cmd = [ - ctx.executable._pmd.short_path, + pmd_info.binary.short_path, ] # We want to disable the suggestion to use the analysis cache @@ -12,8 +14,6 @@ def _pmd_test_impl(ctx): inputs = [] transitive_inputs = depset() - pmd_info = ctx.attr.ruleset[PmdInfo] - file_list = ctx.actions.declare_file("%s-pmd-srcs" % ctx.label.name) ctx.actions.write( file_list, @@ -50,7 +50,7 @@ def _pmd_test_impl(ctx): return DefaultInfo( executable = out, - runfiles = runfiles.merge(ctx.attr._pmd[DefaultInfo].default_runfiles), + runfiles = runfiles.merge(ctx.attr.ruleset[DefaultInfo].default_runfiles), ) pmd_test = rule( @@ -71,11 +71,6 @@ pmd_test = rule( [PmdInfo], ], ), - "_pmd": attr.label( - cfg = "exec", - executable = True, - default = "//java:pmd", - ), }, executable = True, test = True, diff --git a/java/private/pmd_ruleset.bzl b/java/private/pmd_ruleset.bzl index 1d46d36e..baf86964 100644 --- a/java/private/pmd_ruleset.bzl +++ b/java/private/pmd_ruleset.bzl @@ -1,8 +1,56 @@ + +def pmd_binary( + name, + main_class = "net.sourceforge.pmd.PMD", + deps = None, + runtime_deps = None, + srcs = None, + visibility = ["//visibility:public"], + **kwargs): + """Macro for quickly generating a `java_binary` target for use with `pmd_ruleset`. + + By default, this will set the `main_class` to point to the default one used by PMD + but it's ultimately a drop-replacement for a regular `java_binary` target. + + At least one of `runtime_deps`, `deps`, and `srcs` must be specified so that the + `java_binary` target will be valid. + + An example would be: + + ```starlark + pmd_binary( + name = "pmd", + runtime_deps = [ + artifact("net.sourceforge.pmd:pmd-dist"), + ], + ) + ``` + + Args: + name: The name of the target + main_class: The main class to use for PMD. + deps: The deps required for compiling this binary. May be omitted. + runtime_deps: The deps required by PMD at runtime. May be omitted. + srcs: If you're compiling your own PMD binary, the sources to use. + """ + + native.java_binary( + name = name, + main_class = main_class, + srcs = srcs, + deps = deps, + runtime_deps = runtime_deps, + visibility = visibility, + **kwargs + ) + + PmdInfo = provider( fields = { "format": "The format to generate reports in", "rulesets": "Depset of files containing rulesets", "shallow": "Whether to use target outputs as part of processing", + "binary": "The PMD binary to use", }, ) @@ -10,11 +58,13 @@ def _pmd_ruleset_impl(ctx): return [ DefaultInfo( files = depset(ctx.files.rulesets), + runfiles = ctx.attr.pmd_binary[DefaultInfo].default_runfiles, ), PmdInfo( rulesets = depset(ctx.files.rulesets), format = ctx.attr.format, shallow = ctx.attr.shallow, + binary = ctx.executable.pmd_binary, ), ] @@ -35,6 +85,12 @@ pmd_ruleset = rule( doc = "Use the targetted output to increase PMD's depth of processing", default = True, ), + "pmd_binary": attr.label( + doc = "PMD binary to use.", + default = "//java:pmd", + executable = True, + cfg = "exec", + ), }, provides = [ PmdInfo,