Skip to content

Commit ecd09c2

Browse files
committed
Combine duplicate build tools
- report the duplicate versions - intersect the version ranges
1 parent 54b4838 commit ecd09c2

File tree

1 file changed

+42
-2
lines changed

1 file changed

+42
-2
lines changed

Cabal/src/Distribution/Simple/Configure.hs

Lines changed: 42 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
{-# LANGUAGE DataKinds #-}
22
{-# LANGUAGE FlexibleContexts #-}
3+
{-# LANGUAGE LambdaCase #-}
34
{-# LANGUAGE NamedFieldPuns #-}
45
{-# LANGUAGE OverloadedStrings #-}
56
{-# LANGUAGE RankNTypes #-}
@@ -129,7 +130,8 @@ import qualified Data.ByteString as BS
129130
import Data.ByteString.Lazy (ByteString)
130131
import qualified Data.ByteString.Lazy.Char8 as BLC8
131132
import Data.List
132-
( intersect
133+
( groupBy
134+
, intersect
133135
, stripPrefix
134136
, (\\)
135137
)
@@ -172,10 +174,13 @@ import qualified System.Info
172174
import Text.PrettyPrint
173175
( Doc
174176
, char
177+
, colon
175178
, hsep
179+
, nest
176180
, quotes
177181
, renderStyle
178182
, text
183+
, vcat
179184
, ($+$)
180185
)
181186

@@ -858,7 +863,7 @@ configurePackage cfg lbc0 pkg_descr00 flags enabled comp platform programDb0 pac
858863
-- right before calling configurePackage?
859864

860865
-- Configure certain external build tools, see below for which ones.
861-
let requiredBuildTools
866+
let rawRequiredBuildTools
862867
-- If --ignore-build-tools is set, no build tool is required:
863868
| fromFlagOrDefault False $ configIgnoreBuildTools cfg =
864869
[]
@@ -886,6 +891,19 @@ configurePackage cfg lbc0 pkg_descr00 flags enabled comp platform programDb0 pac
886891
]
887892
externBuildToolDeps ++ unknownBuildTools
888893

894+
let (requiredBuildTools, dups) = deduplicateBuildTools rawRequiredBuildTools
895+
896+
for_ dups $ \case
897+
(_, []) -> return ()
898+
(merged, ds@(dup : _)) ->
899+
noticeDoc verbosity $
900+
vcat
901+
[ (text "The build tool" <+> quotes (text $ nameOf dup) <+> "has multiple versions specified") <> colon
902+
, nest 2 $ vcat [char '-' <+> text (prettyShow $ versionOf d) | d <- ds]
903+
, text "These versions have been combined as" <> colon
904+
, nest 2 $ quotes (text $ prettyShow merged)
905+
]
906+
889907
programDb1 <-
890908
configureAllKnownPrograms (lessVerbose verbosity) programDb0
891909
>>= configureRequiredPrograms verbosity requiredBuildTools
@@ -935,6 +953,28 @@ configurePackage cfg lbc0 pkg_descr00 flags enabled comp platform programDb0 pac
935953

936954
return (lbc, pbd)
937955

956+
nameOf :: LegacyExeDependency -> String
957+
nameOf (LegacyExeDependency n _) = n
958+
959+
versionOf :: LegacyExeDependency -> VersionRange
960+
versionOf (LegacyExeDependency _ v) = v
961+
962+
-- | Any duplicates in the list has their version range merged by intersection.
963+
-- The second list has the build tool with its merged version range and its list
964+
-- of duplicates.
965+
deduplicateBuildTools :: [LegacyExeDependency] -> ([LegacyExeDependency], [(LegacyExeDependency, [LegacyExeDependency])])
966+
deduplicateBuildTools xs =
967+
catMaybes
968+
<$> unzip
969+
[ (merged, if length gs == 1 then Nothing else Just (merged, gs))
970+
| gs@(g : _) <- groupBy ((==) `on` nameOf) (sortBy (comparing nameOf) xs)
971+
, let merged = LegacyExeDependency (nameOf g) (mergeVersions (ordNub . filter (/= anyVersion) $ versionOf <$> gs))
972+
]
973+
where
974+
mergeVersions :: [VersionRange] -> VersionRange
975+
mergeVersions [] = anyVersion
976+
mergeVersions (v : vs) = foldr intersectVersionRanges v vs
977+
938978
finalizeAndConfigurePackage
939979
:: ConfigFlags
940980
-> LBC.LocalBuildConfig

0 commit comments

Comments
 (0)