about summary refs log tree commit diff
path: root/third_party/bazel/rules_haskell/haskell/plugins.bzl
blob: 5769eeaf7ef6a86188817b329f98eb48fe516dfc (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
load(":providers.bzl", "GhcPluginInfo", "HaskellLibraryInfo")

def ghc_plugin_impl(ctx):
    args = ctx.attr.args
    args = [ctx.expand_location(arg, ctx.attr.tools) for arg in args]
    args = [ctx.expand_make_variables("args", arg, {}) for arg in args]

    # XXX Ideally we'd resolve tools downstream.
    (tool_inputs, tool_input_manifests) = ctx.resolve_tools(tools = ctx.attr.tools)
    return [
        GhcPluginInfo(
            module = ctx.attr.module,
            deps = ctx.attr.deps,
            tool_inputs = tool_inputs,
            tool_input_manifests = tool_input_manifests,
            args = args,
        ),
    ]

ghc_plugin = rule(
    ghc_plugin_impl,
    attrs = {
        "module": attr.string(
            doc = "Plugin entrypoint.",
        ),
        "deps": attr.label_list(
            doc = "Plugin dependencies. These are compile-time dependencies only.",
            providers = [HaskellLibraryInfo],
        ),
        "args": attr.string_list(
            doc = "Plugin options.",
        ),
        "tools": attr.label_list(
            doc = "Tools needed by the plugin when it used.",
        ),
    },
)
"""Declare a GHC plugin.

Example:
  ```bzl
  haskell_library(
      name = "plugin-lib",
      srcs = ["Plugin.hs"],
  )

  ghc_plugin(
      name = "plugin",
      module = "Plugin",
      deps = [":plugin-lib"],
  )

  haskell_binary(
      name = "some-binary",
      srcs = ["Main.hs"],
      plugins = [":plugin"],
  ```

Plugins to use during compilation by GHC are given by the `plugins`
attribute to Haskell rules. Plugins are haskell libraries with some
extra metadata, like the name of the module that acts as the
entrypoint for the plugin and plugin options.

"""