[project @ 2003-06-24 10:01:27 by simonmar]
[ghc-hetmet.git] / ghc / docs / users_guide / using.sgml
index 3989d72..d3d205a 100644 (file)
@@ -4,61 +4,63 @@
   <indexterm><primary>GHC, using</primary></indexterm>
   <indexterm><primary>using GHC</primary></indexterm>
 
-    <para>GHC can work in one of three &ldquo;modes&rdquo;:</para>
-
-    <variablelist>
-      <varlistentry>
-       <term><cmdsynopsis><command>ghc</command>
-           <arg choice=plain>--interactive</arg>
-         </cmdsynopsis></term>
-       <indexterm><primary>interactive mode</primary>
-       </indexterm>
-       <indexterm><primary>ghci</primary>
-       </indexterm>
-       <listitem>
-         <para>Interactive mode, which is also available as
-         <command>ghci</command>.  Interactive mode is described in
-         more detail in <xref linkend="ghci">.</para>
-       </listitem>
-      </varlistentry>
-
-      <varlistentry>
-       <term><cmdsynopsis><command>ghc</command>
-           <arg choice=plain>--make</arg>
-         </cmdsynopsis></term>
-       <indexterm><primary>make mode</primary>
-       </indexterm>
-       <indexterm><primary><option>--make</option></primary>
-       </indexterm>
-       <listitem>
-         <para>In this mode, GHC will build a multi-module Haskell
-         program automatically, figuring out dependencies for itself.
-         If you have a straightforward Haskell program, this is
-         likely to be much easier, and faster, than using
-         <command>make</command>.</para>
-       </listitem>
-      </varlistentry>
+  <para>GHC can work in one of three &ldquo;modes&rdquo;:</para>
+
+  <variablelist>
+    <varlistentry>
+      <term><cmdsynopsis><command>ghc</command>
+         <arg choice=plain>&ndash;&ndash;interactive</arg>
+       </cmdsynopsis></term>
+      <indexterm><primary>interactive mode</primary>
+      </indexterm>
+      <indexterm><primary>ghci</primary>
+      </indexterm>
+      <listitem>
+       <para>Interactive mode, which is also available as
+       <command>ghci</command>.  Interactive mode is described in
+       more detail in <xref linkend="ghci">.</para>
+      </listitem>
+    </varlistentry>
 
-      <varlistentry>
-       <term><cmdsynopsis>
-           <command>ghc</command>
-           <group>
-             <arg>-E</arg>
-             <arg>-C</arg>
-             <arg>-S</arg>
-             <arg>-c</arg>
-           </group>
-         </cmdsynopsis></term>
-       <indexterm><primary><option>--make</option></primary>
-       </indexterm>
-       <listitem>
-         <para>This is the traditional batch-compiler mode, in which
+    <varlistentry>
+      <term><cmdsynopsis><command>ghc</command>
+         <arg choice=plain>&ndash;&ndash;make</arg>
+       </cmdsynopsis></term>
+      <indexterm><primary>make mode</primary>
+      </indexterm>
+      <indexterm><primary><option>&ndash;&ndash;make</option></primary>
+      </indexterm>
+      <listitem>
+       <para>In this mode, GHC will build a multi-module Haskell
+       program automatically, figuring out dependencies for itself.
+       If you have a straightforward Haskell program, this is likely
+       to be much easier, and faster, than using
+       <command>make</command>.</para>
+      </listitem>
+    </varlistentry>
+
+    <varlistentry>
+      <term><cmdsynopsis>
+         <command>ghc</command>
+         <group>
+           <arg>-E</arg>
+           <arg>-C</arg>
+           <arg>-S</arg>
+           <arg>-c</arg>
+         </group>
+       </cmdsynopsis></term>
+      <indexterm><primary><option>-E</option></primary></indexterm>
+      <indexterm><primary><option>-C</option></primary></indexterm>
+      <indexterm><primary><option>-S</option></primary></indexterm>
+      <indexterm><primary><option>-c</option></primary></indexterm>
+      <listitem>
+       <para>This is the traditional batch-compiler mode, in which
          GHC can compile source files one at a time, or link objects
          together into an executable.</para>
-       </listitem>
-      </varlistentry>
-    </variablelist>
-
+      </listitem>
+    </varlistentry>
+  </variablelist>
+  
   <sect1>
     <title>Options overview</title>
     
@@ -250,10 +252,10 @@ module X where
 
     <variablelist>
       <varlistentry>
-       <term><literal>-help</literal></term>
-       <term><literal>-?</literal></term>
-       <indexterm><primary><literal>-?</literal></primary></indexterm>
-       <indexterm><primary><literal>-help</literal></primary></indexterm>
+       <term><option>&ndash;&ndash;help</option></term>
+       <term><option>-?</option></term>
+       <indexterm><primary><option>-?</option></primary></indexterm>
+       <indexterm><primary><option>&ndash;&ndash;help</option></primary></indexterm>
        <listitem>
          <para>Cause GHC to spew a long usage message to standard
           output and then exit.</para>
