Skip to content

Commit 62bdb62

Browse files
committed
support cc_shared_library as dep in haskell rules
Adds support for CcSharedLibraryInfo provider
1 parent 7fd1298 commit 62bdb62

File tree

3 files changed

+78
-20
lines changed

3 files changed

+78
-20
lines changed

haskell/cc.bzl

Lines changed: 22 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -156,6 +156,11 @@ def cc_interop_info(ctx, override_cc_toolchain = None):
156156
cc_libraries_info = deps_HaskellCcLibrariesInfo(
157157
ctx.attr.deps + getattr(ctx.attr, "plugins", []) + getattr(ctx.attr, "setup_deps", []),
158158
)
159+
160+
transitive_libraries = _transitive_libraries_from_attr(ctx, "deps")
161+
plugin_libraries = _transitive_libraries_from_attr(ctx, "plugins")
162+
setup_libraries = _transitive_libraries_from_attr(ctx, "setup_deps")
163+
159164
return CcInteropInfo(
160165
tools = struct(**tools),
161166
env = env,
@@ -171,22 +176,9 @@ def cc_interop_info(ctx, override_cc_toolchain = None):
171176
linker_flags = linker_flags,
172177
cc_libraries_info = cc_libraries_info,
173178
cc_libraries = get_cc_libraries(cc_libraries_info, [lib for li in cc_common.merge_cc_infos(cc_infos = ccs).linking_context.linker_inputs.to_list() for lib in li.libraries]),
174-
transitive_libraries = [lib for li in cc_common.merge_cc_infos(cc_infos = [
175-
dep[CcInfo]
176-
for dep in ctx.attr.deps
177-
if CcInfo in dep
178-
]).linking_context.linker_inputs.to_list() for lib in li.libraries],
179-
plugin_libraries = [lib for li in cc_common.merge_cc_infos(cc_infos = [
180-
dep[CcInfo]
181-
for plugin in getattr(ctx.attr, "plugins", [])
182-
for dep in plugin[GhcPluginInfo].deps
183-
if CcInfo in dep
184-
]).linking_context.linker_inputs.to_list() for lib in li.libraries],
185-
setup_libraries = [lib for li in cc_common.merge_cc_infos(cc_infos = [
186-
dep[CcInfo]
187-
for dep in getattr(ctx.attr, "setup_deps", [])
188-
if CcInfo in dep
189-
]).linking_context.linker_inputs.to_list() for lib in li.libraries],
179+
transitive_libraries = transitive_libraries,
180+
plugin_libraries = plugin_libraries,
181+
setup_libraries = setup_libraries,
190182
)
191183

192184
def ghc_cc_program_args(hs, cc, ld):
@@ -237,3 +229,17 @@ def ghc_cc_program_args(hs, cc, ld):
237229
"-r",
238230
])
239231
return args
232+
233+
def _transitive_libraries_from_attr(ctx, attr_name):
234+
cc_infos = [
235+
input[CcInfo]
236+
for input in getattr(ctx.attr, attr_name, [])
237+
if CcInfo in input
238+
]
239+
cc_shared_library_infos = [
240+
input[CcSharedLibraryInfo]
241+
for input in getattr(ctx.attr, attr_name, [])
242+
if CcSharedLibraryInfo in input
243+
]
244+
linker_inputs = cc_common.merge_cc_infos(cc_infos = cc_infos).linking_context.linker_inputs.to_list() + [info.linker_input for info in cc_shared_library_infos]
245+
return [lib for li in linker_inputs for lib in li.libraries]

haskell/private/cc_libraries.bzl

