Skip to content

Commit 72da2aa

Browse files
committed
Combine duplicate build tools
- report the duplicate versions - intersect the version ranges
1 parent 04ab16c commit 72da2aa

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 #-}
@@ -128,7 +129,8 @@ import qualified Data.ByteString as BS
128129
import Data.ByteString.Lazy (ByteString)
129130
import qualified Data.ByteString.Lazy.Char8 as BLC8
130131
import Data.List
131-
( intersect
132+
( groupBy
133+
, intersect
132134
, stripPrefix
133135
, (\\)
134136
)
@@ -171,10 +173,13 @@ import qualified System.Info
171173
import Text.PrettyPrint
172174
( Doc
173175
, char
176+
, colon
174177
, hsep
178+
, nest
175179
, quotes
176180
, renderStyle
177181
, text
182+
, vcat
178183
, ($+$)
179184
)
180185

@@ -857,7 +862,7 @@ configurePackage cfg lbc0 pkg_descr00 flags enabled comp platform programDb0 pac
857862
-- right before calling configurePackage?
858863

859864
-- Configure certain external build tools, see below for which ones.
860-
let requiredBuildTools
865+
let rawRequiredBuildTools
861866
-- If --ignore-build-tools is set, no build tool is required:
862867
| fromFlagOrDefault False $ configIgnoreBuildTools cfg =
863868
[]
@@ -885,6 +890,19 @@ configurePackage cfg lbc0 pkg_descr00 flags enabled comp platform programDb0 pac
885890
]
886891
externBuildToolDeps ++ unknownBuildTools
887892

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

935953
return (lbc, pbd)
936954

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

0 commit comments

Comments
 (0)