@@ -261,8 +263,8 @@ module X where
       </varlistentry>
 
       <varlistentry>
-       <term><literal>-v</literal></term>
-       <indexterm><primary><literal>-v</literal></primary></indexterm>
+       <term><option>-v</option></term>
+       <indexterm><primary><option>-v</option></primary></indexterm>
        <listitem>
          <para>The <option>-v</option> option makes GHC
           <emphasis>verbose</emphasis>: it reports its version number
@@ -279,7 +281,7 @@ module X where
       </varlistentry>
        
       <varlistentry>
-       <term><literal>-v</literal><replaceable>n</replaceable></term>
+       <term><option>-v</option><replaceable>n</replaceable></term>
        <indexterm><primary><option>-v</option></primary></indexterm>
        <listitem>
          <para>To provide more control over the compiler's verbosity,
@@ -290,7 +292,7 @@ module X where
          
          <variablelist>
            <varlistentry>
-             <term><literal>-v0</literal></term>
+             <term><option>-v0</option></term>
              <listitem>
                <para>Disable all non-essential messages (this is the
                default).</para>
@@ -298,17 +300,17 @@ module X where
            </varlistentry>
 
            <varlistentry>
-             <term><literal>-v1</literal></term>
+             <term><option>-v1</option></term>
              <listitem>
                <para>Minimal verbosity: print one line per
                compilation (this is the default when
-               <option>--make</option> or
-               <option>--interactive</option> is on).</para>
+               <option>&ndash;&ndash;make</option> or
+               <option>&ndash;&ndash;interactive</option> is on).</para>
              </listitem>
            </varlistentry>
 
            <varlistentry>
-             <term><literal>-v2</literal></term>
+             <term><option>-v2</option></term>
              <listitem>
                <para>Print the name of each compilation phase as it
                is executed. (equivalent to
@@ -317,7 +319,7 @@ module X where
            </varlistentry>
 
            <varlistentry>
-             <term><literal>-v3</literal></term>
+             <term><option>-v3</option></term>
              <listitem>
                <para>The same as <option>-v2</option>, except that in
                 addition the full command line (if appropriate) for
@@ -326,7 +328,7 @@ module X where
            </varlistentry>
 
            <varlistentry>
-             <term><literal>-v4</literal></term>
+             <term><option>-v4</option></term>
              <listitem>
                <para>The same as <option>-v3</option> except that the
                intermediate program representation after each
@@ -339,32 +341,48 @@ module X where
       </varlistentry>
       
       <varlistentry>
-       <term><literal>--version</literal></term>
-       <indexterm><primary><literal>--version</literal></primary></indexterm>
+       <term><option>&ndash;&ndash;version</option></term>
+       <indexterm><primary><option>&ndash;&ndash;version</option></primary></indexterm>
        <listitem>
          <para>Print a one-line string including GHC's version number.</para>
        </listitem>
       </varlistentry>
 
       <varlistentry>
-       <term><literal>--numeric-version</literal></term>
-       <indexterm><primary><literal>--numeric-version</literal></primary></indexterm>
+       <term><option>&ndash;&ndash;numeric-version</option></term>
+       <indexterm><primary><option>&ndash;&ndash;numeric-version</option></primary></indexterm>
        <listitem>
          <para>Print GHC's numeric version number only.</para>
        </listitem>
       </varlistentry>
+
+      <varlistentry>
+       <term><option>&ndash;&ndash;print-libdir</option></term>
+       <indexterm><primary><option>&ndash;&ndash;print-libdir</option></primary></indexterm>
+       <listitem>
+         <para>Print the path to GHC's library directory.  This is
+         the top of the directory tree containing GHC's libraries,
+         interfaces, and include files (usually something like
+         <literal>/usr/local/lib/ghc-5.04</literal> on Unix).  This
+         is the value of
+         <literal>$libdir</literal><indexterm><primary><literal>libdir</literal></primary>
+         </indexterm>in the package configuration file (see <xref
+         linkend="packages">).</para>
+       </listitem>
+      </varlistentry>
+
     </variablelist>
   </sect1>
 
   <sect1 id="make-mode">
-    <title>Using <command>ghc</command> <option>--make</option></title>
+    <title>Using <command>ghc</command> <option>&ndash;&ndash;make</option></title>
 
-    <indexterm><primary><option>--make</option></primary>
+    <indexterm><primary><option>&ndash;&ndash;make</option></primary>
     </indexterm>
     <indexterm><primary>separate compilation</primary>
     </indexterm>
     
-    <para>When given the <option>--make</option> option, GHC will
+    <para>When given the <option>&ndash;&ndash;make</option> option, GHC will
     build a multi-module Haskell program by following dependencies
     from a single root module (usually <literal>Main</literal>).  For
     example, if your <literal>Main</literal> module is in a file
@@ -372,17 +390,17 @@ module X where
     the program like this:</para>
 
 <screen>
-ghc --make Main.hs
+ghc &ndash;&ndash;make Main.hs
 </screen>
 
-    <para>The command line must contain one source file or module
-    name; GHC will figure out all the modules in the program by
-    following the imports from this initial module.  It will then
-    attempt to compile each module which is out of date, and finally
-    if the top module is <literal>Main</literal>, the program
+    <para>The command line may contain any number of source file names
+    or module names; GHC will figure out all the modules in the
+    program by following the imports from these initial modules.  It
+    will then attempt to compile each module which is out of date, and
+    finally if there is a <literal>Main</literal> module, the program
     will also be linked into an executable.</para>
 
-    <para>The main advantages to using <literal>ghc --make</literal>
+    <para>The main advantages to using <literal>ghc &ndash;&ndash;make</literal>
     over traditional <literal>Makefile</literal>s are:</para>
 
     <itemizedlist>
@@ -390,7 +408,7 @@ ghc --make Main.hs
        <para>GHC doesn't have to be restarted for each compilation,
        which means it can cache information between compilations.
        Compiling a muli-module program with <literal>ghc
-       --make</literal> can be up to twice as fast as running
+       &ndash;&ndash;make</literal> can be up to twice as fast as running
        <literal>ghc</literal> individually on each source
        file.</para>
       </listitem>
@@ -408,7 +426,7 @@ ghc --make Main.hs
     </itemizedlist>
 
     <para>Any of the command-line options described in the rest of
-    this chapter can be used with <option>--make</option>, but note
+    this chapter can be used with <option>&ndash;&ndash;make</option>, but note
     that any options you give on the command line will apply to all
     the source files compiled, so if you want any options to apply to
     a single source file only, you'll need to use an
@@ -416,14 +434,28 @@ ghc --make Main.hs
     linkend="source-file-options">).</para>
 
     <para>If the program needs to be linked with additional objects
