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