@@ -64,6 +64,8 @@ module Distribution.Client.Dependency
6464 , addDefaultSetupDependencies
6565 , addSetupCabalMinVersionConstraint
6666 , addSetupCabalMaxVersionConstraint
67+ , setImplicitSetupInfo
68+ , extendSetupInfoDeps
6769 ) where
6870
6971import Distribution.Client.Compat.Prelude
@@ -591,49 +593,69 @@ removeBound RelaxUpper RelaxDepModNone = removeUpperBound
591593removeBound RelaxLower RelaxDepModCaret = transformCaretLower
592594removeBound RelaxUpper RelaxDepModCaret = transformCaretUpper
593595
594- -- | Supply defaults for packages without explicit Setup dependencies
596+ -- | Supply defaults for packages without explicit Setup dependencies.
597+ -- It also serves to add the implicit dependency on @hooks-exe@ needed to
598+ -- compile the @Setup.hs@ executable produced from 'SetupHooks' when
599+ -- @build-type: Hooks@. The first argument function determines which implicit
600+ -- dependencies are needed (including the one on @hooks-exe@).
595601--
596602-- Note: It's important to apply 'addDefaultSetupDepends' after
597603-- 'addSourcePackages'. Otherwise, the packages inserted by
598604-- 'addSourcePackages' won't have upper bounds in dependencies relaxed.
599605addDefaultSetupDependencies
600- :: (UnresolvedSourcePackage -> Maybe [Dependency ])
606+ :: (Maybe [Dependency ] -> PD. BuildType -> Maybe PD. SetupBuildInfo -> Maybe PD. SetupBuildInfo )
607+ -- ^ Function to update the SetupBuildInfo of the package using those dependencies
608+ -> (UnresolvedSourcePackage -> Maybe [Dependency ])
609+ -- ^ Function to determine extra setup dependencies
601610 -> DepResolverParams
602611 -> DepResolverParams
603- addDefaultSetupDependencies defaultSetupDeps params =
612+ addDefaultSetupDependencies applyDefaultSetupDeps defaultSetupDeps params =
604613 params
605614 { depResolverSourcePkgIndex =
606- fmap applyDefaultSetupDeps (depResolverSourcePkgIndex params)
615+ fmap go (depResolverSourcePkgIndex params)
607616 }
608617 where
609- applyDefaultSetupDeps :: UnresolvedSourcePackage -> UnresolvedSourcePackage
610- applyDefaultSetupDeps srcpkg =
618+ go :: UnresolvedSourcePackage -> UnresolvedSourcePackage
619+ go srcpkg =
611620 srcpkg
612621 { srcpkgDescription =
613622 gpkgdesc
614623 { PD. packageDescription =
615624 pkgdesc
616- { PD. setupBuildInfo =
617- case PD. setupBuildInfo pkgdesc of
618- Just sbi -> Just sbi
619- Nothing -> case defaultSetupDeps srcpkg of
620- Nothing -> Nothing
621- Just deps
622- | isCustom ->
623- Just
624- PD. SetupBuildInfo
625- { PD. defaultSetupDepends = True
626- , PD. setupDepends = deps
627- }
628- | otherwise -> Nothing
625+ { PD. setupBuildInfo = applyDefaultSetupDeps (defaultSetupDeps srcpkg) (PD. buildType pkgdesc) (PD. setupBuildInfo pkgdesc)
629626 }
630627 }
631628 }
632629 where
633- isCustom = PD. buildType pkgdesc == PD. Custom || PD. buildType pkgdesc == PD. Hooks
634630 gpkgdesc = srcpkgDescription srcpkg
635631 pkgdesc = PD. packageDescription gpkgdesc
636632
633+ setImplicitSetupInfo :: Maybe [Dependency ] -> PD. BuildType -> Maybe PD. SetupBuildInfo -> Maybe PD. SetupBuildInfo
634+ setImplicitSetupInfo mdeps buildty msetupinfo =
635+ case msetupinfo of
636+ Just sbi -> Just sbi
637+ Nothing -> case mdeps of
638+ Nothing -> Nothing
639+ Just deps
640+ | isCustom ->
641+ Just
642+ PD. SetupBuildInfo
643+ { PD. defaultSetupDepends = True
644+ , PD. setupDepends = deps
645+ }
646+ | otherwise -> Nothing
647+ where
648+ isCustom = buildty == PD. Custom || buildty == PD. Hooks
649+
650+ extendSetupInfoDeps :: Maybe [Dependency ] -> PD. BuildType -> Maybe PD. SetupBuildInfo -> Maybe PD. SetupBuildInfo
651+ extendSetupInfoDeps mDeps buildTy mSetupInfo
652+ | Nothing <- mSetupInfo =
653+ assert
654+ (buildTy /= PD. Hooks ) -- Hooks needs explicit setup-depends
655+ Nothing
656+ | Just setupInfo <- mSetupInfo =
657+ Just setupInfo{PD. setupDepends = PD. setupDepends setupInfo ++ fromMaybe [] mDeps}
658+
637659-- | If a package has a custom setup then we need to add a setup-depends
638660-- on Cabal.
639661addSetupCabalMinVersionConstraint
@@ -713,7 +735,7 @@ standardInstallPolicy
713735 -> [PackageSpecifier UnresolvedSourcePackage ]
714736 -> DepResolverParams
715737standardInstallPolicy installedPkgIndex sourcePkgDb pkgSpecifiers =
716- addDefaultSetupDependencies mkDefaultSetupDeps $
738+ addDefaultSetupDependencies setImplicitSetupInfo mkDefaultSetupDeps $
717739 basicInstallPolicy
718740 installedPkgIndex
719741 sourcePkgDb
0 commit comments