Lines changed: 50 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -290,6 +290,7 @@ def extend_HaskellCcLibrariesInfo(
290290
ctx,
291291
cc_libraries_info,
292292
cc_info,
293+
cc_shared_info,
293294
is_haskell):
294295
"""Adapt new LibraryToLink and add to HaskellCcLibrariesInfo.
295296
@@ -301,6 +302,7 @@ def extend_HaskellCcLibrariesInfo(
301302
ctx: Aspect or rule context.
302303
cc_libraries_info: HaskellCcLibrariesInfo of all dependencies.
303304
cc_info: CcInfo of the current target.
305+
cc_shared_info: CcSharedLibraryInfo of the current target.
304306
is_haskell: Bool, whether the current target is a Haskell library.
305307
306308
Returns:
@@ -309,7 +311,11 @@ def extend_HaskellCcLibrariesInfo(
309311
posix = ctx.toolchains["@rules_sh//sh/posix:toolchain_type"]
310312
libraries = dict(cc_libraries_info.libraries)
311313

312-
for li in cc_info.linking_context.linker_inputs.to_list():
314+
linker_inputs = cc_info.linking_context.linker_inputs.to_list() if cc_info else []
315+
if cc_shared_info:
316+
linker_inputs.append(cc_shared_info.linker_input)
317+
318+
for li in linker_inputs:
313319
for lib_to_link in li.libraries:
314320
key = cc_library_key(lib_to_link)
315321
if key in libraries:
@@ -343,7 +349,7 @@ def extend_HaskellCcLibrariesInfo(
343349

344350
def _haskell_cc_libraries_aspect_impl(target, ctx):
345351
if HaskellProtobufInfo in target:
346-
# haskell_cc_libraries_aspect depends on the CcInfo and optionally
352+
# haskell_cc_libraries_aspect depends on the CcInfo, CcSharedLibraryInfo and optionally
347353
# HaskellInfo providers of a target. In the case of proto_library
348354
# targets these providers are returned by the _haskell_proto_aspect.
349355
# That aspect in turn requires HaskellCcLibrariesInfo in all its
@@ -361,11 +367,14 @@ def _haskell_cc_libraries_aspect_impl(target, ctx):
361367
if HaskellCcLibrariesInfo in dep
362368
])
363369

364-
if CcInfo in target:
370+
cc_info = target[CcInfo] if CcInfo in target else None
371+
cc_shared_info = target[CcSharedLibraryInfo] if CcSharedLibraryInfo in target else None
372+
if cc_info or cc_shared_info:
365373
cc_libraries_info = extend_HaskellCcLibrariesInfo(
366374
ctx = ctx,
367375
cc_libraries_info = cc_libraries_info,
368-
cc_info = target[CcInfo],
376+
cc_info = cc_info,
377+
cc_shared_info = cc_shared_info,
369378
is_haskell = HaskellInfo in target,
370379
)
371380

@@ -386,3 +395,40 @@ haskell_cc_libraries_aspect = aspect(
386395
Create a symbolic link for each static library whose name doesn't match the
387396
mangled name of the corresponding dynamic library.
388397
"""
398+
399+
def merge_cc_shared_library_infos(owner, cc_shared_library_infos):
400+
"""Similar to cc_common.merge_cc_infos but for CcSharedLibraryInfo
401+
402+
Args:
403+
owner: The label of the target that produced all files used in this input.
404+
cc_shared_library_infos: CcSharedLibraryInfo providers to be merged.
405+
406+
Returns:
407+
CcSharedLibraryInfo
408+
"""
409+
dynamic_deps = []
410+
exports = []
411+
link_once_static_libs = {}
412+
transitive_dynamic_deps = []
413+
libraries_to_link = []
414+
for cc_shared_library_info in cc_shared_library_infos:
415+
dynamic_dep_entry = struct(
416+
exports = cc_shared_library_info.exports,
417+
linker_input = cc_shared_library_info.linker_input,
418+
link_once_static_libs = cc_shared_library_info.link_once_static_libs,
419+
)
420+
dynamic_deps.append(dynamic_dep_entry)
421+
transitive_dynamic_deps.append(cc_shared_library_info.dynamic_deps)
422+
libraries_to_link.extend(cc_shared_library_info.linker_input.libraries)
423+
link_once_static_libs.update(pairs = cc_shared_library_info.link_once_static_libs)
424+
exports.extend(cc_shared_library_info.exports)
425+
426+
return CcSharedLibraryInfo(
427+
dynamic_deps = depset(direct = dynamic_deps, transitive = transitive_dynamic_deps, order = "topological"),
428+
exports = exports,
429+
link_once_static_libs = link_once_static_libs,
430+
linker_input = cc_common.create_linker_input(
431+
owner = owner,
432+
libraries = depset(libraries_to_link),
433+
),
434+
)

haskell/private/haskell_impl.bzl

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ load(
2323
)
2424
load(":private/actions/package.bzl", "package")
2525
load(":private/actions/runghc.bzl", "build_haskell_runghc")
26+
load(":private/cc_libraries.bzl", "merge_cc_shared_library_infos")
2627
load(":private/context.bzl", "haskell_context")
2728
load(":private/dependencies.bzl", "gather_dep_info")
2829
load(":private/expansions.bzl", "haskell_library_expand_make_variables")
@@ -710,10 +711,15 @@ def haskell_library_impl(ctx):
710711
),
711712
] + [dep[CcInfo] for dep in deps if CcInfo in dep],
712713
)
714+
out_cc_shared_library_info = merge_cc_shared_library_infos(
715+
owner = ctx.label,
716+
cc_shared_library_infos = [dep[CcSharedLibraryInfo] for dep in deps if CcSharedLibraryInfo in dep],
717+
)
713718

714719
return [
715720
hs_info,
716721
out_cc_info,
722+
out_cc_shared_library_info,
717723
coverage_info,
718724
default_info,
719725
lib_info,

0 commit comments

Comments
 (0)