"""Derived context with Haskell-specific fields and methods"""
load("@bazel_skylib//lib:paths.bzl", "paths")
HaskellContext = provider()
def haskell_context(ctx, attr = None):
toolchain = ctx.toolchains["@io_tweag_rules_haskell//haskell:toolchain"]
if not attr:
attr = ctx.attr
if hasattr(attr, "src_strip_prefix"):
src_strip_prefix = attr.src_strip_prefix
else:
src_strip_prefix = ""
src_root = paths.join(
ctx.label.workspace_root,
ctx.label.package,
src_strip_prefix,
)
env = {
"LANG": toolchain.locale,
}
if toolchain.locale_archive != None:
env["LOCALE_ARCHIVE"] = toolchain.locale_archive.path
coverage_enabled = False
if hasattr(ctx, "configuration"):
coverage_enabled = ctx.configuration.coverage_enabled
return HaskellContext(
# Fields
name = attr.name,
label = ctx.label,
toolchain = toolchain,
tools = toolchain.tools,
src_root = src_root,
package_root = ctx.label.workspace_root + ctx.label.package,
env = env,
mode = ctx.var["COMPILATION_MODE"],
actions = ctx.actions,
bin_dir = ctx.bin_dir,
genfiles_dir = ctx.genfiles_dir,
coverage_enabled = coverage_enabled,
)
def render_env(env):
"""Render environment dict to shell exports.
Example:
>>> render_env({"PATH": "foo:bar", "LANG": "lang"})
export PATH=foo:bar
export LANG=lang
"""
return "\n".join([
"export {}={}".format(k, v)
for k, v in env.items()
])