Commit ba4a6d5b authored by Mikhail Glushenkov's avatar Mikhail Glushenkov
Browse files

GhcOptions: use `NubListR` where appropriate.

Some Cabal API clients apparently use `foldl mappend` on large lists of
`GhcOptions` records. Fixes #2110.
parent de4a4f84
......@@ -302,7 +302,7 @@ instance Text BuildType where
-- is, "expose all modules, but also expose @Data.Bool@ as @Bool@".
--
data ModuleRenaming = ModuleRenaming Bool [(ModuleName, ModuleName)]
deriving (Show, Read, Eq, Typeable, Data, Generic)
deriving (Show, Read, Eq, Ord, Typeable, Data, Generic)
defaultRenaming :: ModuleRenaming
defaultRenaming = ModuleRenaming True []
......
......@@ -100,6 +100,8 @@ import Distribution.System
import Distribution.Verbosity
import Distribution.Text
( display, simpleParse )
import Distribution.Utils.NubList
( overNubListR, toNubListR )
import Language.Haskell.Extension (Language(..), Extension(..)
,KnownExtension(..))
......@@ -730,14 +732,14 @@ buildOrReplLib forRepl verbosity numJobsFlag pkg_descr lbi lib clbi = do
ghcOptMode = toFlag GhcModeMake,
ghcOptNumJobs = toFlag numJobs,
ghcOptPackageKey = toFlag (pkgKey lbi),
ghcOptInputModules = libModules lib
ghcOptInputModules = toNubListR $ libModules lib
}
profOpts = vanillaOpts `mappend` mempty {
ghcOptProfilingMode = toFlag True,
ghcOptHiSuffix = toFlag "p_hi",
ghcOptObjSuffix = toFlag "p_o",
ghcOptExtra = ghcProfOptions libBi
ghcOptExtra = toNubListR $ ghcProfOptions libBi
}
sharedOpts = vanillaOpts `mappend` mempty {
......@@ -745,17 +747,18 @@ buildOrReplLib forRepl verbosity numJobsFlag pkg_descr lbi lib clbi = do
ghcOptFPic = toFlag True,
ghcOptHiSuffix = toFlag "dyn_hi",
ghcOptObjSuffix = toFlag "dyn_o",
ghcOptExtra = ghcSharedOptions libBi
ghcOptExtra = toNubListR $ ghcSharedOptions libBi
}
linkerOpts = mempty {
ghcOptLinkOptions = PD.ldOptions libBi,
ghcOptLinkLibs = extraLibs libBi,
ghcOptLinkLibPath = extraLibDirs libBi,
ghcOptLinkFrameworks = PD.frameworks libBi,
ghcOptInputFiles = [libTargetDir </> x | x <- cObjs]
ghcOptLinkOptions = toNubListR $ PD.ldOptions libBi,
ghcOptLinkLibs = toNubListR $ extraLibs libBi,
ghcOptLinkLibPath = toNubListR $ extraLibDirs libBi,
ghcOptLinkFrameworks = toNubListR $ PD.frameworks libBi,
ghcOptInputFiles = toNubListR
[libTargetDir </> x | x <- cObjs]
}
replOpts = vanillaOpts {
ghcOptExtra = filterGhciFlags
ghcOptExtra = overNubListR filterGhciFlags $
(ghcOptExtra vanillaOpts),
ghcOptNumJobs = mempty
}
......@@ -882,7 +885,7 @@ buildOrReplLib forRepl verbosity numJobsFlag pkg_descr lbi lib clbi = do
mempty {
ghcOptShared = toFlag True,
ghcOptDynLinkMode = toFlag GhcDynamicOnly,
ghcOptInputFiles = dynamicObjectFiles,
ghcOptInputFiles = toNubListR dynamicObjectFiles,
ghcOptOutputFile = toFlag sharedLibFilePath,
-- For dynamic libs, Mac OS/X needs to know the install location
-- at build time. This only applies to GHC < 7.8 - see the
......@@ -894,9 +897,9 @@ buildOrReplLib forRepl verbosity numJobsFlag pkg_descr lbi lib clbi = do
ghcOptPackageKey = toFlag (pkgKey lbi),
ghcOptNoAutoLinkPackages = toFlag True,
ghcOptPackageDBs = withPackageDB lbi,
ghcOptPackages = mkGhcOptPackages clbi ,
ghcOptLinkLibs = extraLibs libBi,
ghcOptLinkLibPath = extraLibDirs libBi
ghcOptPackages = toNubListR $ mkGhcOptPackages clbi ,
ghcOptLinkLibs = toNubListR $ extraLibs libBi,
ghcOptLinkLibPath = toNubListR $ extraLibDirs libBi
}
whenVanillaLib False $ do
......@@ -979,9 +982,9 @@ buildOrReplExe forRepl verbosity numJobsFlag _pkg_descr lbi
baseOpts = (componentGhcOptions verbosity lbi exeBi clbi exeDir)
`mappend` mempty {
ghcOptMode = toFlag GhcModeMake,
ghcOptInputFiles =
ghcOptInputFiles = toNubListR
[ srcMainFile | isHaskellMain],
ghcOptInputModules =
ghcOptInputModules = toNubListR
[ m | not isHaskellMain, m <- exeModules exe],
ghcOptHPCDir = hpcdir
}
......@@ -992,13 +995,13 @@ buildOrReplExe forRepl verbosity numJobsFlag _pkg_descr lbi
ghcOptProfilingMode = toFlag True,
ghcOptHiSuffix = toFlag "p_hi",
ghcOptObjSuffix = toFlag "p_o",
ghcOptExtra = ghcProfOptions exeBi
ghcOptExtra = toNubListR $ ghcProfOptions exeBi
}
dynOpts = baseOpts `mappend` mempty {
ghcOptDynLinkMode = toFlag GhcDynamicOnly,
ghcOptHiSuffix = toFlag "dyn_hi",
ghcOptObjSuffix = toFlag "dyn_o",
ghcOptExtra = ghcSharedOptions exeBi
ghcOptExtra = toNubListR $ ghcSharedOptions exeBi
}
dynTooOpts = staticOpts `mappend` mempty {
ghcOptDynLinkMode = toFlag GhcStaticAndDynamic,
......@@ -1006,14 +1009,15 @@ buildOrReplExe forRepl verbosity numJobsFlag _pkg_descr lbi
ghcOptDynObjSuffix = toFlag "dyn_o"
}
linkerOpts = mempty {
ghcOptLinkOptions = PD.ldOptions exeBi,
ghcOptLinkLibs = extraLibs exeBi,
ghcOptLinkLibPath = extraLibDirs exeBi,
ghcOptLinkFrameworks = PD.frameworks exeBi,
ghcOptInputFiles = [exeDir </> x | x <- cObjs]
ghcOptLinkOptions = toNubListR $ PD.ldOptions exeBi,
ghcOptLinkLibs = toNubListR $ extraLibs exeBi,
ghcOptLinkLibPath = toNubListR $ extraLibDirs exeBi,
ghcOptLinkFrameworks = toNubListR $ PD.frameworks exeBi,
ghcOptInputFiles = toNubListR
[exeDir </> x | x <- cObjs]
}
replOpts = baseOpts {
ghcOptExtra = filterGhciFlags
ghcOptExtra = overNubListR filterGhciFlags
(ghcOptExtra baseOpts)
}
-- For a normal compile we do separate invocations of ghc for
......@@ -1159,20 +1163,20 @@ libAbiHash verbosity _pkg_descr lbi lib clbi = do
`mappend` mempty {
ghcOptMode = toFlag GhcModeAbiHash,
ghcOptPackageKey = toFlag (pkgKey lbi),
ghcOptInputModules = exposedModules lib
ghcOptInputModules = toNubListR $ exposedModules lib
}
sharedArgs = vanillaArgs `mappend` mempty {
ghcOptDynLinkMode = toFlag GhcDynamicOnly,
ghcOptFPic = toFlag True,
ghcOptHiSuffix = toFlag "dyn_hi",
ghcOptObjSuffix = toFlag "dyn_o",
ghcOptExtra = ghcSharedOptions libBi
ghcOptExtra = toNubListR $ ghcSharedOptions libBi
}
profArgs = vanillaArgs `mappend` mempty {
ghcOptProfilingMode = toFlag True,
ghcOptHiSuffix = toFlag "p_hi",
ghcOptObjSuffix = toFlag "p_o",
ghcOptExtra = ghcProfOptions libBi
ghcOptExtra = toNubListR $ ghcProfOptions libBi
}
ghcArgs = if withVanillaLib lbi then vanillaArgs
else if withSharedLib lbi then sharedArgs
......@@ -1193,26 +1197,27 @@ componentGhcOptions verbosity lbi bi clbi odir =
ghcOptHideAllPackages = toFlag True,
ghcOptCabal = toFlag True,
ghcOptPackageDBs = withPackageDB lbi,
ghcOptPackages = mkGhcOptPackages clbi,
ghcOptPackages = toNubListR $ mkGhcOptPackages clbi,
ghcOptSplitObjs = toFlag (splitObjs lbi),
ghcOptSourcePathClear = toFlag True,
ghcOptSourcePath = [odir] ++ nub (hsSourceDirs bi)
++ [autogenModulesDir lbi],
ghcOptCppIncludePath = [autogenModulesDir lbi, odir]
++ PD.includeDirs bi,
ghcOptCppOptions = cppOptions bi,
ghcOptCppIncludes = [autogenModulesDir lbi </> cppHeaderName],
ghcOptFfiIncludes = PD.includes bi,
ghcOptSourcePath = toNubListR $ [odir] ++ (hsSourceDirs bi)
++ [autogenModulesDir lbi],
ghcOptCppIncludePath = toNubListR $ [autogenModulesDir lbi, odir]
++ PD.includeDirs bi,
ghcOptCppOptions = toNubListR $ cppOptions bi,
ghcOptCppIncludes = toNubListR $
[autogenModulesDir lbi </> cppHeaderName],
ghcOptFfiIncludes = toNubListR $ PD.includes bi,
ghcOptObjDir = toFlag odir,
ghcOptHiDir = toFlag odir,
ghcOptStubDir = toFlag odir,
ghcOptOutputDir = toFlag odir,
ghcOptOptimisation = toGhcOptimisation (withOptimization lbi),
ghcOptExtra = hcOptions GHC bi,
ghcOptExtra = toNubListR $ hcOptions GHC bi,
ghcOptLanguage = toFlag (fromMaybe Haskell98 (defaultLanguage bi)),
-- Unsupported extensions have already been checked by configure
ghcOptExtensions = usedExtensions bi,
ghcOptExtensionMap = compilerExtensions (compiler lbi)
ghcOptExtensions = toNubListR $ usedExtensions bi,
ghcOptExtensionMap = M.fromList . compilerExtensions $ (compiler lbi)
}
where
toGhcOptimisation NoOptimisation = mempty --TODO perhaps override?
......@@ -1227,16 +1232,17 @@ componentCcGhcOptions verbosity lbi bi clbi pref filename =
mempty {
ghcOptVerbosity = toFlag verbosity,
ghcOptMode = toFlag GhcModeCompile,
ghcOptInputFiles = [filename],
ghcOptInputFiles = toNubListR [filename],
ghcOptCppIncludePath = [autogenModulesDir lbi, odir]
++ PD.includeDirs bi,
ghcOptCppIncludePath = toNubListR $ [autogenModulesDir lbi, odir]
++ PD.includeDirs bi,
ghcOptPackageDBs = withPackageDB lbi,
ghcOptPackages = mkGhcOptPackages clbi,
ghcOptCcOptions = (case withOptimization lbi of
NoOptimisation -> []
_ -> ["-O2"]) ++
PD.ccOptions bi,
ghcOptPackages = toNubListR $ mkGhcOptPackages clbi,
ghcOptCcOptions = toNubListR $
(case withOptimization lbi of
NoOptimisation -> []
_ -> ["-O2"]) ++
PD.ccOptions bi,
ghcOptObjDir = toFlag odir
}
where
......
......@@ -71,6 +71,8 @@ import Distribution.Simple.Utils
, findFileWithExtension, findFile )
import Distribution.Text
( display, simpleParse )
import Distribution.Utils.NubList
( toNubListR )
import Distribution.Verbosity
import Language.Haskell.Extension
......@@ -270,7 +272,7 @@ fromLibrary verbosity tmp lbi lib clbi htmlTemplate haddockVersion = do
ghcOptFPic = toFlag True,
ghcOptHiSuffix = toFlag "dyn_hi",
ghcOptObjSuffix = toFlag "dyn_o",
ghcOptExtra = ghcSharedOptions bi
ghcOptExtra = toNubListR $ ghcSharedOptions bi
}
opts <- if withVanillaLib lbi
then return vanillaOpts
......@@ -309,7 +311,7 @@ fromExecutable verbosity tmp lbi exe clbi htmlTemplate haddockVersion = do
ghcOptFPic = toFlag True,
ghcOptHiSuffix = toFlag "dyn_hi",
ghcOptObjSuffix = toFlag "dyn_o",
ghcOptExtra = ghcSharedOptions bi
ghcOptExtra = toNubListR $ ghcSharedOptions bi
}
opts <- if withVanillaLib lbi
then return vanillaOpts
......@@ -361,8 +363,8 @@ getGhcCppOpts :: Version
-> GhcOptions
getGhcCppOpts haddockVersion bi =
mempty {
ghcOptExtensions = [EnableExtension CPP | needsCpp],
ghcOptCppOptions = defines
ghcOptExtensions = toNubListR [EnableExtension CPP | needsCpp],
ghcOptCppOptions = toNubListR defines
}
where
needsCpp = EnableExtension CPP `elem` usedExtensions bi
......
......@@ -17,14 +17,15 @@ import Distribution.ModuleName
import Distribution.Simple.Compiler hiding (Flag)
import Distribution.Simple.Setup ( Flag(..), flagToMaybe, fromFlagOrDefault,
flagToList )
--import Distribution.Simple.LocalBuildInfo
import Distribution.Simple.Program.Types
import Distribution.Simple.Program.Run
import Distribution.Text
import Distribution.Verbosity
import Distribution.Utils.NubList (NubListR, fromNubListR)
import Distribution.Version
import Language.Haskell.Extension ( Language(..), Extension(..) )
import qualified Data.Map as M
import Data.Monoid
-- | A structured set of GHC options/flags
......@@ -36,20 +37,20 @@ data GhcOptions = GhcOptions {
-- | Any extra options to pass directly to ghc. These go at the end and hence
-- override other stuff.
ghcOptExtra :: [String],
ghcOptExtra :: NubListR String,
-- | Extra default flags to pass directly to ghc. These go at the beginning
-- and so can be overridden by other stuff.
ghcOptExtraDefault :: [String],
ghcOptExtraDefault :: NubListR String,
-----------------------
-- Inputs and outputs
-- | The main input files; could be .hs, .hi, .c, .o, depending on mode.
ghcOptInputFiles :: [FilePath],
ghcOptInputFiles :: NubListR FilePath,
-- | The names of input Haskell modules, mainly for @--make@ mode.
ghcOptInputModules :: [ModuleName],
ghcOptInputModules :: NubListR ModuleName,
-- | Location for output file; the @ghc -o@ flag.
ghcOptOutputFile :: Flag FilePath,
......@@ -63,7 +64,7 @@ data GhcOptions = GhcOptions {
ghcOptSourcePathClear :: Flag Bool,
-- | Search path for Haskell source files; the @ghc -i@ flag.
ghcOptSourcePath :: [FilePath],
ghcOptSourcePath :: NubListR FilePath,
-------------
-- Packages
......@@ -77,7 +78,8 @@ data GhcOptions = GhcOptions {
-- | The GHC packages to use. For compatability with old and new ghc, this
-- requires both the short and long form of the package id;
-- the @ghc -package@ or @ghc -package-id@ flags.
ghcOptPackages :: [(InstalledPackageId, PackageId, ModuleRenaming)],
ghcOptPackages ::
NubListR (InstalledPackageId, PackageId, ModuleRenaming),
-- | Start with a clean package set; the @ghc -hide-all-packages@ flag
ghcOptHideAllPackages :: Flag Bool,
......@@ -89,16 +91,16 @@ data GhcOptions = GhcOptions {
-- Linker stuff
-- | Names of libraries to link in; the @ghc -l@ flag.
ghcOptLinkLibs :: [FilePath],
ghcOptLinkLibs :: NubListR FilePath,
-- | Search path for libraries to link in; the @ghc -L@ flag.
ghcOptLinkLibPath :: [FilePath],
ghcOptLinkLibPath :: NubListR FilePath,
-- | Options to pass through to the linker; the @ghc -optl@ flag.
ghcOptLinkOptions :: [String],
ghcOptLinkOptions :: NubListR String,
-- | OSX only: frameworks to link in; the @ghc -framework@ flag.
ghcOptLinkFrameworks :: [String],
ghcOptLinkFrameworks :: NubListR String,
-- | Don't do the link step, useful in make mode; the @ghc -no-link@ flag.
ghcOptNoLink :: Flag Bool,
......@@ -110,19 +112,19 @@ data GhcOptions = GhcOptions {
-- C and CPP stuff
-- | Options to pass through to the C compiler; the @ghc -optc@ flag.
ghcOptCcOptions :: [String],
ghcOptCcOptions :: NubListR String,
-- | Options to pass through to CPP; the @ghc -optP@ flag.
ghcOptCppOptions :: [String],
ghcOptCppOptions :: NubListR String,
-- | Search path for CPP includes like header files; the @ghc -I@ flag.
ghcOptCppIncludePath :: [FilePath],
ghcOptCppIncludePath :: NubListR FilePath,
-- | Extra header files to include at CPP stage; the @ghc -optP-include@ flag.
ghcOptCppIncludes :: [FilePath],
ghcOptCppIncludes :: NubListR FilePath,
-- | Extra header files to include for old-style FFI; the @ghc -#include@ flag.
ghcOptFfiIncludes :: [FilePath],
ghcOptFfiIncludes :: NubListR FilePath,
----------------------------
-- Language and extensions
......@@ -131,11 +133,11 @@ data GhcOptions = GhcOptions {
ghcOptLanguage :: Flag Language,
-- | The language extensions; the @ghc -X@ flag.
ghcOptExtensions :: [Extension],
ghcOptExtensions :: NubListR Extension,
-- | A GHC version-dependent mapping of extensions to flags. This must be
-- set to be able to make use of the 'ghcOptExtensions'.
ghcOptExtensionMap :: [(Extension, String)],
ghcOptExtensionMap :: M.Map Extension String,
----------------
-- Compilation
......@@ -159,7 +161,7 @@ data GhcOptions = GhcOptions {
-- GHCi
-- | Extra GHCi startup scripts; the @-ghci-script@ flag
ghcOptGHCiScripts :: [FilePath],
ghcOptGHCiScripts :: NubListR FilePath,
------------------------
-- Redirecting outputs
......@@ -337,7 +339,7 @@ renderGhcOptions comp opts
, [ "-hide-all-packages" | flagBool ghcOptHideAllPackages ]
, [ "-no-auto-link-packages" | flagBool ghcOptNoAutoLinkPackages ]
, packageDbArgs version (flags ghcOptPackageDBs)
, packageDbArgs version (ghcOptPackageDBs opts)
, concat $ if ver >= [6,11]
then let space "" = ""
......@@ -352,11 +354,11 @@ renderGhcOptions comp opts
then [ "-X" ++ display lang | lang <- flag ghcOptLanguage ]
else []
, [ case lookup ext (ghcOptExtensionMap opts) of
, [ case M.lookup ext (ghcOptExtensionMap opts) of
Just arg -> arg
Nothing -> error $ "Distribution.Simple.Program.GHC.renderGhcOptions: "
++ display ext ++ " not present in ghcOptExtensionMap."
| ext <- ghcOptExtensions opts ]
| ext <- flags ghcOptExtensions ]
----------------
-- GHCi
......@@ -368,7 +370,7 @@ renderGhcOptions comp opts
-- Inputs
, [ display modu | modu <- flags ghcOptInputModules ]
, ghcOptInputFiles opts
, flags ghcOptInputFiles
, concat [ [ "-o", out] | out <- flag ghcOptOutputFile ]
, concat [ [ "-dyno", out] | out <- flag ghcOptOutputDynFile ]
......@@ -376,14 +378,14 @@ renderGhcOptions comp opts
---------------
-- Extra
, ghcOptExtra opts
, flags ghcOptExtra
]
where
flag flg = flagToList (flg opts)
flags flg = flg opts
flags flg = fromNubListR . flg $ opts
flagBool flg = fromFlagOrDefault False (flg opts)
version@(Version ver _) = compilerVersion comp
......
......@@ -2,10 +2,12 @@ module Distribution.Utils.NubList
( NubList -- opaque
, toNubList -- smart construtor
, fromNubList
, overNubList
, NubListR
, toNubListR
, fromNubListR
, overNubListR
) where
import Data.Binary
......@@ -25,9 +27,14 @@ newtype NubList a =
-- does not specifically state that ordering is maintained so we will add a test
-- for that to the test suite.
-- | Smart constructor for the NubList type.
toNubList :: Ord a => [a] -> NubList a
toNubList list = NubList $ ordNub list
-- | Lift a function over lists to a function over NubLists.
overNubList :: Ord a => ([a] -> [a]) -> NubList a -> NubList a
overNubList f (NubList list) = toNubList . f $ list
-- | Monoid operations on NubLists.
-- For a valid Monoid instance we need to satistfy the required monoid laws;
-- identity, associativity and closure.
......@@ -52,12 +59,13 @@ instance Show a => Show (NubList a) where
instance (Ord a, Read a) => Read (NubList a) where
readPrec = readNubList toNubList
-- | Helper used by NubList/NubListR's Read instances.
readNubList :: (Ord a, Read a) => ([a] -> l a) -> R.ReadPrec (l a)
readNubList toList = R.parens . R.prec 10 $ fmap toList R.readPrec
-- Binary instance of NubList is the same as for List. For put, we just pull off
-- constructor and put the list. For get, we get the list and make a NubList
-- out of it using toNubList.
-- | Binary instance for 'NubList a' is the same as for '[a]'. For 'put', we
-- just pull off constructor and put the list. For 'get', we get the list and
-- make a 'NubList' out of it using 'toNubList'.
instance (Ord a, Binary a) => Binary (NubList a) where
put (NubList l) = put l
get = fmap toNubList get
......@@ -70,9 +78,14 @@ newtype NubListR a =
NubListR { fromNubListR :: [a] }
deriving Eq
-- | Smart constructor for the NubListR type.
toNubListR :: Ord a => [a] -> NubListR a
toNubListR list = NubListR $ ordNubRight list
-- | Lift a function over lists to a function over NubListRs.
overNubListR :: Ord a => ([a] -> [a]) -> NubListR a -> NubListR a
overNubListR f (NubListR list) = toNubListR . f $ list
instance Ord a => Monoid (NubListR a) where
mempty = NubListR []
mappend (NubListR xs) (NubListR ys) = NubListR $ xs `listUnionRight` ys
......
......@@ -103,7 +103,7 @@ data Extension =
-- pragma.
| UnknownExtension String
deriving (Generic, Show, Read, Eq, Typeable, Data)
deriving (Generic, Show, Read, Eq, Ord, Typeable, Data)
instance Binary Extension
......@@ -688,7 +688,7 @@ data KnownExtension =
-- * <http://www.haskell.org/ghc/docs/latest/html/users_guide/other-type-extensions.html#ambiguity>
| AllowAmbiguousTypes
deriving (Generic, Show, Read, Eq, Enum, Bounded, Typeable, Data)
deriving (Generic, Show, Read, Eq, Ord, Enum, Bounded, Typeable, Data)
instance Binary KnownExtension
......
......@@ -78,6 +78,8 @@ import Distribution.Client.Utils
import Distribution.System ( Platform(..), buildPlatform )
import Distribution.Text
( display )
import Distribution.Utils.NubList
( toNubListR )
import Distribution.Verbosity
( Verbosity )
import Distribution.Compat.Exception
......@@ -453,17 +455,17 @@ externalSetupMethod verbosity options pkg bt mkargs = do
let ghcOptions = mempty {
ghcOptVerbosity = Flag verbosity
, ghcOptMode = Flag GhcModeMake
, ghcOptInputFiles = [setupHs]
, ghcOptInputFiles = toNubListR [setupHs]
, ghcOptOutputFile = Flag setupProgFile
, ghcOptObjDir = Flag setupDir
, ghcOptHiDir = Flag setupDir
, ghcOptSourcePathClear = Flag True
, ghcOptSourcePath = [workingDir]
, ghcOptSourcePath = toNubListR [workingDir]
, ghcOptPackageDBs = usePackageDB options''
, ghcOptPackages = maybe []
(\ipkgid -> [(ipkgid, cabalPkgid, defaultRenaming)])
maybeCabalLibInstalledPkgId
, ghcOptExtra = ["-threaded"]
, ghcOptPackages = toNubListR $
maybe [] (\ipkgid -> [(ipkgid, cabalPkgid, defaultRenaming)])
maybeCabalLibInstalledPkgId
, ghcOptExtra = toNubListR ["-threaded"]
}
let ghcCmdLine = renderGhcOptions compiler ghcOptions
case useLoggingHandle options of
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment