From 2d282ec3e987106a5a63d71c26b63794526dd3f3 Mon Sep 17 00:00:00 2001 From: Michael Snoyman Date: Sun, 24 Mar 2019 14:06:23 +0200 Subject: [PATCH] Make libs and includes order-dependent (fixes #4527) --- ChangeLog.md | 2 ++ src/Stack/Options/ConfigParser.hs | 9 ++++----- src/Stack/Package.hs | 10 ++++------ src/Stack/Path.hs | 5 ++--- src/Stack/Setup.hs | 12 ++++++------ src/Stack/Types/Build.hs | 4 ++-- src/Stack/Types/Config.hs | 16 ++++++++-------- 7 files changed, 28 insertions(+), 30 deletions(-) diff --git a/ChangeLog.md b/ChangeLog.md index 20a7b2cc23..a5f6b1b356 100644 --- a/ChangeLog.md +++ b/ChangeLog.md @@ -164,6 +164,8 @@ Bug fixes: * Using `--ghc-options` with `stack script --compile` now works. * Ensure the detailed-0.9 type tests work. See [#4453](https://github.com/commercialhaskell/stack/issues/4453). +* Extra include and lib dirs are now order-dependent. See + [#4527](https://github.com/commercialhaskell/stack/issues/4527). ## v1.9.3 diff --git a/src/Stack/Options/ConfigParser.hs b/src/Stack/Options/ConfigParser.hs index 5270784336..74432ce05e 100644 --- a/src/Stack/Options/ConfigParser.hs +++ b/src/Stack/Options/ConfigParser.hs @@ -2,7 +2,6 @@ module Stack.Options.ConfigParser where import Data.Char -import qualified Data.Set as Set import Options.Applicative import Options.Applicative.Builder.Extra import Path @@ -88,20 +87,20 @@ configOptsParser currentDir hide0 = <> help "Number of concurrent jobs to run" <> hide )) - <*> fmap Set.fromList (many ((currentDir FilePath.) <$> strOption + <*> many ((currentDir FilePath.) <$> strOption ( long "extra-include-dirs" <> metavar "DIR" <> completer dirCompleter <> help "Extra directories to check for C header files" <> hide - ))) - <*> fmap Set.fromList (many ((currentDir FilePath.) <$> strOption + )) + <*> many ((currentDir FilePath.) <$> strOption ( long "extra-lib-dirs" <> metavar "DIR" <> completer dirCompleter <> help "Extra directories to check for libraries" <> hide - ))) + )) <*> optionalFirst (absFileOption ( long "with-gcc" <> metavar "PATH-TO-GCC" diff --git a/src/Stack/Package.hs b/src/Stack/Package.hs index aec46fe3fc..ceb8c9ae05 100644 --- a/src/Stack/Package.hs +++ b/src/Stack/Package.hs @@ -338,8 +338,8 @@ data BioInput = BioInput , biAddPackages :: ![PackageName] , biBuildInfo :: !BuildInfo , biDotCabalPaths :: ![DotCabalPath] - , biConfigLibDirs :: !(Set FilePath) - , biConfigIncludeDirs :: !(Set FilePath) + , biConfigLibDirs :: ![FilePath] + , biConfigIncludeDirs :: ![FilePath] , biComponentName :: !NamedComponent , biCabalVersion :: !Version } @@ -407,8 +407,7 @@ generateBuildInfoOpts BioInput {..} = toIncludeDir "." = Just biCabalDir toIncludeDir relDir = concatAndColapseAbsDir biCabalDir relDir includeOpts = - map ("-I" <>) (configExtraIncludeDirs <> pkgIncludeOpts) - configExtraIncludeDirs = S.toList biConfigIncludeDirs + map ("-I" <>) (biConfigIncludeDirs <> pkgIncludeOpts) pkgIncludeOpts = [ toFilePathNoTrailingSep absDir | dir <- includeDirs biBuildInfo @@ -416,8 +415,7 @@ generateBuildInfoOpts BioInput {..} = ] libOpts = map ("-l" <>) (extraLibs biBuildInfo) <> - map ("-L" <>) (configExtraLibDirs <> pkgLibDirs) - configExtraLibDirs = S.toList biConfigLibDirs + map ("-L" <>) (biConfigLibDirs <> pkgLibDirs) pkgLibDirs = [ toFilePathNoTrailingSep absDir | dir <- extraLibDirs biBuildInfo diff --git a/src/Stack/Path.hs b/src/Stack/Path.hs index 9738e58bba..f046c32b4d 100644 --- a/src/Stack/Path.hs +++ b/src/Stack/Path.hs @@ -10,7 +10,6 @@ module Stack.Path import Stack.Prelude import Data.List (intercalate) -import qualified Data.Set as Set import qualified Data.Text as T import qualified Data.Text.IO as T import Lens.Micro (lens) @@ -186,10 +185,10 @@ paths = , WithoutHaddocks $ view $ configL.to configLocalBin.to toFilePathNoTrailingSep.to T.pack) , ( "Extra include directories" , "extra-include-dirs" - , WithoutHaddocks $ T.intercalate ", " . map T.pack . Set.elems . configExtraIncludeDirs . view configL ) + , WithoutHaddocks $ T.intercalate ", " . map T.pack . configExtraIncludeDirs . view configL ) , ( "Extra library directories" , "extra-library-dirs" - , WithoutHaddocks $ T.intercalate ", " . map T.pack . Set.elems . configExtraLibDirs . view configL ) + , WithoutHaddocks $ T.intercalate ", " . map T.pack . configExtraLibDirs . view configL ) , ( "Snapshot package database" , "snapshot-pkg-db" , WithoutHaddocks $ T.pack . toFilePathNoTrailingSep . piSnapDb ) diff --git a/src/Stack/Setup.hs b/src/Stack/Setup.hs index 8e0afdbaa6..56cb414ddb 100644 --- a/src/Stack/Setup.hs +++ b/src/Stack/Setup.hs @@ -443,12 +443,12 @@ withNewLocalBuildTargets targets f = do -- | Add the include and lib paths to the given Config addIncludeLib :: ExtraDirs -> Config -> Config addIncludeLib (ExtraDirs _bins includes libs) config = config - { configExtraIncludeDirs = Set.union - (configExtraIncludeDirs config) - (Set.fromList (map toFilePathNoTrailingSep includes)) - , configExtraLibDirs = Set.union - (configExtraLibDirs config) - (Set.fromList (map toFilePathNoTrailingSep libs)) + { configExtraIncludeDirs = + configExtraIncludeDirs config ++ + map toFilePathNoTrailingSep includes + , configExtraLibDirs = + configExtraLibDirs config ++ + map toFilePathNoTrailingSep libs } -- | Ensure compiler (ghc or ghcjs) is installed and provide the PATHs to add if necessary diff --git a/src/Stack/Types/Build.hs b/src/Stack/Types/Build.hs index 3c11ddbede..985e775a95 100644 --- a/src/Stack/Types/Build.hs +++ b/src/Stack/Types/Build.hs @@ -629,8 +629,8 @@ configureOptsNoDir econfig bco deps isLocal package = concat flagNameString name) (Map.toList flags) , concatMap (\x -> [compilerOptionsCabalFlag wc, T.unpack x]) (packageGhcOptions package) - , map ("--extra-include-dirs=" ++) (Set.toList (configExtraIncludeDirs config)) - , map ("--extra-lib-dirs=" ++) (Set.toList (configExtraLibDirs config)) + , map ("--extra-include-dirs=" ++) (configExtraIncludeDirs config) + , map ("--extra-lib-dirs=" ++) (configExtraLibDirs config) , maybe [] (\customGcc -> ["--with-gcc=" ++ toFilePath customGcc]) (configOverrideGccPath config) , ["--ghcjs" | wc == Ghcjs] , ["--exact-configuration" | useExactConf] diff --git a/src/Stack/Types/Config.hs b/src/Stack/Types/Config.hs index fcb20984ab..2884eae830 100644 --- a/src/Stack/Types/Config.hs +++ b/src/Stack/Types/Config.hs @@ -301,9 +301,9 @@ data Config = -- ^ How many concurrent jobs to run, defaults to number of capabilities ,configOverrideGccPath :: !(Maybe (Path Abs File)) -- ^ Optional gcc override path - ,configExtraIncludeDirs :: !(Set FilePath) + ,configExtraIncludeDirs :: ![FilePath] -- ^ --extra-include-dirs arguments - ,configExtraLibDirs :: !(Set FilePath) + ,configExtraLibDirs :: ![FilePath] -- ^ --extra-lib-dirs arguments ,configConcurrentTests :: !Bool -- ^ Run test suites concurrently @@ -703,9 +703,9 @@ data ConfigMonoid = -- ^ Used for overriding the GHC build ,configMonoidJobs :: !(First Int) -- ^ See: 'configJobs' - ,configMonoidExtraIncludeDirs :: !(Set FilePath) + ,configMonoidExtraIncludeDirs :: ![FilePath] -- ^ See: 'configExtraIncludeDirs' - ,configMonoidExtraLibDirs :: !(Set FilePath) + ,configMonoidExtraLibDirs :: ![FilePath] -- ^ See: 'configExtraLibDirs' , configMonoidOverrideGccPath :: !(First (Path Abs File)) -- ^ Allow users to override the path to gcc @@ -808,10 +808,10 @@ parseConfigMonoidObject rootDir obj = do configMonoidGHCVariant <- First <$> obj ..:? configMonoidGHCVariantName configMonoidGHCBuild <- First <$> obj ..:? configMonoidGHCBuildName configMonoidJobs <- First <$> obj ..:? configMonoidJobsName - configMonoidExtraIncludeDirs <- fmap (Set.map (toFilePath rootDir FilePath.)) $ - obj ..:? configMonoidExtraIncludeDirsName ..!= Set.empty - configMonoidExtraLibDirs <- fmap (Set.map (toFilePath rootDir FilePath.)) $ - obj ..:? configMonoidExtraLibDirsName ..!= Set.empty + configMonoidExtraIncludeDirs <- map (toFilePath rootDir FilePath.) <$> + obj ..:? configMonoidExtraIncludeDirsName ..!= [] + configMonoidExtraLibDirs <- map (toFilePath rootDir FilePath.) <$> + obj ..:? configMonoidExtraLibDirsName ..!= [] configMonoidOverrideGccPath <- First <$> obj ..:? configMonoidOverrideGccPathName configMonoidOverrideHpack <- First <$> obj ..:? configMonoidOverrideHpackName configMonoidConcurrentTests <- First <$> obj ..:? configMonoidConcurrentTestsName