diff options
Diffstat (limited to 'third_party/bazel/rules_haskell/haskell/plugins.bzl')
-rw-r--r-- | third_party/bazel/rules_haskell/haskell/plugins.bzl | 64 |
1 files changed, 64 insertions, 0 deletions
diff --git a/third_party/bazel/rules_haskell/haskell/plugins.bzl b/third_party/bazel/rules_haskell/haskell/plugins.bzl new file mode 100644 index 000000000000..5769eeaf7ef6 --- /dev/null +++ b/third_party/bazel/rules_haskell/haskell/plugins.bzl @@ -0,0 +1,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. + +""" |