@@ -65,6 +65,8 @@ module Distribution.Client.Dependency
6565 , addSetupCabalMinVersionConstraint
6666 , addSetupCabalMaxVersionConstraint
6767 , addSetupCabalProfiledDynamic
68+ , setImplicitSetupInfo
69+ , extendSetupInfoDeps
6870 ) where
6971
7072import Distribution.Client.Compat.Prelude
@@ -596,49 +598,77 @@ removeBound RelaxUpper RelaxDepModNone = removeUpperBound
596598removeBound RelaxLower RelaxDepModCaret = transformCaretLower
597599removeBound RelaxUpper RelaxDepModCaret = transformCaretUpper
598600
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@).
600606--
601607-- Note: It's important to apply 'addDefaultSetupDepends' after
602608-- 'addSourcePackages'. Otherwise, the packages inserted by
603609-- 'addSourcePackages' won't have upper bounds in dependencies relaxed.
604610addDefaultSetupDependencies
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
606615 -> DepResolverParams
607616 -> DepResolverParams
608- addDefaultSetupDependencies defaultSetupDeps params =
617+ addDefaultSetupDependencies applyDefaultSetupDeps defaultSetupDeps params =
609618 params
610619 { depResolverSourcePkgIndex =
611- fmap applyDefaultSetupDeps (depResolverSourcePkgIndex params)
620+ fmap go (depResolverSourcePkgIndex params)
612621 }
613622 where
614- applyDefaultSetupDeps :: UnresolvedSourcePackage -> UnresolvedSourcePackage
615- applyDefaultSetupDeps srcpkg =
623+ go :: UnresolvedSourcePackage -> UnresolvedSourcePackage
624+ go srcpkg =
616625 srcpkg
617626 { srcpkgDescription =
618627 gpkgdesc
619628 { PD. packageDescription =
620629 pkgdesc
621630 { 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)
634635 }
635636 }
636637 }
637638 where
638- isCustom = PD. buildType pkgdesc == PD. Custom || PD. buildType pkgdesc == PD. Hooks
639639 gpkgdesc = srcpkgDescription srcpkg
640640 pkgdesc = PD. packageDescription gpkgdesc
641641
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+
642672-- | If a package has a custom setup then we need to add a setup-depends
643673-- on Cabal.
644674addSetupCabalMinVersionConstraint
@@ -734,7 +764,7 @@ standardInstallPolicy
734764 -> [PackageSpecifier UnresolvedSourcePackage ]
735765 -> DepResolverParams
736766standardInstallPolicy installedPkgIndex sourcePkgDb pkgSpecifiers =
737- addDefaultSetupDependencies mkDefaultSetupDeps $
767+ addDefaultSetupDependencies setImplicitSetupInfo mkDefaultSetupDeps $
738768 basicInstallPolicy
739769 installedPkgIndex
740770 sourcePkgDb
0 commit comments