Skip to content

Commit 8e967d3

Browse files
committed
repl: add support for cc_shared_library
1 parent 7e6b41d commit 8e967d3

File tree

1 file changed

+29
-2
lines changed

1 file changed

+29
-2
lines changed

haskell/repl.bzl

Lines changed: 29 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ load(
1414
"haskell_cc_libraries_aspect",
1515
"link_libraries",
1616
"merge_HaskellCcLibrariesInfo",
17+
"merge_cc_shared_library_infos",
1718
)
1819
load(":private/context.bzl", "haskell_context", "render_env")
1920
load(":private/expansions.bzl", "expand_make_variables")
@@ -48,6 +49,7 @@ HaskellReplLoadInfo = provider(
4849
"import_dirs": "Depset of Haskell import directories.",
4950
"cc_libraries_info": "HaskellCcLibrariesInfo of transitive C dependencies.",
5051
"cc_info": "CcInfo of transitive C dependencies.",
52+
"cc_shared_library_infos": "CcSharedLibraryInfo providers of transitive C dependencies.",
5153
"compiler_flags": "Flags to pass to the Haskell compiler.",
5254
"repl_ghci_args": "Arbitrary extra arguments to pass to GHCi. This extends `compiler_flags` and `repl_ghci_args` from the toolchain",
5355
"data_runfiles": "Runtime data dependencies of this target, i.e. the files and runfiles of the `data` attribute.",
@@ -68,6 +70,7 @@ HaskellReplDepInfo = provider(
6870
"interface_dirs": "Set of interface dirs for all the dependencies",
6971
"cc_libraries_info": "HaskellCcLibrariesInfo of transitive C dependencies.",
7072
"cc_info": "CcInfo of the package itself (includes its transitive dependencies).",
73+
"cc_shared_library_infos": "CcSharedLibraryInfo providers of transitive C dependencies.",
7174
"runfiles": "Runfiles of this target.",
7275
},
7376
)
@@ -146,6 +149,7 @@ def _merge_HaskellReplLoadInfo(load_infos):
146149
import_dirs = depset()
147150
cc_libraries_infos = []
148151
cc_infos = []
152+
cc_shared_library_infos = []
149153
compiler_flags = []
150154
repl_ghci_args = []
151155
data_runfiles = []
@@ -158,6 +162,7 @@ def _merge_HaskellReplLoadInfo(load_infos):
158162
import_dirs = depset(transitive = [import_dirs, load_info.import_dirs])
159163
cc_libraries_infos.append(load_info.cc_libraries_info)
160164
cc_infos.append(load_info.cc_info)
165+
cc_shared_library_infos.extend(load_info.cc_shared_library_infos)
161166
compiler_flags += load_info.compiler_flags
162167
repl_ghci_args += load_info.repl_ghci_args
163168
data_runfiles.append(load_info.data_runfiles)
@@ -171,6 +176,7 @@ def _merge_HaskellReplLoadInfo(load_infos):
171176
import_dirs = import_dirs,
172177
cc_libraries_info = merge_HaskellCcLibrariesInfo(infos = cc_libraries_infos),
173178
cc_info = cc_common.merge_cc_infos(cc_infos = cc_infos),
179+
cc_shared_library_infos = cc_shared_library_infos,
174180
compiler_flags = compiler_flags,
175181
repl_ghci_args = repl_ghci_args,
176182
data_runfiles = _merge_runfiles(data_runfiles),
@@ -180,11 +186,13 @@ def _merge_HaskellReplLoadInfo(load_infos):
180186
def _merge_HaskellReplLoadInfoMulti(root_info, load_infos):
181187
cc_libraries_infos = []
182188
cc_infos = []
189+
cc_shared_library_infos = []
183190
data_runfiles = []
184191
java_deps = []
185192
for load_info in load_infos:
186193
cc_libraries_infos.append(load_info.cc_libraries_info)
187194
cc_infos.append(load_info.cc_info)
195+
cc_shared_library_infos.extend(load_info.cc_shared_library_infos)
188196
data_runfiles.append(load_info.data_runfiles)
189197
java_deps.append(load_info.java_deps)
190198

@@ -197,6 +205,7 @@ def _merge_HaskellReplLoadInfoMulti(root_info, load_infos):
197205
import_dirs = root_info.import_dirs,
198206
cc_libraries_info = merge_HaskellCcLibrariesInfo(infos = cc_libraries_infos),
199207
cc_info = cc_common.merge_cc_infos(cc_infos = cc_infos),
208+
cc_shared_library_infos = cc_shared_library_infos,
200209
compiler_flags = root_info.compiler_flags,
201210
repl_ghci_args = root_info.repl_ghci_args,
202211
data_runfiles = _merge_runfiles(data_runfiles),
@@ -209,6 +218,7 @@ def _merge_HaskellReplDepInfo(dep_infos):
209218
interface_dirs = depset()
210219
cc_libraries_infos = []
211220
cc_infos = []
221+
cc_shared_library_infos = []
212222
runfiles = []
213223

