Fix warnings on non-Windows
[ghc-hetmet.git] / compiler / main / DynFlags.hs
index e9681f6..fb87391 100644 (file)
@@ -1,6 +1,5 @@
 
 {-# OPTIONS -fno-warn-missing-fields #-}
-{-# OPTIONS -w #-}
 -- The above warning supression flag is a temporary kludge.
 -- While working on this module you are encouraged to remove it and fix
 -- any warnings in the module. See
@@ -29,6 +28,7 @@ module DynFlags (
        GhcLink(..), isNoLink,
        PackageFlag(..),
        Option(..),
+       DynLibLoader(..),
         fFlags, xFlags,
 
        -- Configuration of the core-to-core and stg-to-stg phases
@@ -60,6 +60,8 @@ module DynFlags (
     compilerInfo,
   ) where
 
+-- XXX This define is a bit of a hack, and should be done more nicely
+#define FAST_STRING_NOT_NEEDED 1
 #include "HsVersions.h"
 
 import Module
@@ -86,13 +88,9 @@ import {-# SOURCE #-} ErrUtils ( Severity(..), Message, mkLocMessage )
 import Data.IORef      ( readIORef )
 import Control.Exception ( throwDyn )
 import Control.Monad   ( when )
-#ifdef mingw32_TARGET_OS
-import Data.List       ( isPrefixOf )
-#else
-import Util            ( split )
-#endif
 
 import Data.Char
+import System.FilePath
 import System.IO        ( hPutStrLn, stderr )
 
 -- -----------------------------------------------------------------------------
@@ -195,6 +193,7 @@ data DynFlag
    | Opt_PArr                          -- Syntactic support for parallel arrays
    | Opt_Arrows                                -- Arrow-notation syntax
    | Opt_TemplateHaskell
+   | Opt_QuasiQuotes
    | Opt_ImplicitParams
    | Opt_Generics
    | Opt_ImplicitPrelude 
@@ -332,6 +331,7 @@ data DynFlags = DynFlags {
 
   outputFile           :: Maybe String,
   outputHi             :: Maybe String,
+  dynLibLoader         :: DynLibLoader,
 
   -- | This is set by DriverPipeline.runPipeline based on where
   --   its output is going.
@@ -442,7 +442,7 @@ data GhcLink        -- What to do in the link step, if there is one
 
 isNoLink :: GhcLink -> Bool
 isNoLink NoLink = True
-isNoLink other  = False
+isNoLink _      = False
 
 data PackageFlag
   = ExposePackage  String
@@ -450,14 +450,23 @@ data PackageFlag
   | IgnorePackage  String
   deriving Eq
 
+defaultHscTarget :: HscTarget
 defaultHscTarget = defaultObjectTarget
 
 -- | the 'HscTarget' value corresponding to the default way to create
 -- object files on the current platform.
+defaultObjectTarget :: HscTarget
 defaultObjectTarget
   | cGhcWithNativeCodeGen == "YES"     =  HscAsm
   | otherwise                          =  HscC
 
+data DynLibLoader
+  = Deployable
+  | Wrapped (Maybe String)
+  | SystemDependent
+  deriving Eq
+
+initDynFlags :: DynFlags -> IO DynFlags
 initDynFlags dflags = do
  -- someday these will be dynamic flags
  ways <- readIORef v_Ways
@@ -469,6 +478,7 @@ initDynFlags dflags = do
        rtsBuildTag     = rts_build_tag
        }
 
+defaultDynFlags :: DynFlags
 defaultDynFlags =
      DynFlags {
        ghcMode                 = CompManager,
@@ -504,6 +514,7 @@ defaultDynFlags =
 
        outputFile              = Nothing,
        outputHi                = Nothing,
+       dynLibLoader            = Deployable,
        dumpPrefix              = Nothing,
        dumpPrefixForce         = Nothing,
        includePaths            = [],
@@ -587,6 +598,14 @@ getVerbFlag dflags
   | verbosity dflags >= 3  = "-v" 
   | otherwise =  ""
 
+setObjectDir, setHiDir, setStubDir, setObjectSuf, setHiSuf, setHcSuf, parseDynLibLoaderMode,
+         setPgmP, setPgmL, setPgmF, setPgmc, setPgmm, setPgms, setPgma, setPgml, setPgmdll, setPgmwindres,
+         addOptL, addOptP, addOptF, addOptc, addOptm, addOpta, addOptl, addOptdep, addOptwindres,
+         addCmdlineFramework, addHaddockOpts
+   :: String -> DynFlags -> DynFlags
+setOutputFile, setOutputHi, setDumpPrefixForce
+   :: Maybe String -> DynFlags -> DynFlags
+
 setObjectDir  f d = d{ objectDir  = Just f}
 setHiDir      f d = d{ hiDir      = Just f}
 setStubDir    f d = d{ stubDir    = Just f, includePaths = f : includePaths d }
@@ -600,6 +619,15 @@ setHcSuf      f d = d{ hcSuf      = f}
 setOutputFile f d = d{ outputFile = f}
 setOutputHi   f d = d{ outputHi   = f}
 
+parseDynLibLoaderMode f d =
+ case splitAt 8 f of
+   ("deploy", "")       -> d{ dynLibLoader = Deployable }
+   ("sysdep", "")       -> d{ dynLibLoader = SystemDependent }
+   ("wrapped", "")      -> d{ dynLibLoader = Wrapped Nothing }
+   ("wrapped:", "hard") -> d{ dynLibLoader = Wrapped Nothing }
+   ("wrapped:", flex)   -> d{ dynLibLoader = Wrapped (Just flex) }
+   (_,_)                -> error "Unknown dynlib loader"
+
 setDumpPrefixForce f d = d { dumpPrefixForce = f}
 
 -- XXX HACK: Prelude> words "'does not' work" ===> ["'does","not'","work"]
@@ -689,6 +717,7 @@ optLevelFlags
 -- -----------------------------------------------------------------------------
 -- Standard sets of warning options
 
+standardWarnings :: [DynFlag]
 standardWarnings
     = [ Opt_WarnDeprecations,
        Opt_WarnOverlappingPatterns,
@@ -697,6 +726,7 @@ standardWarnings
        Opt_WarnDuplicateExports
       ]
 
+minusWOpts :: [DynFlag]
 minusWOpts
     = standardWarnings ++ 
       [        Opt_WarnUnusedBinds,
@@ -706,6 +736,7 @@ minusWOpts
        Opt_WarnDodgyImports
       ]
 
+minusWallOpts :: [DynFlag]
 minusWallOpts
     = minusWOpts ++
       [        Opt_WarnTypeDefaults,
@@ -716,6 +747,7 @@ minusWallOpts
       ]
 
 -- minuswRemovesOpts should be every warning option
+minuswRemovesOpts :: [DynFlag]
 minuswRemovesOpts
     = minusWallOpts ++
       [Opt_WarnImplicitPrelude,
@@ -772,7 +804,7 @@ data FloatOutSwitches
 -- The core-to-core pass ordering is derived from the DynFlags:
 runWhen :: Bool -> CoreToDo -> CoreToDo
 runWhen True  do_this = do_this
-runWhen False do_this = CoreDoNothing
+runWhen False _       = CoreDoNothing
 
 runMaybe :: Maybe a -> (a -> CoreToDo) -> CoreToDo
 runMaybe (Just x) f = f x
@@ -992,6 +1024,7 @@ dynamic_flags = [
   ,  ( "c"             , NoArg (upd $ \d -> d{ ghcLink=NoLink } ))
   ,  ( "no-link"       , NoArg (upd $ \d -> d{ ghcLink=NoLink } )) -- Dep.
   ,  ( "shared"                , NoArg (upd $ \d -> d{ ghcLink=LinkDynLib } ))
+  ,  ( "dynload"       , HasArg (upd . parseDynLibLoaderMode))
 
        ------- Libraries ---------------------------------------------------
   ,  ( "L"             , Prefix addLibraryPath )
@@ -1185,6 +1218,7 @@ dynamic_flags = [
 
 -- these -f<blah> flags can all be reversed with -fno-<blah>
 
+fFlags :: [(String, DynFlag)]
 fFlags = [
   ( "warn-dodgy-imports",               Opt_WarnDodgyImports ),
   ( "warn-duplicate-exports",           Opt_WarnDuplicateExports ),
@@ -1299,6 +1333,7 @@ xFlags = [
   ( "Arrows",                           Opt_Arrows ),
   ( "PArr",                             Opt_PArr ),
   ( "TemplateHaskell",                  Opt_TemplateHaskell ),
+  ( "QuasiQuotes",                      Opt_QuasiQuotes ),
   ( "Generics",                         Opt_Generics ),
   -- On by default:
   ( "ImplicitPrelude",                  Opt_ImplicitPrelude ),
@@ -1335,9 +1370,13 @@ xFlags = [
 
 impliedFlags :: [(DynFlag, [DynFlag])]
 impliedFlags = [
-  ( Opt_GADTs, [Opt_RelaxedPolyRec] )  -- We want type-sig variables to be completely rigid for GADTs
+   ( Opt_GADTs,              [Opt_RelaxedPolyRec] )    -- We want type-sig variables to 
+                                                       --      be completely rigid for GADTs
+ , ( Opt_ScopedTypeVariables, [Opt_RelaxedPolyRec] )   -- Ditto for scoped type variables; see
+                                                       --      Note [Scoped tyvars] in TcBinds
   ]
 
+glasgowExtsFlags :: [DynFlag]
 glasgowExtsFlags = [
              Opt_PrintExplicitForalls
            , Opt_ForeignFunctionInterface
@@ -1383,7 +1422,7 @@ isPrefFlag pref flags no_f
 ------------------
 getFlag :: [(String,a)] -> String -> a
 getFlag flags f = case [ opt | (ff, opt) <- flags, ff == f] of
-                      (o:os) -> o
+                      (o:_)  -> o
                       []     -> panic ("get_flag " ++ f)
 
 getPrefFlag :: String -> [(String,a)] -> String -> a
@@ -1430,10 +1469,13 @@ setDumpFlag dump_flag
 setVerbosity :: Maybe Int -> DynP ()
 setVerbosity mb_n = upd (\dfs -> dfs{ verbosity = mb_n `orElse` 3 })
 
+addCmdlineHCInclude :: String -> DynP ()
 addCmdlineHCInclude a = upd (\s -> s{cmdlineHcIncludes =  a : cmdlineHcIncludes s})
 
+extraPkgConf_ :: FilePath -> DynP ()
 extraPkgConf_  p = upd (\s -> s{ extraPkgConfs = p : extraPkgConfs s })
 
+exposePackage, hidePackage, ignorePackage :: String -> DynP ()
 exposePackage p = 
   upd (\s -> s{ packageFlags = ExposePackage p : packageFlags s })
 hidePackage p = 
@@ -1441,6 +1483,7 @@ hidePackage p =
 ignorePackage p = 
   upd (\s -> s{ packageFlags = IgnorePackage p : packageFlags s })
 
+setPackageName :: String -> DynFlags -> DynFlags
 setPackageName p
   | Nothing <- unpackPackageId pid
   = throwDyn (CmdLineError ("cannot parse \'" ++ p ++ "\' as a package identifier"))
@@ -1451,6 +1494,7 @@ setPackageName p
 
 -- If we're linking a binary, then only targets that produce object
 -- code are allowed (requests for other target types are ignored).
+setTarget :: HscTarget -> DynP ()
 setTarget l = upd set
   where 
    set dfs 
@@ -1461,6 +1505,7 @@ setTarget l = upd set
 -- used by -fasm and -fvia-C, which switch from one to the other, but
 -- not from bytecode to object-code.  The idea is that -fasm/-fvia-C
 -- can be safely used in an OPTIONS_GHC pragma.
+setObjTarget :: HscTarget -> DynP ()
 setObjTarget l = upd set
   where 
    set dfs 
@@ -1495,6 +1540,8 @@ setMainIs arg
 -----------------------------------------------------------------------------
 -- Paths & Libraries
 
+addImportPath, addLibraryPath, addIncludePath, addFrameworkPath :: FilePath -> DynP ()
+
 -- -i on its own deletes the import paths
 addImportPath "" = upd (\s -> s{importPaths = []})
 addImportPath p  = upd (\s -> s{importPaths = importPaths s ++ splitPathList p})
@@ -1509,7 +1556,10 @@ addIncludePath p =
 addFrameworkPath p = 
   upd (\s -> s{frameworkPaths = frameworkPaths s ++ splitPathList p})
 
+#ifndef mingw32_TARGET_OS
+split_marker :: Char
 split_marker = ':'   -- not configurable (ToDo)
+#endif
 
 splitPathList :: String -> [String]
 splitPathList s = filter notNull (splitUp s)
@@ -1553,7 +1603,7 @@ splitPathList s = filter notNull (splitUp s)
     -- finding the next split marker.
     findNextPath xs = 
         case break (`elem` split_markers) xs of
-          (p, d:ds) -> (p, ds)
+           (p, _:ds) -> (p, ds)
           (p, xs)   -> (p, xs)
 
     split_markers :: [Char]
@@ -1570,32 +1620,28 @@ setTmpDir :: FilePath -> DynFlags -> DynFlags
 setTmpDir dir dflags = dflags{ tmpDir = canonicalise dir }
   where
 #if !defined(mingw32_HOST_OS)
-     canonicalise p = normalisePath p
+     canonicalise p = normalise p
 #else
-       -- Canonicalisation of temp path under win32 is a bit more
-       -- involved: (a) strip trailing slash, 
-       --           (b) normalise slashes
-       --           (c) just in case, if there is a prefix /cygdrive/x/, change to x:
-       -- 
-     canonicalise path = normalisePath (xltCygdrive (removeTrailingSlash path))
-
-        -- if we're operating under cygwin, and TMP/TEMP is of
-       -- the form "/cygdrive/drive/path", translate this to
-       -- "drive:/path" (as GHC isn't a cygwin app and doesn't
-       -- understand /cygdrive paths.)
-     xltCygdrive path
-      | "/cygdrive/" `isPrefixOf` path = 
-         case drop (length "/cygdrive/") path of
-           drive:xs@('/':_) -> drive:':':xs
-           _ -> path
-      | otherwise = path
-
-        -- strip the trailing backslash (awful, but we only do this once).
-     removeTrailingSlash path = 
-       case last path of
-         '/'  -> init path
-         '\\' -> init path
-         _    -> path
+     -- Canonicalisation of temp path under win32 is a bit more
+     -- involved: (a) strip trailing slash,
+     --      (b) normalise slashes
+     --     (c) just in case, if there is a prefix /cygdrive/x/, change to x:
+     canonicalise path = removeTrailingSlash $ normalise $ xltCygdrive path
+
+     -- if we're operating under cygwin, and TMP/TEMP is of
+     -- the form "/cygdrive/drive/path", translate this to
+     -- "drive:/path" (as GHC isn't a cygwin app and doesn't
+     -- understand /cygdrive paths.)
+     cygdrivePrefix = [pathSeparator] ++ "/cygdrive/" ++ [pathSeparator]
+     xltCygdrive path = case maybePrefixMatch cygdrivePrefix path of
+                        Just (drive:sep:xs)
+                         | isPathSeparator sep -> drive:':':pathSeparator:xs
+                        _ -> path
+
+     -- strip the trailing backslash (awful, but we only do this once).
+     removeTrailingSlash path
+      | isPathSeparator (last path) = init path
+      | otherwise                   = path
 #endif
 
 -----------------------------------------------------------------------------
@@ -1621,7 +1667,7 @@ setOptHpcDir arg  = upd $ \ d -> d{hpcDir = arg}
 
 machdepCCOpts :: DynFlags -> ([String], -- flags for all C compilations
                              [String]) -- for registerised HC compilations
-machdepCCOpts dflags
+machdepCCOpts _dflags
 #if alpha_TARGET_ARCH
        =       ( ["-w", "-mieee"
 #ifdef HAVE_THREADED_RTS_SUPPORT
@@ -1654,7 +1700,7 @@ machdepCCOpts dflags
       --
       -- -fomit-frame-pointer : *must* in .hc files; because we're stealing
       --   the fp (%ebp) for our register maps.
-       =  let n_regs = stolen_x86_regs dflags
+       =  let n_regs = stolen_x86_regs _dflags
               sta = opt_Static
           in
                    ( [ if sta then "-DDONT_WANT_WIN32_DLL_SUPPORT" else ""
@@ -1702,7 +1748,7 @@ machdepCCOpts dflags
 #endif
 
 picCCOpts :: DynFlags -> [String]
-picCCOpts dflags
+picCCOpts _dflags
 #if darwin_TARGET_OS
       -- Apple prefers to do things the other way round.
       -- PIC is on by default.