Skip to content

Commit 9a78923

Browse files
committed
attach worker config to the toolchain
1 parent a050eba commit 9a78923

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
@@ -427,20 +427,22 @@ def _common_compile_module_args(
427427
external_tool_paths: list[RunInfo],
428428
sources: list[Artifact],
429429
direct_deps_info: list[HaskellLibraryInfoTSet],
430+
allow_worker: bool,
430431
pkgname: str | None = None,
431-
worker_plugin: Dependency | None = None,
432432
) -> CommonCompileModuleArgs:
433433
command = cmd_args(ghc_wrapper)
434434
command.add("--ghc", haskell_toolchain.compiler)
435435
command.add("--ghc-dir", haskell_toolchain.ghc_dir)
436436

437-
if haskell_toolchain.use_worker and worker_plugin != None:
437+
if allow_worker and haskell_toolchain.use_worker and haskell_toolchain.use_worker_multiplexer:
438+
if haskell_toolchain.worker_multiplexer_plugin == None:
439+
fail("'worker_multiplexer_plugin' must be set on the toolchain if 'use_worker_multiplexer' is true")
438440
if pkgname == None:
439-
warning("Module {} has no 'pkgname', plugin worker will break".format(label))
441+
warning("Module {} has no 'pkgname', worker multiplexer will break".format(label))
440442
else:
441443
pkg_deps = resolved[haskell_toolchain.packages.dynamic]
442444
package_db = pkg_deps.providers[DynamicHaskellPackageDbInfo].packages
443-
db = package_db[worker_plugin[HaskellToolchainLibrary].name]
445+
db = package_db[haskell_toolchain.worker_multiplexer_plugin[HaskellToolchainLibrary].name]
444446
command.add("--plugin-db", db.value.db)
445447
command.add("--worker-target-id", pkgname)
446448

@@ -760,8 +762,8 @@ def _dynamic_do_compile_impl(actions, artifacts, dynamic_values, outputs, arg):
760762
enable_profiling = arg.enable_profiling,
761763
link_style = arg.link_style,
762764
direct_deps_info = arg.direct_deps_info,
765+
allow_worker = arg.allow_worker,
763766
pkgname = arg.pkgname,
764-
worker_plugin = arg.worker_plugin,
765767
)
766768

767769
md = artifacts[arg.md_file].read_json()
@@ -813,7 +815,6 @@ def compile(
813815
enable_profiling: bool,
814816
enable_haddock: bool,
815817
md_file: Artifact,
816-
worker_plugin: Dependency | None,
817818
worker: WorkerInfo | None = None,
818819
pkgname: str | None = None) -> CompileResultInfo:
819820
artifact_suffix = get_artifact_suffix(link_style, enable_profiling)
@@ -875,7 +876,7 @@ def compile(
875876
srcs_envs = ctx.attrs.srcs_envs,
876877
toolchain_deps_by_name = toolchain_deps_by_name,
877878
worker = worker,
878-
worker_plugin = worker_plugin,
879+
allow_worker = ctx.attrs.allow_worker,
879880
),
880881
))
881882

haskell/haskell.bzl

Lines changed: 10 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -631,7 +631,6 @@ def _build_haskell_lib(
631631
md_file = md_file,
632632
pkgname = pkgname,
633633
worker = _persistent_worker(ctx),
634-
worker_plugin = ctx.attrs._worker_plugin if ctx.label.cell != "prelude" and ctx.attrs._haskell_toolchain[HaskellToolchainInfo].use_worker else None,
635634
)
636635
solibs = {}
637636
artifact_suffix = get_artifact_suffix(link_style, enable_profiling)
@@ -1195,7 +1194,6 @@ def haskell_binary_impl(ctx: AnalysisContext) -> list[Provider]:
11951194
md_file = md_file,
11961195
worker = _persistent_worker(ctx),
11971196
pkgname = pkgname,
1198-
worker_plugin = ctx.attrs._worker_plugin if hasattr(ctx.attrs, "_worker_plugin") else None,
11991197
)
12001198

12011199
haskell_toolchain = ctx.attrs._haskell_toolchain[HaskellToolchainInfo]
@@ -1478,20 +1476,20 @@ worker = anon_rule(
14781476
"srcs_deps": attrs.dict(attrs.string(), attrs.dep(), default = {}),
14791477
"srcs_envs": attrs.dict(attrs.string(), attrs.string(), default = {}),
14801478
"template_deps": attrs.list(attrs.dep(), default = []),
1481-
# N.B. the _worker_* attrs are only treated by the call site of the anon_target
1482-
"_worker_deps": attrs.default_only(attrs.list(attrs.dep(), default = [])),
1483-
"_worker_srcs": attrs.default_only(attrs.list(attrs.source(), default = [])),
1479+
# N.B. allow_worker is only treated by the call site of the anon_target
1480+
"allow_worker": attrs.bool(),
14841481
} | native_common.link_style(),
14851482
artifact_promise_mappings = {
14861483
"worker": lambda x: x[DefaultInfo].default_outputs[0],
14871484
},
14881485
)
14891486

14901487
def _persistent_worker(ctx: AnalysisContext) -> WorkerInfo | None:
1491-
if ctx.label.cell == "prelude":
1488+
if not ctx.attrs.allow_worker:
14921489
return None
14931490

1494-
if not ctx.attrs._haskell_toolchain[HaskellToolchainInfo].use_worker:
1491+
tc = ctx.attrs._haskell_toolchain[HaskellToolchainInfo]
1492+
if not tc.use_worker:
14951493
return None
14961494

14971495
worker_target = ctx.actions.anon_target(
@@ -1501,20 +1499,21 @@ def _persistent_worker(ctx: AnalysisContext) -> WorkerInfo | None:
15011499
"_generate_target_metadata": ctx.attrs._generate_target_metadata,
15021500
"_ghc_wrapper": ctx.attrs._ghc_wrapper,
15031501
"_haskell_toolchain": ctx.attrs._haskell_toolchain,
1504-
"deps": ctx.attrs._worker_deps,
1502+
"deps": tc.worker_deps,
15051503
"link_style": "shared",
15061504
"name": "prelude//haskell:worker",
1507-
"srcs": ctx.attrs._worker_srcs,
1508-
"compiler_flags": ctx.attrs._worker_compiler_flags + [
1505+
"srcs": tc.worker_srcs_multiplexer if tc.use_worker_multiplexer else tc.worker_srcs,
1506+
"compiler_flags": tc.worker_compiler_flags + [
15091507
"-O2",
15101508
],
1511-
"linker_flags": ctx.attrs._worker_compiler_flags + [
1509+
"linker_flags": [
15121510
"-dynamic",
15131511
"-rtsopts=all",
15141512
"-with-rtsopts=-K512M -H -I5 -T",
15151513
"-threaded",
15161514
"-O2",
15171515
],
1516+
"allow_worker": False,
15181517
},
15191518
)
15201519
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)