@@ -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
344350def _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(
386395Create a symbolic link for each static library whose name doesn't match the
387396mangled 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+ )
0 commit comments