Skip to content

Commit ed8370b

Browse files
committed
Support the multiplexing worker
1 parent cc71ebd commit ed8370b

File tree

4 files changed

+35
-2
lines changed

4 files changed

+35
-2
lines changed

decls/haskell_rules.bzl

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -70,6 +70,7 @@ haskell_binary = prelude_rule(
7070
"_worker_srcs": attrs.list(attrs.source(), default = worker_srcs),
7171
"_worker_deps": attrs.list(attrs.dep(), default = ["@prelude//haskell/worker:{}".format(pkg) for pkg in worker_libs]),
7272
"_worker_compiler_flags": attrs.list(attrs.string(), default = worker_flags),
73+
"_worker_plugin": attrs.dep(default = "@prelude//haskell/worker:ghc-persistent-worker-plugin"),
7374
}
7475
),
7576
)
@@ -195,6 +196,7 @@ haskell_library = prelude_rule(
195196
"_worker_srcs": attrs.list(attrs.source(), default = worker_srcs),
196197
"_worker_deps": attrs.list(attrs.dep(), default = ["@prelude//haskell/worker:{}".format(pkg) for pkg in worker_libs]),
197198
"_worker_compiler_flags": attrs.list(attrs.string(), default = worker_flags),
199+
"_worker_plugin": attrs.dep(default = "@prelude//haskell/worker:ghc-persistent-worker-plugin"),
198200
}
199201
),
200202
)

haskell/compile.bzl

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -438,11 +438,21 @@ def _common_compile_module_args(
438438
sources: list[Artifact],
439439
direct_deps_info: list[HaskellLibraryInfoTSet],
440440
pkgname: str | None = None,
441+
worker_plugin: Dependency | None = None,
441442
) -> CommonCompileModuleArgs:
442443
command = cmd_args(ghc_wrapper)
443444
command.add("--ghc", haskell_toolchain.compiler)
444445
command.add("--ghc-dir", haskell_toolchain.ghc_dir)
445446

447+
if haskell_toolchain.use_worker and worker_plugin != None:
448+
if pkgname == None:
449+
warning("Module {} has no 'pkgname', plugin worker will break".format(label))
450+
else:
451+
package_db = pkg_deps.providers[DynamicHaskellPackageDbInfo].packages
452+
db = package_db[worker_plugin[HaskellToolchainLibrary].name]
453+
command.add("--plugin-db", db.value.db)
454+
command.add("--worker-target-id", pkgname)
455+
446456
# Some rules pass in RTS (e.g. `+RTS ... -RTS`) options for GHC, which can't
447457
# be parsed when inside an argsfile.
448458
command.add(haskell_toolchain.compiler_flags)
@@ -754,6 +764,7 @@ def _dynamic_do_compile_impl(actions, md_file, pkg_deps, arg, direct_deps_by_nam
754764
link_style = arg.link_style,
755765
direct_deps_info = arg.direct_deps_info,
756766
pkgname = arg.pkgname,
767+
worker_plugin = arg.worker_plugin,
757768
)
758769

759770
md = md_file.read_json()
@@ -814,6 +825,7 @@ def compile(
814825
enable_profiling: bool,
815826
enable_haddock: bool,
816827
md_file: Artifact,
828+
worker_plugin: Dependency | None,
817829
worker: WorkerInfo | None = None,
818830
pkgname: str | None = None) -> CompileResultInfo:
819831
artifact_suffix = get_artifact_suffix(link_style, enable_profiling)
@@ -871,6 +883,7 @@ def compile(
871883
srcs_envs = ctx.attrs.srcs_envs,
872884
toolchain_deps_by_name = toolchain_deps_by_name,
873885
worker = worker,
886+
worker_plugin = worker_plugin,
874887
),
875888
))
876889

haskell/haskell.bzl

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -648,6 +648,7 @@ 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,
651652
)
652653
solibs = {}
653654
artifact_suffix = get_artifact_suffix(link_style, enable_profiling)
@@ -1211,13 +1212,19 @@ def haskell_binary_impl(ctx: AnalysisContext) -> list[Provider]:
12111212

12121213
md_file = target_metadata(ctx, sources = ctx.attrs.srcs)
12131214

1215+
# Provisional hack to have a worker ID
1216+
libname = repr(ctx.label.path).replace("//", "_").replace("/", "_") + "_" + ctx.label.name
1217+
pkgname = libname.replace("_", "-")
1218+
12141219
compiled = compile(
12151220
ctx,
12161221
link_style,
12171222
enable_profiling = enable_profiling,
12181223
enable_haddock = False,
12191224
md_file = md_file,
12201225
worker = _persistent_worker(ctx),
1226+
pkgname = pkgname,
1227+
worker_plugin = ctx.attrs._worker_plugin if hasattr(ctx.attrs, "_worker_plugin") else None,
12211228
)
12221229

12231230
haskell_toolchain = ctx.attrs._haskell_toolchain[HaskellToolchainInfo]

haskell/worker/worker.bzl

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,22 @@
11
worker_libs = [
22
"base",
3+
"binary",
34
"bytestring",
45
"containers",
56
"deepseq",
67
"exceptions",
8+
"extra",
79
"filepath",
810
"ghc",
11+
"ghc-persistent-worker-plugin",
912
"grpc-haskell",
13+
"network",
14+
"process",
1015
"proto3-suite",
1116
"proto3-wire",
17+
"stm",
1218
"text",
19+
"transformers",
1320
"vector",
1421
"unix",
1522
]
@@ -22,8 +29,12 @@ worker_srcs = [
2229
"@prelude//haskell/worker/impl/plugin/src:Internal/Error.hs",
2330
"@prelude//haskell/worker/impl/plugin/src:Internal/Log.hs",
2431
"@prelude//haskell/worker/impl/plugin/src:Internal/Session.hs",
32+
"@prelude//haskell/worker/impl/server/app:Server.hs",
33+
"@prelude//haskell/worker/impl/server/app:Pool.hs",
34+
"@prelude//haskell/worker/impl/server/app:Worker.hs",
35+
"@prelude//haskell/worker/impl/comm/src:Message.hs",
2536
"@prelude//haskell/worker/impl/buck-worker:Args.hs",
26-
"@prelude//haskell/worker/impl/buck-worker:Main.hs",
37+
"@prelude//haskell/worker/impl/buck-worker-2:Main.hs",
2738
"@prelude//haskell/worker/impl/buck-worker:BuckWorker.hs",
2839
]
2940

@@ -36,6 +47,6 @@ worker_flags = [
3647
"-XDuplicateRecordFields",
3748
"-XOverloadedRecordDot",
3849
"-XStrictData",
39-
"-XNoFieldSelectors",
50+
# "-XNoFieldSelectors",
4051
"-XLambdaCase",
4152
]

0 commit comments

Comments
 (0)