<para>Options can be forced through to a particlar compilation
phase, using the following flags:</para>
+ <variablelist>
+ <varlistentry>
+ <term><option>-optL</option> <replaceable>option</replaceable></term>
+ <indexterm><primary><option>-optL</option></primary>
+ </indexterm>
+ <listitem>
+ <para>Pass <replaceable>option</replaceable> to the
+ literate pre-processor</para>
+ </listitem>
+ </varlistentry>
+ <varlistentry>
+ <term><option>-optP</option> <replaceable>option</replaceable></term>
+ <indexterm><primary><option>-optP</option></primary>
+ </indexterm>
+ <listitem>
+ <para>Pass <replaceable>option</replaceable> to CPP (makes
+ sense only if <option>-cpp</option> is also on).</para>
+ </listitem>
+ </varlistentry>
+ <varlistentry>
+ <term><option>-optF</option> <replaceable>option</replaceable></term>
+ <indexterm><primary><option>-optF</option></primary>
+ </indexterm>
+ <listitem>
+ <para>Pass <replaceable>option</replaceable> to the
+ custom pre-processor (see <xref linkend="pre-processor">).</para>
+ </listitem>
+ </varlistentry>
+ <varlistentry>
+ <term><option>-optc</option> <replaceable>option</replaceable></term>
+ <indexterm><primary><option>-optc</option></primary>
+ </indexterm>
+ <listitem>
+ <para>Pass <replaceable>option</replaceable> to the C compiler.</para>
+ </listitem>
+ </varlistentry>
+ <varlistentry>
+ <term><option>-opta</option> <replaceable>option</replaceable></term>
+ <indexterm><primary><option>-opta</option></primary>
+ </indexterm>
+ <listitem>
+ <para>Pass <replaceable>option</replaceable> to the assembler.</para>
+ </listitem>
+ </varlistentry>
+ <varlistentry>
+ <term><option>-optl</option> <replaceable>option</replaceable></term>
+ <indexterm><primary><option>-optl</option></primary>
+ </indexterm>
+ <listitem>
+ <para>Pass <replaceable>option</replaceable> to the linker.</para>
+ </listitem>
+ </varlistentry>
+ <varlistentry>
+ <term><option>-optdll</option> <replaceable>option</replaceable></term>
+ <indexterm><primary><option>-optdll</option></primary>
+ </indexterm>
+ <listitem>
+ <para>Pass <replaceable>option</replaceable> to the DLL generator.</para>
+ </listitem>
+ </varlistentry>
+ <varlistentry>
+ <term><option>-optdep</option> <replaceable>option</replaceable></term>
+ <indexterm><primary><option>-optdep</option></primary>
+ </indexterm>
+ <listitem>
+ <para>Pass <replaceable>option</replaceable> to the
+ dependency generator.</para>
+ </listitem>
+ </varlistentry>
+ </variablelist>
<para>So, for example, to force an <option>-Ewurble</option>
option to the assembler, you would tell the driver
</varlistentry>
<varlistentry>
+ <term><option>-no-link</option></term>
+ <indexterm>
+ <primary><option>-no-link</option></primary>
+ </indexterm>
+ <listitem>
+ <para>Omit the link step. This flag can be useful if you
+ want to avoid linking in <option>--make</option> mode,
+ where linking is normally done automatically if the program
+ contains a <literal>Main</literal> module.</para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
<term><option>-package</option> <replaceable>name</replaceable></term>
<indexterm><primary><option>-package</option></primary></indexterm>
<listitem>
This option corresponds to the <option>-framework</option> option for Apple's Linker.
Please note that frameworks and packages are two different things - frameworks don't
contain any haskell code. Rather, they are Apple's way of packaging shared libraries.
- To link to Apple's “Carbon&qdquo; API, for example, you'd use
+ To link to Apple's “Carbon” API, for example, you'd use
<option>-framework Carbon</option>.
</para>
</listitem>
</varlistentry>
<varlistentry>
+ <term><option>-main-is <replaceable>thing</replaceable></option></term>
+ <indexterm><primary><option>-main-is</option></primary></indexterm>
+ <indexterm><primary>specifying your own main function</primary></indexterm>
+ <listitem>
+ <para> The normal rule in Haskell is that your program must supply a <literal>main</literal>
+ function in module <literal>Main</literal>. When testing, it is often convenient
+ to change which function is the "main" one, and the <option>-main-is</option> flag
+ allows you to do so. The <replaceable>thing</replaceable> can be one of:
+ <itemizedlist>
+ <listitem><para>A lower-case identifier <literal>foo</literal>. GHC assumes that the main function is <literal>Main.foo</literal>.</para></listitem>
+ <listitem><para>An module name <literal>A</literal>. GHC assumes that the main function is <literal>A.main</literal>.</para></listitem>
+ <listitem><para>An qualified name <literal>A.foo</literal>. GHC assumes that the main function is <literal>A.foo</literal>.</para></listitem>
+ </itemizedlist>
+ Strictly speaking, <option>-main-is</option> is not a link-phase flag at all; it has no effect on the link step.
+ The flag must be specified when compiling the module containing the specified main function (e.g. module <literal>A</literal>
+ in the latter two items above. It has no effect for other modules (and hence can safely be given to <literal>ghc --make</literal>).
+ </para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
<term><option>-no-hs-main</option></term>
<indexterm><primary><option>-no-hs-main</option></primary></indexterm>
<indexterm><primary>linking Haskell libraries with foreign code</primary></indexterm>
as part of another (non-Haskell) program, the RTS will not
be supplying its definition of <function>main()</function>
at link-time, you will have to. To signal that to the
- driver script when linking, use
- <option>-no-hs-main</option>.</para>
+ compiler when linking, use
+ <option>-no-hs-main</option>. See also <xref linkend="using-own-main">.</para>
<para>Notice that since the command-line passed to the
linker is rather involved, you probably want to use
though, just try linking once with <option>-v</option> on
to see what options the driver passes through to the
linker.</para>
+
+ <para>The <option>-no-hs-main</option> flag can also be
+ used to persuade the compiler to do the link step in
+ <option>--make</option> mode when there is no Haskell
+ <literal>Main</literal> module present (normally the
+ compiler will not attempt linking when there is no
+ <literal>Main</literal>).</para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term><option>-debug</option></term>
+ <indexterm><primary><option>-debug</option></primary>
+ </indexterm>
+ <listitem>
+ <para>Link the program with a debugging version of the
+ runtime system. The debugging runtime turns on numerous
+ assertions and sanity checks, and provides extra options
+ for producing debugging output at runtime (run the program
+ with <literal>+RTS -?</literal> to see a list).</para>
</listitem>
</varlistentry>
+
+ <varlistentry>
+ <term><option>-threaded</option></term>
+ <indexterm><primary><option>-threaded</option></primary>
+ </indexterm>
+ <listitem>
+ <para>Link the program with the "threaded" runtime system.
+ This version of the runtime is designed to be used in
+ programs that use multiple operating-system threads. It
+ supports calls to foreign-exported functions from multiple
+ OS threads. Calls to foreign functions are made using the
+ same OS thread that created the Haskell thread (if it was
+ created by a call-in), or an arbitrary OS thread otherwise
+ (if the Haskell thread was created by
+ <literal>forkIO</literal>).</para>
+
+ <para>The threaded RTS does <emphasis>not</emphasis>
+ support using multiple CPUs to speed up execution of a
+ multi-threaded Haskell program. The GHC runtime platform
+ is still single-threaded, but using the
+ <option>-threaded</option> option it can be used safely in
+ a multi-threaded environment.</para>
+ </listitem>
+ </varlistentry>
+
</variablelist>
</sect2>