Skip to content

Commit f25e09e

Browse files
committed
attach worker config to the toolchain
1 parent ed8370b commit f25e09e

File tree

6 files changed

+39
-33
lines changed

6 files changed

+39
-33
lines changed

decls/haskell_rules.bzl

Lines changed: 2 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,6 @@ load("@prelude//linking:types.bzl", "Linkage")
1414
load(":common.bzl", "LinkableDepType", "buck", "prelude_rule")
1515
load(":haskell_common.bzl", "haskell_common")
1616
load(":native_common.bzl", "native_common")
17-
load("@prelude//haskell/worker/worker.bzl", "worker_libs", "worker_srcs", "worker_flags")
1817

1918
haskell_binary = prelude_rule(
2019
name = "haskell_binary",
@@ -67,10 +66,7 @@ haskell_binary = prelude_rule(
6766
"linker_flags": attrs.list(attrs.arg(), default = []),
6867
"platform": attrs.option(attrs.string(), default = None),
6968
"platform_linker_flags": attrs.list(attrs.tuple(attrs.regex(), attrs.list(attrs.arg())), default = []),
70-
"_worker_srcs": attrs.list(attrs.source(), default = worker_srcs),
71-
"_worker_deps": attrs.list(attrs.dep(), default = ["@prelude//haskell/worker:{}".format(pkg) for pkg in worker_libs]),
72-
"_worker_compiler_flags": attrs.list(attrs.string(), default = worker_flags),
73-
"_worker_plugin": attrs.dep(default = "@prelude//haskell/worker:ghc-persistent-worker-plugin"),
69+
"allow_worker": attrs.bool(default = True),
7470
}
7571
),
7672
)
@@ -193,10 +189,7 @@ haskell_library = prelude_rule(
193189
"linker_flags": attrs.list(attrs.arg(), default = []),
194190
"platform": attrs.option(attrs.string(), default = None),
195191
"platform_linker_flags": attrs.list(attrs.tuple(attrs.regex(), attrs.list(attrs.arg())), default = []),
196-
"_worker_srcs": attrs.list(attrs.source(), default = worker_srcs),
197-
"_worker_deps": attrs.list(attrs.dep(), default = ["@prelude//haskell/worker:{}".format(pkg) for pkg in worker_libs]),
198-
"_worker_compiler_flags": attrs.list(attrs.string(), default = worker_flags),
199-
"_worker_plugin": attrs.dep(default = "@prelude//haskell/worker:ghc-persistent-worker-plugin"),
192+
"allow_worker": attrs.bool(default = True),
200193
}
201194
),
202195
)

haskell/compile.bzl

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -437,19 +437,21 @@ def _common_compile_module_args(
437437
external_tool_paths: list[RunInfo],
438438
sources: list[Artifact],
439439
direct_deps_info: list[HaskellLibraryInfoTSet],
440+
allow_worker: bool,
440441
pkgname: str | None = None,
441-
worker_plugin: Dependency | None = None,
442442
) -> CommonCompileModuleArgs:
443443
command = cmd_args(ghc_wrapper)
444444
command.add("--ghc", haskell_toolchain.compiler)
445445
command.add("--ghc-dir", haskell_toolchain.ghc_dir)
446446

447-
if haskell_toolchain.use_worker and worker_plugin != None:
447+
if allow_worker and haskell_toolchain.use_worker and haskell_toolchain.use_worker_multiplexer:
448+
if haskell_toolchain.worker_multiplexer_plugin == None:
449+
fail("'worker_multiplexer_plugin' must be set on the toolchain if 'use_worker_multiplexer' is true")
448450
if pkgname == None:
449-
warning("Module {} has no 'pkgname', plugin worker will break".format(label))
451+
warning("Module {} has no 'pkgname', worker multiplexer will break".format(label))
450452
else:
451453
package_db = pkg_deps.providers[DynamicHaskellPackageDbInfo].packages
452-
db = package_db[worker_plugin[HaskellToolchainLibrary].name]
454+
db = package_db[haskell_toolchain.worker_multiplexer_plugin[HaskellToolchainLibrary].name]
453455
command.add("--plugin-db", db.value.db)
454456
command.add("--worker-target-id", pkgname)
455457

