@@ -65,6 +65,8 @@ module Distribution.Client.Dependency
65
65
, addSetupCabalMinVersionConstraint
66
66
, addSetupCabalMaxVersionConstraint
67
67
, addSetupCabalProfiledDynamic
68
+ , setImplicitSetupInfo
69
+ , extendSetupInfoDeps
68
70
) where
69
71
70
72
import Distribution.Client.Compat.Prelude
@@ -596,49 +598,77 @@ removeBound RelaxUpper RelaxDepModNone = removeUpperBound
596
598
removeBound RelaxLower RelaxDepModCaret = transformCaretLower
597
599
removeBound RelaxUpper RelaxDepModCaret = transformCaretUpper
598
600
599
- -- | Supply defaults for packages without explicit Setup dependencies
601
+ -- | Supply defaults for packages without explicit Setup dependencies.
602
+ -- It also serves to add the implicit dependency on @hooks-exe@ needed to
603
+ -- compile the @Setup.hs@ executable produced from 'SetupHooks' when
604
+ -- @build-type: Hooks@. The first argument function determines which implicit
605
+ -- dependencies are needed (including the one on @hooks-exe@).
600
606
--
601
607
-- Note: It's important to apply 'addDefaultSetupDepends' after
602
608
-- 'addSourcePackages'. Otherwise, the packages inserted by
603
609
-- 'addSourcePackages' won't have upper bounds in dependencies relaxed.
604
610
addDefaultSetupDependencies
605
- :: (UnresolvedSourcePackage -> Maybe [Dependency ])
611
+ :: (Maybe [Dependency ] -> PD. BuildType -> Maybe PD. SetupBuildInfo -> Maybe PD. SetupBuildInfo )
612
+ -- ^ Function to update the SetupBuildInfo of the package using those dependencies
613
+ -> (UnresolvedSourcePackage -> Maybe [Dependency ])
614
+ -- ^ Function to determine extra setup dependencies
606
615
-> DepResolverParams
607
616
-> DepResolverParams
608
- addDefaultSetupDependencies defaultSetupDeps params =
617
+ addDefaultSetupDependencies applyDefaultSetupDeps defaultSetupDeps params =
609
618
params
610
619
{ depResolverSourcePkgIndex =
611
- fmap applyDefaultSetupDeps (depResolverSourcePkgIndex params)
620
+ fmap go (depResolverSourcePkgIndex params)
612
621
}
613
622
where
614
- applyDefaultSetupDeps :: UnresolvedSourcePackage -> UnresolvedSourcePackage
615
- applyDefaultSetupDeps srcpkg =
623
+ go :: UnresolvedSourcePackage -> UnresolvedSourcePackage
624
+ go srcpkg =
616
625
srcpkg
617
626
{ srcpkgDescription =
618
627
gpkgdesc
619
628
{ PD. packageDescription =
620
629
pkgdesc
621
630
{ PD. setupBuildInfo =
622
- case PD. setupBuildInfo pkgdesc of
623
- Just sbi -> Just sbi
624
- Nothing -> case defaultSetupDeps srcpkg of
625
- Nothing -> Nothing
626
- Just deps
627
- | isCustom ->
628
- Just
629
- PD. SetupBuildInfo
630
- { PD. defaultSetupDepends = True
631
- , PD. setupDepends = deps
632
- }
633
- | otherwise -> Nothing
631
+ applyDefaultSetupDeps
632
+ (defaultSetupDeps srcpkg)
633
+ (PD. buildType pkgdesc)
634
+ (PD. setupBuildInfo pkgdesc)
634
635
}
635
636
}
636
637
}
637
638
where
638
- isCustom = PD. buildType pkgdesc == PD. Custom || PD. buildType pkgdesc == PD. Hooks
639
639
gpkgdesc = srcpkgDescription srcpkg
640
640
pkgdesc = PD. packageDescription gpkgdesc
641
641
642
+ setImplicitSetupInfo
643
+ :: Maybe [Dependency ]
644
+ -> PD. BuildType
645
+ -> Maybe PD. SetupBuildInfo
646
+ -> Maybe PD. SetupBuildInfo
647
+ setImplicitSetupInfo mdeps buildty msetupinfo =
648
+ case msetupinfo of
649
+ Just sbi -> Just sbi
650
+ Nothing -> case mdeps of
651
+ Nothing -> Nothing
652
+ Just deps
653
+ | isCustom ->
654
+ Just
655
+ PD. SetupBuildInfo
656
+ { PD. defaultSetupDepends = True
657
+ , PD. setupDepends = deps
658
+ }
659
+ | otherwise -> Nothing
660
+ where
661
+ isCustom = buildty == PD. Custom || buildty == PD. Hooks
662
+
663
+ extendSetupInfoDeps :: Maybe [Dependency ] -> PD. BuildType -> Maybe PD. SetupBuildInfo -> Maybe PD. SetupBuildInfo
664
+ extendSetupInfoDeps mDeps buildTy mSetupInfo
665
+ | Nothing <- mSetupInfo =
666
+ assert
667
+ (buildTy /= PD. Hooks ) -- Hooks needs explicit setup-depends
668
+ Nothing
669
+ | Just setupInfo <- mSetupInfo =
670
+ Just setupInfo{PD. setupDepends = PD. setupDepends setupInfo ++ fromMaybe [] mDeps}
671
+
642
672
-- | If a package has a custom setup then we need to add a setup-depends
643
673
-- on Cabal.
644
674
addSetupCabalMinVersionConstraint
@@ -734,7 +764,7 @@ standardInstallPolicy
734
764
-> [PackageSpecifier UnresolvedSourcePackage ]
735
765
-> DepResolverParams
736
766
standardInstallPolicy installedPkgIndex sourcePkgDb pkgSpecifiers =
737
- addDefaultSetupDependencies mkDefaultSetupDeps $
767
+ addDefaultSetupDependencies setImplicitSetupInfo mkDefaultSetupDeps $
738
768
basicInstallPolicy
739
769
installedPkgIndex
740
770
sourcePkgDb
0 commit comments