[project @ 2001-12-18 12:13:05 by simonmar]
[ghc-hetmet.git] / ghc / docs / users_guide / phases.sgml
index e78f34a..864ee5c 100644 (file)
@@ -2,7 +2,7 @@
     <title>Options related to a particular phase</title>
 
     <sect2 id="replacing-phases">
-      <title>Replacing the program for one or more phases.</title>
+      <title>Replacing the program for one or more phases</title>
       <indexterm><primary>phases, changing</primary></indexterm>
 
       <para>You may specify that a different program be used for one
       the <Command>ghc</Command> has wired into it.  For example, you
       might want to try a different assembler.  The following options
       allow you to change the external program used for a given
-      compilation phases:</para>
+      compilation phase:</para>
+
+      <variablelist>
+       <varlistentry>
+         <term><option>-pgmL</option> <replaceable>cmd</replaceable></term>
+         <indexterm><primary><option>-pgmL</option></primary>
+         </indexterm>
+         <listitem>
+           <para>Use <replaceable>cmd</replaceable> as the literate
+           pre-processor.</para>
+         </listitem>
+       </varlistentry>
+
+       <varlistentry>
+         <term><option>-pgmP</option> <replaceable>cmd</replaceable></term>
+         <indexterm><primary><option>-pgmP</option></primary>
+         </indexterm>
+         <listitem>
+           <para>Use <replaceable>cmd</replaceable> as the C
+           pre-processor (with <option>-cpp</option> only).</para>
+         </listitem>
+       </varlistentry>
+
+       <varlistentry>
+         <term><option>-pgmc</option> <replaceable>cmd</replaceable></term>
+         <indexterm><primary><option>-pgmc</option></primary>
+         </indexterm>
+         <listitem>
+           <para>Use <replaceable>cmd</replaceable> as the C
+           compiler.</para>
+         </listitem>
+       </varlistentry>
+
+       <varlistentry>
+         <term><option>-pgma</option> <replaceable>cmd</replaceable></term>
+         <indexterm><primary><option>-pgma</option></primary>
+         </indexterm>
+         <listitem>
+           <para>Use <replaceable>cmd</replaceable> as the
+           assembler.</para>
+         </listitem>
+       </varlistentry>
+
+       <varlistentry>
+         <term><option>-pgml</option> <replaceable>cmd</replaceable></term>
+         <indexterm><primary><option>-pgml</option></primary>
+         </indexterm>
+         <listitem>
+           <para>Use <replaceable>cmd</replaceable> as the
+           linker.</para>
+         </listitem>
+       </varlistentry>
+
+       <varlistentry>
+         <term><option>-pgmdll</option> <replaceable>cmd</replaceable></term>
+         <indexterm><primary><option>-pgmdll</option></primary>
+         </indexterm>
+         <listitem>
+           <para>Use <replaceable>cmd</replaceable> as the DLL
+           generator.</para>
+         </listitem>
+       </varlistentry>
+
+       <varlistentry>
+         <term><option>-pgmdep</option> <replaceable>cmd</replaceable></term>
+         <indexterm><primary><option>-pgmdep</option></primary>
+         </indexterm>
+         <listitem>
+           <para>Use <replaceable>cmd</replaceable> as the dependency
+           generator.</para>
+         </listitem>
+       </varlistentry>
+
+       <varlistentry>
+         <term><option>-pgmF</option> <replaceable>cmd</replaceable></term>
+         <indexterm><primary><option>-pgmF</option></primary>
+         </indexterm>
+         <listitem>
+           <para>Use <replaceable>cmd</replaceable> as the
+           pre-processor (with <option>-F</option> only).</para>
+         </listitem>
+       </varlistentry>
+      </variablelist>
 
     </sect2>
 
     <sect2 id="forcing-options-through">
-      <title>Forcing options to a particular phase.</title>
+      <title>Forcing options to a particular phase</title>
       <indexterm><primary>forcing GHC-phase options</primary></indexterm>
 
       <para>Options can be forced through to a particlar compilation