-    (say, some auxilliary C code), these can be specified on the
-    command line as usual.</para>
+    (say, some auxilliary C code), then the object files can be
+    given on the command line and GHC will include them when linking
+    the executable.</para>
+
+    <para>Note that GHC can only follow dependencies if it has the
+    source file available, so if your program includes a module for
+    which there is no source file, even if you have an object and an
+    interface file for the module, then GHC will complain.  The
+    exception to this rule is for package modules, which may or may
+    not have source files.</para>
+
+    <para>The source files for the program don't all need to be in the
+    same directory; the <option>-i</option> option can be used to add
+    directories to the search path (see <xref
+    linkend="options-finding-imports">).</para>
+
   </sect1>
   
   <Sect1 id="options-order">
-    <title>GHC without <option>--make</option></title>
+    <title>GHC without <option>&ndash;&ndash;make</option></title>
 
-    <para>Without <option>--make</option>, GHC will compile one or
+    <para>Without <option>&ndash;&ndash;make</option>, GHC will compile one or
     more source files given on the command line.</para>
 
     <para>The first phase to run is determined by each input-file
@@ -529,8 +561,8 @@ ghc --make Main.hs
 
     <variablelist>
       <varlistentry>
-       <term><literal>-o</literal></term>
-       <indexterm><primary><literal>-o</literal></primary></indexterm>
+       <term><option>-o</option></term>
+       <indexterm><primary><option>-o</option></primary></indexterm>
        <listitem>
          <para>GHC's compiled output normally goes into a
           <filename>.hc</filename>, <filename>.o</filename>, etc.,
@@ -543,12 +575,22 @@ ghc --make Main.hs
           counterintuitive: <command>ghc -C -o foo.o foo.hs</command>
           will put the intermediate C code in the file
           <filename>foo.o</filename>, name notwithstanding!</para>
+
+         <para>Note: on Windows, if the result is an executable file, the
+          extension "<filename>.exe</filename>" is added if the specified filename
+           does not already have an extension.  Thus
+           <programlisting>
+                ghc -o foo Main.hs
+           </programlisting>
+          will compile and link the module <filename>Main.hs</filename>, and put the
+          resulting executable in <filename>foo.exe</filename> (not <filename>foo</filename>).
+         </para>
        </listitem>
       </varlistentry>
 
       <varlistentry>
