-----------------------------------------------------------------------------
--- $Id: DriverFlags.hs,v 1.109 2003/01/08 13:03:25 simonmar Exp $
+-- $Id: DriverFlags.hs,v 1.116 2003/06/23 10:35:17 simonpj Exp $
--
-- Driver flags
--
------- Miscellaneous -----------------------------------------------
, ( "no-link-chk" , NoArg (return ()) ) -- ignored for backwards compat
, ( "no-hs-main" , NoArg (writeIORef v_NoHsMain True) )
+ , ( "main-is" , SepArg setMainIs )
------- Output Redirection ------------------------------------------
, ( "odir" , HasArg (writeIORef v_Output_dir . Just) )
, ( "syslib" , HasArg (addPackage) ) -- for compatibility w/ old vsns
------- Specific phases --------------------------------------------
+ , ( "pgmL" , HasArg setPgmL )
+ , ( "pgmP" , HasArg setPgmP )
, ( "pgmP" , HasArg setPgmP )
, ( "pgmF" , HasArg setPgmF )
, ( "pgmc" , HasArg setPgmc )
, ( "fno-asm-mangling" , NoArg (writeIORef v_Do_asm_mangling False) )
, ( "fmax-simplifier-iterations",
- Prefix (writeIORef v_MaxSimplifierIterations . read) )
+ PrefixPred (all isDigit) (writeIORef v_MaxSimplifierIterations . read) )
, ( "frule-check",
SepArg (\s -> writeIORef v_RuleCheck (Just s)) )
- , ( "fusagesp" , NoArg (do writeIORef v_UsageSPInf True
- add v_Opt_C "-fusagesp-on") )
-
, ( "fexcess-precision" , NoArg (do writeIORef v_Excess_precision True
add v_Opt_C "-fexcess-precision"))
#endif
------ HsCpp opts ---------------------------------------------------
- -- With a C compiler whose system() doesn't use a UNIX shell (i.e.
- -- mingwin gcc), -D and -U args must *not* be quoted, as the quotes
- -- will be interpreted as part of the arguments, and not stripped;
- -- on all other systems, quoting is necessary, to avoid interpretation
- -- of shell metacharacters in the arguments (e.g. green-card's
- -- -DBEGIN_GHC_ONLY='}-' trick).
-#ifndef mingw32_HOST_OS
- , ( "D", Prefix (\s -> addOpt_P ("-D'"++s++"'") ) )
- , ( "U", Prefix (\s -> addOpt_P ("-U'"++s++"'") ) )
-#else
- , ( "D", Prefix (\s -> addOpt_P ("-D"++s) ) )
- , ( "U", Prefix (\s -> addOpt_P ("-U"++s) ) )
-#endif
+ , ( "D", AnySuffix addOpt_P )
+ , ( "U", AnySuffix addOpt_P )
------ Debugging ----------------------------------------------------
, ( "dstg-stats", NoArg (writeIORef v_StgStats True) )
, ( "ddump-tc", NoArg (setDynFlag Opt_D_dump_tc) )
, ( "ddump-types", NoArg (setDynFlag Opt_D_dump_types) )
, ( "ddump-rules", NoArg (setDynFlag Opt_D_dump_rules) )
- , ( "ddump-usagesp", NoArg (setDynFlag Opt_D_dump_usagesp) )
, ( "ddump-cse", NoArg (setDynFlag Opt_D_dump_cse) )
, ( "ddump-worker-wrapper", NoArg (setDynFlag Opt_D_dump_worker_wrapper) )
, ( "dshow-passes", NoArg (setVerbosity "2") )
, ( "ddump-vect", NoArg (setDynFlag Opt_D_dump_vect) )
, ( "dcore-lint", NoArg (setDynFlag Opt_DoCoreLinting) )
, ( "dstg-lint", NoArg (setDynFlag Opt_DoStgLinting) )
- , ( "dusagesp-lint", NoArg (setDynFlag Opt_DoUSPLinting) )
------ Machine dependant (-m<blah>) stuff ---------------------------
return ( static : filtered_opts )
+setMainIs :: String -> IO ()
+setMainIs arg
+ | not (null main_mod) -- The arg looked like "Foo.baz"
+ = do { writeIORef v_MainFunIs (Just main_fn) ;
+ writeIORef v_MainModIs (Just main_mod) }
+
+ | isUpper (head main_fn) -- The arg looked like "Foo"
+ = writeIORef v_MainModIs (Just main_fn)
+
+ | otherwise -- The arg looked like "baz"
+ = writeIORef v_MainFunIs (Just main_fn)
+ where
+ (main_mod, main_fn) = split_longest_prefix arg (== '.')
+
+
-----------------------------------------------------------------------------
-- Via-C compilation stuff