@@ -153,7 +153,7 @@ data HaddockArgs = HaddockArgs
153
153
-- ^ Re-exported modules
154
154
, argTargets :: [FilePath ]
155
155
-- ^ Modules to process.
156
- , argLib :: Flag String
156
+ , argResourcesDir :: Flag String
157
157
-- ^ haddock's static \/ auxiliary files.
158
158
}
159
159
deriving (Generic )
@@ -329,6 +329,15 @@ haddock_setupHooks
329
329
[] -> allTargetsInBuildOrder' pkg_descr lbi
330
330
_ -> targets
331
331
332
+ version' =
333
+ if flag haddockVersionCPP
334
+ then Just version
335
+ else Nothing
336
+
337
+ mtmp
338
+ | version >= mkVersion [2 , 28 , 0 ] = const Nothing
339
+ | otherwise = Just
340
+
332
341
internalPackageDB <-
333
342
createInternalPackageDB verbosity lbi (flag $ setupDistPref . haddockCommonFlags)
334
343
@@ -367,11 +376,11 @@ haddock_setupHooks
367
376
exeArgs <-
368
377
fromExecutable
369
378
verbosity
370
- tmp
379
+ (mtmp tmp)
371
380
lbi'
372
381
clbi
373
382
htmlTemplate
374
- version
383
+ version'
375
384
exe
376
385
let exeArgs' = commonArgs `mappend` exeArgs
377
386
runHaddock
@@ -401,17 +410,17 @@ haddock_setupHooks
401
410
(maybeComponentInstantiatedWith clbi)
402
411
ipi <- case component of
403
412
CLib lib -> do
404
- withTempDirectoryCwdEx verbosity tmpFileOpts mbWorkDir (buildDir lbi) " tmp" $
413
+ withTempDirectoryCwdEx verbosity tmpFileOpts mbWorkDir (buildDir lbi' ) " tmp" $
405
414
\ tmp -> do
406
415
smsg
407
416
libArgs <-
408
417
fromLibrary
409
418
verbosity
410
- tmp
419
+ (mtmp tmp)
411
420
lbi'
412
421
clbi
413
422
htmlTemplate
414
- version
423
+ version'
415
424
lib
416
425
let libArgs' = commonArgs `mappend` libArgs
417
426
runHaddock verbosity mbWorkDir tmpFileOpts comp platform haddockProg True libArgs'
@@ -448,20 +457,20 @@ haddock_setupHooks
448
457
when
449
458
(flag haddockForeignLibs)
450
459
( do
451
- withTempDirectoryCwdEx verbosity tmpFileOpts mbWorkDir (buildDir lbi') " tmp " $
452
- \ tmp -> do
453
- smsg
454
- flibArgs <-
460
+ smsg
461
+ flibArgs <-
462
+ withTempDirectoryCwdEx verbosity tmpFileOpts mbWorkDir (buildDir lbi') " tmp " $
463
+ \ tmp -> do
455
464
fromForeignLib
456
465
verbosity
457
- tmp
466
+ (mtmp tmp)
458
467
lbi'
459
468
clbi
460
469
htmlTemplate
461
- version
470
+ version'
462
471
flib
463
- let libArgs' = commonArgs `mappend` flibArgs
464
- runHaddock verbosity mbWorkDir tmpFileOpts comp platform haddockProg True libArgs'
472
+ let libArgs' = commonArgs `mappend` flibArgs
473
+ runHaddock verbosity mbWorkDir tmpFileOpts comp platform haddockProg True libArgs'
465
474
)
466
475
>> return index
467
476
CExe _ -> when (flag haddockExecutables) (smsg >> doExe component) >> return index
@@ -525,7 +534,7 @@ fromFlags env flags =
525
534
(haddockIndex flags)
526
535
, argGenIndex = Flag False
527
536
, argBaseUrl = haddockBaseUrl flags
528
- , argLib = haddockLib flags
537
+ , argResourcesDir = haddockResourcesDir flags
529
538
, argVerbose =
530
539
maybe mempty (Any . (>= deafening))
531
540
. flagToMaybe
@@ -552,7 +561,7 @@ fromHaddockProjectFlags flags =
552
561
, argPrologueFile = haddockProjectPrologue flags
553
562
, argInterfaces = fromFlagOrDefault [] (haddockProjectInterfaces flags)
554
563
, argLinkedSource = Flag True
555
- , argLib = haddockProjectLib flags
564
+ , argResourcesDir = haddockProjectResourcesDir flags
556
565
}
557
566
558
567
fromPackageDescription :: HaddockTarget -> PackageDescription -> HaddockArgs
@@ -597,26 +606,34 @@ componentGhcOptions verbosity lbi bi clbi odir =
597
606
598
607
mkHaddockArgs
599
608
:: Verbosity
600
- -> SymbolicPath Pkg (Path. Dir Tmp )
609
+ -> Maybe (SymbolicPath Pkg (Path. Dir Tmp ))
610
+ -- ^ 'Nothing' to prevent passing temporary directories for -hidir, -odir, and
611
+ -- -stubdir to GHC through Haddock
601
612
-> LocalBuildInfo
602
613
-> ComponentLocalBuildInfo
603
614
-> Maybe PathTemplate
604
615
-- ^ template for HTML location
605
- -> Version
616
+ -> Maybe Version
617
+ -- ^ 'Nothing' if the user requested not to define the __HADDOCK_VERSION__
618
+ -- macro
606
619
-> [SymbolicPath Pkg File ]
607
620
-> BuildInfo
608
621
-> IO HaddockArgs
609
- mkHaddockArgs verbosity tmp lbi clbi htmlTemplate haddockVersion inFiles bi = do
622
+ mkHaddockArgs verbosity mtmp lbi clbi htmlTemplate haddockVersion inFiles bi = do
610
623
ifaceArgs <- getInterfaces verbosity lbi clbi htmlTemplate
611
- let vanillaOpts =
612
- (componentGhcOptions normal lbi bi clbi (buildDir lbi))
613
- { -- Noooooooooo!!!!!111
614
- -- haddock stomps on our precious .hi
615
- -- and .o files. Workaround by telling
616
- -- haddock to write them elsewhere.
617
- ghcOptObjDir = toFlag $ coerceSymbolicPath tmp
618
- , ghcOptHiDir = toFlag $ coerceSymbolicPath tmp
619
- , ghcOptStubDir = toFlag $ coerceSymbolicPath tmp
624
+ let vanillaOpts' =
625
+ componentGhcOptions normal lbi bi clbi (buildDir lbi)
626
+ `mappend` getGhcCppOpts haddockVersion bi
627
+ vanillaOpts =
628
+ vanillaOpts'
629
+ { -- Starting with Haddock 2.28, we no longer want to run Haddock's
630
+ -- GHC session in a temporary directory. Doing so always causes
631
+ -- recompilation during documentation generation, which can now be
632
+ -- avoided thanks to Hi Haddock. See
633
+ -- https://github.com/haskell/cabal/pull/9177 for discussion.
634
+ ghcOptObjDir = maybe (ghcOptObjDir vanillaOpts') (toFlag . coerceSymbolicPath) mtmp
635
+ , ghcOptHiDir = maybe (ghcOptHiDir vanillaOpts') (toFlag . coerceSymbolicPath) mtmp
636
+ , ghcOptStubDir = maybe (ghcOptStubDir vanillaOpts') (toFlag . coerceSymbolicPath) mtmp
620
637
}
621
638
`mappend` getGhcCppOpts haddockVersion bi
622
639
sharedOpts =
@@ -644,20 +661,24 @@ mkHaddockArgs verbosity tmp lbi clbi htmlTemplate haddockVersion inFiles bi = do
644
661
645
662
fromLibrary
646
663
:: Verbosity
647
- -> SymbolicPath Pkg (Path. Dir Tmp )
664
+ -> Maybe (SymbolicPath Pkg (Path. Dir Tmp ))
665
+ -- ^ 'Nothing' to prevent passing temporary directories for -hidir, -odir, and
666
+ -- -stubdir to GHC through Haddock
648
667
-> LocalBuildInfo
649
668
-> ComponentLocalBuildInfo
650
669
-> Maybe PathTemplate
651
670
-- ^ template for HTML location
652
- -> Version
671
+ -> Maybe Version
672
+ -- ^ 'Nothing' if the user requested not to define the __HADDOCK_VERSION__
673
+ -- macro
653
674
-> Library
654
675
-> IO HaddockArgs
655
- fromLibrary verbosity tmp lbi clbi htmlTemplate haddockVersion lib = do
676
+ fromLibrary verbosity mtmp lbi clbi htmlTemplate haddockVersion lib = do
656
677
inFiles <- map snd `fmap` getLibSourceFiles verbosity lbi lib clbi
657
678
args <-
658
679
mkHaddockArgs
659
680
verbosity
660
- tmp
681
+ mtmp
661
682
lbi
662
683
clbi
663
684
htmlTemplate
@@ -671,20 +692,24 @@ fromLibrary verbosity tmp lbi clbi htmlTemplate haddockVersion lib = do
671
692
672
693
fromExecutable
673
694
:: Verbosity
674
- -> SymbolicPath Pkg (Path. Dir Tmp )
695
+ -> Maybe (SymbolicPath Pkg (Path. Dir Tmp ))
696
+ -- ^ 'Nothing' to prevent passing temporary directories for -hidir, -odir, and
697
+ -- -stubdir to GHC through Haddock
675
698
-> LocalBuildInfo
676
699
-> ComponentLocalBuildInfo
677
700
-> Maybe PathTemplate
678
701
-- ^ template for HTML location
679
- -> Version
702
+ -> Maybe Version
703
+ -- ^ 'Nothing' if the user requested not to define the __HADDOCK_VERSION__
704
+ -- macro
680
705
-> Executable
681
706
-> IO HaddockArgs
682
- fromExecutable verbosity tmp lbi clbi htmlTemplate haddockVersion exe = do
707
+ fromExecutable verbosity mtmp lbi clbi htmlTemplate haddockVersion exe = do
683
708
inFiles <- map snd `fmap` getExeSourceFiles verbosity lbi exe clbi
684
709
args <-
685
710
mkHaddockArgs
686
711
verbosity
687
- tmp
712
+ mtmp
688
713
lbi
689
714
clbi
690
715
htmlTemplate
@@ -699,20 +724,24 @@ fromExecutable verbosity tmp lbi clbi htmlTemplate haddockVersion exe = do
699
724
700
725
fromForeignLib
701
726
:: Verbosity
702
- -> SymbolicPath Pkg (Path. Dir Tmp )
727
+ -> Maybe (SymbolicPath Pkg (Path. Dir Tmp ))
728
+ -- ^ 'Nothing' to prevent passing temporary directories for -hidir, -odir, and
729
+ -- -stubdir to GHC through Haddock
703
730
-> LocalBuildInfo
704
731
-> ComponentLocalBuildInfo
705
732
-> Maybe PathTemplate
706
733
-- ^ template for HTML location
707
- -> Version
734
+ -> Maybe Version
735
+ -- ^ 'Nothing' if the user requested not to define the __HADDOCK_VERSION__
736
+ -- macro
708
737
-> ForeignLib
709
738
-> IO HaddockArgs
710
- fromForeignLib verbosity tmp lbi clbi htmlTemplate haddockVersion flib = do
739
+ fromForeignLib verbosity mtmp lbi clbi htmlTemplate haddockVersion flib = do
711
740
inFiles <- map snd `fmap` getFLibSourceFiles verbosity lbi flib clbi
712
741
args <-
713
742
mkHaddockArgs
714
743
verbosity
715
- tmp
744
+ mtmp
716
745
lbi
717
746
clbi
718
747
htmlTemplate
@@ -768,7 +797,9 @@ getReexports LibComponentLocalBuildInfo{componentExposedModules = mods} =
768
797
getReexports _ = []
769
798
770
799
getGhcCppOpts
771
- :: Version
800
+ :: Maybe Version
801
+ -- ^ 'Nothing' if the user requested not to define the __HADDOCK_VERSION__
802
+ -- macro
772
803
-> BuildInfo
773
804
-> GhcOptions
774
805
getGhcCppOpts haddockVersion bi =
@@ -778,16 +809,21 @@ getGhcCppOpts haddockVersion bi =
778
809
}
779
810
where
780
811
needsCpp = EnableExtension CPP `elem` usedExtensions bi
781
- defines = [haddockVersionMacro]
782
- haddockVersionMacro =
783
- " -D__HADDOCK_VERSION__= "
784
- ++ show (v1 * 1000 + v2 * 10 + v3)
812
+ defines =
813
+ [ " -D__HADDOCK_VERSION__= " ++ show vn
814
+ | Just vn <- [versionInt . versionNumbers <$> haddockVersion]
815
+ ]
785
816
where
786
- (v1, v2, v3) = case versionNumbers haddockVersion of
787
- [] -> (0 , 0 , 0 )
788
- [x] -> (x, 0 , 0 )
789
- [x, y] -> (x, y, 0 )
790
- (x : y : z : _) -> (x, y, z)
817
+ -- For some list xs = [x, y, z ...], versionInt xs results in
818
+ -- x * 1000 + y * 10 + z. E.g.:
819
+ -- >>> versionInt [2, 29, 0]
820
+ -- 2290
821
+ -- >>> versionInt [3, 4]
822
+ -- 3040
823
+ -- >>> versionInt []
824
+ -- 0
825
+ versionInt :: [Int ] -> Int
826
+ versionInt = foldr ((+) . uncurry (*) ) 0 . zip [1000 , 10 , 1 ]
791
827
792
828
getGhcLibDir
793
829
:: Verbosity
@@ -993,7 +1029,7 @@ renderPureArgs version comp platform args =
993
1029
, isVersion 2 19
994
1030
]
995
1031
, argTargets $ args
996
- , maybe [] ((: [] ) . (" --lib= " ++ )) . flagToMaybe . argLib $ args
1032
+ , maybe [] ((: [] ) . (resourcesDirFlag ++ )) . flagToMaybe . argResourcesDir $ args
997
1033
]
998
1034
where
999
1035
-- See Note [Symbolic paths] in Distribution.Utils.Path
@@ -1037,6 +1073,9 @@ renderPureArgs version comp platform args =
1037
1073
verbosityFlag
1038
1074
| isVersion 2 5 = " --verbosity=1"
1039
1075
| otherwise = " --verbose"
1076
+ resourcesDirFlag
1077
+ | isVersion 2 29 = " --resources-dir="
1078
+ | otherwise = " --lib="
1040
1079
haddockSupportsVisibility = version >= mkVersion [2 , 26 , 1 ]
1041
1080
haddockSupportsPackageName = version > mkVersion [2 , 16 ]
1042
1081
haddockSupportsHyperlinkedSource = isVersion 2 17
0 commit comments