-       <term><literal>-odir</literal></term>
-       <indexterm><primary><literal>-odir</literal></primary></indexterm>
+       <term><option>-odir</option></term>
+       <indexterm><primary><option>-odir</option></primary></indexterm>
        <listitem>
          <para>The <option>-o</option> option isn't of much use if
           you have <emphasis>several</emphasis> input files&hellip;
@@ -581,39 +623,76 @@ ghc --make Main.hs
       </varlistentry>
 
       <varlistentry>
-       <term><literal>-ohi</literal></term>
-       <indexterm><primary><literal>-ohi</literal></primary></indexterm>
+       <term><option>-ohi</option>  <replaceable>file</replaceable></term>
+       <indexterm><primary><option>-ohi</option></primary>
+       </indexterm>
+       <listitem>
+         <para>The interface output may be directed to another file
+          <filename>bar2/Wurble.iface</filename> with the option
+          <option>-ohi bar2/Wurble.iface</option> (not
+          recommended).</para>
+
+         <para>WARNING: if you redirect the interface file somewhere
+         that GHC can't find it, then the recompilation checker may
+         get confused (at the least, you won't get any recompilation
+         avoidance).  We recommend using a combination of
+         <option>-hidir</option> and <option>-hisuf</option> options
+         instead, if possible.</para>
+
+         <para>To avoid generating an interface at all, you could use
+          this option to redirect the interface into the bit bucket:
+          <literal>-ohi /dev/null</literal>, for example.</para>
+       </listitem>
+      </varlistentry>
+      
+      <varlistentry>
+       <term><option>-hidir</option>  <replaceable>directory</replaceable></term>
+       <indexterm><primary><option>-hidir</option></primary>
+       </indexterm>
        <listitem>
-         <para></para>
+         <para>Redirects all generated interface files into
+         <replaceable>directory</replaceable>, instead of the default
+         which is to place the interface file in the same directory
+         as the source file.</para>
        </listitem>
       </varlistentry>
 
       <varlistentry>
-       <term><literal>-osuf</literal></term>
-       <term><literal>-hisuf</literal></term>
-       <indexterm><primary><literal>-osuf</literal></primary></indexterm>
-       <indexterm><primary><literal>-hisuf</literal></primary></indexterm>
+       <term><option>-osuf</option> <replaceable>suffix</replaceable></term>
+       <term><option>-hisuf</option> <replaceable>suffix</replaceable></term>
+       <term><option>-hcsuf</option> <replaceable>suffix</replaceable></term>
+       <indexterm><primary><option>-osuf</option></primary></indexterm>
+       <indexterm><primary><option>-hisuf</option></primary></indexterm>
+       <indexterm><primary><option>-hcsuf</option></primary></indexterm>
        <listitem>
-         <para>EXOTICA: The <option>-osuf
-          &lt;suffix&gt;</option><IndexTerm><Primary>-osuf
-          &lt;suffix&gt; option</Primary></IndexTerm> will change the
-          <filename>.o</filename> file suffix for object files to
-          whatever you specify.  (We use this in compiling the
-          prelude.).</para>
-
-         <para>Similarly, the <option>-hisuf
-          &lt;suffix&gt;</option><IndexTerm><Primary>-hisuf
-          &lt;suffix&gt; option</Primary></IndexTerm> will change the
-          <filename>.hi</filename> file suffix for non-system
-          interface files (see <XRef LinkEnd="hi-options">).</para>
+         <para>EXOTICA: The <option>-osuf</option>
+          <replaceable>suffix</replaceable> will change the
+          <literal>.o</literal> file suffix for object files to
+          whatever you specify.  We use this when compiling libraries,
+          so that objects for the profiling versions of the libraries
+          don't clobber the normal ones.</para>
+
+         <para>Similarly, the <option>-hisuf</option>
+          <replaceable>suffix</replaceable> will change the
+          <literal>.hi</literal> file suffix for non-system interface
+          files (see <XRef LinkEnd="hi-options">).</para>
+
+         <para>Finally, the option <option>-hcsuf</option>
+          <replaceable>suffix</replaceable> will change the
+          <literal>.hc</literal> file suffix for compiler-generated
+          intermediate C files.</para>
 
          <para>The <option>-hisuf</option>/<option>-osuf</option>
-          game is useful if you want to compile a program with both
-          GHC and HBC (say) in the same directory.  Let HBC use the
-          standard <filename>.hi</filename>/<filename>.o</filename>
-          suffixes; add <option>-hisuf g&lowbar;hi -osuf
-          g&lowbar;o</option> to your <command>make</command> rule for
-          GHC compiling&hellip;</para>
+          game is particularly useful if you want to compile a program both with and without
+           profiling, in the same directory.  You can say:
+           <Screen>
+             ghc ... 
+           </Screen>
+           to get the ordinary version, and
+           <Screen>
+             ghc ... -osuf prof.o -hisuf prof.hi -prof -auto-all
+           </Screen>
+           to get the profiled version.</para>
        </listitem>
       </varlistentry>
     </variablelist>
