import Data.List
import Data.Map (Map)
import qualified Data.Map as Map
-import Distribution.System
import System.FilePath
import System.IO ( stderr, hPutChar )
| Opt_DeriveFunctor
| Opt_DeriveTraversable
| Opt_DeriveFoldable
- | Opt_DeriveRepresentable -- Allow deriving Representable0/1
- | Opt_DefaultSignatures -- Allow extra signatures for defmeths
- | Opt_Generics -- Generic deriving mechanism
+ | Opt_DeriveGeneric -- Allow deriving Generic/1
+ | Opt_DefaultSignatures -- Allow extra signatures for defmeths
+ | Opt_Generics -- Old generic classes, now deprecated
| Opt_TypeSynonymInstances
| Opt_FlexibleContexts
log_action = \severity srcSpan style msg ->
case severity of
- SevOutput -> printOutput (msg style)
- SevInfo -> printErrs (msg style)
- SevFatal -> printErrs (msg style)
+ SevOutput -> printSDoc msg style
+ SevInfo -> printErrs msg style
+ SevFatal -> printErrs msg style
_ -> do
hPutChar stderr '\n'
- printErrs ((mkLocMessage srcSpan msg) style)
+ printErrs (mkLocMessage srcSpan msg) style
-- careful (#2302): printErrs prints in UTF-8, whereas
-- converting to string first and using hPutStr would
-- just emit the low 8 bits of each unicode char.
= runCmdLine (processArgs flag_spec args') dflags0
when (not (null errs)) $ ghcError $ errorsToGhcException errs
- let (pic_warns, dflags2)
- | not (cTargetArch == X86_64 && (cTargetOS == Linux || cTargetOS == OSX)) &&
- (not opt_Static || opt_PIC) &&
- hscTarget dflags1 == HscLlvm
- = ([L noSrcSpan $ "Warning: -fllvm is incompatible with -fPIC and "
- ++ "-dynamic on this platform;\n"
- ++ " using "
- ++ showHscTargetFlag defaultObjectTarget ++ " instead"],
- dflags1{ hscTarget = defaultObjectTarget })
- | otherwise = ([], dflags1)
-
- return (dflags2, leftover, pic_warns ++ warns)
+ return (dflags1, leftover, warns)
{- **********************************************************************
( "ParallelArrays", Opt_ParallelArrays, nop ),
( "TemplateHaskell", Opt_TemplateHaskell, checkTemplateHaskellOk ),
( "QuasiQuotes", Opt_QuasiQuotes, nop ),
- ( "Generics", Opt_Generics, nop ),
+ ( "Generics", Opt_Generics,
+ \ _ -> deprecate "it does nothing; look into -XDefaultSignatures and -XDeriveGeneric for generic programming support." ),
( "ImplicitPrelude", Opt_ImplicitPrelude, nop ),
( "RecordWildCards", Opt_RecordWildCards, nop ),
( "NamedFieldPuns", Opt_RecordPuns, nop ),
( "DeriveFunctor", Opt_DeriveFunctor, nop ),
( "DeriveTraversable", Opt_DeriveTraversable, nop ),
( "DeriveFoldable", Opt_DeriveFoldable, nop ),
- ( "DeriveRepresentable", Opt_DeriveRepresentable, nop ),
+ ( "DeriveGeneric", Opt_DeriveGeneric, nop ),
( "DefaultSignatures", Opt_DefaultSignatures, nop ),
( "TypeSynonymInstances", Opt_TypeSynonymInstances, nop ),
( "FlexibleContexts", Opt_FlexibleContexts, nop ),
, (Opt_RecordWildCards, turnOn, Opt_DisambiguateRecordFields)
, (Opt_ParallelArrays, turnOn, Opt_ParallelListComp)
- -- The new behavior of the XGenerics flag is just to turn on these two flags
- , (Opt_Generics, turnOn, Opt_DefaultSignatures)
- , (Opt_Generics, turnOn, Opt_DeriveRepresentable)
]
optLevelFlags :: [([Int], DynFlag)]
, Opt_DeriveFunctor
, Opt_DeriveFoldable
, Opt_DeriveTraversable
- , Opt_DeriveRepresentable
+ , Opt_DeriveGeneric
, Opt_FlexibleContexts
, Opt_FlexibleInstances
, Opt_ConstrainedClassMethods
= case l of
HscC
| cGhcUnregisterised /= "YES" ->
- do addWarn ("Compiler not unregisterised, so ignoring " ++
- showHscTargetFlag l)
+ do addWarn ("Compiler not unregisterised, so ignoring " ++ flag)
return dflags
HscAsm
| cGhcWithNativeCodeGen /= "YES" ->
do addWarn ("Compiler has no native codegen, so ignoring " ++
- showHscTargetFlag l)
+ flag)
return dflags
HscLlvm
| cGhcUnregisterised == "YES" ->
- do addWarn ("Compiler unregisterised, so ignoring " ++
- showHscTargetFlag l)
+ do addWarn ("Compiler unregisterised, so ignoring " ++ flag)
+ return dflags
+ | not ((arch == ArchX86_64) && (os == OSLinux || os == OSDarwin)) &&
+ (not opt_Static || opt_PIC)
+ ->
+ do addWarn ("Ignoring " ++ flag ++ " as it is incompatible with -fPIC and -dynamic on this platform")
return dflags
_ -> return $ dflags { hscTarget = l }
| otherwise = return dflags
+ where platform = targetPlatform dflags
+ arch = platformArch platform
+ os = platformOS platform
+ flag = showHscTargetFlag l
setOptLevel :: Int -> DynFlags -> DynP DynFlags
setOptLevel n dflags