@@ -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
@@ -604,49 +606,77 @@ removeBound RelaxUpper RelaxDepModNone = removeUpperBound
604
606
removeBound RelaxLower RelaxDepModCaret = transformCaretLower
605
607
removeBound RelaxUpper RelaxDepModCaret = transformCaretUpper
606
608
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@).
608
614
--
609
615
-- Note: It's important to apply 'addDefaultSetupDepends' after
610
616
-- 'addSourcePackages'. Otherwise, the packages inserted by
611
617
-- 'addSourcePackages' won't have upper bounds in dependencies relaxed.
612
618
addDefaultSetupDependencies
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
614
623
-> DepResolverParams
615
624
-> DepResolverParams
616
- addDefaultSetupDependencies defaultSetupDeps params =
625
+ addDefaultSetupDependencies applyDefaultSetupDeps defaultSetupDeps params =
617
626
params
618
627
{ depResolverSourcePkgIndex =
619
- fmap applyDefaultSetupDeps (depResolverSourcePkgIndex params)
628
+ fmap go (depResolverSourcePkgIndex params)
620
629
}
621
630
where
622
- applyDefaultSetupDeps :: UnresolvedSourcePackage -> UnresolvedSourcePackage
623
- applyDefaultSetupDeps srcpkg =
631
+ go :: UnresolvedSourcePackage -> UnresolvedSourcePackage
632
+ go srcpkg =
624
633
srcpkg
625
634
{ srcpkgDescription =
626
635
gpkgdesc
627
636
{ PD. packageDescription =
628
637
pkgdesc
629
638
{ 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)
642
643
}
643
644
}
644
645
}
645
646
where
646
- isCustom = PD. buildType pkgdesc == PD. Custom || PD. buildType pkgdesc == PD. Hooks
647
647
gpkgdesc = srcpkgDescription srcpkg
648
648
pkgdesc = PD. packageDescription gpkgdesc
649
649
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
+
650
680
-- | If a package has a custom setup then we need to add a setup-depends
651
681
-- on Cabal.
652
682
addSetupCabalMinVersionConstraint
@@ -742,7 +772,7 @@ standardInstallPolicy
742
772
-> [PackageSpecifier UnresolvedSourcePackage ]
743
773
-> DepResolverParams
744
774
standardInstallPolicy installedPkgIndex sourcePkgDb pkgSpecifiers =
745
- addDefaultSetupDependencies mkDefaultSetupDeps $
775
+ addDefaultSetupDependencies setImplicitSetupInfo mkDefaultSetupDeps $
746
776
basicInstallPolicy
747
777
installedPkgIndex
748
778
sourcePkgDb
0 commit comments