@@ -206,6 +288,62 @@ strmod = "\
       and the string gap works as expected.</para>
     </sect2>
 
+    <sect2 id="pre-processor">
+      <title>Options affecting a Haskell pre-processor</title>
+      
+      <indexterm><primary>pre-processing: custom</primary></indexterm>
+      <indexterm><primary>Pre-processor options</primary></indexterm>
+
+      <variablelist>
+       <varlistentry>
+         <term><option>-F</option></term>
+         <indexterm><primary><option>-F</option></primary></indexterm>
+         <listitem>
+           <para>A custom pre-processor is run over your Haskell
+           source file only if the <option>-F</option> option
+           <indexterm><primary>-F</primary></indexterm> is given.
+           </para>
+           <para>
+           Running a custom pre-processor at compile-time is in some
+           settings appropriate and useful. The <option>-F</option>
+            option lets you run a pre-processor as part of the overall
+           GHC compilation pipeline, which has the advantage over
+           running a Haskell pre-processor separately in that it
+           works in interpreted mode and you can continue to take
+           reap the benefits of GHC's recompilation checker.
+           </para>
+           <para>
+           The pre-processor is run just before the Haskell
+           compiler proper processes the Haskell input, but after
+           the literate markup has been stripped away and (possibly)
+           the C pre-processor has washed the Haskell input.
+           </para>
+         </listitem>
+       </varlistentry>
+       <varlistentry>
+         <term><option>-pgmF</option> <replaceable>cmd</replaceable></term>
+         <indexterm><primary><option>-pgmF</option> <replaceable>cmd</replaceable></primary></indexterm>
+         <listitem>
+           <para>Use <replaceable>cmd</replaceable> as the Haskell
+         pre-processor. When invoked, the
+         <replaceable>cmd</replaceable> pre-processor is given at
+         least three arguments on its command-line: the first
+         argument is the name of the original source file, the second
+         is the name of the file holding the input, and the third is
+         the name of the file where
+         <replaceable>cmd</replaceable> should write its output to.
+         </para>
+         <para>Additional arguments to the
+         <replaceable>cmd</replaceable> pre-processor can be passed
+         in using the <option>-optF</option> option. These are fed to
+         <replaceable>cmd</replaceable> on the command line after the
+         three standard input and output arguments. 
+        </para>
+         </listitem>
+       </varlistentry>
+      </variablelist>
+    </sect2>
+
     <sect2 id="options-C-compiler">
       <title>Options affecting the C compiler (if applicable)</title>
 
@@ -253,6 +391,17 @@ strmod = "\
            code generator.</para>
          </listitem>
        </varlistentry>
+
+       <varlistentry>
+         <term><option>-fno-code</option></term>
+         <indexterm><primary><option>-fno-code</option></primary>
+         </indexterm>
+         <listitem>
+           <para>Omit code generation (and all later phases)
+           altogether.  Might be of some use if you just want to see
+           dumps of the intermediate compilation phases.</para>
+         </listitem>
+       </varlistentry>
       </variablelist>
     </sect2>
 
@@ -288,6 +437,22 @@ strmod = "\
             come <emphasis>before</emphasis>
             <option>-l</option><replaceable>bar</replaceable> on the
             command line.</para>
+
+           <para>There's one other gotcha to bear in mind when using
+           external libraries: if the library contains a
+           <literal>main()</literal> function, then this will be
+           linked in preference to GHC's own
+           <literal>main()</literal> function
+           (eg. <literal>libf2c</literal> and <literal>libl</literal>
+           have their own <literal>main()</literal>s).  This is
+           because GHC's <literal>main()</literal> comes from the
+           <literal>HSrts</literal> library, which is normally
+           included <emphasis>after</emphasis> all the other
+           libraries on the linker's command line.  To force GHC's
+           <literal>main()</literal> to be used in preference to any
+           other <literal>main()</literal>s from external libraries,
+           just add the option <option>-lHSrts</option> before any
+           other libraries on the command line.</para>
          </listitem>
        </varlistentry>