Skip to content

Commit

Permalink
Define user facing executable targets
Browse files Browse the repository at this point in the history
Defines a separate external workspace `@stackage-exe` for a
`stack_snapshot` named `@stackage` that will contain aliases pointing to
the Cabal executable targets to packages in `@stackage`.
  • Loading branch information
aherrmann committed Jun 4, 2020
1 parent ff7b4b6 commit f7dcf5f
Showing 1 changed file with 45 additions and 2 deletions.
47 changes: 45 additions & 2 deletions haskell/cabal.bzl
Original file line number Diff line number Diff line change
Expand Up @@ -1202,17 +1202,18 @@ haskell_cabal_library(
build_file_builder.append(
"""
haskell_cabal_binary(
name = "{name}_exe_{exe}",
name = "_{name}_exe_{exe}",
exe_name = "{exe}",
flags = {flags},
srcs = glob(["{dir}/**"]),
deps = {deps},
tools = {tools},
visibility = {visibility},
visibility = ["@{workspace}-exe//{name}:__pkg__"],
compiler_flags = ["-w", "-optF=-w"],
verbose = {verbose},
)
""".format(
workspace = repository_ctx.name,
name = package.name,
exe = exe,
flags = package.flags,
Expand Down Expand Up @@ -1246,6 +1247,41 @@ _stack_snapshot = repository_rule(
},
)

def _stack_executables_impl(repository_ctx):
workspace = repository_ctx.name[:-len("-exe")]
all_components = dicts.add(
_default_components,
repository_ctx.attr.components,
)
for (package, components) in all_components.items():
executables = _parse_components(package, components).exe
build_file_builder = []
build_file_builder.append(
"""load("@{workspace}//:packages.bzl", "packages")""".format(
workspace = workspace,
),
)
for exe in executables:
build_file_builder.append("""\
alias(
name = "{exe}",
actual = "@{workspace}//:_{package}_exe_{exe}",
visibility = ["//visibility:public"],
) if "{package}" in packages.keys() else None
""".format(
workspace = workspace,
package = package,
exe = exe,
))
repository_ctx.file(package + "/BUILD.bazel", executable = False, content = "\n".join(build_file_builder))

_stack_executables = repository_rule(
_stack_executables_impl,
attrs = {
"components": attr.string_list_dict(),
},
)

def _stack_update_impl(repository_ctx):
stack_cmd = repository_ctx.path(repository_ctx.attr.stack)
_execute_or_fail_loudly(repository_ctx, [stack_cmd, "update"])
Expand Down Expand Up @@ -1341,6 +1377,7 @@ _fetch_stack = repository_rule(
"""Find a suitably recent local Stack or download it."""

def stack_snapshot(
name,
stack = None,
extra_deps = {},
vendored_packages = {},
Expand Down Expand Up @@ -1430,6 +1467,7 @@ def stack_snapshot(
```
Args:
name: The name of the Bazel workspace.
snapshot: The name of a Stackage snapshot. Incompatible with local_snapshot.
local_snapshot: A custom Stack snapshot file, as per the Stack documentation.
Incompatible with snapshot.
Expand Down Expand Up @@ -1481,6 +1519,7 @@ def stack_snapshot(
stack = stack,
)
_stack_snapshot(
name = name,
stack = stack,
# Dependency for ordered execution, stack update before stack unpack.
stack_update = "@rules_haskell_stack_update//:stack_update",
Expand All @@ -1501,6 +1540,10 @@ def stack_snapshot(
verbose = verbose,
**kwargs
)
_stack_executables(
name = name + "-exe",
components = components,
)

def _expand_make_variables(name, ctx, strings):
extra_label_attrs = [
Expand Down

0 comments on commit f7dcf5f

Please sign in to comment.