In compiler/main/DriverPipeline.hs, runPhase sets default options *even if the user has specified a different program with the -pgm option. The example I ran into before was:

ghc -pgma yasm -opta "-ax86" -opta "-pgas" -opta "-fwin32" test.asm

In ghc, these options are stored together under 'dflags":

runPhase As stop dflags _basename _suff input_fn get_output_fn maybe_loc
  = do  let as_opts =  getOpts dflags opt_a

runPhase continues to add particular wired-in options as if the only program used is the default. For example:
        SysTools.runAs dflags
                ((map SysTools.Option as_opts)
                        ++ [ SysTools.Option "-c", ... ])


This design seems to work as far as people use GHC--I am probably the only complainer. I understand the purpose of -pgm options is largely to use a non-standard *location* for a default program. An alternative design, as if any alternative program might be used, might make users responsible for adding *all* necessary options for a user-defined -pgm . For GHC-default includes and link-libraries, GHC might map the include-opt or link-opt for the -pgm over them with additional options, such as mapping str1 or str2 from -opt_dlink str1 and -opt_dincl str2 over the defaults. The order of the options might be preserved by maintaining the order of the options used in the command line.

Ghc may test for a simple equivalence to the default pgm program in runPhase (before passing it to SysTools.runAs or such). If you wanted to test for a nonstandard program, as opposed to a nonstandard location for a default program ("/usr/local/bin/gcc" instead of default "/usr/bin/gcc"), the test would use a regex and only test the equivalence of the program name ("gcc"). If the test fails, the program isn't considered the default and the remaining default options will not be added in runPhase.


In order to gain more flexibility in choosing the default programs and default options, particularly Microsoft CL and Yasm, I am generating those programs and options into compiler/main/Config.hs. (As you know, Config.hs is generated by compiler/Makefile.) By the way, I am adding a simple comment in Config.hs to alert users to the source of this generated file:

-- This file is generated by compiler/Makefile --

It might be possible, even preferable, to keep the program names and default options from Config.hs by storing them in a configuration file as "Simon" suggested storing them in package.conf in a comment- note in SysTools.hs. For Win-GHC (as I am calling Windows-native GHC), it would probably be more "standard" to store them in the Registry; for other systems they might be stored in package.conf or a specialised initialisation file.


Cheers,
Pete

_______________________________________________
Cvs-ghc mailing list
[EMAIL PROTECTED]
http://www.haskell.org/mailman/listinfo/cvs-ghc

Reply via email to