|
1 | 1 | {-# LANGUAGE DataKinds #-}
|
2 | 2 | {-# LANGUAGE FlexibleContexts #-}
|
| 3 | +{-# LANGUAGE LambdaCase #-} |
3 | 4 | {-# LANGUAGE NamedFieldPuns #-}
|
4 | 5 | {-# LANGUAGE OverloadedStrings #-}
|
5 | 6 | {-# LANGUAGE RankNTypes #-}
|
@@ -128,7 +129,8 @@ import qualified Data.ByteString as BS
|
128 | 129 | import Data.ByteString.Lazy (ByteString)
|
129 | 130 | import qualified Data.ByteString.Lazy.Char8 as BLC8
|
130 | 131 | import Data.List
|
131 |
| - ( intersect |
| 132 | + ( groupBy |
| 133 | + , intersect |
132 | 134 | , stripPrefix
|
133 | 135 | , (\\)
|
134 | 136 | )
|
@@ -171,10 +173,13 @@ import qualified System.Info
|
171 | 173 | import Text.PrettyPrint
|
172 | 174 | ( Doc
|
173 | 175 | , char
|
| 176 | + , colon |
174 | 177 | , hsep
|
| 178 | + , nest |
175 | 179 | , quotes
|
176 | 180 | , renderStyle
|
177 | 181 | , text
|
| 182 | + , vcat |
178 | 183 | , ($+$)
|
179 | 184 | )
|
180 | 185 |
|
@@ -857,7 +862,7 @@ configurePackage cfg lbc0 pkg_descr00 flags enabled comp platform programDb0 pac
|
857 | 862 | -- right before calling configurePackage?
|
858 | 863 |
|
859 | 864 | -- Configure certain external build tools, see below for which ones.
|
860 |
| - let requiredBuildTools |
| 865 | + let rawRequiredBuildTools |
861 | 866 | -- If --ignore-build-tools is set, no build tool is required:
|
862 | 867 | | fromFlagOrDefault False $ configIgnoreBuildTools cfg =
|
863 | 868 | []
|
@@ -885,6 +890,19 @@ configurePackage cfg lbc0 pkg_descr00 flags enabled comp platform programDb0 pac
|
885 | 890 | ]
|
886 | 891 | externBuildToolDeps ++ unknownBuildTools
|
887 | 892 |
|
| 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 | + |
888 | 906 | programDb1 <-
|
889 | 907 | configureAllKnownPrograms (lessVerbose verbosity) programDb0
|
890 | 908 | >>= configureRequiredPrograms verbosity requiredBuildTools
|
@@ -934,6 +952,28 @@ configurePackage cfg lbc0 pkg_descr00 flags enabled comp platform programDb0 pac
|
934 | 952 |
|
935 | 953 | return (lbc, pbd)
|
936 | 954 |
|
| 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 | + |
937 | 977 | finalizeAndConfigurePackage
|
938 | 978 | :: ConfigFlags
|
939 | 979 | -> LBC.LocalBuildConfig
|
|
0 commit comments