<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
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>
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>
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>