<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>
</varlistentry>
</variablelist>
</sect2>
-
+
<sect2 id="keeping-intermediates">
<title>Keeping Intermediate Files</title>
<indexterm><primary>intermediate files, saving</primary>
module A where
newtype TA = MkTA Int
</programlisting>
-A <filename>hs-boot</filename> file is compiled by GHC, just like a <filename>hs</filename> file:
-<programlisting>
- ghc -c A.hs-boot
-</programlisting>
-Just as compiling <filename>A.hs</filename> produces an
-interface file <filename>A.hi</filename>, and an object file
-<filename>A.o</filename>, so compiling <filename>A.hs-boot</filename>
-produces an interface file
-<filename>A.hi-boot</filename>, and an pseudo-object file
-<filename>A.o-boot</filename>. The interface file
-<filename>A.hi-boot</filename> has exactly the same format as any
-other interface file. The pseudo-object file is empty (don't link it!), but it is
-very useful when using a Makefile, to record when the <filename>A.hi-boot</filename> was
-last brought up to date.
</para>
<para>To compile these three files, issue the following commands:
<programlisting>
<listitem>
<para>The file <filename>A.hs-boot</filename> is a programmer-written source file.
It must live in the same directory as its parent source file <filename>A.hs</filename>.
- (Currently, if you use a literate source file <filename>A.lhs</filename> you must
- also use a literate boot file, <filename>A.lhs-boot</filename>.)
+ Currently, if you use a literate source file <filename>A.lhs</filename> you must
+ also use a literate boot file, <filename>A.lhs-boot</filename>; and vice versa.
</para></listitem>
- <listitem><para> The <filename>hi-boot</filename> generated by compiling a <filename>hs-boot</filename>
- file is in machine-generated binary format.
- You can display its contents with <command>ghc --show-iface</commaond>. If you
- specify a directory for interface files, the <option>-ohidir</option> flag, then that affects
- <filename>hi-boot</filename> files too.</para></listitem>b
-
- <listitem><para> Hs-boot files are written in a subset of Haskell. In particular, the module
- exports and imports, and the scoping rules are exactly the same as in Haskell. Hence, to
- mention a non-Prelude type or class, you must import it.</para></listitem>
-
- <listitem><para> When a hs-boot file <filename>A.hs-boot</filename>
+<listitem><para>
+ A <filename>hs-boot</filename> file is compiled by GHC, just like a <filename>hs</filename> file:
+<programlisting>
+ ghc -c A.hs-boot
+</programlisting>
+When a hs-boot file <filename>A.hs-boot</filename>
is compiled, it is checked for scope and type errors.
When its parent module <filename>A.hs</filename> is compiled, the two are compared, and
an error is reported if the two are inconsistent.
</para></listitem>
+ <listitem>
+ <para> Just as compiling <filename>A.hs</filename> produces an
+ interface file <filename>A.hi</filename>, and an object file
+ <filename>A.o</filename>, so compiling
+ <filename>A.hs-boot</filename> produces an interface file
+ <filename>A.hi-boot</filename>, and an pseudo-object file
+ <filename>A.o-boot</filename>: </para>
+
+ <itemizedlist>
+ <listitem>
+ <para>The pseudo-object file <filename>A.o-boot</filename> is
+ empty (don't link it!), but it is very useful when using a
+ Makefile, to record when the <filename>A.hi-boot</filename> was
+ last brought up to date (see <xref
+ linkend="using-make"/>).</para>
+ </listitem>
+
+ <listitem>
+ <para>The <filename>hi-boot</filename> generated by compiling a
+ <filename>hs-boot</filename> file is in the same
+ machine-generated binary format as any other GHC-generated
+ interface file (e.g. <filename>B.hi</filename>). You can
+ display its contents with <command>ghc
+ --show-iface</command>. If you specify a directory for
+ interface files, the <option>-ohidir</option> flag, then that
+ affects <filename>hi-boot</filename> files
+ too.</para>
+ </listitem>
+ </itemizedlist>
+ </listitem>
+
<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, and import statements, are exactly as in Haskell.</para></listitem>
+<listitem><para> The module header (including the export list), and import statements, are exactly as in
+Haskell, and so are the scoping rules.
+ Hence, to mention a non-Prelude type or class, you must import it.</para></listitem>
+
<listitem><para> There must be no value declarations, but there can be type signatures for
values. For example:
<programlisting>
doing…nothing. Which is true.</para>
<para> Note that the suffix rules are all repeated twice, once
for normal Haskell source files, and once for <filename>hs-boot</filename>
- files (see <xref linkend="mutual-recursion"/>).
+ files (see <xref linkend="mutual-recursion"/>).</para>
- <para>Note the inter-module dependencies at the end of the
- Makefile, which take the form</para>
+ <para>Note also the inter-module dependencies at the end of the
+ Makefile, which take the form
<programlisting>
Foo.o Foo.hc Foo.s : Baz.hi # Foo imports Baz
</programlisting>
- <para>They tell <command>make</command> that if any of
+ They tell <command>make</command> that if any of
<literal>Foo.o</literal>, <literal>Foo.hc</literal> or
<literal>Foo.s</literal> have an earlier modification date than
<literal>Baz.hi</literal>, then the out-of-date file must be
<xref linkend="sec-makefile-dependencies"/></para>
</sect2>
+
<sect2 id="sec-makefile-dependencies">
<title>Dependency generation</title>
<indexterm><primary>dependencies in Makefiles</primary></indexterm>
<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
locate any imported modules that come from packages. The
package modules won't be included in the dependencies
generated, though (but see the
- <option>––include-prelude</option> option below).</para>
+ <option>––include-pkg-deps</option> option below).</para>
<para>The dependency generation phase of GHC can take some
additional options, which you may find useful. For historical
</varlistentry>
<varlistentry>
+ <term><option>-v2</option></term>
+ <listitem>
+ <para>Print a full list of the module depenencies to stdout.
+ (This is the standard verbosity flag, so the list will
+ also be displayed with <option>-v3</option> and
+ <option>-v4</option>;
+ <xref linkend ="options-help"/>.)</para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
<term><option>-f</option> <replaceable>file</replaceable></term>
<listitem>
<para>Use <replaceable>file</replaceable> as the makefile,
</varlistentry>
<varlistentry>
- <term><option>––include-prelude</option></term>
+ <term><option>––include-pkg-deps</option></term>
<listitem>
<para>Regard modules imported from packages as unstable,
- i.e., generate dependencies on the package modules used
+ i.e., generate dependencies on any imported package modules
(including <literal>Prelude</literal>, and all other
- standard Haskell libraries). This option is normally
+ standard Haskell libraries). Dependencies are not traced
+ recursively into packages; dependencies are only generated for
+ home-package modules on external-package modules directly imported
+ by the home package module.
+ This option is normally
only used by the various system libraries.</para>
</listitem>
</varlistentry>