214224
for dep_info in dep_infos:
@@ -217,6 +227,7 @@ def _merge_HaskellReplDepInfo(dep_infos):
217227
interface_dirs = depset(transitive = [interface_dirs, dep_info.interface_dirs])
218228
cc_libraries_infos.append(dep_info.cc_libraries_info)
219229
cc_infos.append(dep_info.cc_info)
230+
cc_shared_library_infos.extend(dep_info.cc_shared_library_infos)
220231
runfiles.append(dep_info.runfiles)
221232

222233
return HaskellReplDepInfo(
@@ -226,6 +237,7 @@ def _merge_HaskellReplDepInfo(dep_infos):
226237
interface_dirs = interface_dirs,
227238
cc_libraries_info = merge_HaskellCcLibrariesInfo(infos = cc_libraries_infos),
228239
cc_info = cc_common.merge_cc_infos(cc_infos = cc_infos),
240+
cc_shared_library_infos = cc_shared_library_infos,
229241
runfiles = _merge_runfiles(runfiles),
230242
)
231243

@@ -257,6 +269,11 @@ def _create_HaskellReplCollectInfo(target, dep_labels, dep_package_ids, dep_pack
257269
for dep in getattr(ctx.rule.attr, "deps", []) + getattr(ctx.rule.attr, "narrowed_deps", [])
258270
if CcInfo in dep and not HaskellInfo in dep
259271
]
272+
ccSharedLibraryInfoDeps = [
273+
dep
274+
for dep in getattr(ctx.rule.attr, "deps", []) + getattr(ctx.rule.attr, "narrowed_deps", [])
275+
if CcSharedLibraryInfo in dep and not HaskellInfo in dep
276+
]
260277
if HaskellLibraryInfo in target:
261278
package_id = target[HaskellLibraryInfo].package_id
262279
load_info = HaskellReplLoadInfo(
@@ -266,12 +283,19 @@ def _create_HaskellReplCollectInfo(target, dep_labels, dep_package_ids, dep_pack
266283
boot_files = hs_info.boot_files,
267284
module_names = hs_info.module_names,
268285
import_dirs = set.to_depset(hs_info.import_dirs),
269-
cc_libraries_info = deps_HaskellCcLibrariesInfo(ccInfoDeps),
286+
cc_libraries_info = deps_HaskellCcLibrariesInfo(ccInfoDeps + ccSharedLibraryInfoDeps),
270287
cc_info = cc_common.merge_cc_infos(cc_infos = [
271288
# Collect pure C library dependencies, no Haskell dependencies.
272289
dep[CcInfo]
273290
for dep in ccInfoDeps
274291
]),
292+
cc_shared_library_infos = [merge_cc_shared_library_infos(
293+
owner = ctx.label,
294+
cc_shared_library_infos = [
295+
dep[CcSharedLibraryInfo]
296+
for dep in ccSharedLibraryInfoDeps
297+
],
298+
)],
275299
compiler_flags = hs_info.user_compile_flags,
276300
repl_ghci_args = hs_info.user_repl_flags,
277301
data_runfiles = _data_runfiles(ctx, ctx.rule, "data"),
@@ -287,6 +311,7 @@ def _create_HaskellReplCollectInfo(target, dep_labels, dep_package_ids, dep_pack
287311
interface_dirs = hs_info.interface_dirs,
288312
cc_libraries_info = target[HaskellCcLibrariesInfo],
289313
cc_info = target[CcInfo],
314+
cc_shared_library_infos = [target[CcSharedLibraryInfo]] if CcSharedLibraryInfo in target else [],
290315
runfiles = target[DefaultInfo].default_runfiles,
291316
)
292317
dep_infos[target.label] = dep_info
@@ -484,7 +509,9 @@ def _compiler_flags_and_inputs(hs, cc, repl_info, get_dirname, static = False, i
484509
repl_info.load_info.cc_info,
485510
repl_info.dep_info.cc_info,
486511
])
487-
all_libraries = [lib for li in cc_info.linking_context.linker_inputs.to_list() for lib in li.libraries]
512+
cc_shared_library_infos = repl_info.load_info.cc_shared_library_infos + repl_info.dep_info.cc_shared_library_infos
513+
linker_inputs = cc_info.linking_context.linker_inputs.to_list() + [info.linker_input for info in cc_shared_library_infos]
514+
all_libraries = [lib for li in linker_inputs for lib in li.libraries]
488515
cc_libraries = get_cc_libraries(cc_libraries_info, all_libraries)
489516
if static:
490517
cc_library_files = _concat(get_library_files(hs, cc_libraries_info, cc_libraries))

0 commit comments

Comments
 (0)