<filename>Main.hs</filename>, and put the resulting
executable in <filename>foo.exe</filename> (not
<filename>foo</filename>).</para>
+
+ <para>If you use <command>ghc --make</command> and you don't
+ use the <option>-o</option>, the name GHC will choose
+ for the executable will be based on the name of the file
+ containing the module <literal>Main</literal>.
+ Note that with GHC the <literal>Main</literal> module doesn't
+ have to be put in file <filename>Main.hs</filename>.
+ Thus both
+<programlisting>
+ ghc --make Prog
+</programlisting>
+ and
+<programlisting>
+ ghc --make Prog.hs
+</programlisting>
+ will produce <filename>Prog</filename> (or
+ <filename>Prog.exe</filename> if you are on Windows).</para>
</listitem>
</varlistentry>
<varlistentry>
<term>
+ <option>-stubdir</option> <replaceable>dir</replaceable>
+ <indexterm><primary><option>-stubdir</option></primary></indexterm>
+ </term>
+ <listitem>
+ <para>Redirects all generated FFI stub files into
+ <replaceable>dir</replaceable>. Stub files are generated when the
+ Haskell source contains a <literal>foreign export</literal> or
+ <literal>foreign import "&wrapper"</literal> declaration (see <xref
+ linkend="foreign-export-ghc" />). The <option>-stubdir</option>
+ option behaves in exactly the same way as <option>-odir</option>
+ and <option>-hidir</option> with respect to hierarchical
+ modules.</para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>
<option>-osuf</option> <replaceable>suffix</replaceable>
<indexterm><primary><option>-osuf</option></primary></indexterm>
</term>
<listitem><para> If hs-boot files are considered distinct from their parent source
files, and if a <literal>{-# SOURCE #-}</literal> import is considered to refer to the
- hs-boot file, then the module import graph must have no cycles. The <command>ghc -M</command>
- will report an error if a cycle is found.
+ hs-boot file, then the module import graph must have no cycles. The command
+ <command>ghc -M</command> will report an error if a cycle is found.
+ </para></listitem>
+
+ <listitem><para> A module <literal>M</literal> that is
+ <literal>{-# SOURCE #-}</literal>-imported in a program will usually also be
+ ordinarily imported elsewhere. If not, <command>ghc --make</command>
+ automatically adds <literal>M</literal> to the set of moudles it tries to
+ compile and link, to ensure that <literal>M</literal>'s implementation is included in
+ the final program.
</para></listitem>
</itemizedlist>
</para>
started. For example, it doesn't need to contain declarations
for <emphasis>everything</emphasis> that module
<literal>A</literal> exports, only the things required by the
- module that imports <literal>A</literal> recursively.</para>
+ module(s) that import <literal>A</literal> recursively.</para>
<para>A hs-boot file is written in a subset of Haskell:
<itemizedlist>
<listitem><para> The module header (including the export list), and import statements, are exactly as in
<command>ghc</command> traces the dependencies, just like <command>ghc --make</command>
(a new feature in GHC 6.4).</para>
+ <para>Note that <literal>ghc -M</literal> needs to find a <emphasis>source
+ file</emphasis> for each module in the dependency graph, so that it can
+ parse the import declarations and follow dependencies. Any pre-compiled
+ modules without source files must therefore belong to a
+ package<footnote><para>This is a change in behaviour relative to 6.2 and
+ earlier.</para>
+ </footnote>.</para>
+
<para>By default, <command>ghc -M</command> generates all the
dependencies, and then concatenates them onto the end of
<filename>makefile</filename> (or