@@ -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
@@ -604,49 +606,77 @@ removeBound RelaxUpper RelaxDepModNone = removeUpperBound
604606removeBound RelaxLower RelaxDepModCaret = transformCaretLower
605607removeBound RelaxUpper RelaxDepModCaret = transformCaretUpper
606608
607- -- | Supply defaults for packages without explicit Setup dependencies
609+ -- | Supply defaults for packages without explicit Setup dependencies.
610+ -- It also serves to add the implicit dependency on @hooks-exe@ needed to
611+ -- compile the @Setup.hs@ executable produced from 'SetupHooks' when
612+ -- @build-type: Hooks@. The first argument function determines which implicit
613+ -- dependencies are needed (including the one on @hooks-exe@).
608614--
609615-- Note: It's important to apply 'addDefaultSetupDepends' after
610616-- 'addSourcePackages'. Otherwise, the packages inserted by
611617-- 'addSourcePackages' won't have upper bounds in dependencies relaxed.
612618addDefaultSetupDependencies
613- :: (UnresolvedSourcePackage -> Maybe [Dependency ])
619+ :: (Maybe [Dependency ] -> PD. BuildType -> Maybe PD. SetupBuildInfo -> Maybe PD. SetupBuildInfo )
620+ -- ^ Function to update the SetupBuildInfo of the package using those dependencies
621+ -> (UnresolvedSourcePackage -> Maybe [Dependency ])
622+ -- ^ Function to determine extra setup dependencies
614623 -> DepResolverParams
615624 -> DepResolverParams
616- addDefaultSetupDependencies defaultSetupDeps params =
625+ addDefaultSetupDependencies applyDefaultSetupDeps defaultSetupDeps params =
617626 params
618627 { depResolverSourcePkgIndex =
619- fmap applyDefaultSetupDeps (depResolverSourcePkgIndex params)
628+ fmap go (depResolverSourcePkgIndex params)
620629 }
621630 where
622- applyDefaultSetupDeps :: UnresolvedSourcePackage -> UnresolvedSourcePackage
623- applyDefaultSetupDeps srcpkg =
631+ go :: UnresolvedSourcePackage -> UnresolvedSourcePackage
632+ go srcpkg =
624633 srcpkg
625634 { srcpkgDescription =
626635 gpkgdesc
627636 { PD. packageDescription =
628637 pkgdesc
629638 { PD. setupBuildInfo =
630- case PD. setupBuildInfo pkgdesc of
631- Just sbi -> Just sbi
632- Nothing -> case defaultSetupDeps srcpkg of
633- Nothing -> Nothing
634- Just deps
635- | isCustom ->
636- Just
637- PD. SetupBuildInfo
638- { PD. defaultSetupDepends = True
639- , PD. setupDepends = deps
640- }
641- | otherwise -> Nothing
639+ applyDefaultSetupDeps
640+ (defaultSetupDeps srcpkg)
641+ (PD. buildType pkgdesc)
642+ (PD. setupBuildInfo pkgdesc)
642643 }
643644 }
644645 }
645646 where
646- isCustom = PD. buildType pkgdesc == PD. Custom || PD. buildType pkgdesc == PD. Hooks
647647 gpkgdesc = srcpkgDescription srcpkg
648648 pkgdesc = PD. packageDescription gpkgdesc
649649
650+ setImplicitSetupInfo
651+ :: Maybe [Dependency ]
652+ -> PD. BuildType
653+ -> Maybe PD. SetupBuildInfo
654+ -> Maybe PD. SetupBuildInfo
655+ setImplicitSetupInfo mdeps buildty msetupinfo =
656+ case msetupinfo of
657+ Just sbi -> Just sbi
658+ Nothing -> case mdeps of
659+ Nothing -> Nothing
660+ Just deps
661+ | isCustom ->
662+ Just
663+ PD. SetupBuildInfo
664+ { PD. defaultSetupDepends = True
665+ , PD. setupDepends = deps
666+ }
667+ | otherwise -> Nothing
668+ where
669+ isCustom = buildty == PD. Custom || buildty == PD. Hooks
670+
671+ extendSetupInfoDeps :: Maybe [Dependency ] -> PD. BuildType -> Maybe PD. SetupBuildInfo -> Maybe PD. SetupBuildInfo
672+ extendSetupInfoDeps mDeps buildTy mSetupInfo
673+ | Nothing <- mSetupInfo =
674+ assert
675+ (buildTy /= PD. Hooks ) -- Hooks needs explicit setup-depends
676+ Nothing
677+ | Just setupInfo <- mSetupInfo =
678+ Just setupInfo{PD. setupDepends = PD. setupDepends setupInfo ++ fromMaybe [] mDeps}
679+
650680-- | If a package has a custom setup then we need to add a setup-depends
651681-- on Cabal.
652682addSetupCabalMinVersionConstraint
@@ -742,7 +772,7 @@ standardInstallPolicy
742772 -> [PackageSpecifier UnresolvedSourcePackage ]
743773 -> DepResolverParams
744774standardInstallPolicy installedPkgIndex sourcePkgDb pkgSpecifiers =
745- addDefaultSetupDependencies mkDefaultSetupDeps $
775+ addDefaultSetupDependencies setImplicitSetupInfo mkDefaultSetupDeps $
746776 basicInstallPolicy
747777 installedPkgIndex
748778 sourcePkgDb
0 commit comments