@@ -634,24 +713,24 @@ ghc --make Main.hs
 
       <variablelist>
        <varlistentry>
-         <term><literal>-keep-hc-files</literal></term>
+         <term><option>-keep-hc-files</option></term>
          <indexterm>
-           <primary><literal>-keep-hc-files</literal></primary>
+           <primary><option>-keep-hc-files</option></primary>
          </indexterm>
          <listitem>
            <para>Keep intermediate <literal>.hc</literal> files when
            doing <literal>.hs</literal>-to-<literal>.o</literal>
            compilations via C (NOTE: <literal>.hc</literal> files
            aren't generated when using the native code generator, you
-           may need to use <literal>-fvia-C</literal> to force them
+           may need to use <option>-fvia-C</option> to force them
            to be produced).</para>
          </listitem>
        </varlistentry>
 
        <varlistentry>
-         <term><literal>-keep-s-files</literal></term>
+         <term><option>-keep-s-files</option></term>
          <indexterm>
-           <primary><literal>-keep-s-files</literal></primary>
+           <primary><option>-keep-s-files</option></primary>
          </indexterm>
          <listitem>
            <para>Keep intermediate <literal>.s</literal> files.</para>
@@ -659,9 +738,9 @@ ghc --make Main.hs
        </varlistentry>
 
        <varlistentry>
-         <term><literal>-keep-raw-s-files</literal></term>
+         <term><option>-keep-raw-s-files</option></term>
          <indexterm>
-           <primary><literal>-keep-raw-s-files</literal></primary>
+           <primary><option>-keep-raw-s-files</option></primary>
          </indexterm>
          <listitem>
            <para>Keep intermediate <literal>.raw-s</literal> files.
@@ -673,9 +752,9 @@ ghc --make Main.hs
        </varlistentry>
 
        <varlistentry>
-         <term><literal>-keep-tmp-files</literal></term>
+         <term><option>-keep-tmp-files</option></term>
          <indexterm>
-           <primary><literal>-keep-tmp-files</literal></primary>
+           <primary><option>-keep-tmp-files</option></primary>
          </indexterm>
          <indexterm>
            <primary>temporary files</primary>
@@ -686,7 +765,7 @@ ghc --make Main.hs
            temporary files, which it normally keeps in
            <literal>/tmp</literal> (or possibly elsewhere; see <xref
            linkend="temp-files">).  Running GHC with
-           <literal>-v</literal> will show you what temporary files
+           <option>-v</option> will show you what temporary files
            were generated along the way.</para>
          </listitem>
        </varlistentry>
@@ -703,8 +782,8 @@ ghc --make Main.hs
 
       <variablelist>
        <varlistentry>