@@ -763,8 +765,8 @@ def _dynamic_do_compile_impl(actions, md_file, pkg_deps, arg, direct_deps_by_nam
763765
enable_profiling = arg.enable_profiling,
764766
link_style = arg.link_style,
765767
direct_deps_info = arg.direct_deps_info,
768+
allow_worker = arg.allow_worker,
766769
pkgname = arg.pkgname,
767-
worker_plugin = arg.worker_plugin,
768770
)
769771

770772
md = md_file.read_json()
@@ -825,7 +827,6 @@ def compile(
825827
enable_profiling: bool,
826828
enable_haddock: bool,
827829
md_file: Artifact,
828-
worker_plugin: Dependency | None,
829830
worker: WorkerInfo | None = None,
830831
pkgname: str | None = None) -> CompileResultInfo:
831832
artifact_suffix = get_artifact_suffix(link_style, enable_profiling)
@@ -883,7 +884,7 @@ def compile(
883884
srcs_envs = ctx.attrs.srcs_envs,
884885
toolchain_deps_by_name = toolchain_deps_by_name,
885886
worker = worker,
886-
worker_plugin = worker_plugin,
887+
allow_worker = ctx.attrs.allow_worker,
887888
),
888889
))
889890

haskell/haskell.bzl

Lines changed: 10 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -648,7 +648,6 @@ def _build_haskell_lib(
648648
md_file = md_file,
649649
pkgname = pkgname,
650650
worker = _persistent_worker(ctx),
651-
worker_plugin = ctx.attrs._worker_plugin if ctx.label.cell != "prelude" and ctx.attrs._haskell_toolchain[HaskellToolchainInfo].use_worker else None,
652651
)
653652
solibs = {}
654653
artifact_suffix = get_artifact_suffix(link_style, enable_profiling)
@@ -1224,7 +1223,6 @@ def haskell_binary_impl(ctx: AnalysisContext) -> list[Provider]:
12241223
md_file = md_file,
12251224
worker = _persistent_worker(ctx),
12261225
pkgname = pkgname,
1227-
worker_plugin = ctx.attrs._worker_plugin if hasattr(ctx.attrs, "_worker_plugin") else None,
12281226
)
12291227

12301228
haskell_toolchain = ctx.attrs._haskell_toolchain[HaskellToolchainInfo]
@@ -1505,9 +1503,8 @@ worker = anon_rule(
15051503
"srcs_deps": attrs.dict(attrs.string(), attrs.dep(), default = {}),
15061504
"srcs_envs": attrs.dict(attrs.string(), attrs.string(), default = {}),
15071505
"template_deps": attrs.list(attrs.dep(), default = []),
1508-
# N.B. the _worker_* attrs are only treated by the call site of the anon_target
1509-
"_worker_deps": attrs.default_only(attrs.list(attrs.dep(), default = [])),
1510-
"_worker_srcs": attrs.default_only(attrs.list(attrs.source(), default = [])),
1506+
# N.B. allow_worker is only treated by the call site of the anon_target
1507+
"allow_worker": attrs.bool(),
15111508
}
15121509
| haskell_common.use_argsfile_at_link_arg()
15131510
| native_common.link_style(),
@@ -1517,10 +1514,11 @@ worker = anon_rule(
15171514
)
15181515

15191516
def _persistent_worker(ctx: AnalysisContext) -> WorkerInfo | None:
1520-
if ctx.label.cell == "prelude":
1517+
if not ctx.attrs.allow_worker:
15211518
return None
15221519

1523-
if not ctx.attrs._haskell_toolchain[HaskellToolchainInfo].use_worker:
1520+
tc = ctx.attrs._haskell_toolchain[HaskellToolchainInfo]
1521+
if not tc.use_worker:
15241522
return None
15251523

