64 lines
		
	
	
	
		
			1.7 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			64 lines
		
	
	
	
		
			1.7 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
| 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.
 | |
| 
 | |
| """
 |