module StaticFlags (
parseStaticFlags,
staticFlags,
+ initStaticOpts,
-- Ways
WayName(..), v_Ways, v_Build_tag, v_RTS_Build_tag, isRTSWay,
-- Hpc opts
opt_Hpc,
- opt_Hpc_Tracer,
-- language opts
opt_DictsStrict,
-- Related to linking
opt_PIC,
opt_Static,
+ opt_HardwireLibPaths,
-- misc opts
opt_IgnoreDotGhci,
import System.IO.Unsafe ( unsafePerformIO )
import Control.Monad ( when )
import Data.Char ( isDigit )
-import Data.List ( sort, intersperse, nub )
+import Data.List
-----------------------------------------------------------------------------
-- Static flags
parseStaticFlags :: [String] -> IO [String]
parseStaticFlags args = do
+ ready <- readIORef v_opt_C_ready
+ when ready $ throwDyn (ProgramError "Too late for parseStaticFlags: call it before newSession")
+
(leftover, errs) <- processArgs static_flags args
when (not (null errs)) $ throwDyn (UsageError (unlines errs))
let cg_flags | tablesNextToCode = ["-optc-DTABLES_NEXT_TO_CODE"]
| otherwise = []
+ -- HACK: -fexcess-precision is both a static and a dynamic flag. If
+ -- the static flag parser has slurped it, we must return it as a
+ -- leftover too. ToDo: make -fexcess-precision dynamic only.
+ let excess_prec | opt_SimplExcessPrecision = ["-fexcess-precision"]
+ | otherwise = []
+
when (not (null errs)) $ ghcError (UsageError (unlines errs))
- return (cg_flags++more_leftover++leftover)
+ return (excess_prec++cg_flags++more_leftover++leftover)
+initStaticOpts :: IO ()
+initStaticOpts = writeIORef v_opt_C_ready True
static_flags :: [(String, OptKind IO)]
-- All the static flags should appear in this list. It describes how each
, ( "dppr-user-length", AnySuffix addOpt )
-- rest of the debugging flags are dynamic
- --------- Haskell Program Coverage -----------------------------------
-
- , ( "fhpc" , PassFlag addOpt )
- , ( "fhpc-tracer" , PassFlag addOpt )
-
--------- Profiling --------------------------------------------------
, ( "auto-all" , NoArg (addOpt "-fauto-sccs-on-all-toplevs") )
, ( "auto" , NoArg (addOpt "-fauto-sccs-on-exported-toplevs") )
opt_DoTickyProfiling = WayTicky `elem` (unsafePerformIO $ readIORef v_Ways)
-- Hpc opts
-
opt_Hpc = lookUp FSLIT("-fhpc")
- || opt_Hpc_Tracer
-opt_Hpc_Tracer = lookUp FSLIT("-fhpc-tracer")
-- language opts
opt_DictsStrict = lookUp FSLIT("-fdicts-strict")
opt_PIC = lookUp FSLIT("-fPIC")
#endif
opt_Static = lookUp FSLIT("-static")
+opt_HardwireLibPaths = lookUp FSLIT("-fhardwire-lib-paths")
opt_Unregisterised = lookUp FSLIT("-funregisterised")
-- Derived, not a real option. Determines whether we will be compiling
"fexcess-precision",
"funfolding-update-in-place",
"static",
+ "fhardwire-lib-paths",
"funregisterised",
"fext-core",
"fcpr-off",
"ferror-spans",
- "fPIC"
+ "fPIC",
+ "fhpc"
]
- || any (flip prefixMatch f) [
+ || any (`isPrefixOf` f) [
"fliberate-case-threshold",
"fmax-worker-args",
"fhistory-size",
| c == "G" || c == "g" = truncate (n * 1000 * 1000 * 1000)
| otherwise = throwDyn (CmdLineError ("can't decode size: " ++ str))
where (m, c) = span pred str
- n = read m :: Double
+ n = readRational m
pred c = isDigit c || c == '.'