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.
"""
|