Reorganisation of the source tree
[ghc-hetmet.git] / docs / building / building.xml
index d654818..e1967e9 100644 (file)
@@ -1,27 +1,23 @@
 <?xml version="1.0" encoding="iso-8859-1"?>
 <!DOCTYPE article PUBLIC "-//OASIS//DTD DocBook XML V4.2//EN"
-   "http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd">
+   "http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd" [
+  <!ENTITY hacking SYSTEM "../../HACKING">
+]>
 
 <article id="building-guide">
 
 <articleinfo>
 
-<title>Building the Glasgow Functional Programming Tools Suite</title>
+<title>Building and developing GHC</title>
 <author><othername>The GHC Team</othername></author>
 <address><email>glasgow-haskell-&lcub;users,bugs&rcub;@haskell.org</email></address>
 
     <abstract>
-      <para>The Glasgow fptools suite is a collection of Functional
-      Programming related tools, including the Glasgow Haskell
-      Compiler (GHC).  The source code for the whole suite is kept in
-      a single CVS repository and shares a common build and
-      installation system.</para>
-
-      <para>This guide is intended for people who want to build or
-      modify programs from the Glasgow <literal>fptools</literal>
-      suite (as distinct from those who merely want to
-      <emphasis>run</emphasis> them). Installation instructions are
-      now provided in the user guide.</para>
+      <para>This Guide is primarily aimed at those who want to build and/or
+       hack on GHC.  It describes how to get started with building GHC on your
+       machine, and how to tweak the settings to get the kind of build you
+       want.  It also describes the inner workings of the build system, so you
+       can extend it, modify it, and use it to build your code.</para>
 
       <para>The bulk of this guide applies to building on Unix
       systems; see <xref linkend="winbuild"/> for Windows notes.</para>
@@ -33,8 +29,7 @@
   <sect1 id="sec-getting">
     <title>Getting the sources</title>
     
-    <para>You can get your hands on the <literal>fptools</literal>
-    in two ways:</para>
+    <para>You can get your hands on the GHC sources in two ways:</para>
 
     <variablelist>
 
@@ -49,8 +44,7 @@
           (c)&nbsp;you want to hack on GHC yourself.</para>
 
          <para>A source distribution contains complete sources for
-          one or more projects in the <literal>fptools</literal>
-          suite.  Not only that, but the more awkward
+          GHC.  Not only that, but the more awkward
           machine-independent steps are done for you.  For example, if
           you don't have
           <command>happy</command><indexterm><primary>happy</primary></indexterm>
       </varlistentry>
 
       <varlistentry>
-       <term>The CVS repository.<indexterm><primary>CVS repository</primary></indexterm></term>
+       <term>The darcs repository.<indexterm><primary>darcs repository</primary></indexterm></term>
        <listitem>
          <para>We make releases infrequently.  If you want more
           up-to-the minute (but less tested) source code then you need
-          to get access to our CVS repository.</para>
+          to get access to our darcs repository.</para>
 
-         <para>All the <literal>fptools</literal> source code is held
-          in a CVS repository. CVS is a pretty good source-code
-          control system, and best of all it works over the
-          network.</para>
+         <para>Information on accessing the darcs repository is on
+           the wiki: <ulink
+           url="http://hackage.haskell.org/trac/ghc/wiki/GhcDarcs"
+           />.</para>
 
          <para>The repository holds source code only. It holds no
           mechanically generated files at all.  So if you check out a
-          source tree from CVS you will need to install every utility
+          source tree from darcs you will need to install every utility
           so that you can build all the derived files from
           scratch.</para>