15261524
worker_target = ctx.actions.anon_target(
@@ -1530,21 +1528,22 @@ def _persistent_worker(ctx: AnalysisContext) -> WorkerInfo | None:
15301528
"_generate_target_metadata": ctx.attrs._generate_target_metadata,
15311529
"_ghc_wrapper": ctx.attrs._ghc_wrapper,
15321530
"_haskell_toolchain": ctx.attrs._haskell_toolchain,
1533-
"deps": ctx.attrs._worker_deps,
1531+
"deps": tc.worker_deps,
15341532
"link_style": "shared",
15351533
"name": "prelude//haskell:worker",
1536-
"srcs": ctx.attrs._worker_srcs,
1537-
"compiler_flags": ctx.attrs._worker_compiler_flags + [
1534+
"srcs": tc.worker_srcs_multiplexer if tc.use_worker_multiplexer else tc.worker_srcs,
1535+
"compiler_flags": tc.worker_compiler_flags + [
15381536
"-O2",
15391537
],
1540-
"linker_flags": ctx.attrs._worker_compiler_flags + [
1538+
"linker_flags": [
15411539
"-dynamic",
15421540
"-rtsopts=all",
15431541
"-with-rtsopts=-K512M -H -I5 -T",
15441542
"-threaded",
15451543
"-O2",
15461544
],
15471545
"use_argsfile_at_link": False,
1546+
"allow_worker": False,
15481547
},
15491548
)
15501549
return WorkerInfo(worker_target.artifact("worker"))

haskell/toolchain.bzl

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,12 @@ HaskellToolchainInfo = provider(
4141
"script_template_processor": provider_field(typing.Any, default = None),
4242
"packages": provider_field(typing.Any, default = None),
4343
"use_worker": provider_field(bool, default = False),
44+
"use_worker_multiplexer": provider_field(bool, default = False),
45+
"worker_multiplexer_plugin": provider_field(None | Dependency, default = None),
46+
"worker_srcs": provider_field(typing.Any, default = []),
47+
"worker_srcs_multiplexer": provider_field(typing.Any, default = []),
48+
"worker_deps": provider_field(typing.Any, default = []),
49+
"worker_compiler_flags": provider_field(typing.Any, default = []),
4450
"ghc_dir": provider_field(typing.Any, default = None),
4551
},
4652
)

haskell/worker/BUCK

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
11
load(":worker.bzl", "worker_libs")
22

33
[haskell_toolchain_library(name = pkg, visibility = ["PUBLIC"]) for pkg in worker_libs]
4+
5+
haskell_toolchain_library(name = "ghc-persistent-worker-plugin", visibility = ["PUBLIC"])

haskell/worker/worker.bzl

Lines changed: 11 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,6 @@ worker_libs = [
88
"extra",
99
"filepath",
1010
"ghc",
11-
"ghc-persistent-worker-plugin",
1211
"grpc-haskell",
1312
"network",
1413
"process",
@@ -21,21 +20,28 @@ worker_libs = [
2120
"unix",
2221
]
2322

24-
worker_srcs = [
23+
worker_srcs_shared = [
2524
"@prelude//haskell/worker/impl/plugin/src:Internal/AbiHash.hs",
2625
"@prelude//haskell/worker/impl/plugin/src:Internal/Args.hs",
2726
"@prelude//haskell/worker/impl/plugin/src:Internal/Cache.hs",
2827
"@prelude//haskell/worker/impl/plugin/src:Internal/Compile.hs",
2928
"@prelude//haskell/worker/impl/plugin/src:Internal/Error.hs",
3029
"@prelude//haskell/worker/impl/plugin/src:Internal/Log.hs",
3130
"@prelude//haskell/worker/impl/plugin/src:Internal/Session.hs",
31+
"@prelude//haskell/worker/impl/buck-worker:Args.hs",
32+
"@prelude//haskell/worker/impl/buck-worker:BuckWorker.hs",
33+
]
34+
35+
worker_srcs = worker_srcs_shared + [
36+
"@prelude//haskell/worker/impl/buck-worker:Main.hs",
37+
]
38+
39+
worker_srcs_multiplexer = worker_srcs_shared + [
40+
"@prelude//haskell/worker/impl/comm/src:Message.hs",
3241
"@prelude//haskell/worker/impl/server/app:Server.hs",
3342
"@prelude//haskell/worker/impl/server/app:Pool.hs",
3443
"@prelude//haskell/worker/impl/server/app:Worker.hs",
35-
"@prelude//haskell/worker/impl/comm/src:Message.hs",
36-
"@prelude//haskell/worker/impl/buck-worker:Args.hs",
3744
"@prelude//haskell/worker/impl/buck-worker-2:Main.hs",
38-
"@prelude//haskell/worker/impl/buck-worker:BuckWorker.hs",
3945
]
4046

4147
worker_flags = [
@@ -47,6 +53,5 @@ worker_flags = [
4753
"-XDuplicateRecordFields",
4854
"-XOverloadedRecordDot",
4955
"-XStrictData",
50-
# "-XNoFieldSelectors",
5156
"-XLambdaCase",
5257
]

0 commit comments

Comments
 (0)