37
37
load (
38
38
":providers.bzl" ,
39
39
"HaddockInfo" ,
40
+ "HaskellCabalArgs" ,
40
41
"HaskellInfo" ,
41
42
"HaskellLibraryInfo" ,
42
43
"all_dependencies_package_ids" ,
@@ -436,6 +437,25 @@ def _shorten_library_symlink(dynamic_library):
436
437
basename = dynamic_library .basename
437
438
return paths .join (prefix , basename )
438
439
440
+ def _haskell_cabal_args_impl (ctx ):
441
+ is_empty = ctx .attr .is_empty
442
+ cabal_args = HaskellCabalArgs (
443
+ is_empty = is_empty ,
444
+ )
445
+ return [cabal_args ]
446
+
447
+ haskell_cabal_args = rule (
448
+ _haskell_cabal_args_impl ,
449
+ attrs = {
450
+ "is_empty" : attr .bool (
451
+ default = False ,
452
+ doc = """True if this (sub) library is empty, with only re-exports, and no source files of its own.
453
+ It is necessary to set this, otherwise bazel will complain about missing "*libHS.a" files.""" ,
454
+ ),
455
+ },
456
+ provides = [HaskellCabalArgs ],
457
+ )
458
+
439
459
def _haskell_cabal_library_impl (ctx ):
440
460
hs = haskell_context (ctx )
441
461
dep_info = gather_dep_info (ctx .attr .name , ctx .attr .deps )
@@ -446,6 +466,10 @@ def _haskell_cabal_library_impl(ctx):
446
466
override_cc_toolchain = hs .tools_config .maybe_exec_cc_toolchain ,
447
467
)
448
468
469
+ is_empty = False
470
+ if ctx .attr .cabal_args :
471
+ is_empty = ctx .attr .cabal_args [HaskellCabalArgs ].is_empty
472
+
449
473
# All C and Haskell library dependencies.
450
474
cc_info = cc_common .merge_cc_infos (
451
475
cc_infos = [dep [CcInfo ] for dep in ctx .attr .deps if CcInfo in dep ],
@@ -486,7 +510,7 @@ def _haskell_cabal_library_impl(ctx):
486
510
"_install/{}_data" .format (package_id ),
487
511
sibling = cabal ,
488
512
)
489
- with_haddock = ctx .attr .haddock and hs .tools_config .supports_haddock
513
+ with_haddock = ctx .attr .haddock and hs .tools_config .supports_haddock and not is_empty
490
514
if with_haddock :
491
515
haddock_file = hs .actions .declare_file (
492
516
"_install/{}_haddock/{}.haddock" .format (package_id , package_name ),
@@ -499,30 +523,36 @@ def _haskell_cabal_library_impl(ctx):
499
523
else :
500
524
haddock_file = None
501
525
haddock_html_dir = None
502
- vanilla_library = hs .actions .declare_file (
503
- "_install/lib/libHS{}.a" .format (package_id ),
504
- sibling = cabal ,
505
- )
506
- if with_profiling :
507
- profiling_library = hs .actions .declare_file (
508
- "_install/lib/libHS{}_p.a" .format (package_id ),
509
- sibling = cabal ,
510
- )
511
- static_library = profiling_library
512
- else :
526
+ if is_empty :
527
+ vanilla_library = None
528
+ static_library = None
513
529
profiling_library = None
514
- static_library = vanilla_library
515
- if hs .toolchain .static_runtime :
516
530
dynamic_library = None
517
531
else :
518
- dynamic_library = hs .actions .declare_file (
519
- "_install/lib/libHS{}-ghc{}.{}" .format (
520
- package_id ,
521
- hs .toolchain .version ,
522
- _so_extension (hs ),
523
- ),
532
+ vanilla_library = hs .actions .declare_file (
533
+ "_install/lib/libHS{}.a" .format (package_id ),
524
534
sibling = cabal ,
525
535
)
536
+ if with_profiling :
537
+ profiling_library = hs .actions .declare_file (
538
+ "_install/lib/libHS{}_p.a" .format (package_id ),
539
+ sibling = cabal ,
540
+ )
541
+ static_library = profiling_library
542
+ else :
543
+ profiling_library = None
544
+ static_library = vanilla_library
545
+ if hs .toolchain .static_runtime :
546
+ dynamic_library = None
547
+ else :
548
+ dynamic_library = hs .actions .declare_file (
549
+ "_install/lib/libHS{}-ghc{}.{}" .format (
550
+ package_id ,
551
+ hs .toolchain .version ,
552
+ _so_extension (hs ),
553
+ ),
554
+ sibling = cabal ,
555
+ )
526
556
(tool_inputs , tool_input_manifests ) = ctx .resolve_tools (tools = ctx .attr .tools )
527
557
c = _prepare_cabal_inputs (
528
558
hs ,
@@ -556,11 +586,12 @@ def _haskell_cabal_library_impl(ctx):
556
586
outputs = [
557
587
package_database ,
558
588
interfaces_dir ,
559
- vanilla_library ,
560
589
data_dir ,
561
590
]
562
591
if with_haddock :
563
592
outputs .extend ([haddock_file , haddock_html_dir ])
593
+ if vanilla_library != None :
594
+ outputs .append (vanilla_library )
564
595
if dynamic_library != None :
565
596
outputs .append (dynamic_library )
566
597
if with_profiling :
@@ -581,8 +612,13 @@ def _haskell_cabal_library_impl(ctx):
581
612
progress_message = "HaskellCabalLibrary {}" .format (hs .label ),
582
613
)
583
614
615
+ if not is_empty :
616
+ default_info_libs = depset ([static_library ] + ([dynamic_library ] if dynamic_library != None else []))
617
+ else :
618
+ default_info_libs = depset ([package_database ])
619
+
584
620
default_info = DefaultInfo (
585
- files = depset ([ static_library ] + ([ dynamic_library ] if dynamic_library != None else [])) ,
621
+ files = default_info_libs ,
586
622
runfiles = ctx .runfiles (
587
623
files = [data_dir ],
588
624
collect_default = True ,
@@ -631,7 +667,7 @@ def _haskell_cabal_library_impl(ctx):
631
667
)
632
668
linker_input = cc_common .create_linker_input (
633
669
owner = ctx .label ,
634
- libraries = depset (direct = [
670
+ libraries = depset (direct = ([] if is_empty else [
635
671
cc_common .create_library_to_link (
636
672
actions = ctx .actions ,
637
673
feature_configuration = feature_configuration ,
@@ -641,7 +677,7 @@ def _haskell_cabal_library_impl(ctx):
641
677
static_library = static_library ,
642
678
cc_toolchain = cc_toolchain ,
643
679
),
644
- ]),
680
+ ])) ,
645
681
)
646
682
compilation_context = cc_common .create_compilation_context ()
647
683
linking_context = cc_common .create_linking_context (
@@ -750,6 +786,10 @@ haskell_cabal_library = rule(
750
786
library symlink underneath `_solib_<cpu>` will be shortened to
751
787
avoid exceeding the MACH-O header size limit on MacOS.""" ,
752
788
),
789
+ "cabal_args" : attr .label (
790
+ doc = """A haskell_cabal_args target with cabal specific settings for this package.""" ,
791
+ providers = [[HaskellCabalArgs ]],
792
+ ),
753
793
},
754
794
toolchains = use_cc_toolchain () + [
755
795
"@rules_haskell//haskell:toolchain" ,
0 commit comments