-
-         <para>More information about our CVS repository can be found
-          in <xref linkend="sec-cvs"/>.</para>
-       </listitem>
-      </varlistentry>
-    </variablelist>
-
-    <para>If you are going to do any building from sources (either
-    from a source distribution or the CVS repository) then you need to
-    read all of this manual in detail.</para>
-  </sect1>
-
-  <sect1 id="sec-cvs">
-    <title>Using the CVS repository</title>
-
-    <para>We use <ulink url="http://www.cvshome.org/">CVS</ulink> (Concurrent Version System) to keep track of our
-    sources for various software projects. CVS lets several people
-    work on the same software at the same time, allowing changes to be
-    checked in incrementally. </para>
-
-    <para>This section is a set of guidelines for how to use our CVS
-    repository, and will probably evolve in time. The main thing to
-    remember is that most mistakes can be undone, but if there's
-    anything you're not sure about feel free to bug the local CVS
-    meister (namely Jeff Lewis
-    <email>jlewis@galois.com</email>). </para>
-
-    <sect2 id="cvs-access">
-      <title>Getting access to the CVS Repository</title>
-
-      <para>You can access the repository in one of two ways:
-      read-only (<xref linkend="cvs-read-only"/>), or read-write (<xref
-      linkend="cvs-read-write"/>).</para>
-
-      <sect3 id="cvs-read-only">
-       <title>Remote Read-only CVS Access</title>
-
-       <para>Read-only access is available to anyone - there's no
-        need to ask us first.  With read-only CVS access you can do
-        anything except commit changes to the repository.  You can
-        make changes to your local tree, and still use CVS's merge
-        facility to keep your tree up to date, and you can generate
-        patches using 'cvs diff' in order to send to us for
-        inclusion. </para>
-
-       <para>To get read-only access to the repository:</para>
-
-       <orderedlist>
-         <listitem>
-           <para>Make sure that <application>cvs</application> is
-            installed on your machine.</para>
-         </listitem>
-         <listitem>
-           <para>Set your <literal>$CVSROOT</literal> environment variable to
-            <literal>:pserver:anoncvs@glass.cse.ogi.edu:/cvs</literal></para>
-           <para>If you set <literal>$CVSROOT</literal> in a shell script, be sure not to
-             have any trailing spaces on that line, otherwise CVS will respond with 
-             a perplexing message like
-             <screen>/cvs : no such repository</screen></para>
-         </listitem>
-         <listitem>
-            <para>Run the command</para>
-<screen>$ cvs login</screen>
-           <para>The password is simply <literal>cvs</literal>.  This
-            sets up a file in your home directory called
-            <literal>.cvspass</literal>, which squirrels away the
-            dummy password, so you only need to do this step once.</para>
-         </listitem>
-
-         <listitem>
-           <para>Now go to <xref linkend="cvs-first"/>.</para>
-         </listitem>
-       </orderedlist>
-      </sect3>
-
-      <sect3 id="cvs-read-write">
-       <title>Remote Read-Write CVS Access</title>
-
-       <para>We generally supply read-write access to folk doing
-        serious development on some part of the source tree, when
-        going through us would be a pain. If you're developing some
-        feature, or think you have the time and inclination to fix
-        bugs in our sources, feel free to ask for read-write
-        access. There is a certain amount of responsibility that goes
-        with commit privileges; we are more likely to grant you access
-        if you've demonstrated your competence by sending us patches
-        via mail in the past.</para>
-
-       <para>To get remote read-write CVS access, you need to do the
-       following steps.</para>
-
-       <orderedlist>
-         <listitem>
-           <para>Make sure that <literal>cvs</literal> and
-            <literal>ssh</literal> are both installed on your
-            machine.</para>
-         </listitem>
-
-         <listitem>
-           <para>Generate a DSA private-key/public-key pair, thus:</para>
-<screen>$ ssh-keygen -d</screen>
-           <para>(<literal>ssh-keygen</literal> comes with
-            <literal>ssh</literal>.)  Running <literal>ssh-keygen
-            -d</literal> creates the private and public keys in
-            <literal>$HOME/.ssh/id_dsa</literal> and
-            <literal>$HOME/.ssh/id_dsa.pub</literal> respectively
-            (assuming you accept the standard defaults).</para>
-
-           <para><literal>ssh-keygen -d</literal> will only work if
-            you have Version 2 <literal>ssh</literal> installed; it
-            will fail harmlessly otherwise.  If you only have Version
-            1 you can instead generate an RSA key pair using plain</para>
-<screen>$ ssh-keygen</screen>
-
-           <para>Doing so creates the private and public RSA keys in
-            <literal>$HOME/.ssh/identity</literal> and
-            <literal>$HOME/.ssh/identity.pub</literal>
-            respectively.</para>
-
-            <para>[Deprecated.]  Incidentally, you can force a Version
-            2 <literal>ssh</literal> to use the Version 1 protocol by
-            creating <literal>$HOME/config</literal> with the
-            following in it:</para>
-<programlisting>BatchMode Yes
-
-Host cvs.haskell.org
-Protocol 1</programlisting>
-
-           <para>In both cases, <literal>ssh-keygen</literal> will
-            ask for a <firstterm>passphrase</firstterm>.  The
-            passphrase is a password that protects your private key.
-            In response to the 'Enter passphrase' question, you can
-            either:</para>
-           <itemizedlist>
-             <listitem>
-               <para>[Recommended.]  Enter a passphrase, which you
-                will quote each time you use CVS.
-                <literal>ssh-agent</literal> makes this entirely
-                un-tiresome.</para>
-             </listitem>
-             <listitem>
-               <para>[Deprecated.] Just hit return (i.e. use an empty
-                passphrase); then you won't need to quote the
-                passphrase when using CVS.  The downside is that
-                anyone who can see into your <literal>.ssh</literal>
-                directory, and thereby get your private key, can mess
-                up the repository.  So you must keep the
-                <literal>.ssh</literal> directory with draconian
-                no-access permissions.</para>
-             </listitem>
-           </itemizedlist>
-
-
-       <para>
-       <emphasis>Windows users: see the notes in <xref linkend="configure-ssh"/> about <command>ssh</command> wrinkles!</emphasis>
-         </para>
-
-
-         </listitem>
-
-         <listitem>
-           <para>Send a message to to the CVS repository
-            administrator (currently Jeff Lewis
-            <email>jeff@galois.com</email>), containing:</para>
-           <itemizedlist>
-             <listitem>
-               <para>Your desired user-name.</para>
-             </listitem>
-             <listitem>
-               <para>Your <literal>.ssh/id_dsa.pub</literal> (or
-                <literal>.ssh/identity.pub</literal>).</para>
-             </listitem>
-           </itemizedlist>
-           <para>He will set up your account.</para>
-         </listitem>
-
-         <listitem>
-           <para>Set the following environment variables:</para>
-          <itemizedlist>
-          <listitem>
-          <para>
-          <constant>$HOME</constant>: points to your home directory.  This is where CVS
-          will look for its <filename>.cvsrc</filename> file.
-          </para>
-          </listitem>
-
-          <listitem>
-          <para>
-          <constant>$CVS_RSH</constant> to <filename>ssh</filename>
-          </para>
-          <para>[Windows users.] Setting your <literal>CVS_RSH</literal> to
-            <literal>ssh</literal> assumes that your CVS client
-            understands how to execute shell script
-            (&quot;#!&quot;s,really), which is what
-            <literal>ssh</literal> is. This may not be the case on
-            Win32 platforms, so in that case set <literal>CVS_RSH</literal> to
-            <literal>ssh1</literal>.</para>
-          </listitem>
-
-             <listitem>
-               <para><literal>$CVSROOT</literal> to
-               <literal>:ext:</literal><replaceable>your-username</replaceable>
-                <literal>@cvs.haskell.org:/home/cvs/root</literal>
-               where <replaceable>your-username</replaceable> is your user name on
-               <literal>cvs.haskell.org</literal>.
-               </para>
-       <para>The <literal>CVSROOT</literal> environment variable will
-        be recorded in the checked-out tree, so you don't need to set
-        this every time. </para>
-
-            </listitem>
-
-       <listitem>
-       <para>
-       <constant>$CVSEDITOR</constant>: <filename>bin/gnuclient.exe</filename> 
-       if you want to use an Emacs buffer for typing in those long commit messages.
-       </para>
-       </listitem>
-
-       <listitem>
-       <para>
-       <constant>$SHELL</constant>: To use bash as the shell in Emacs, you need to
-       set this to point to <filename>bash.exe</filename>.
-       </para>
-       </listitem>
-
-       </itemizedlist>
-
-
-         </listitem>
-
-         <listitem>
-         <para>
-         Put the following in <filename>$HOME/.cvsrc</filename>:
-         </para>
-         
-<programlisting>checkout -P
-release -d
-update -P
-diff -u</programlisting>
-         
-         <para>
-         These are the default options for the specified CVS commands,
-         and represent better defaults than the usual ones.  (Feel
-         free to change them.)
-         </para>
-         
-         <para>
-         [Windows users.]  Filenames starting with <filename>.</filename> were illegal in 
-         the 8.3 DOS filesystem, but that restriction should have
-         been lifted by now (i.e., you're using VFAT or later filesystems.) If
-         you're still having problems creating it, don't worry; <filename>.cvsrc</filename> is entirely
-         optional.
-         </para>
-         </listitem>
-
-       </orderedlist>
-
-
-       <para>[Experts.]  Once your account is set up, you can get
-        access from other machines without bothering Jeff, thus:</para>
-       <orderedlist>
-         <listitem>
-           <para>Generate a public/private key pair on the new
-            machine.</para>
-         </listitem>
-         <listitem>
-           <para>Use ssh to log in to
-            <literal>cvs.haskell.org</literal>, from your old
-            machine.</para>
-         </listitem>
-         <listitem>
-           <para>Add the public key for the new machine to the file
-            <literal>$HOME/ssh/authorized_keys</literal> on
-            <literal>cvs.haskell.org</literal>.
-            (<literal>authorized_keys2</literal>, I think, for Version
-            2 protocol.)</para>
-         </listitem>
-         <listitem>
-           <para>Make sure that the new version of
-            <literal>authorized_keys</literal> still has 600 file
-            permissions.</para>
-         </listitem>
-       </orderedlist>
-      </sect3>
-    </sect2>
-
-
-
-    <sect2 id="cvs-first">
-      <title>Checking Out a Source Tree</title>
-
-      <itemizedlist>
-       <listitem>
-         <para>Make sure you set your <literal>CVSROOT</literal>
-          environment variable according to either of the remote
-          methods above. The Approved Way to check out a source tree
-          is as follows:</para>
-
-<screen>$ cvs checkout fpconfig</screen>
-
-         <para>At this point you have a new directory called
-          <literal>fptools</literal> which contains the basic stuff
-          for the fptools suite, including the configuration files and
-          some other junk. </para>
-
-<para>[Windows users.]  The following messages appear to be harmless:
-<screen>setsockopt IPTOS_LOWDELAY: Invalid argument
-setsockopt IPTOS_THROUGHPUT: Invalid argument</screen>
-</para>
-
-
-         <para>You can call the fptools directory whatever you like,
-          CVS won't mind: </para>
-         
-<screen>$ mv fptools <replaceable>directory</replaceable></screen>
-
-         <para> NB: after you've read the CVS manual you might be
-          tempted to try</para>
-<screen>$ cvs checkout -d <replaceable>directory</replaceable> fpconfig</screen>
-
-         <para>instead of checking out <literal>fpconfig</literal>
-          and then renaming it.  But this doesn't work, and will
-          result in checking out the entire repository instead of just
-          the <literal>fpconfig</literal> bit.</para>
-<screen>$ cd <replaceable>directory</replaceable>
-$ cvs checkout ghc libraries</screen>
-
-         <para>The second command here checks out the relevant
-          modules you want to work on. For a GHC build, for instance,
-          you need at least the <literal>ghc</literal>,
-          and <literal>libraries</literal>
-          modules (for a full list of the projects available, see
-          <xref linkend="projects"/>).</para>
-
-         <para>Remember that if you do not have
-          <literal>happy</literal> and/or <literal>Alex</literal>
-          installed, you need to check them out as well.</para>
-       </listitem>
-      </itemizedlist>
-    </sect2>
-
-    <sect2 id="cvs-committing">
-      <title>Committing Changes</title>
-
-      <para>This is only if you have read-write access to the
-      repository. For anoncvs users, CVS will issue a &quot;read-only
-      repository&quot; error if you try to commit changes.</para>
-
-      <itemizedlist>
-       <listitem>
-         <para>Build the software, if necessary. Unless you're just
-          working on documentation, you'll probably want to build the
-          software in order to test any changes you make.</para>
-       </listitem>
-
-       <listitem>
-         <para>Make changes. Preferably small ones first.</para>
-       </listitem>
-
-       <listitem>
-         <para>Test them. You can see exactly what changes you've
-          made by using the <literal>cvs diff</literal> command:</para>
-<screen>$ cvs diff</screen>
-         <para>lists all the changes (using the
-          <literal>diff</literal> command) in and below the current
-          directory. In emacs, <literal>C-c C-v =</literal> runs
-          <literal>cvs diff</literal> on the current buffer and shows
-          you the results.</para>
-       </listitem>
-
-       <listitem>
-         <para>If you changed something in the 
-          <literal>fptools/libraries</literal> subdirectories, also run
-          <literal>make html</literal> to check if the documentation can
-          be generated successfully, too.</para>
-       </listitem>
-
-       <listitem>
-         <para>Before checking in a change, you need to update your
-          source tree:</para>
-
-<screen>$ cd fptools
-$ cvs update</screen>
-         <para>This pulls in any changes that other people have made,
-          and merges them with yours. If there are any conflicts, CVS
-          will tell you, and you'll have to resolve them before you
-          can check your changes in. The documentation describes what
-          to do in the event of a conflict.</para>
-
-         <para>It's not always necessary to do a full cvs update
-          before checking in a change, since CVS will always tell you
-          if you try to check in a file that someone else has changed.
-          However, you should still update at regular intervals to
-          avoid making changes that don't work in conjuction with
-          changes that someone else made. Keeping an eye on what goes
-          by on the mailing list can help here.</para>
-       </listitem>
-
-       <listitem>
-         <para>When you're happy that your change isn't going to
-          break anything, check it in. For a one-file change:</para>
-
-<screen>$ cvs commit <replaceable>filename</replaceable></screen>
-
-         <para>CVS will then pop up an editor for you to enter a
-          &quot;commit message&quot;, this is just a short description
-          of what your change does, and will be kept in the history of
-          the file.</para>
-
-         <para>If you're using emacs, simply load up the file into a
-          buffer and type <literal>C-x C-q</literal>, and emacs will
-          prompt for a commit message and then check in the file for
-          you.</para>
-
-         <para>For a multiple-file change, things are a bit
-          trickier. There are several ways to do this, but this is the
-          way I find easiest. First type the commit message into a
-          temporary file. Then either</para>
-
-<screen>$ cvs commit -F <replaceable>commit-message</replaceable> <replaceable>file_1</replaceable> .... <replaceable>file_n</replaceable></screen>
-
-         <para>or, if nothing else has changed in this part of the
-          source tree, </para>
-
-<screen>$ cvs commit -F <replaceable>commit-message</replaceable> <replaceable>directory</replaceable></screen>
-
-          <para>where <replaceable>directory</replaceable> is a common
-          parent directory for all your changes, and
-          <replaceable>commit-message</replaceable> is the name of the
-          file containing the commit message.</para>
-
-         <para>Shortly afterwards, you'll get some mail from the
-          relevant mailing list saying which files changed, and giving
-          the commit message. For a multiple-file change, you should
-          still get only <emphasis>one</emphasis> message.</para>
-       </listitem>
-      </itemizedlist>
-    </sect2>
-
-    <sect2 id="cvs-update">
-      <title>Updating Your Source Tree</title>
-
-      <para>It can be tempting to cvs update just part of a source
-      tree to bring in some changes that someone else has made, or
-      before committing your own changes. This is NOT RECOMMENDED!
-      Quite often changes in one part of the tree are dependent on
-      changes in another part of the tree (the
-      <literal>mk/*.mk</literal> files are a good example where
-      problems crop up quite often). Having an inconsistent tree is a
-      major cause of headaches. </para>
-
-      <para>So, to avoid a lot of hassle, follow this recipe for
-      updating your tree:</para>
-
-<screen>$ cd fptools
-$ cvs update -P 2&gt;&amp;1 | tee log</screen>
-
-      <para>Look at the log file, and fix any conflicts (denoted by a
-      <quote>C</quote> in the first column).  New directories may have
-      appeared in the repository; CVS doesn't check these out by
-      default, so to get new directories you have to explicitly do
-<screen>$ cvs update -d</screen>
-      in each project subdirectory.  Don't do this at the top level,
-      because then <emphasis>all</emphasis> the projects will be
-      checked out.</para>
-
-      <para>If you're using multiple build trees, then for every build
-      tree you have pointing at this source tree, you need to update
-      the links in case any new files have appeared: </para>
-
-<screen>$ cd <replaceable>build-tree</replaceable>
-$ lndir <replaceable>source-tree</replaceable></screen>
-
-      <para>Some files might have been removed, so you need to remove
-      the links pointing to these non-existent files:</para>
-
-<screen>$ find . -xtype l -exec rm '{}' \;</screen>
-
-      <para>To be <emphasis>really</emphasis> safe, you should do
-      </para>
-
-<screen>$ gmake all</screen>
-
-      <para>from the top-level, to update the dependencies and build
-      any changed files. </para>
-    </sect2>
-
-    <sect2 id="cvs-tags">
-      <title>GHC Tag Policy</title>
-
-      <para>If you want to check out a particular version of GHC,
-      you'll need to know how we tag versions in the repository.  The
-      policy (as of 4.04) is:</para>
-
-      <itemizedlist>
-       <listitem>
-         <para>The tree is branched before every major release.  The
-          branch tag is <literal>ghc-x-xx-branch</literal>, where
-          <literal>x-xx</literal> is the version number of the release
-          with the <literal>'.'</literal> replaced by a
-          <literal>'-'</literal>.  For example, the 4.04 release lives
-          on <literal>ghc-4-04-branch</literal>.</para>
-       </listitem>
-
-       <listitem>
-         <para>The release itself is tagged with
-          <literal>ghc-x-xx</literal> (on the branch).  eg. 4.06 is
-          called <literal>ghc-4-06</literal>.</para>
-       </listitem>
-
-       <listitem>
-         <para>We didn't always follow these guidelines, so to see
-          what tags there are for previous versions, do <literal>cvs
-          log</literal> on a file that's been around for a while (like
-          <literal>fptools/ghc/README</literal>).</para>
-       </listitem>
-      </itemizedlist>
-
-      <para>So, to check out a fresh GHC 4.06 tree you would
-      do:</para>
-
-<screen>$ cvs co -r ghc-4-06 fpconfig
-$ cd fptools
-$ cvs co -r ghc-4-06 ghc libraries</screen>
-    </sect2>
-
-    <sect2 id="cvs-hints">
-      <title>General Hints</title>
-
-      <itemizedlist>
-       <listitem>
-         <para>As a general rule: commit changes in small units,
-          preferably addressing one issue or implementing a single
-          feature.  Provide a descriptive log message so that the
-          repository records exactly which changes were required to
-          implement a given feature/fix a bug. I've found this
-          <emphasis>very</emphasis> useful in the past for finding out
-          when a particular bug was introduced: you can just wind back
-          the CVS tree until the bug disappears.</para>
-       </listitem>
-
-       <listitem>
-         <para>Keep the sources at least *buildable* at any given
-          time. No doubt bugs will creep in, but it's quite easy to
-          ensure that any change made at least leaves the tree in a
-          buildable state. We do nightly builds of GHC to keep an eye
-          on what things work/don't work each day and how we're doing
-          in relation to previous verions. This idea is truely wrecked
-          if the compiler won't build in the first place!</para>
-       </listitem>
-
-       <listitem>
-         <para>To check out extra bits into an already-checked-out
-          tree, use the following procedure.  Suppose you have a
-          checked-out fptools tree containing just ghc, and you want
-          to add nofib to it:</para>
-
-<screen>$ cd fptools
-$ cvs checkout nofib</screen>
-
-         <para>or: </para>
-
-<screen>$ cd fptools
-$ cvs update -d nofib</screen>
-         
-         <para>(the -d flag tells update to create a new
-          directory). If you just want part of the nofib suite, you
-          can do </para>
-
-<screen>$ cd fptools
-$ cvs checkout nofib/spectral</screen>
-
-         <para>This works because <literal>nofib</literal> is a
-          module in its own right, and spectral is a subdirectory of
-          the nofib module. The path argument to checkout must always
-          start with a module name. There's no equivalent form of this
-          command using <literal>update</literal>.</para>
-       </listitem>
-      </itemizedlist>
-    </sect2>
-  </sect1>
-
-  <sect1 id="projects">
-    <title>What projects are there?</title>
-
-    <para>The <literal>fptools</literal> suite consists of several
-    <firstterm>projects</firstterm>, most of which can be downloaded,
-    built and installed individually.  Each project corresponds to a
-    subdirectory in the source tree, and if checking out from CVS then
-    each project can be checked out individually by sitting in the top
-    level of your source tree and typing <command>cvs checkout
-    <replaceable>project</replaceable></command>.</para>
-
-    <para>Here is a list of the projects currently available:</para>
-
-    <variablelist>
-      <varlistentry>
-       <term>
-          <literal>alex</literal>
-          <indexterm><primary><literal>alex</literal></primary><secondary>project</secondary></indexterm>
-        </term>
-       <listitem>
-         <para>The <ulink
-         url="http://www.haskell.org/alex/">Alex</ulink> lexical
-         analyser generator for Haskell.</para>
-       </listitem>
-      </varlistentry>
-
-      <varlistentry>
-       <term>
-          <literal>ghc</literal>
-          <indexterm><primary><literal>ghc</literal></primary>
-          <secondary>project</secondary></indexterm>
-        </term>
-       <listitem>
-         <para>The <ulink url="http://www.haskell.org/ghc/">Glasgow
-         Haskell Compiler</ulink> (minus libraries).  Absolutely
-         required for building GHC.</para>
-       </listitem>
-      </varlistentry>
-
-      <varlistentry>
-       <term>
-          <literal>glafp-utils</literal>
-          <indexterm><primary><literal>glafp-utils</literal></primary><secondary>project</secondary></indexterm>
-        </term>
-       <listitem>
-         <para>Utility programs, some of which are used by the
-         build/installation system.  Required for pretty much
-         everything.</para>
-       </listitem>
-      </varlistentry>
-
-      <varlistentry>
-       <term>
-          <literal>greencard</literal>
-         <indexterm><primary><literal>greencard</literal></primary><secondary>project</secondary></indexterm>
-        </term>
-       <listitem>
-         <para>The <ulink
-         url="http://www.haskell.org/greencard/">GreenCard</ulink>
-         system for generating Haskell foreign function
-         interfaces.</para>
-       </listitem>
-      </varlistentry>
-
-      <varlistentry>
-       <term>
-          <literal>haggis</literal>
-         <indexterm><primary><literal>haggis</literal></primary><secondary>project</secondary></indexterm>
-        </term>
-       <listitem>
-         <para>The <ulink
-         url="http://www.dcs.gla.ac.uk/fp/software/haggis/">Haggis</ulink>
-         Haskell GUI framework.</para>
-       </listitem>
-      </varlistentry>
-
-      <varlistentry>
-       <term>
-          <literal>haddock</literal>
-         <indexterm><primary><literal>haddock</literal></primary><secondary>project</secondary></indexterm>
-        </term>
-       <listitem>
-         <para>The <ulink
-         url="http://www.haskell.org/haddock/">Haddock</ulink>
-         documentation tool.</para>
-       </listitem>
-      </varlistentry>
-
-      <varlistentry>
-       <term>
-          <literal>happy</literal>
-          <indexterm><primary><literal>happy</literal></primary><secondary>project</secondary></indexterm>
-        </term>
-       <listitem>
-         <para>The <ulink
-         url="http://www.haskell.org/happy/">Happy</ulink> Parser
-         generator.</para>
-       </listitem>
-      </varlistentry>
-
-      <varlistentry>
-       <term>
-          <literal>hdirect</literal>
-          <indexterm><primary><literal>hdirect</literal></primary><secondary>project</secondary></indexterm>
-        </term>
-       <listitem>
-         <para>The <ulink
-         url="http://www.haskell.org/hdirect/">H/Direct</ulink>
-         Haskell interoperability tool.</para>
-       </listitem>
-      </varlistentry>
-
-      <varlistentry>
-       <term>
-          <literal>hood</literal>
-          <indexterm><primary><literal>hood</literal></primary><secondary>project</secondary></indexterm>
-        </term>
-       <listitem>
-         <para>The <ulink url="http://www.haskell.org/hood/">Haskell
-         Object Observation Debugger</ulink>.</para>
-       </listitem>
-      </varlistentry>
-
-      <varlistentry>
-       <term>
-          <literal>hslibs</literal>
-          <indexterm><primary><literal>hslibs</literal></primary><secondary>project</secondary></indexterm>
-        </term>
-       <listitem>
-         <para>Old, now deprecated, libraries.  Everything in here is in <literal>libraries</literal>.</para>
-       </listitem>
-      </varlistentry>
-
-      <varlistentry>
-       <term>
-          <literal>libraries</literal>
-          <indexterm><primary><literal></literal></primary><secondary>project</secondary></indexterm>
-        </term>
-       <listitem>
-         <para>Hierarchical Haskell library suite
-         (<emphasis>required</emphasis> for building GHC).</para>
-       </listitem>
-      </varlistentry>
-
-      <varlistentry>
-       <term>
-          <literal>mhms</literal>
-          <indexterm><primary><literal></literal></primary><secondary>project</secondary></indexterm>
-        </term>
-       <listitem>
-         <para>The Modular Haskell Metric System.</para>
-       </listitem>
-      </varlistentry>
-
-      <varlistentry>
-       <term>
-          <literal>nofib</literal>
-          <indexterm><primary><literal>nofib</literal></primary><secondary>project</secondary></indexterm>
-        </term>
-       <listitem>
-         <para>The NoFib suite: A collection of Haskell programs used
-         primarily for benchmarking.</para>
-       </listitem>
-      </varlistentry>
-
-      <varlistentry>
-       <term>
-          <literal>testsuite</literal>
-          <indexterm><primary><literal>testsuite</literal></primary><secondary>project</secondary></indexterm>
-        </term>
-       <listitem>
-         <para>A testing framework, including GHC's regression test
-         suite.</para>
        </listitem>
       </varlistentry>
     </variablelist>
-
-    <para>So, to build GHC you need at least the
-    <literal>ghc</literal> and <literal>libraries</literal>
-    projects (a GHC source distribution will
-    already include the bits you need).</para>
   </sect1>
 
   <sect1 id="sec-build-checks">
@@ -903,15 +136,12 @@ $ cvs checkout nofib/spectral</screen>
   </sect1>
 
   <sect1 id="sec-port-info">
-    <title>What machines the Glasgow tools run on</title>
+    <title>What machines GHC runs on</title>
 
 <indexterm><primary>ports</primary><secondary>GHC</secondary></indexterm>
 <indexterm><primary>GHC</primary><secondary>ports</secondary></indexterm>
 <indexterm><primary>platforms</primary><secondary>supported</secondary></indexterm>
 
-    <para>The main question is whether or not the Haskell compiler
-    (GHC) runs on your platform.</para>
-
     <para>A &ldquo;platform&rdquo; is a
     architecture/manufacturer/operating-system combination, such as
     <literal>sparc-sun-solaris2</literal>.  Other common ones are
@@ -931,13 +161,10 @@ $ cvs checkout nofib/spectral</screen>
     platforms; for example, a sockets library is of no use unless the
     operating system supports the underlying BSDisms.</para>
 
-    <sect2>
-      <title>What platforms the Haskell compiler (GHC) runs on</title>
-
-      <indexterm><primary>fully-supported platforms</primary></indexterm>
-      <indexterm><primary>native-code generator</primary></indexterm>
-      <indexterm><primary>registerised ports</primary></indexterm>
-      <indexterm><primary>unregisterised ports</primary></indexterm>
+    <indexterm><primary>fully-supported platforms</primary></indexterm>
+    <indexterm><primary>native-code generator</primary></indexterm>
+    <indexterm><primary>registerised ports</primary></indexterm>
+    <indexterm><primary>unregisterised ports</primary></indexterm>
 
       <para>The GHC hierarchy of Porting Goodness: (a)&nbsp;Best is a
       native-code generator; (b)&nbsp;next best is a
@@ -946,10 +173,6 @@ $ cvs checkout nofib/spectral</screen>
       (&ldquo;Unregisterised&rdquo; is so terrible that we won't say
       more about it).</para>
 
-      <para>We use Sparcs running Solaris 2.7 and x86 boxes running
-      FreeBSD and Linux, so those are the best supported platforms,
-      unsurprisingly.</para>
-
       <para>Here's everything that's known about GHC ports.  We
       identify platforms by their &ldquo;canonical&rdquo;
       CPU/Manufacturer/OS triple.</para>
@@ -1090,20 +313,11 @@ $ cvs checkout nofib/spectral</screen>
          <term>x86_64-unknown-linux
             <indexterm><primary>x86_64-unknown-linux</primary></indexterm>
           </term>
-         <listitem>
-           <para>GHC currently works unregisterised.  A registerised
-           port is in progress.</para>
-         </listitem>
-       </varlistentry>
-
-       <varlistentry>
-         <term>amd64-unknown-openbsd
+<term>amd64-unknown-openbsd
             <indexterm><primary>amd64-unknown-linux</primary></indexterm>
           </term>
          <listitem>
-            <para>(This is the same as x86_64-unknown-openbsd). GHC
-                currently works unregisterised.  A registerised port is in
-                progress.</para>
+           <para>Fully supported, with a native code generator and GHCi.</para>
          </listitem>
        </varlistentry>
 
@@ -1165,17 +379,8 @@ $ cvs checkout nofib/spectral</screen>
       distant past, including various Motorola 68k boxes.  The 68k
       support still remains, but porting to one of these systems will
       certainly be a non-trivial task.</para>
-    </sect2>
-
-    <sect2>
-      <title>What machines the other tools run on</title>
-
-      <para>Unless you hear otherwise, the other tools work if GHC
-      works.</para>
-    </sect2>
   </sect1>
 
-
   <sect1 id="sec-pre-supposed">
     <title>Installing pre-supposed utilities</title>
 
@@ -1220,8 +425,9 @@ $ cvs checkout nofib/spectral</screen>
           Perl version 5 at least is required.  GHC has been known to
           tickle bugs in Perl, so if you find that Perl crashes when
           running GHC try updating (or downgrading) your Perl
-          installation.  Versions of Perl that we use and are known to
-          be fairly stable are 5.005 and 5.6.1.</para>
+          installation.  Versions of Perl before 5.6 have been known to have
+          various bugs tickled by GHC, so the configure script
+          will look for version 5.6 or later.</para>
 
          <para>For Win32 platforms, you should use the binary
           supplied in the InstallShield (copy it to
@@ -1241,16 +447,12 @@ $ cvs checkout nofib/spectral</screen>
           <indexterm><primary>GCC (GNU C compiler), pre-supposed</primary></indexterm>
         </term>
        <listitem>
-         <para>We recommend using GCC version 2.95.2 on all
-          platforms.  Failing that, version 2.7.2 is stable on most
-          platforms.  Earlier versions of GCC can be assumed not to
-          work, and versions in between 2.7.2 and 2.95.2 (including
-          <command>egcs</command>) have varying degrees of stability
-          depending on the platform.</para>
-
-         <para>GCC 3.2 is currently known to have problems building
-         GHC on Sparc, but is stable on x86.</para>
-         
+         <para>Most GCC versions should work with the most recent GHC
+           sources.  Expect trouble if you use a recent GCC with
+           an older GHC, though (trouble in the form of mis-compiled code,
+           link errors, and errors from the <literal>ghc-asm</literal>
+           script).</para>
+
          <para>If your GCC dies with &ldquo;internal error&rdquo; on
           some GHC source file, please let us know, so we can report
           it and get things improved.  (Exception: on x86
@@ -1269,23 +471,35 @@ $ cvs checkout nofib/spectral</screen>
          specific to GNU <command>make</command>, so you must have
          this installed in order to build any of the fptools
          suite.</para>
+
+         <para>NB. it has been reported that version 3.79 no longer
+         works to build GHC, and 3.80 is required.</para>
        </listitem>
       </varlistentry>
 
       <varlistentry>
-       <term>Happy
+       <term><ulink url="http://www.haskell.org/happy">Happy</ulink>
           <indexterm><primary>Happy</primary></indexterm>
         </term>
        <listitem>
          <para>Happy is a parser generator tool for Haskell, and is
-          used to generate GHC's parsers.  Happy is written in
+          used to generate GHC's parsers.</para>
+
+         <para>If you start from a source tarball of GHC (i.e. not a darcs
+           checkout), then you don't need Happy, because we supply the
+           pre-processed versions of the Happy parsers.  If you intend to
+           modify the compiler and/or you're using a darcs checkout, then you
+           need Happy.</para>
+
+         <para>Happy version 1.15 is currently required to build GHC.</para>
+
+         <para>Happy is written in
           Haskell, and is a project in the CVS repository
           (<literal>fptools/happy</literal>).  It can be built from
           source, but bear in mind that you'll need GHC installed in
           order to build it.  To avoid the chicken/egg problem,
           install a binary distribution of either Happy or GHC to get
-          started.  Happy distributions are available from <ulink
-          url="http://www.haskell.org/happy/">Happy's Web
+          started.  Happy distributions are available from <ulink url="http://www.haskell.org/happy/">Happy's Web
           Page</ulink>.</para>
        </listitem>
       </varlistentry>
@@ -1296,10 +510,15 @@ $ cvs checkout nofib/spectral</screen>
         </term>
        <listitem>
          <para>Alex is a lexical-analyser generator for Haskell,
-         which GHC uses to generate its lexer.  Like Happy, Alex is
-         written in Haskell and is a project in the CVS repository.
-         Alex distributions are available from <ulink
-         url="http://www.haskell.org/alex/">Alex's Web
+         which GHC uses to generate its lexer.</para>
+
+         <para>Like Happy, you don't need Alex if you're building GHC from a
+           source tarball, but you do need it if you're modifying GHC and/or
+           building a darcs checkout.</para>
+
+         <para>Alex is
+         written in Haskell and is a project in the darcs repository.
+         Alex distributions are available from <ulink url="http://www.haskell.org/alex/">Alex's Web
          Page</ulink>.</para>
        </listitem>
       </varlistentry>
@@ -1311,7 +530,7 @@ $ cvs checkout nofib/spectral</screen>
         </term>
        <listitem>
          <para>GNU autoconf is needed if you intend to build from the
-          CVS sources, it is <emphasis>not</emphasis> needed if you
+          darcs sources, it is <emphasis>not</emphasis> needed if you
           just intend to build a standard source distribution.</para>
 
          <para>Version 2.52 or later of the autoconf package is required.
@@ -1424,41 +643,54 @@ $ cvs checkout nofib/spectral</screen>
     <indexterm><primary>Building from source</primary></indexterm>
     <indexterm><primary>Source, building from</primary></indexterm>
 
-    <para>You've been rash enough to want to build some of the Glasgow
-    Functional Programming tools (GHC, Happy, nofib, etc.) from
-    source.  You've slurped the source, from the CVS repository or
-    from a source distribution, and now you're sitting looking at a
-    huge mound of bits, wondering what to do next.</para>
-
-    <para>Gingerly, you type <command>make</command>.  Wrong
-    already!</para>
-
-    <para>This rest of this guide is intended for duffers like me, who
-    aren't really interested in Makefiles and systems configurations,
-    but who need a mental model of the interlocking pieces so that
-    they can make them work, extend them consistently when adding new
-    software, and lay hands on them gently when they don't
-    work.</para>
-
-    <sect2 id="quick-start">
-      <title>Quick Start</title>
+    <para>&ldquo;I just want to build it!&rdquo;</para>
 
-      <para>If you are starting from a source distribution, and just
-      want a completely standard build, then the following procedure should 
-      work (unless you're on Windows, in which case go to <xref linkend="winbuild" />).</para>
+    <para>No problem.  This recipe should build and install a working GHC with
+      all the default settings.  (unless you're
+      on Windows, in which case go to <xref linkend="winbuild" />).</para>
 
-<screen>$ autoreconf
+<screen>$ autoreconf<footnote><para>not necessary if you started from a source tarball</para>
+      </footnote>
 $ ./configure
 $ make
 $ make install</screen>
 
       <para>For GHC, this will do a 2-stage bootstrap build of the
       compiler, with profiling libraries, and install the
-      results.</para>
+      results in the default location (under <filename>/usr/local</filename> on
+      Unix, for example).</para>
+
+    <para>The <literal>configure</literal> script is a standard GNU
+      <literal>autoconf</literal> script, and accepts the usual options for
+      changing install locations and the like.  Run
+      <literal>./configure&nbsp;--help</literal> for a list of options.</para>
 
       <para>If you want to do anything at all non-standard, or you
       want to do some development, read on...</para>
-    </sect2>
+    </sect1>
+    
+    <sect1 id="quick-start">
+      <title>Quick start for GHC developers</title>
+      
+      <para>This section is a copy of the file
+       <literal>ghc/HACKING</literal> from the GHC source tree.  It describes
+       how to get started with setting up your build tree for developing GHC
+       or its libraries, and how to start building.</para>
+
+<screen>     
+&hacking;
+      </screen>
+    </sect1>
+
+  <sect1 id="sec-working-with-the-build-system">
+    <title>Working with the build system</title>
+    
+    <para>This rest of this guide is intended for duffers like me, who
+    aren't really interested in Makefiles and systems configurations,
+    but who need a mental model of the interlocking pieces so that
+    they can make them work, extend them consistently when adding new
+    software, and lay hands on them gently when they don't
+    work.</para>
 
     <sect2 id="sec-source-tree">
       <title>Your source tree</title>
@@ -1614,7 +846,7 @@ $ make install</screen>
          <term>Step 1: get ready for configuration.</term>
          <listitem>
            <para>NOTE: if you're starting from a source distribution,
-           rather than CVS sources, you can skip this step.</para>
+           rather than darcs sources, you can skip this step.</para>
 
            <para>Change directory to
             <constant>&dollar;(FPTOOLS&lowbar;TOP)</constant> and
@@ -1858,7 +1090,7 @@ $ make install</screen>
 
       <orderedlist>
        <listitem>
-         <para> Get your source tree from somewhere (CVS repository
+         <para> Get your source tree from somewhere (darcs repository
           or source distribution).  Say you call the root directory
           <filename>myfptools</filename> (it does not have to be
           called <filename>fptools</filename>).  Make sure that you
@@ -3818,7 +3050,19 @@ GhcBootLibs = YES</programlisting>
              <listitem>
                <para>Touch the generated configuration files, just to make
                sure they don't get replaced during the build:</para>
-<screen>$ touch <filename><replaceable>H</replaceable></filename>/ghc/includes/{ghcautoconf.h,DerivedConstants.h.GHCConstants.h.mkDerivedConstants.c,mkDerivedConstantsHdr,mkDerivedConstants.o,mkGHCConstants,mkGHCConstants.o}</screen>
+<screen>$ cd <filename><replaceable>H</replaceable></filename>/ghc/includes
+$ touch ghcautoconf.h DerivedConstants.h GHCConstants.h mkDerivedConstants.c
+$ touch mkDerivedConstantsHdr mkDerivedConstants.o mkGHCConstants mkGHCConstants.o</screen>
+
+               <para>Note: it has been reported that these files still get
+                 overwritten during the next stage.  We have installed a fix
+                 for this in GHC 6.4.2, but if you are building a version
+                 before that you need to watch out for these files getting
+                 overwritte by the <literal>Makefile</literal> in
+                 <literal>ghc/includes</literal>.  If your system supports
+                 it, you might be able to prevent it by making them
+                 immutable:</para>
+<screen>$ chflags uchg  ghc/includes/{ghcautoconf.h,DerivedConstants.h,GHCConstants.h}</screen>
              </listitem>
 
            <listitem>
@@ -3840,8 +3084,10 @@ $ make boot stage=2 &amp;&amp; make stage=2</screen>
            </listitem>
 
            <listitem>
-<screen>$ cd <replaceable>H</replaceable>/ghc/lib
+<screen>$ cd <replaceable>H</replaceable>/ghc/lib/compat
 $ make clean
+$ rm .depend
+$ make boot UseStage1=YES
 $ make -k UseStage1=YES EXTRA_HC_OPTS='-O -fvia-C -keep-hc-files'
 $ cd <replaceable>H</replaceable>/ghc/utils
 $ make clean
@@ -4272,7 +3518,7 @@ Posix interface.
 
 <para>You can't use the MinGW to <emphasis>build</emphasis> GHC, because MinGW doesn't have a shell,
 or the standard Unix commands such as <command>mv</command>, <command>rm</command>,
-<command>ls</command>, nor build-system stuff such as <command>make</command> and <command>cvs</command>.
+<command>ls</command>, nor build-system stuff such as <command>make</command> and <command>darcs</command>.
 For that, there are two choices: <ulink url="http://www.cygwin.com">Cygwin</ulink> 
 and <ulink url="http://www.mingw.org/msys.shtml">MSYS</ulink>:
 
@@ -4295,7 +3541,7 @@ through fewer layers, so MSYS is quite a bit faster too.
 <para>Furthermore, MSYS provides no compilation tools; it relies instead on the MinGW tools. These
 compile binaries that run with no DLL support, on any Win32 system.
 However, MSYS does come with all the make-system tools, such as <command>make</command>, <command>autoconf</command>, 
-<command>cvs</command>, <command>ssh</command> etc.  To get these, you have to download the 
+<command>darcs</command>, <command>ssh</command> etc.  To get these, you have to download the 
 MsysDTK (Developer Tool Kit) package, as well as the base MSYS package.
 </para>
 <para>MSYS does have a DLL, but it's only used by MSYS commands (<command>sh</command>, <command>rm</command>, 
@@ -4494,7 +3740,7 @@ download the following (of course, the version numbers will differ):
   </para></listitem>
   <listitem><para>The MSYS developer's toolkit (binary is sufficient): <literal>msysDTK-1.0.1.exe</literal>.
                    This provides <command>make</command>, <command>autoconf</command>, 
-                   <command>ssh</command>, <command>cvs</command> and probably more besides.
+                   <command>ssh</command> and probably more besides.
   </para></listitem>
 </itemizedlist>
 Run both executables (in the order given above) to install them.  I put them in <literal>c:/msys</literal>
@@ -4565,11 +3811,17 @@ bzip'd dump.</para></listitem>
 </para>
 </sect2>
 
-<sect2><title>Installing and configuring Cygwin</title>
+<sect2 id="install-cygwin"><title>Installing and configuring Cygwin</title>
 
 <para> Install Cygwin from <ulink url="http://www.cygwin.com/">http://www.cygwin.com/</ulink>.
-The installation process is straightforward; we install it in <filename>c:/cygwin</filename>.
-During the installation dialogue, make sure that you select all of the following:
+The installation process is straightforward; we install it in
+<filename>c:/cygwin</filename>.</para>
+<para>
+You must install enough Cygwin <emphasis>packages</emphasis> to support
+building GHC.  If you miss out any of these, strange things will happen to you.   There are two ways to do this:
+<itemizedlist>
+<listitem><para>The direct, but laborious way is to 
+select all of the following packages in the installation dialogue:
              <command>cvs</command>, 
              <command>openssh</command>,
              <command>autoconf</command>,
@@ -4577,11 +3829,32 @@ During the installation dialogue, make sure that you select all of the following
              <command>gcc</command>,
              <command>flex</command>,
              <command>make</command>.
-If you miss out any of these, strange things will happen to you.   To see thse packages, 
+To see thse packages, 
 click on the "View" button in the "Select Packages" 
 stage of Cygwin's installation dialogue, until the view says "Full".  The default view, which is
 "Category" isn't very helpful, and the "View" button is rather unobtrousive.
 </para>
+</listitem>
+
+<listitem><para>The clever way is to point the Cygwin installer at the
+<command>ghc-depends</command> package, which is kept at <ulink
+url="http://haskell.org/ghc/cygwin">http://haskell.org/ghc/cygwin</ulink>.
+When the Cygwin installer asks you to "Choose a Download Site", choose one of
+the
+offered mirror sites; and then type "http://haskell.org/ghc/cygwin" into the
+"User URL" box and click "Add"; now two sites are selected. (The Cygwin
+installer remembers this for next time.)
+Click "Next".</para>
+<para>In the "Select Packages" dialogue box that follows, click the "+" sign by
+"Devel", scroll down to the end of the "Devel" packages, and choose
+<command>ghc-depends</command>.
+The package <command>ghc-depends</command> will not actually install anything itself, 
+but forces additional packages to be added by the Cygwin installer.
+</para>
+</listitem>
+</itemizedlist>
+</para>
+
 <para> Now set the following user environment variables:
 <itemizedlist>
 
@@ -4610,50 +3883,7 @@ file.  Ditto <command>emacs</command> looking for <filename>.emacsrc</filename>
 </itemizedlist>
 </para>
 
-<para>
-There are a few other things to do:
-<itemizedlist>
-<listitem>
-<para>
-By default, cygwin provides the command shell <filename>ash</filename>
-as <filename>sh.exe</filename>. We have often seen build-system problems that 
-turn out to be due to bugs in <filename>ash</filename>
-(to do with quoting
-and length of command lines).  On the other hand <filename>bash</filename> seems
-to be rock solid.
-So, in <filename>cygwin/bin</filename>
-remove the supplied <filename>sh.exe</filename> (or rename it as <filename>ash.exe</filename>),
-and copy <filename>bash.exe</filename> to  <filename>sh.exe</filename>.
-You'll need to do this in Windows Explorer or the Windows <command>cmd</command> shell, because
-you can't rename a running program!
-</para>
-</listitem>
-
-<listitem>
-<para>
-Some script files used in the make system start with "<command>#!/bin/perl</command>",
-(and similarly for <command>sh</command>).  Notice the hardwired path!
-So you need to ensure that your <filename>/bin</filename> directory has the following
-binaries in it:
-<itemizedlist>
-<listitem> <para><command>sh</command></para></listitem>
-<listitem> <para><command>perl</command></para></listitem>
-<listitem> <para><command>cat</command></para></listitem>
-</itemizedlist>
-All these come in Cygwin's <filename>bin</filename> directory, which you probably have
-installed as <filename>c:/cygwin/bin</filename>.  By default Cygwin mounts "<filename>/</filename>" as
-<filename>c:/cygwin</filename>, so if you just take the defaults it'll all work ok.
-(You can discover where your Cygwin
-root directory <filename>/</filename> is by typing <command>mount</command>.)
-Provided <filename>/bin</filename> points to the Cygwin <filename>bin</filename>
-directory, there's no need to copy anything.  If not, copy these binaries from the <filename>cygwin/bin</filename>
-directory (after fixing the <filename>sh.exe</filename> stuff mentioned in the previous bullet).
-</para>
-</listitem>
-</itemizedlist>
-</para>
-
-<para>Finally, here are some things to be aware of when using Cygwin:
+<para>Here are some things to be aware of when using Cygwin:
 <itemizedlist>
 <listitem> <para>Cygwin doesn't deal well with filenames that include
 spaces. "<filename>Program Files</filename>" and "<filename>Local files</filename>" are
@@ -4672,6 +3902,38 @@ they don't recognise symlinks.
 See the notes in <xref linkend="msys-install"/> about <command>find</command> and <command>bzip</command>,
 which apply to Cygwin too.
 </para></listitem>
+
+<listitem>
+<para>
+Some script files used in the make system start with "<command>#!/bin/perl</command>",
+(and similarly for <command>sh</command>).  Notice the hardwired path!
+So you need to ensure that your <filename>/bin</filename> directory has at least
+<command>sh</command>, <command>perl</command>, and <command>cat</command> in it.
+All these come in Cygwin's <filename>bin</filename> directory, which you probably have
+installed as <filename>c:/cygwin/bin</filename>.  By default Cygwin mounts "<filename>/</filename>" as
+<filename>c:/cygwin</filename>, so if you just take the defaults it'll all work ok.
+(You can discover where your Cygwin
+root directory <filename>/</filename> is by typing <command>mount</command>.)
+Provided <filename>/bin</filename> points to the Cygwin <filename>bin</filename>
+directory, there's no need to copy anything.  If not, copy these binaries from the <filename>cygwin/bin</filename>
+directory (after fixing the <filename>sh.exe</filename> stuff mentioned in the previous bullet).
+</para>
+</listitem>
+
+<listitem>
+<para>
+By default, cygwin provides the command shell <filename>ash</filename>
+as <filename>sh.exe</filename>.   It seems to be fine now, but in the past we
+saw build-system problems that turned out to be due to bugs in <filename>ash</filename>
+(to do with quoting and length of command lines).  On the other hand <filename>bash</filename> seems
+to be rock solid.
+If this happens to you (which it shouldn't), in <filename>cygwin/bin</filename>
+remove the supplied <filename>sh.exe</filename> (or rename it as <filename>ash.exe</filename>),
+and copy <filename>bash.exe</filename> to  <filename>sh.exe</filename>.
+You'll need to do this in Windows Explorer or the Windows <command>cmd</command> shell, because
+you can't rename a running program!
+</para>
+</listitem>
 </itemizedlist>
 </para>
 
@@ -4680,9 +3942,10 @@ which apply to Cygwin too.
 
 <sect2 id="configure-ssh"><title>Configuring SSH</title>
 
-<para><command>ssh</command> comes with Cygwin, provided you remember to ask for it when
-you install Cygwin.  (If not, the installer lets you update easily.)  Look for <command>openssh</command> 
-(not ssh) in the Cygwin list of applications!</para>
+<para><command>ssh</command> comes with both Cygwin and MSYS. 
+(Cygwin note: you need to ask for package <command>openssh</command> (not ssh)
+in the Cygwin list of packages; or use the <command>ghc-depends</command>
+package -- see <xref linkend="install-cygwin"/>.)</para>
 
 <para>There are several strange things about <command>ssh</command> on Windows that you need to know.
 <itemizedlist>
@@ -4800,7 +4063,11 @@ in your path.
 <para><emphasis>On Cygwin, do not</emphasis> add any of the <emphasis>mingw</emphasis> binaries to your  path.
 They are only going to get used by explicit access (via the --with-gcc flag you
 give to <command>configure</command> later).  If you do add them to your path
-you are likely to get into a mess because their names overlap with Cygwin binaries.
+you are likely to get into a mess because their names overlap with Cygwin
+binaries.
+On the other hand, you <emphasis>do</emphasis> need <command>ld</command>, <command>ar</command>
+(and perhaps one or two other things) in your path.  The Cygwin ones are fine,
+but you must have them; hence needing the  Cygwin binutils package.
 </para>
 </listitem>
 
@@ -4824,8 +4091,7 @@ so you will need to add <filename>emacs/bin</filename> to your <literal>PATH</li
 
 <listitem>
 <para> Finally, check out a copy of GHC sources from
-the CVS repository, following the instructions above (<xref linkend="cvs-access"/>).
-</para>
+the darcs repository, following the instructions at <ulink url="http://hackage.haskell.org/trac/ghc/wiki/GhcDarcs" />.</para>
 </listitem>
 </itemizedlist>
 </para>
@@ -4926,6 +4192,86 @@ Win32.</para></listitem>
 </sect2>
 
 
+<sect2><title>A Windows build log using Cygwin</title>
+
+<para>Here is a complete, from-scratch, log of all you need to build GHC using
+Cygwin, kindly provided by Claus Reinke.  It does not discuss alternative
+choices, but it gives a single path that works.</para>
+<programlisting>- Install some editor (vim, emacs, whatever)
+
+- Install cygwin (http://www.cygwin.com)
+    ; i used 1.5.16-1, installed in c:\cygwin
+  - run 'setup.exe'
+    Choose a Download Source:
+       select 'download from internet';
+    Select Root Install Directory:
+       root dir: c:\cygwin; 
+       install for: all users;
+       default file type: unix
+    Select Local Package Directory
+       choose a spare temporary home
+    Select Your Internet Connection
+       Use IE5 settings
+    Choose a Download Site
+       Choose your preferred main mirror and
+        Add 'http://www.haskell.org/ghc/cygwin'
+    Select Packages
+       In addition to 'Base' (default install), 
+       select 'Devel->ghc-depends'
+
+- Install mingw (http://www.mingw.org/)
+    ; i used MinGW-3.1.0-1.exe
+    ; installed in c:\mingw
+  - you probably want to add GLUT 
+    ; (http://www.xmission.com/~nate/glut.html)
+    ; i used glut-3.7.3-mingw32.tar
+
+- Get recent binary snapshot of ghc-6.4.1 for mingw 
+    ; (http://www.haskell.org/ghc/dist/stable/dist/)
+  - unpack in c:/ghc
+  - add C:\ghc\ghc-6.4.1\bin to %PATH%
+    (Start->Control Panel->System->Advanced->Environment Variables)
+
+- Get darcs version of ghc
+    ; also, subscribe to cvs-all@haskell.org, or follow the mailing list
+    ; archive, in case you checkout a version with problems
+    ; http://www.haskell.org//pipermail/cvs-all/
+  - mkdir c:/fptools; cd c:/fptools 
+    ; (or whereever you want your darcs tree to be)
+  - darcs get http://darcs.haskell.org/ghc
+  - cd ghc
+  - chmod +x darcs-all
+  - ./darcs-all get
+
+- Build ghc, using cygwin and mingw, targetting mingw
+  - export PATH=/cygdrive/c/ghc/ghc-6.4.1:$PATH
+    ; for haddock, alex, happy (*)
+  - export PATH=/cygdrive/c/mingw/bin:$PATH
+    ; without, we pick up some cygwin tools at best!
+  - cd c:/fptools/fptools
+    ; (if you aren't there already)
+  - autoreconf
+  - ./configure --host=i386-unknown-mingw32 --with-gcc=C:/Mingw/bin/gcc.exe
+    ; we use cygwin, but build for windows
+  - cp mk/build.mk.sample mk/build.mk
+  - in mk/build.mk:
+    add line:       SplitObjs = NO
+       (MSYS seems slow when there are zillions of object files)
+    uncomment line: BuildFlavour = perf
+       (or BuildFlavour = devel, if you are doing development)
+    add line:       BIN_DIST=1
+  - make 2>&amp;1 | tee make.log
+    ; always useful to have a log around
+
+- Package up binary distribution
+  - make binary-dist Project=Ghc 2>&amp;1 | tee make-bin-dist.log
+    ; always useful to have a log around
+  - cd ghc-6.5
+  - chmod +x ../distrib/prep-bin-dist-mingw
+    ; if you're happy with the script's contents (*)
+  - ../distrib/prep-bin-dist-mingw
+    ; then tar up, unpack where wanted, and enjoy</programlisting>
+</sect2>
 </sect1>
 
 <index/>