@@ -290,6 +290,7 @@ def extend_HaskellCcLibrariesInfo(
290
290
ctx ,
291
291
cc_libraries_info ,
292
292
cc_info ,
293
+ cc_shared_info ,
293
294
is_haskell ):
294
295
"""Adapt new LibraryToLink and add to HaskellCcLibrariesInfo.
295
296
@@ -301,6 +302,7 @@ def extend_HaskellCcLibrariesInfo(
301
302
ctx: Aspect or rule context.
302
303
cc_libraries_info: HaskellCcLibrariesInfo of all dependencies.
303
304
cc_info: CcInfo of the current target.
305
+ cc_shared_info: CcSharedLibraryInfo of the current target.
304
306
is_haskell: Bool, whether the current target is a Haskell library.
305
307
306
308
Returns:
@@ -309,7 +311,11 @@ def extend_HaskellCcLibrariesInfo(
309
311
posix = ctx .toolchains ["@rules_sh//sh/posix:toolchain_type" ]
310
312
libraries = dict (cc_libraries_info .libraries )
311
313
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 :
313
319
for lib_to_link in li .libraries :
314
320
key = cc_library_key (lib_to_link )
315
321
if key in libraries :
@@ -343,7 +349,7 @@ def extend_HaskellCcLibrariesInfo(
343
349
344
350
def _haskell_cc_libraries_aspect_impl (target , ctx ):
345
351
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
347
353
# HaskellInfo providers of a target. In the case of proto_library
348
354
# targets these providers are returned by the _haskell_proto_aspect.
349
355
# That aspect in turn requires HaskellCcLibrariesInfo in all its
@@ -361,11 +367,14 @@ def _haskell_cc_libraries_aspect_impl(target, ctx):
361
367
if HaskellCcLibrariesInfo in dep
362
368
])
363
369
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 :
365
373
cc_libraries_info = extend_HaskellCcLibrariesInfo (
366
374
ctx = ctx ,
367
375
cc_libraries_info = cc_libraries_info ,
368
- cc_info = target [CcInfo ],
376
+ cc_info = cc_info ,
377
+ cc_shared_info = cc_shared_info ,
369
378
is_haskell = HaskellInfo in target ,
370
379
)
371
380
@@ -386,3 +395,40 @@ haskell_cc_libraries_aspect = aspect(
386
395
Create a symbolic link for each static library whose name doesn't match the
387
396
mangled name of the corresponding dynamic library.
388
397
"""
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