about summary refs log blame commit diff
path: root/third_party/bazel/rules_haskell/haskell/private/context.bzl
blob: 3cd3ff92cb65b44807b7c85f17223fd2b257e52d (plain) (tree)































































                                                                            
"""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()
    ])