-         <term><literal>-tmpdir</literal></term>
-         <indexterm><primary><literal>-tmpdir</literal></primary></indexterm>
+         <term><option>-tmpdir</option></term>
+         <indexterm><primary><option>-tmpdir</option></primary></indexterm>
          <listitem>
            <para>If you have trouble because of running out of space
             in <filename>/tmp</filename> (or wherever your
@@ -747,7 +826,7 @@ ghc --make Main.hs
     generated during compilation.  By default, you get a standard set
     of warnings which are generally likely to indicate bugs in your
     program.  These are:
-    <option>-fwarn-overlpapping-patterns</option>,
+    <option>-fwarn-overlapping-patterns</option>,
     <option>-fwarn-deprecations</option>,
     <option>-fwarn-duplicate-exports</option>,
     <option>-fwarn-missing-fields</option>, and
@@ -764,7 +843,8 @@ ghc --make Main.hs
          <para>Provides the standard warnings plus
          <option>-fwarn-incomplete-patterns</option>,
          <option>-fwarn-unused-matches</option>,
-         <option>-fwarn-unused-imports</option> and
+         <option>-fwarn-unused-imports</option>,
+         <option>-fwarn-misc</option>, and
          <option>-fwarn-unused-binds</option>.</para>
        </listitem>
       </varlistentry>
@@ -772,7 +852,7 @@ ghc --make Main.hs
       <varlistentry>
        <term><option>-w</option>:</term>
        <listitem>
-         <IndexTerm><Primary>-w option</Primary></IndexTerm>
+         <IndexTerm><Primary><option>-w</option></Primary></IndexTerm>
          <para>Turns off all warnings, including the standard ones.</para>
        </listitem>
       </varlistentry>
@@ -780,11 +860,20 @@ ghc --make Main.hs
       <varlistentry>
        <term><option>-Wall</option>:</term>
        <listitem>
-         <indexterm><primary>-Wall option</primary></indexterm>
+         <indexterm><primary><option>-Wall</option></primary></indexterm>
          <para>Turns on all warning options.</para>
        </listitem>
       </varlistentry>
 
+      <varlistentry>
+       <term><option>-Werror</option>:</term>
+       <listitem>
+         <indexterm><primary><option>-Werror</option></primary></indexterm>
+         <para>Makes any warning into a fatal error. Useful so that you don't 
+           miss warnings when doing batch compilation. </para>
+       </listitem>
+      </varlistentry>
+
     </variablelist>
 
     <para>The full set of warning options is described below.  To turn
@@ -809,7 +898,7 @@ ghc --make Main.hs
       <varlistentry>
        <term><option>-fwarn-duplicate-exports</option>:</term>
        <listitem>
-         <indexterm><primary>-fwarn-duplicate-exports option</primary></indexterm>
+         <indexterm><primary><option>-fwarn-duplicate-exports</option></primary></indexterm>
          <indexterm><primary>duplicate exports, warning</primary></indexterm>
          <indexterm><primary>export lists, duplicates</primary></indexterm>
 
@@ -826,7 +915,7 @@ ghc --make Main.hs
       <varlistentry>
        <term><option>-fwarn-hi-shadowing</option>:</term>
        <listitem>
-         <indexterm><primary>-fwarn-hi-shadowing option</primary></indexterm>
+         <indexterm><primary><option>-fwarn-hi-shadowing</option></primary></indexterm>
          <indexterm><primary>shadowing</primary>
            <secondary>interface files</secondary></indexterm>
 
@@ -840,7 +929,7 @@ ghc --make Main.hs
       <varlistentry>
        <term><option>-fwarn-incomplete-patterns</option>:</term>
        <listitem>
-         <indexterm><primary>-fwarn-incomplete-patterns option</primary></indexterm>
+         <indexterm><primary><option>-fwarn-incomplete-patterns</option></primary></indexterm>
          <indexterm><primary>incomplete patterns, warning</primary></indexterm>
          <indexterm><primary>patterns, incomplete</primary></indexterm>
 
@@ -862,9 +951,20 @@ g [] = 2
       </varlistentry>
 
       <varlistentry>
+       <term><option>-fwarn-misc</option>:</term>
+       <indexterm><primary><option>-fwarn-misc</option></primary></indexterm>
+       <listitem>
+         <para>Turns on warnings for various harmless but untidy
+         things.  This currently includes: importing a type with
+         <literal>(..)</literal> when the export is abstract, and
+         listing duplicate class assertions in a qualified type.</para>
+       </listitem>
+      </varlistentry>
+
+      <varlistentry>
        <term><option>-fwarn-missing-fields</option>:</term>
        <listitem>
-         <indexterm><primary>-fwarn-missing-fields option</primary></indexterm>
+         <indexterm><primary><option>-fwarn-missing-fields</option></primary></indexterm>
          <indexterm><primary>missing fields, warning</primary></indexterm>
          <indexterm><primary>fields, missing</primary></indexterm>
 
@@ -879,7 +979,7 @@ g [] = 2
       <varlistentry>
        <term><option>-fwarn-missing-methods</option>:</term>
        <listitem>
-         <indexterm><primary>-fwarn-missing-methods option</primary></indexterm>
+         <indexterm><primary><option>-fwarn-missing-methods</option></primary></indexterm>
          <indexterm><primary>missing methods, warning</primary></indexterm>
          <indexterm><primary>methods, missing</primary></indexterm>
 
@@ -887,13 +987,25 @@ g [] = 2
           an instance declaration is missing one or more methods, and
           the corresponding class declaration has no default
           declaration for them.</para>
+         <para>The warning is suppressed if the method name
+         begins with an underscore.  Here's an example where this is useful:
+           <programlisting>
+             class C a where
+               _simpleFn :: a -> String
+               complexFn :: a -> a -> String
+               complexFn x y = ... _simpleFn ...
+             </programlisting>
+           The idea is that: (a) users of the class will only call <literal>complexFn</literal>; 
+           never <literal>_simpleFn</literal>; and (b)
+           instance declarations can define either <literal>complexFn</literal> or <literal>_simpleFn</literal>.
+           </para>
        </listitem>
       </varlistentry>
 
       <varlistentry>
        <term><option>-fwarn-missing-signatures</option>:</term>
        <listitem>
-         <indexterm><primary>-fwarn-missing-signatures option</primary></indexterm>
+         <indexterm><primary><option>-fwarn-missing-signatures</option></primary></indexterm>
          <indexterm><primary>type signatures, missing</primary></indexterm>
 
          <para>If you would like GHC to check that every top-level
@@ -906,7 +1018,7 @@ g [] = 2
       <varlistentry>
        <term><option>-fwarn-name-shadowing</option>:</term>
        <listitem>
-         <indexterm><primary>-fwarn-name-shadowing option</primary></indexterm>
+         <indexterm><primary><option>-fwarn-name-shadowing</option></primary></indexterm>
          <indexterm><primary>shadowing, warning</primary></indexterm>
          
          <para>This option causes a warning to be emitted whenever an
@@ -924,7 +1036,7 @@ g [] = 2
 
       <varlistentry>
        <term><option>-fwarn-overlapping-patterns</option>:</term>
-       <indexterm><primary>-fwarn-overlapping-patterns option</primary></indexterm>
+       <indexterm><primary><option>-fwarn-overlapping-patterns</option></primary></indexterm>
        <indexterm><primary>overlapping patterns, warning</primary></indexterm>
        <indexterm><primary>patterns, overlapping</primary></indexterm>
        <listitem>
@@ -960,7 +1072,7 @@ f "2"    = 2
       <varlistentry>
        <term><option>-fwarn-type-defaults</option>:</term>
        <listitem>
-         <indexterm><primary>-fwarn-type-defaults option</primary></indexterm>
+         <indexterm><primary><option>-fwarn-type-defaults</option></primary></indexterm>
          <indexterm><primary>defaulting mechanism, warning</primary></indexterm>
          <para>Have the compiler warn/inform you where in your source
           the Haskell defaulting mechanism for numeric types kicks
@@ -980,7 +1092,7 @@ f "2"    = 2
       <varlistentry>
        <term><option>-fwarn-unused-binds</option>:</term>
        <listitem>
-         <indexterm><primary>-fwarn-unused-binds option</primary></indexterm>
+         <indexterm><primary><option>-fwarn-unused-binds</option></primary></indexterm>
          <indexterm><primary>unused binds, warning</primary></indexterm>
          <indexterm><primary>binds, unused</primary></indexterm>
          <para>Report any function definitions (and local bindings)
@@ -992,7 +1104,7 @@ f "2"    = 2
       <varlistentry>
        <term><option>-fwarn-unused-imports</option>:</term>
        <listitem>
-         <indexterm><primary>-fwarn-unused-imports option</primary></indexterm>
+         <indexterm><primary><option>-fwarn-unused-imports</option></primary></indexterm>
          <indexterm><primary>unused imports, warning</primary></indexterm>
          <indexterm><primary>imports, unused</primary></indexterm>
 
@@ -1004,26 +1116,30 @@ f "2"    = 2
       <varlistentry>
        <term><option>-fwarn-unused-matches</option>:</term>
        <listitem>
-         <indexterm><primary>-fwarn-unused-matches option</primary></indexterm>
+         <indexterm><primary><option>-fwarn-unused-matches</option></primary></indexterm>
          <indexterm><primary>unused matches, warning</primary></indexterm>
          <indexterm><primary>matches, unused</primary></indexterm>
 
          <para>Report all unused variables which arise from pattern
           matches, including patterns consisting of a single variable.
           For instance <literal>f x y = []</literal> would report
-          <VarName>x</VarName> and <VarName>y</VarName> as unused.  To
-          eliminate the warning, all unused variables can be replaced
-          with wildcards.</para>
+          <VarName>x</VarName> and <VarName>y</VarName> as unused.  The
+          warning is suppressed if the variable name begins with an underscore, thus:
+           <programlisting>
+              f _x = True
+           </programlisting>
+          </para>
        </listitem>
       </varlistentry>
 
     </VariableList>
 
     <para>If you're feeling really paranoid, the
-    <option>-dcore-lint</option> option<indexterm><primary>-dcore-lint
-    option</primary></indexterm> is a good choice.  It turns on
-    heavyweight intra-pass sanity-checking within GHC.  (It checks
-    GHC's sanity, not yours.)</para>
+    <option>-dcore-lint</option>
+    option<indexterm><primary><option>-dcore-lint</option></primary></indexterm>
+    is a good choice.  It turns on heavyweight intra-pass
+    sanity-checking within GHC.  (It checks GHC's sanity, not
+    yours.)</para>
 
   </sect1>
 
@@ -1121,18 +1237,6 @@ f "2"    = 2
        </varlistentry>
 
        <varlistentry>
-         <term><option>-O2-for-C</option>:</term>
-         <indexterm><primary>-O2-for-C option</primary></indexterm>
-         <indexterm><primary>gcc, invoking with -O2</primary></indexterm>
-         <listitem>
-           <para>Says to run GCC with <option>-O2</option>, which may
-            be worth a few percent in execution speed.  Don't forget
-            <option>-fvia-C</option>, lest you use the native-code
-            generator and bypass GCC altogether!</para>
-         </listitem>
-       </varlistentry>
-
-       <varlistentry>
          <term><option>-Ofile &lt;file&gt;</option>:</term>
          <indexterm><primary>-Ofile &lt;file&gt; option</primary></indexterm>
          <indexterm><primary>optimising, customised</primary></indexterm>
@@ -1159,8 +1263,8 @@ f "2"    = 2
       <para>We don't use a <option>-O*</option> flag for day-to-day
       work.  We use <option>-O</option> to get respectable speed;
       e.g., when we want to measure something.  When we want to go for
-      broke, we tend to use <option>-O -fvia-C -O2-for-C</option> (and
-      we go for lots of coffee breaks).</para>
+      broke, we tend to use <option>-O -fvia-C</option> (and we go for
+      lots of coffee breaks).</para>
 
       <para>The easiest way to see what <option>-O</option> (etc.)
       &ldquo;really mean&rdquo; is to run with <option>-v</option>,
@@ -1349,36 +1453,31 @@ data S = S !Int !Int
       </variablelist>
 
     </sect2>
-
+    
   </sect1>
-
-&phases;  
-
-<Sect1 id="sec-using-concurrent">
+  
+  &phases;  
+  
+  <sect1 id="sec-using-concurrent">
 <title>Using Concurrent Haskell</title>
 
-<para>
-<indexterm><primary>Concurrent Haskell&mdash;use</primary></indexterm>
-</para>
+            <indexterm><primary>Concurrent Haskell&mdash;use</primary></indexterm>
 
 <para>
-GHC (as of version 4.00) supports Concurrent Haskell by default,
-without requiring a special option or libraries compiled in a certain
-way.  To get access to the support libraries for Concurrent Haskell
-(i.e. <literal>Concurrent</literal> and friends), use the
-<option>-package concurrent</option> option.
-</para>
+GHC supports Concurrent Haskell by default, without requiring a
+special option or libraries compiled in a certain way.  To get access
+to the support libraries for Concurrent Haskell, just import
+<literal>Control.Concurrent</literal> (details are in the accompanying
+library documentation).</para>
 
 <para>
-Three RTS options are provided for modifying the behaviour of the
-threaded runtime system.  See the descriptions of
-<option>-C[&lt;us&gt;]</option>, <option>-q</option>, and
-<option>-t&lt;num&gt;</option> in <XRef LinkEnd="parallel-rts-opts">.
+RTS options are provided for modifying the behaviour of the threaded
+runtime system.  See <XRef LinkEnd="parallel-rts-opts">.
 </para>
 
 <para>
-Concurrent Haskell is described in more detail in <XRef
-LinkEnd="sec-Concurrent">.
+Concurrent Haskell is described in more detail in the documentation
+for the <literal>Control.Concurrent</literal> module.
 </para>
 
 </Sect1>
@@ -1784,6 +1883,48 @@ statements or clauses.
   </sect1>
 
 &runtime;
+
+<sect1 id="ext-core">
+  <title>Generating and compiling External Core Files</title>
+
+  <indexterm><primary>intermediate code generation</primary></indexterm>
+
+  <para>GHC can dump its optimized intermediate code (said to be in &ldquo;Core&rdquo; format) 
+  to a file as a side-effect of compilation. Core files, which are given the suffix
+  <filename>.hcr</filename>, can be read and processed by non-GHC back-end
+  tools.  The Core format is formally described in <ulink url="http://www.haskell.org/ghc/docs/papers/core.ps.gz"
+  <citetitle>An External Representation for the GHC Core Language</citetitle></ulink>, 
+  and sample tools (in Haskell)
+  for manipulating Core files are available in the GHC source distribution 
+  directory <literal>/fptools/ghc/utils/ext-core</literal>.  
+  Note that the format of <literal>.hcr</literal> 
+  files is <emphasis>different</emphasis> (though similar) to the Core output format generated 
+  for debugging purposes (<xref linkend="options-debugging">).</para>
+
+  <para>The Core format natively supports notes which you can add to
+  your source code using the <literal>CORE</literal> pragma (see <xref
+  linkend="pragmas">).</para>
+
+    <variablelist>
+
+       <varlistentry>
+         <term><option>-fext-core</option></term>
+         <indexterm>
+           <primary><option>-fext-core</option></primary>
+         </indexterm>
+         <listitem>
+           <para>Generate <literal>.hcr</literal> files.</para>
+         </listitem>
+       </varlistentry>
+
+    </variablelist>
+
+<para>GHC can also read in External Core files as source; just give the <literal>.hcr</literal> file on
+the command line, instead of the <literal>.hs</literal> or <literal>.lhs</literal> Haskell source.
+A current infelicity is that you need to give teh <literal>-fglasgow-exts</literal> flag too, because
+ordinary Haskell 98, when translated to External Core, uses things like rank-2 types.</para>
+</sect1>
+
 &debug;
 &flags;