[project @ 1997-03-14 07:52:06 by simonpj]
authorsimonpj <unknown>
Fri, 14 Mar 1997 08:11:17 +0000 (08:11 +0000)
committersimonpj <unknown>
Fri, 14 Mar 1997 08:11:17 +0000 (08:11 +0000)
Major update to more-or-less 2.02

319 files changed:
ANNOUNCE-2.02 [new file with mode: 0644]
Makefile
configure.in
distrib/Makefile-bin.in [new file with mode: 0644]
distrib/configure-bin.in [new file with mode: 0644]
docs/Makefile [new file with mode: 0644]
docs/installing.lit [new file with mode: 0644]
ghc/CONTRIB/README [deleted file]
ghc/CONTRIB/fptags [deleted file]
ghc/CONTRIB/haskel.gif [deleted file]
ghc/CONTRIB/haskell-modes/README [deleted file]
ghc/CONTRIB/haskell-modes/chalmers/original/haskell-mode.el [deleted file]
ghc/CONTRIB/haskell-modes/chalmers/sof/haskell-mode.el [deleted file]
ghc/CONTRIB/haskell-modes/chalmers/thiemann/haskell-mode.el [deleted file]
ghc/CONTRIB/haskell-modes/glasgow/original/haskell-mode.el [deleted file]
ghc/CONTRIB/haskell-modes/glasgow/original/manual.dvi [deleted file]
ghc/CONTRIB/haskell-modes/glasgow/original/report.dvi [deleted file]
ghc/CONTRIB/haskell-modes/simonm/ghc/haskell.el [deleted file]
ghc/CONTRIB/haskell-modes/simonm/real/haskell.el [deleted file]
ghc/CONTRIB/haskell-modes/yale/chak/haskell.el [deleted file]
ghc/CONTRIB/haskell-modes/yale/original/README [deleted file]
ghc/CONTRIB/haskell-modes/yale/original/comint.el [deleted file]
ghc/CONTRIB/haskell-modes/yale/original/haskell-menu.el [deleted file]
ghc/CONTRIB/haskell-modes/yale/original/haskell.el [deleted file]
ghc/CONTRIB/haskell-modes/yale/original/optimizer-help.txt [deleted file]
ghc/CONTRIB/haskell-modes/yale/original/printer-help.txt [deleted file]
ghc/CONTRIB/haskell_poem [deleted file]
ghc/CONTRIB/mira2hs [deleted file]
ghc/CONTRIB/pphs/Jmakefile [deleted file]
ghc/CONTRIB/pphs/README [deleted file]
ghc/CONTRIB/pphs/docs/Code.tex [deleted file]
ghc/CONTRIB/pphs/docs/Error_Messages.tex [deleted file]
ghc/CONTRIB/pphs/docs/External_Specification.tex [deleted file]
ghc/CONTRIB/pphs/docs/Faults.tex [deleted file]
ghc/CONTRIB/pphs/docs/Future_Work.tex [deleted file]
ghc/CONTRIB/pphs/docs/Haskell_char.tex [deleted file]
ghc/CONTRIB/pphs/docs/Haskell_internalalign1.tex [deleted file]
ghc/CONTRIB/pphs/docs/Haskell_internalalign2.tex [deleted file]
ghc/CONTRIB/pphs/docs/Haskell_leftindent1.tex [deleted file]
ghc/CONTRIB/pphs/docs/Haskell_leftindent2.tex [deleted file]
ghc/CONTRIB/pphs/docs/Haskell_math.tex [deleted file]
ghc/CONTRIB/pphs/docs/Haskell_simple.tex [deleted file]
ghc/CONTRIB/pphs/docs/Haskell_string1.tex [deleted file]
ghc/CONTRIB/pphs/docs/Haskell_typewriter.tex [deleted file]
ghc/CONTRIB/pphs/docs/How.tex [deleted file]
ghc/CONTRIB/pphs/docs/Introduction.tex [deleted file]
ghc/CONTRIB/pphs/docs/LaTeX-code_simple.tex [deleted file]
ghc/CONTRIB/pphs/docs/LaTeX_blankline.tex [deleted file]
ghc/CONTRIB/pphs/docs/LaTeX_char.tex [deleted file]
ghc/CONTRIB/pphs/docs/LaTeX_comment.tex [deleted file]
ghc/CONTRIB/pphs/docs/LaTeX_internalalign1.tex [deleted file]
ghc/CONTRIB/pphs/docs/LaTeX_leftindent1.tex [deleted file]
ghc/CONTRIB/pphs/docs/LaTeX_leftindent2.tex [deleted file]
ghc/CONTRIB/pphs/docs/LaTeX_math.tex [deleted file]
ghc/CONTRIB/pphs/docs/LaTeX_simple.tex [deleted file]
ghc/CONTRIB/pphs/docs/LaTeX_string1.tex [deleted file]
ghc/CONTRIB/pphs/docs/LaTeX_string2.tex [deleted file]
ghc/CONTRIB/pphs/docs/LaTeX_wide-colons.tex [deleted file]
ghc/CONTRIB/pphs/docs/Problem_Definition.tex [deleted file]
ghc/CONTRIB/pphs/docs/Project_Documents.tex [deleted file]
ghc/CONTRIB/pphs/docs/Report.tex [deleted file]
ghc/CONTRIB/pphs/docs/Statement_Of_Requirements.tex [deleted file]
ghc/CONTRIB/pphs/docs/Title.tex [deleted file]
ghc/CONTRIB/pphs/docs/UserGuide.tex [deleted file]
ghc/CONTRIB/pphs/docs/UserGuide_Text.tex [deleted file]
ghc/CONTRIB/pphs/docs/User_Documents.tex [deleted file]
ghc/CONTRIB/pphs/docs/Uses.tex [deleted file]
ghc/CONTRIB/pphs/docs/What.tex [deleted file]
ghc/CONTRIB/pphs/docs/Wrapper.tex [deleted file]
ghc/CONTRIB/pphs/docs/char.hs [deleted file]
ghc/CONTRIB/pphs/docs/comment.hs [deleted file]
ghc/CONTRIB/pphs/docs/internalalign1.hs [deleted file]
ghc/CONTRIB/pphs/docs/leftindent1.hs [deleted file]
ghc/CONTRIB/pphs/docs/leftindent2.hs [deleted file]
ghc/CONTRIB/pphs/docs/math.hs [deleted file]
ghc/CONTRIB/pphs/docs/pphs.sty [deleted file]
ghc/CONTRIB/pphs/docs/rep.sty [deleted file]
ghc/CONTRIB/pphs/docs/simple.hs [deleted file]
ghc/CONTRIB/pphs/docs/string1.hs [deleted file]
ghc/CONTRIB/pphs/docs/string2.hs [deleted file]
ghc/CONTRIB/pphs/pphs.c [deleted file]
ghc/Makefile
ghc/compiler/HsVersions.h
ghc/compiler/Makefile
ghc/compiler/NOTES [new file with mode: 0644]
ghc/compiler/absCSyn/CLabel.lhs
ghc/compiler/absCSyn/Costs.lhs
ghc/compiler/absCSyn/HeapOffs.lhs
ghc/compiler/absCSyn/PprAbsC.lhs
ghc/compiler/basicTypes/Id.hi-boot [new file with mode: 0644]
ghc/compiler/basicTypes/Id.lhs
ghc/compiler/basicTypes/IdLoop.lhi
ghc/compiler/basicTypes/Literal.lhs
ghc/compiler/basicTypes/Name.lhs
ghc/compiler/basicTypes/SrcLoc.lhs
ghc/compiler/basicTypes/UniqSupply.lhs
ghc/compiler/basicTypes/Unique.lhs
ghc/compiler/codeGen/CgClosure.lhs
ghc/compiler/codeGen/CgMonad.lhs
ghc/compiler/codeGen/CodeGen.lhs
ghc/compiler/coreSyn/CoreLint.lhs
ghc/compiler/coreSyn/CoreSyn.lhs
ghc/compiler/coreSyn/CoreUnfold.lhs
ghc/compiler/coreSyn/PprCore.lhs
ghc/compiler/deSugar/Desugar.lhs
ghc/compiler/deSugar/DsBinds.lhs
ghc/compiler/deSugar/DsExpr.lhs
ghc/compiler/deSugar/DsGRHSs.lhs
ghc/compiler/deSugar/DsHsSyn.lhs
ghc/compiler/deSugar/DsListComp.lhs
ghc/compiler/deSugar/DsLoop.lhi
ghc/compiler/deSugar/DsMonad.lhs
ghc/compiler/deSugar/DsUtils.lhs
ghc/compiler/deSugar/Match.lhs
ghc/compiler/deSugar/MatchLit.lhs
ghc/compiler/hsSyn/HsBasic.lhs
ghc/compiler/hsSyn/HsBinds.lhs
ghc/compiler/hsSyn/HsCore.lhs
ghc/compiler/hsSyn/HsDecls.lhs
ghc/compiler/hsSyn/HsExpr.lhs
ghc/compiler/hsSyn/HsPat.lhs
ghc/compiler/hsSyn/HsPragmas.lhs
ghc/compiler/hsSyn/HsTypes.lhs
ghc/compiler/main/CmdLineOpts.lhs
ghc/compiler/main/LoopHack.lhc
ghc/compiler/main/Main.lhs
ghc/compiler/main/MkIface.lhs
ghc/compiler/nativeGen/AsmCodeGen.lhs
ghc/compiler/nativeGen/NCG.h
ghc/compiler/nativeGen/PprMach.lhs
ghc/compiler/parser/UgenUtil.lhs
ghc/compiler/parser/hslexer.flex
ghc/compiler/parser/hsparser.y
ghc/compiler/parser/id.c
ghc/compiler/parser/main.c
ghc/compiler/parser/syntax.c
ghc/compiler/parser/tree.ugn
ghc/compiler/prelude/PrelInfo.lhs
ghc/compiler/prelude/PrelLoop.lhi
ghc/compiler/prelude/PrelMods.lhs
ghc/compiler/prelude/PrelVals.lhs
ghc/compiler/prelude/PrimOp.lhs
ghc/compiler/prelude/PrimRep.lhs
ghc/compiler/profiling/CostCentre.lhs
ghc/compiler/reader/Lex.lhs
ghc/compiler/reader/PrefixToHs.lhs
ghc/compiler/reader/RdrHsSyn.lhs
ghc/compiler/reader/ReadPrefix.lhs
ghc/compiler/rename/ParseIface.y
ghc/compiler/rename/ParseType.y [new file with mode: 0644]
ghc/compiler/rename/ParseUnfolding.y [new file with mode: 0644]
ghc/compiler/rename/Rename.lhs
ghc/compiler/rename/RnBinds.lhs
ghc/compiler/rename/RnEnv.lhs
ghc/compiler/rename/RnExpr.lhs
ghc/compiler/rename/RnHsSyn.lhs
ghc/compiler/rename/RnIfaces.lhs
ghc/compiler/rename/RnMonad.lhs
ghc/compiler/rename/RnNames.lhs
ghc/compiler/rename/RnSource.lhs
ghc/compiler/simplCore/BinderInfo.lhs
ghc/compiler/simplCore/FloatOut.lhs
ghc/compiler/simplCore/OccurAnal.lhs
ghc/compiler/simplCore/SetLevels.lhs
ghc/compiler/simplCore/SimplCore.lhs
ghc/compiler/simplCore/SimplEnv.lhs
ghc/compiler/simplCore/SimplMonad.lhs
ghc/compiler/simplCore/SimplPgm.lhs
ghc/compiler/simplCore/SimplVar.lhs
ghc/compiler/simplStg/LambdaLift.lhs
ghc/compiler/simplStg/SimplStg.lhs
ghc/compiler/specialise/SpecEnv.lhs
ghc/compiler/specialise/SpecUtils.lhs
ghc/compiler/specialise/Specialise.lhs
ghc/compiler/stgSyn/StgLint.lhs
ghc/compiler/stgSyn/StgSyn.lhs
ghc/compiler/stranal/SaAbsInt.lhs
ghc/compiler/stranal/SaLib.lhs
ghc/compiler/stranal/StrictAnal.lhs
ghc/compiler/stranal/WwLib.lhs
ghc/compiler/tests/Makefile
ghc/compiler/tests/deSugar/Makefile
ghc/compiler/typecheck/GenSpecEtc.lhs [deleted file]
ghc/compiler/typecheck/Inst.lhs
ghc/compiler/typecheck/TcBinds.lhs
ghc/compiler/typecheck/TcClassDcl.lhs
ghc/compiler/typecheck/TcDefaults.lhs
ghc/compiler/typecheck/TcDeriv.lhs
ghc/compiler/typecheck/TcEnv.lhs
ghc/compiler/typecheck/TcExpr.lhs
ghc/compiler/typecheck/TcGenDeriv.lhs
ghc/compiler/typecheck/TcHsSyn.lhs
ghc/compiler/typecheck/TcIfaceSig.lhs
ghc/compiler/typecheck/TcInstDcls.lhs
ghc/compiler/typecheck/TcInstUtil.lhs
ghc/compiler/typecheck/TcKind.lhs
ghc/compiler/typecheck/TcMatches.lhs
ghc/compiler/typecheck/TcModule.lhs
ghc/compiler/typecheck/TcMonad.lhs
ghc/compiler/typecheck/TcMonoType.lhs
ghc/compiler/typecheck/TcPat.lhs
ghc/compiler/typecheck/TcSimplify.lhs
ghc/compiler/typecheck/TcTyClsDecls.lhs
ghc/compiler/typecheck/TcTyDecls.lhs
ghc/compiler/typecheck/Unify.lhs
ghc/compiler/types/Kind.lhs
ghc/compiler/types/PprType.lhs
ghc/compiler/types/TyCon.lhs
ghc/compiler/types/TyLoop.lhi
ghc/compiler/types/Type.lhs
ghc/compiler/utils/Argv.lhs
ghc/compiler/utils/Bag.lhs
ghc/compiler/utils/CharSeq.lhs
ghc/compiler/utils/FastString.lhs [new file with mode: 0644]
ghc/compiler/utils/FiniteMap.lhs
ghc/compiler/utils/HandleHack.lhi [new file with mode: 0644]
ghc/compiler/utils/MatchEnv.lhs
ghc/compiler/utils/PprStyle.lhs
ghc/compiler/utils/Pretty.lhs
ghc/compiler/utils/PrimPacked.lhs [new file with mode: 0644]
ghc/compiler/utils/StringBuffer.lhs [new file with mode: 0644]
ghc/compiler/utils/Ubiq.lhi
ghc/compiler/utils/UniqFM.lhs
ghc/compiler/utils/Unpretty.lhs
ghc/compiler/utils/Util.lhs
ghc/docs/Makefile
ghc/docs/install_guide/Makefile [deleted file]
ghc/docs/install_guide/installing.lit [deleted file]
ghc/docs/release_notes/Makefile [deleted file]
ghc/docs/state_interface/Makefile [deleted file]
ghc/docs/state_interface/state-interface.verb [deleted file]
ghc/docs/users_guide/2-01-notes.lit [moved from ghc/docs/release_notes/2-01-notes.lit with 100% similarity]
ghc/docs/users_guide/2-02-notes.lit [new file with mode: 0644]
ghc/docs/users_guide/Makefile
ghc/docs/users_guide/how_to_run.lit
ghc/docs/users_guide/intro.lit
ghc/docs/users_guide/libraries.lit
ghc/docs/users_guide/real-soon-now.lit [moved from ghc/docs/release_notes/real-soon-now.lit with 100% similarity]
ghc/docs/users_guide/recomp.lit
ghc/docs/users_guide/release.lit [moved from ghc/docs/release_notes/release.lit with 100% similarity]
ghc/docs/users_guide/user.lit
ghc/driver/Makefile
ghc/driver/ghc-consist.lprl
ghc/driver/ghc-iface.lprl
ghc/driver/ghc.lprl
ghc/driver/prefix.txt [new file with mode: 0644]
ghc/lib/cbits/getCPUTime.lc [new file with mode: 0644]
ghc/lib/cbits/stgio.h
ghc/lib/required/CPUTime.lhs [new file with mode: 0644]
ghc/lib/tests/Array/arr001/Main.hs [new file with mode: 0644]
ghc/lib/tests/Array/arr001/Makefile [new file with mode: 0644]
ghc/lib/tests/Array/arr002/Main.hs [new file with mode: 0644]
ghc/lib/tests/Array/arr002/Makefile [new file with mode: 0644]
ghc/lib/tests/Array/arr003/Main.hs [new file with mode: 0644]
ghc/lib/tests/Array/arr003/Makefile [new file with mode: 0644]
ghc/lib/tests/Array/arr004/Main.hs [new file with mode: 0644]
ghc/lib/tests/Array/arr004/Makefile [new file with mode: 0644]
ghc/lib/tests/Array/arr005/Main.hs [new file with mode: 0644]
ghc/lib/tests/Array/arr005/Makefile [new file with mode: 0644]
ghc/lib/tests/Array/arr006/Main.hs [new file with mode: 0644]
ghc/lib/tests/Array/arr006/Makefile [new file with mode: 0644]
ghc/lib/tests/Array/arr007/Main.hs [new file with mode: 0644]
ghc/lib/tests/Array/arr007/Makefile [new file with mode: 0644]
ghc/lib/tests/Array/arr008/Main.hs [new file with mode: 0644]
ghc/lib/tests/Array/arr008/Makefile [new file with mode: 0644]
ghc/lib/tests/Array/arr009/Main.hs [new file with mode: 0644]
ghc/lib/tests/Array/arr009/Makefile [new file with mode: 0644]
ghc/lib/tests/Array/arr010/Main.hs [new file with mode: 0644]
ghc/lib/tests/Array/arr010/Makefile [new file with mode: 0644]
ghc/lib/tests/Array/arr011/Main.hs [new file with mode: 0644]
ghc/lib/tests/Array/arr011/Makefile [new file with mode: 0644]
ghc/lib/tests/Array/arr012/Main.hs [new file with mode: 0644]
ghc/lib/tests/Array/arr012/Makefile [new file with mode: 0644]
ghc/mk/boilerplate.mk [new file with mode: 0644]
ghc/mk/buildflags.mk [deleted file]
ghc/mk/ghc-opts.mk [deleted file]
ghc/mk/ghc.mk [deleted file]
ghc/mk/ghcconfig.mk.in [deleted file]
ghc/mk/paths.mk [new file with mode: 0644]
ghc/mk/site-ghc.mk [deleted file]
ghc/mk/suffix.mk [new file with mode: 0644]
ghc/mk/suffixes-ghc.mk [deleted file]
ghc/mk/target.mk [new file with mode: 0644]
ghc/mk/ways.mk [deleted file]
ghc/utils/hstags/prefix.txt [new file with mode: 0644]
glafp-utils/Makefile
glafp-utils/fastmake/Makefile
glafp-utils/fastmake/fastmake.prl
glafp-utils/lndir/Makefile
glafp-utils/ltx/Makefile
glafp-utils/ltx/ltx.prl
glafp-utils/mk/boilerplate.mk [new file with mode: 0644]
glafp-utils/mk/opts.mk [new file with mode: 0644]
glafp-utils/mkdependC/Makefile
glafp-utils/mkdependC/mkdependC.prl
glafp-utils/mkdirhier/Makefile
glafp-utils/msub/Makefile
glafp-utils/runstdtest/Makefile
glafp-utils/runstdtest/runstdtest.prl
mk/Cprog.mk [deleted file]
mk/HSprog.mk [deleted file]
mk/boilerplate.mk [new file with mode: 0644]
mk/cdepend.mk [deleted file]
mk/clib.mk [deleted file]
mk/config.h.in [new file with mode: 0644]
mk/config.mk.in [new file with mode: 0644]
mk/gen.mk [deleted file]
mk/hsdepend.mk [deleted file]
mk/install.mk.in [deleted file]
mk/lib.mk [deleted file]
mk/opts.mk [new file with mode: 0644]
mk/paths.mk [new file with mode: 0644]
mk/platform.mk.in [deleted file]
mk/rules.mk [deleted file]
mk/script.mk [deleted file]
mk/subdir.mk [deleted file]
mk/suffix.mk [new file with mode: 0644]
mk/target.mk [new file with mode: 0644]
mk/utils.mk.in [deleted file]

diff --git a/ANNOUNCE-2.02 b/ANNOUNCE-2.02
new file mode 100644 (file)
index 0000000..38b6b5b
--- /dev/null
@@ -0,0 +1,177 @@
+            The Glasgow Haskell Compiler -- version 2.02
+            ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+We are pleased to announce the first release of the Glasgow Haskell
+Compiler (GHC, version 2.02) for *Haskell 1.4*.  Sources and binaries
+are freely available by anonymous FTP and on the World-Wide Web;
+details below.
+
+Haskell is "the" standard lazy functional programming language; the
+current language version is 1.3, agreed in May, 1996.  The Haskell
+Report is online at
+
+       http://haskell.cs.yale.edu/1.4/haskell-report.html
+
+GHC 2.02 is a beta-quality release:
+
+  * It is reliable.
+    It has been extensively tested against a large suite of Haskell 1.2 
+    programs, but not so extensively tested against Haskell 1.4 programs 
+    because we don't have a comprehensive set (Donations of Haskell 1.4
+    programs to our test suite are most welcome).
+
+  * It should generate good code.
+    All the optimisations that GHC 0.29 used to do are back in, with 
+    the exception of specialisation.  It ought to be the case that
+    GHC 2.02 outperforms GHC 0.29, because it has a much better
+    handle on cross-module inlining, but there's a good chance that
+    there are performance "holes" lurking.  We have yet to make
+    a systematic comparison.  (Please send us programs where 2.02
+    does noticeably worse than 0.29.)
+
+  * It is more expensive than it should be.
+    GHC 2.02 has received even less attention to its own performance.
+    At present it eats more space and time than GHC 0.29, especially
+    for very small programs.  We'll work on this.
+
+  * A couple of Haskell 1.4 features are incompletely supported,
+    notably polymorphic strictness annotations, and Unicode.
+
+If you want to use Haskell 1.4, this is a good moment to switch.  If
+you don't need the Haskell 1.4 extensions, then stay with GHC 0.29.
+If you want to hack on GHC itself, then 2.02 is definitely for you.
+The release notes comment further on this point.
+
+GHC 2.02 is substantially changed from 2.01.  Changes worth noting
+include:
+
+  * The whole front end, which deals with the module system, has 
+    been rewritten. The interface file format has changed.
+
+  * GHC 2.02 comes complete with Green Card, a C foreign language 
+    interface for GHC.  Green card is a pre-processor that
+    scans Haskell source files for Green Card directives, which
+    it expands into tons of "ccall" boilerplate that marshalls
+    your arguments to and from C.
+
+  * GHC 2.02 is available for Windows NT.  From now on, Windows NT
+    will be a fully supported platform for GHC.
+
+  * GHC 2.02 supports full cross moudule inlining.  Unlike 0.29 and
+    its predecessors, inlining can happen even if the inlined body
+    mentions a function or type that is not itself exported.  This is
+    one place Haskell 1.4's new module system really pays off.
+
+  * Like 2.01, GHC 2.02 aborts a compilation if it decides that
+    nothing that the module imports *and acually uses* has changed.
+    This decision is now taken by the compiler itself, rather than
+    by a Perl script (as in 2.01) which sometimes got it wrong.
+
+  * The ghc/lib libraries are much more systematically organised.
+
+  * There's a completely new "make" system.  This will mainly affect people
+    who want the source distribution, who will hopefully find it much, much,
+    easier than grappling with the old Jmakefiles.  Even for binary
+    installation, the procedure is a little simpler, though.
+
+Please see the release notes for a complete discussion of What's New.
+
+To run this release, you need a machine with 16+MB memory (more if
+building from sources), GNU C (`gcc'), and `perl'.  We have seen GHC
+2.01 work on these platforms: alpha-dec-osf2, hppa1.1-hp-hpux9,
+sparc-sun-{sunos4,solaris2}, mips-sgi-irix5, and
+i386-unknown-{linux,solaris2,freebsd}.  Similar platforms should work
+with minimal hacking effort.  The installer's guide give a full
+what-ports-work report.
+
+Binaries are distributed in `bundles', e.g. a "profiling bundle" or a
+"concurrency bundle" for your platform.  Just grab the ones you need.
+
+Once you have the distribution, please follow the pointers in
+ghc/README to find all of the documentation about this release.  NB:
+preserve modification times when un-tarring the files (no `m' option
+for tar, please)!
+
+We run mailing lists for GHC users and bug reports; to subscribe, send
+mail to majordomo@dcs.gla.ac.uk; the msg body should be:
+
+    subscribe glasgow-haskell-<which> Your Name <your-email@where.you.are>
+
+Please send bug reports about GHC to glasgow-haskell-bugs@dcs.gla.ac.uk.
+
+Simon Peyton Jones
+
+Dated: February 1997
+
+Relevant URLs on the World-Wide Web:
+
+GHC home page            http://www.dcs.gla.ac.uk/fp/software/ghc/
+Glasgow FP group page     http://www.dcs.gla.ac.uk/fp/
+comp.lang.functional FAQ  http://www.cs.nott.ac.uk/Department/Staff/mpj/faq.html
+
+======================================================================
+How to get GHC 2.01:
+
+This release is available by anonymous FTP from the main Haskell
+archive sites, in the directory pub/haskell/glasgow:
+
+       ftp.dcs.gla.ac.uk   (130.209.240.50)
+       ftp.cs.chalmers.se  (129.16.227.140)
+       haskell.cs.yale.edu (128.36.11.43)
+
+The Glasgow site is mirrored by src.doc.ic.ac.uk (146.169.43.1), in
+computing/programming/languages/haskell/glasgow.
+
+These are the available files (.gz files are gzipped) -- some are `on
+demand', ask if you don't see them:
+
+ghc-2.01-src.tar.gz    The source distribution; about 3MB.
+
+ghc-2.01.ANNOUNCE      This file.
+
+ghc-2.01.{README,RELEASE-NOTES} From the distribution; for those who
+                       want to peek before FTPing...
+
+ghc-2.01-ps-docs.tar.gz        Main GHC documents in PostScript format; in
+                       case your TeX setup doesn't agree with our
+                       DVI files...
+
+ghc-2.01-<platform>.tar.gz Basic binary distribution for a particular
+                       <platform>.  Unpack and go: you can compile
+                       and run Haskell programs with nothing but one
+                       of these files.  NB: does *not* include
+                       profiling (see below).
+
+       <platform> ==>  alpha-dec-osf2
+                       hppa1.1-hp-hpux9
+                       i386-unknown-freebsd
+                       i386-unknown-linux
+                       i386-unknown-solaris2
+                       m68k-sun-sunos4
+                       mips-sgi-irix5
+                       sparc-sun-sunos4
+                       sparc-sun-solaris2
+
+ghc-2.01-<bundle>-<platform>.tar.gz
+
+       <platform> ==>  as above
+       <bundle>   ==>  prof (profiling)
+                       conc (concurrent Haskell)
+                       par  (parallel)
+                       gran (GranSim parallel simulator)
+                       ticky (`ticky-ticky' counts -- for implementors)
+                       prof-conc (profiling for "conc[urrent]")
+                       prof-ticky (ticky for "conc[urrent]")
+
+ghc-2.01-hc-files.tar.gz Basic set of intermediate C (.hc) files for the
+                        compiler proper, the prelude, and `Hello,
+                        world'.  Used for bootstrapping the system.
+                        About 4MB.
+
+ghc-2.01-<bundle>-hc-files.tar.gz Further sets of .hc files, for
+                       building other "bundles", e.g., profiling.
+
+ghc-2.01-hi-files-<blah>.tar.gz Sometimes it's more convenient to
+                       use a different set of interface files than
+                       the ones in *-src.tar.gz.  (The installation
+                       guide will advise you of this.)
index b5fce9c..eca7ef4 100644 (file)
--- a/Makefile
+++ b/Makefile
@@ -1,23 +1,92 @@
-#-----------------------------------------------------------------------------
-# $Id: Makefile,v 1.2 1996/11/21 16:45:54 simonm Exp $
+#################################################################################
+#
+#                      fptools/Makefile
+#
+#              This is the main Makefile for fptools.
+#
+#################################################################################
 
-TOP = .
-SUBDIRS = glafp-utils ghc
-include $(TOP)/mk/gen.mk
-include $(TOP)/mk/subdir.mk
+TOP=.
+include $(TOP)/mk/boilerplate.mk
+SRC_DIST_DIR=$(shell pwd)/$(SRC_DIST_NAME)
 
-line = @echo "------------------------------------------------------------------------------"
+SUBDIRS = $(ProjectsToBuild)
 
-boot ::
-       @echo "Bootstrapping $(PROJECTNAME)..."
-       $(line)
-       @echo "Booting glafp-utils"
-       $(line)
-       @$(MAKE) -C glafp-utils boot
+#
+# Files to include in fptools source distribution
+#
+SRC_DIST_DIRS += mk $(ProjectsToBuild)
+SRC_DIST_FILES += configure.in config.guess config.sub configure README ANNOUNCE NEWS INSTALL Makefile
 
-       $(line)
-       @echo "Booting ghc"
-       $(line)
-       @$(MAKE) -C ghc boot
 
-       @echo "Done!"
+#
+# Making a binary distribution
+#
+BIN_DIST_TMPDIR=$(shell pwd)
+BIN_DIST_NAME=fptools
+
+#
+# list of toplevel `projects' to include in binary distrib.
+#
+BIN_DIST_DIRS=ghc
+
+binary-dist:: binary-dist-pre
+
+BIN_DIST_TOP= distrib/Makefile-bin.in \
+             distrib/configure-bin.in \
+             distrib/README \
+             distrib/INSTALL \
+             distrib/ANNOUNCE
+
+binary-dist::
+       @for i in $(BIN_DIST_TOP); do \
+         @echo cp $$i $(BIN_DIST_TMPDIR)/$(BIN_DIST_NAME) \
+         cp $$i $(BIN_DIST_TMPDIR)/$(BIN_DIST_NAME) \
+       done;
+
+#
+# Creating and copying the documentation into the bin-dist tree.
+#
+binary-dist::
+       $(MKDIRHIER) $(BIN_DIST_TMPDIR)/$(BIN_DIST_NAME)/html
+       $(MKDIRHIER) $(BIN_DIST_TMPDIR)/$(BIN_DIST_NAME)/dvi
+       $(MKDIRHIER) $(BIN_DIST_TMPDIR)/$(BIN_DIST_NAME)/info
+       @echo "Making html documentation.."
+       $(MAKE) -C docs --no-print-directory $(MFLAGS) html
+       cp docs/html/* $(BIN_DIST_TMPDIR)/$(BIN_DIST_NAME)/html
+       @echo "Making dvi files.."
+       $(MAKE) -C docs --no-print-directory $(MFLAGS) dvi
+       cp docs/*.dvi  $(BIN_DIST_TMPDIR)/$(BIN_DIST_NAME)/dvi
+       @echo "Making info files.."
+       $(MAKE) -C docs --no-print-directory $(MFLAGS) info
+       cp docs/*.info* $(BIN_DIST_TMPDIR)/$(BIN_DIST_NAME)/info
+
+dist :: dist-pre
+include $(TOP)/mk/target.mk
+dist :: dist-post
+
+#
+# Automatically remake update configuration files
+# (from autoconf manual)
+#
+configure: configure.in
+       autoconf
+#     
+# autoheader might not change config.h.in, so touch a stamp file.
+#
+mk/config.h.in: mk/stamp-h.in
+mk/stamp-h.in: configure.in
+       autoheader
+       echo timestamp > mk/stamp-h.in
+
+mk/config.h: mk/stamp-h
+mk/stamp-h: mk/config.h.in config.status
+       ./config.status
+     
+config.status: configure
+       ./config.status --recheck
+
+.PHONY: config
+
+config: config.status
+       @:
index 94624ca..12ed4cf 100644 (file)
@@ -4,7 +4,7 @@ dnl
 dnl * INITIAL SETUP, CHOICE OF PLATFORM(S)
 #!/bin/sh
 #
-# (c) The AQUA Project, Glasgow University, 1994-1995
+# (c) The AQUA Project, Glasgow University, 1994-1997
 #
 # Configure script for the Glasgow functional programming tools
 # (created automagically by autoconf...do not edit by hand)
@@ -12,163 +12,51 @@ dnl * INITIAL SETUP, CHOICE OF PLATFORM(S)
 # Do "./configure --help" to see what flags are available.
 # (Better yet, read the documentation!)
 #
-AC_INIT(mk/platform.mk.in)
+# First off, a distrib sanity check..
+AC_INIT(mk/config.mk.in)
 
 # -------------------------------------------------------------------------
 # Prepare to generate the following header files
 #
-AC_CONFIG_HEADER(ghc/includes/config.h literate/lit-deatify/config.h)
+#
+AC_CONFIG_HEADER(mk/config.h)
 
 # No, we don't do `--srcdir'...
 if test x"$srcdir" != 'x.' ; then
-    echo "This configuration does not support the \`--srcdir' option."
+    echo "This configuration does not support the \`--srcdir' option.."
     exit 1
 fi
 
+#
+# Remove some automounter nonsense (Glasgow specific gruff)
+#
 hardtop=`pwd`
-hardtop=`echo $hardtop | sed 's|^/tmp_mnt/|/|' | sed 's|^/export/|/|' | sed 's|^/grasp_tmp|/local/grasp_tmp|'`
+hardtop=`echo $hardtop | sed 's|^/tmp_mnt/|/|' | sed 's|^/grasp_tmp|/local/grasp_tmp|'`
+
+#OLD: hardtop=`echo $hardtop | sed 's|^/tmp_mnt/|/|' | sed 's|^/export/|/|' | sed 's|^/grasp_tmp|/local/grasp_tmp|'`
+
 echo ''
 echo "*** The top of your build tree is: $hardtop"
 AC_SUBST(hardtop)
 
 # -------------------------------------------------------------------------
-dnl ** choose what blobs to build (ghc,hslibs,haggis,happy,nofib,????)
-
-# set to the name for the dir if doing it, otherwise empty
-DoingHsLibs=''
-DoingNoFib=''
-DoingHappy=''
-DoingHaggis=''
-MkWorldSetup='std'
-
-AC_ARG_ENABLE(hslibs,
-   [
-**********************************************************************
-* Configuration options for the Glasgow functional-programming tools *
-**********************************************************************
-
-First, select *which* of the tools you want to build, with
---{enable,disable}-{hslibs,nofib,happy,haggis}.  (Currently, you have to
-build ghc.)
-
-Second, you may set one of a few applies-in-all-cases options.  For
-example, --with-tmpdir=/usr/tmp.
-
-Then you may set various options which are specifically for the tools you
-choose in step 1.  For GHC, perhaps --enable-concurrent.  For NoFib,
-perhaps --enable-all-tests.  And so on.
-
-The rest of this message lists all of the configure options.  If the option
-is enabled by default, the message says how to disable it.  And vice versa.
-
-If you are confused, don't forget the installation documents that came with
-the software!
-
-*******************************************************************
-** FOR SELECTING WHICH GLASGOW FP TOOLS TO BUILD:]
-   [--enable-hslibs   build suite of Haskell libraries],
-   [case "$enableval" in
-        yes) DoingHsLibs='hslibs'
-             ;;
-        no)  DoingHsLibs=''
-             ;;
-        *)   echo "I don't understand this option: --enable-hslibs=$enableval"
-             exit 1
-             ;;
-    esac])
-if test "xxx$DoingHsLibs" = 'xxxhslibs' -a \( ! -d hslibs \) ; then
-    DoingHsLibs=''
-    echo 'Doing --disable-hslibs, as there is no hslibs directory'
-fi
-
-AC_ARG_ENABLE(nofib,
-   [--enable-nofib    build NoFib suite as part of Glasgow FP tools],
-   [case "$enableval" in
-        yes) DoingNoFib='nofib'
-             ;;
-        no)  DoingNoFib=''
-             ;;
-        *)   echo "I don't understand this option: --enable-nofib=$enableval"
-             exit 1
-             ;;
-    esac])
-if test "xxx$DoingNoFib" = 'xxxnofib' -a \( ! -d nofib \) ; then
-    DoingNoFib=''
-    echo 'Doing --disable-nofib, as there is no nofib directory'
-fi
-
-AC_ARG_ENABLE(happy,
-   [--enable-happy    build Happy parser-generator as part of Glasgow FP tools],
-   [case "$enableval" in
-        yes) DoingHappy='happy'
-             ;;
-        no)  DoingHappy=''
-             ;;
-        *)   echo "I don't understand this option: --enable-happy=$enableval"
-             exit 1
-             ;;
-    esac])
-if test "xxx$DoingHappy" = 'xxxhappy' -a \( ! -d happy \) ; then
-    DoingHappy=''
-    echo 'Doing --disable-happy, as there is no happy directory'
-fi
-
-AC_ARG_ENABLE(haggis,
-   [--enable-haggis   build Haggis GUI toolkit as part of Glasgow FP tools],
-   [case "$enableval" in
-        yes) DoingHaggis='haggis'
-             ;;
-        no)  DoingHaggis=''
-             ;;
-        *)   echo "I don't understand this option: --enable-haggis=$enableval"
-             exit 1
-             ;;
-    esac])
-if test "xxx$DoingHaggis" = 'xxxhaggis' -a \( ! -d haggis \) ; then
-    DoingHaggis=''
-    echo 'Doing --disable-haggis, as there is no haggis directory'
-fi
-
-AC_SUBST(DoingHsLibs)
-AC_SUBST(DoingNoFib)
-AC_SUBST(DoingHappy)
-AC_SUBST(DoingHaggis)
-
-# -------------------------------------------------------------------------
 dnl ** choose host(/target/build) platform
+#
 # Guess host/target/build platform(s) if necessary.
-# Partly stolen from GCC "configure".
 #
-if test "x$target" = xNONE ; then
-    if test "x$nonopt" != xNONE ; then
-        target=$nonopt
-    else
-        # This way of testing the result of a command substitution is
-        # defined by Posix.2 (section 3.9.1) as well as traditional shells.
-        if target=`$srcdir/config.guess` ; then
-            echo "Configuring for a ${target} host." 1>&2
-        else
-            echo 'Config.guess failed to determine the host type.  You need \
-to specify one.' 1>&2
-            if test -r config.status ; then
-                tail +2 config.status 1>&2
-            fi
-            exit 1
-        fi
-    fi
-fi
+AC_CANONICAL_SYSTEM
 
 # "$host" defaults to "$target"
 if test "x$host" = xNONE ; then
     host=$target
 fi
 # "$build" defaults to "$host"
-if test "x$build" = xNONE ; then
-    build=$host
-else
-    echo "This configuration does not support the \`--build' option."
-    exit 1
-fi
+#if test "x$build" = xNONE ; then
+#    build=$host
+#else
+#    echo "This configuration does not support the \`--build' option."
+#    exit 1
+#fi
 
 dnl ** canonicalize platform names
 # Canonicali[sz]e those babies
@@ -181,22 +69,23 @@ if test x"$TargetPlatform" != x"$HostPlatform" ; then
     exit 1
 fi
 
+#
 # The following will be more difficult when we *are* cross-compiling.
 # Suitable names to slam in *_CPP are in platform.h.in.
 # We also record the architecture, vendor, and operating system (OS)
 # separately.
 case $HostPlatform in
 alpha-dec-osf[[1234]]*)
-       HostPlatform=alpha-dec-osf1 # canonicalise for our purposes
+       HostPlatform=alpha-dec-osf1   # canonicalise for our purposes
        TargetPlatform=alpha-dec-osf1 # this will work for now... (hack)
-       BuildPlatform=alpha-dec-osf1 #hack
+       BuildPlatform=alpha-dec-osf1  # hack
         HostPlatform_CPP='alpha_dec_osf1'
         HostArch_CPP='alpha'
         HostVendor_CPP='dec'
         HostOS_CPP='osf1'
         ;;
 hppa1.1-hp-hpux*)
-       HostPlatform=hppa1.1-hp-hpux # canonicalise for our purposes (hack)
+       HostPlatform=hppa1.1-hp-hpux  # canonicalise for our purposes (hack)
        TargetPlatform=hppa1.1-hp-hpux
        BuildPlatform=hppa1.1-hp-hpux
         HostPlatform_CPP='hppa1_1_hp_hpux'
@@ -205,7 +94,7 @@ hppa1.1-hp-hpux*)
         HostOS_CPP='hpux'
         ;;
 i[[3456]]86-*-linuxaout*)
-       HostPlatform=i386-unknown-linuxaout # hack again
+       HostPlatform=i386-unknown-linuxaout   # hack again
        TargetPlatform=i386-unknown-linuxaout
        BuildPlatform=i386-unknown-linuxaout
         HostPlatform_CPP='i386_unknown_linuxaout'
@@ -249,6 +138,15 @@ i[[3456]]86-*-solaris2*)
         HostVendor_CPP='unknown'
         HostOS_CPP='solaris2'
         ;;
+i[[3456]]86-*-cygwin32*)
+       HostPlatform=i386-unknown-cygwin32 # hack again
+       TargetPlatform=i386-unknown-cygwin32
+       BuildPlatform=i386-unknown-cygwin32
+        HostPlatform_CPP='i386_unknown_cygwin32'
+        HostArch_CPP='i386'
+        HostVendor_CPP='unknown'
+        HostOS_CPP='cygwin32'
+        ;;
 m68k-next-nextstep2)
         HostPlatform_CPP='m68k_next_nextstep2'
         HostArch_CPP='m68k'
@@ -326,12 +224,9 @@ sparc-sun-solaris2*)
         exit 1
         ;;
 esac
-
-test -n "$verbose" && echo "Host platform set to $HostPlatform"
-test -n "$verbose" -a x"$HostPlatform" != x"$TargetPlatform" \
-        && echo "Target platform set to $TargetPlatform"
-test -n "$verbose" -a x"$BuildPlatform" != x"$HostPlatform" \
-        && echo "Build platform set to $BuildPlatform"
+echo "Which we'll canonicalise into: $HostPlatform"
+test  x"$HostPlatform" != x"$TargetPlatform" && echo "Target platform set to $TargetPlatform"
+test  x"$BuildPlatform" != x"$HostPlatform"  && echo "Build platform set to $BuildPlatform"
 
 BuildPlatform_CPP=$HostPlatform_CPP
 TargetPlatform_CPP=$HostPlatform_CPP
@@ -341,10 +236,11 @@ BuildOS_CPP=$HostOS_CPP
 TargetOS_CPP=$HostOS_CPP
 BuildVendor_CPP=$HostVendor_CPP
 TargetVendor_CPP=$HostVendor_CPP
-dnl Cannot afford all these AC_SUBSTs (because of braindead seds w/ 99 cmd limits
+
+dnl Cannot afford all these SUBSTs (because of braindead seds w/ 99 cmd limits)
 dnl AC_SUBST(BuildPlatform)
 AC_SUBST(HostPlatform)
-dnl AC_SUBST(TargetPlatform)
+AC_SUBST(TargetPlatform)
 AC_SUBST(HostPlatform_CPP)
 dnl AC_SUBST(BuildPlatform_CPP)
 dnl AC_SUBST(TargetPlatform_CPP)
@@ -364,6 +260,8 @@ dnl * _GENERAL_ CONFIGURATION CHECKS
 #
 dnl ** are we at Glasgow?
 #
+# This stuff is in danger of going away..
+#
 if test -d /local/fp -a -d /users/fp/simonpj; then
     echo "Brilliant!  You must be a Glaswegian."
     AT_GLASGOW=1
@@ -471,7 +369,8 @@ else
     rm -fr conftest*
 fi
 AC_SUBST(HaveGcc)
-AC_C_CROSS
+
+# Deprecated (AC_PROG_CC does it): AC_C_CROSS
 #
 dnl ** figure out how to do context diffs
 # (NB: NeXTStep thinks diff'ing a file against itself is "trouble")
@@ -507,7 +406,7 @@ if test -z "$YaccCmd"; then
         $WhatCmd $YaccCmd > conftest.out
         if egrep 'y1\.c 1\..*SMI' conftest.out >/dev/null 2>&1; then
             echo "I don't trust your $YaccCmd; it looks like an old Sun yacc"
-            if test -x /usr/lang/yacc; then
+            if test -f /usr/lang/yacc; then
                 echo "I'm going to use /usr/lang/yacc instead"
                 YaccCmd=/usr/lang/yacc
             else
@@ -529,146 +428,6 @@ dnl ** Find lex command (lex or flex) and library (-ll or -lfl)
 #
 AC_PROG_LEX
 
-#--------------------------------------------------------------
-WithHc='haskell-compiler-unspecified'
-WithHcType='HC_UNSPECIFIED'
-
-AC_ARG_WITH(hc,
-   [
-*******************************************************************
-** GENERAL OPTIONS WHICH APPLY TO ALL TOOLS:
-
---with-hc=<Haskell compiler>
-          ghc*     => Glasgow Haskell invoked by the name given
-          hbc*     => Chalmers HBC, invoked by the name given
-          nhc*     => Niklas Rojemo's "nhc", invoked by the name given
-          C or c   => Don't use a Haskell compiler;
-                      build from intermediate C (.hc) files.
-          in-place => Use ghc/driver/ghc; i.e. you've built GHC
-                      and you want to use it un-installed ("in-place").
-   ],
-   [case "$withval" in
-        ghc* | glhc* )
-                WithHc=$withval
-                ;;
-        hbc* )  WithHc=$withval
-                ;;
-        nhc* )  WithHc=$withval
-                ;;
-        c | C)  WithHc='C'
-                ;;
-        in-place )
-               WithHc='IN-PLACE'
-                ;;
-        *)      echo "I don't understand this option: --with-hc=$withval"
-                exit 1
-                ;;
-    esac])
-
-# make sure that what they said makes sense.... set WithHcType
-case $WithHc in
-    haskell-compiler-unspecified ) # maybe they will say something later...
-           ;;
-    ghc* | glhc* )
-           WithHcType='HC_GLASGOW_GHC'
-            AC_CHECK_PROG(have_ghc,$WithHc,$ac_dir/$ac_word)
-            if test -z "$have_ghc"; then
-                echo "Can't find Glasgow Haskell to compile with: $WithHc"
-               exit 1
-            fi
-            ;;
-    hbc* )  # Look for the dastardly competition
-           WithHcType='HC_CHALMERS_HBC'
-            AC_CHECK_PROG(have_hbc,$WithHc,YES,NO)
-            if test $have_hbc = 'NO' ; then
-                echo "Can't find Chalmers HBC to compile with: $WithHc"
-                exit 1
-            fi
-            ;;
-    nhc* )  # Look for Niklas Rojemo's "nhc"
-           WithHcType='HC_ROJEMO_NHC'
-            AC_CHECK_PROG(have_nhc,$WithHc,YES,NO)
-            if test $have_nhc = 'NO' ; then
-                echo "Can't find Niklas Rojemo's NHC to compile with: $WithHc"
-                exit 1
-            fi
-            ;;
-    c | C)  WithHcType='HC_USE_HC_FILES'
-            ;;
-    IN-PLACE) WithHcType='HC_GLASGOW_GHC'
-             WithHc='$(TOP_PWD)/ghc/driver/ghc'
-           ;;
-esac
-AC_SUBST(WithHc)
-AC_SUBST(WithHcType)
-
-dnl ** Possibly use something else instead of 'gcc'.
-WhatGccIsCalled=gcc
-AC_ARG_WITH(gcc,
-   [--with-gcc=<gcc command>
-       Use a different command instead of 'gcc' for the GNU C compiler.],
-   [HaveGcc=YES; WhatGccIsCalled="$withval"])
-AC_SUBST(WhatGccIsCalled)
-
-dnl ** Choose which make to use (default 'make')
-MakeCmd='make'
-AC_ARG_WITH(make,
-   [ 
---with-make=<make command> 
-       Use an alternate command instead of 'make'.  This is useful
-       when GNU make is required (for instance when the default make
-       supplied by the system won't work, as is the case on FreeBSD
-       and NetBSD).],
-   [MakeCmd="$withval"]) 
-AC_SUBST(MakeCmd)
-
-dnl ** possibly choose a different tmpdir (default /tmp)
-# let the user decide where the best tmpdir is
-# /tmp is the default; /usr/tmp is sometimes a good choice.
-# Very site-specific.
-TmpDir='/tmp'
-AC_ARG_WITH(tmpdir,
-   [
---with-tmpdir=<temp directory> 
-       Use an alternative directory for temporary files (presumably
-       because /tmp is too small).],
-   [TmpDir="$withval"])
-AC_SUBST(TmpDir)
-
-dnl ** possibly set a max heap for Haskell compilations
-HcMaxHeapFlag=''
-AC_ARG_WITH(max-heap,
-   [
---with-max-heap=<heap size, e.g., 32m> 
-       Do all Haskell compilations with a heap of this size.],
-   [HcMaxHeapFlag="-H$withval"])
-AC_SUBST(HcMaxHeapFlag)
-
-dnl ** possibly set a max stack for Haskell compilations
-HcMaxStackFlag=''
-AC_ARG_WITH(max-stack,
-   [
---with-max-stack=<stack size, e.g., 4m> 
-       Do all Haskell compilations with a stack of this size.],
-   [HcMaxStackFlag="-K$withval"])
-AC_SUBST(HcMaxStackFlag)
-
-dnl ** figure out about mkdependHS
-MkDependHSCmd='mkdependHS'
-if test -f ./ghc/utils/mkdependHS/mkdependHS \
-     -o -f ./ghc/utils/mkdependHS/mkdependHS.prl ; then
-    MkDependHSCmd='TopDirPwd/ghc/utils/mkdependHS/mkdependHS'
-fi
-AC_ARG_WITH(mkdependHS,
-   [--with-mkdependHS=<mkdependHS command>
-       Use a different command instead of 'mkdependHS'.],
-   [MkDependHSCmd="$withval"])
-dnl AC_CHECK_PROG(have_mkdependHS,$MkDependHSCmd,YES,NO)
-dnl if test $have_mkdependHS = 'NO' ; then
-dnl     MkDependHSCmd=':'
-dnl fi
-AC_SUBST(MkDependHSCmd)
-
 # -------------------------------------------------------------------------
 #
 dnl ** figure out how to invoke cpp directly (gcc -E is no good)
@@ -744,6 +503,59 @@ if test -n "$NeedRanLib"; then
 fi
 AC_SUBST(RANLIB)
 #
+#
+dnl ** Check to see whether ln -s works
+#
+AC_PROG_LN_S()
+AC_SUBST(LN_S)
+#
+dnl ** Find the path to sed **
+AC_PATH_PROG(SedCmd,sed,$ac_dir/$ac_word)
+# 
+# It better be around somewhere (we wouldn't
+# exec this script properly if it wasn't!)
+#
+AC_SUBST(SedCmd)
+#
+dnl ** check for time command **
+AC_PATH_PROG(TimeCmd,time,$ac_dir/$ac_word)
+# 
+AC_SUBST(TimeCmd)
+#
+dnl ** check for tar **
+#
+# if GNU tar is named gtar, look for it first.
+#
+AC_PATH_PROGS(TarCmd,gtar tar,tar)
+AC_SUBST(TarCmd)
+
+#
+dnl ** check for gzip/compress **
+AC_PATH_PROGS(CompressCmd,gzip compress,gzip)
+
+compress_nm=`basename $CompressCmd`
+
+if test x"$compress_nm" = xgzip; then
+  CompressCmd="$CompressCmd -d"
+  CompressSuffix="gz"
+else
+  CompressSuffix="Z"
+fi
+AC_SUBST(CompressCmd)
+AC_SUBST(CompressSuffix)
+#
+dnl ** check for installed happy binary
+#
+AC_PATH_PROG(HappyCmd,happy)
+AC_SUBST(HappyCmd)
+#
+#
+dnl ** check for installed lx binary
+#
+AC_PATH_PROG(LxCmd,lx)
+AC_SUBST(LxCmd)
+#
+#
 dnl ** check for full ANSI header (.h) files
 #
 AC_HEADER_STDC
@@ -797,1137 +609,26 @@ char **argv;
     exit(1);
 }], LeadingUnderscore='YES', LeadingUnderscore='NO', LeadingUnderscore='YES')
 test -n "$verbose" && echo "    setting LeadingUnderscore to $LeadingUnderscore"
+AC_SUBST(LeadingUnderscore)
 
-dnl -------------------------------------------------------
-dnl ** which builds to build?
-dnl ** (applies to anything w/ libraries (ghc, hslibs, ???)
-dnl -------------------------------------------------------
-# builds: normal = sequential _ap_o ; _p = profiling (sequential);
-# _t = ticky; _u = unregisterized
-Build_normal='YES'
-Build_p='YES'
-Build_t='NO'
-Build_u='NO'
-# _mc = concurrent; _mr = profiled concurrent; _mt = ticky concurrent
-# _mp = parallel; _mg = gransim
-Build_mc='NO'
-Build_mr='NO'
-Build_mt='NO'
-Build_mp='NO'
-Build_mg='NO'
-# GC builds: _2s, _1s, _du (, _gn)
-Build_2s='NO'
-Build_1s='NO'
-Build_du='NO'
-# user builds: a...o
-Build_a='NO'
-Build_b='NO'
-Build_c='NO'
-Build_d='NO'
-Build_e='NO'
-Build_f='NO'
-Build_g='NO'
-Build_h='NO'
-Build_i='NO'
-Build_j='NO'
-Build_k='NO'
-Build_l='NO'
-Build_m='NO'
-Build_n='NO'
-Build_o='NO'
-Build_A='NO'
-Build_B='NO'
-# More could be added here...
-
-AC_ARG_ENABLE(normal-build,
-   [
-*******************************************************************
-** \`GHC' (GLASGOW HASKELL COMPILER) OPTIONS:
-
-Choose all the \`builds' of GHC that you want:
-
---disable-normal-build do *not* build GHC for normal sequential code],
-   [case "$enableval" in
-        yes) Build_normal='YES'
-             ;;
-        no)  Build_normal='NO'
-             ;;
-        *)   echo "I don't understand this option: --enable-normal-build=$enableval"
-             exit 1
-             ;;
-    esac])
-
-AC_ARG_ENABLE(profiling,
-   [--disable-profiling    do *not* build profiling features],
-   [case "$enableval" in
-        yes) Build_p='YES'
-             ;;
-        no)  Build_p='NO'
-             ;;
-        *)   echo "I don't understand this option: --enable-profiling=$enableval"
-             exit 1
-             ;;
-    esac])
-
-AC_ARG_ENABLE(ticky,
-   [--enable-ticky         build for \`ticky-ticky' profiling (for implementors)],
-   [case "$enableval" in
-        yes) Build_t='YES'
-             ;;
-        no)  Build_t='NO'
-             ;;
-        *)   echo "I don't understand this option: --enable-ticky=$enableval"
-             exit 1
-             ;;
-    esac])
+AC_OUTPUT(mk/config.mk, echo timestamp > mk/stamp-h )
 
-AC_ARG_ENABLE(concurrent,
-   [--enable-concurrent    turn on \`concurrent Haskell' features],
-   [case "$enableval" in
-        yes) Build_mc='YES'
-             ;;
-        no)  Build_mc='NO'
-             ;;
-        *)   echo "I don't understand this option: --enable-concurrent=$enableval"
-             exit 1
-             ;;
-    esac])
-
-AC_ARG_ENABLE(profiled-concurrent,
-   [--enable-profiled-concurrent turn on profiling for \`concurrent Haskell'],
-   [case "$enableval" in
-        yes) Build_mr='YES'
-             ;;
-        no)  Build_mr='NO'
-             ;;
-        *)   echo "I don't understand this option: --enable-profiled-concurrent=$enableval"
-             exit 1
-             ;;
-    esac])
-
-AC_ARG_ENABLE(ticky-concurrent,
-   [--enable-ticky-concurrent turn on \`ticky-ticky' profiling for \`concurrent Haskell'],
-   [case "$enableval" in
-        yes) Build_mt='YES'
-             ;;
-        no)  Build_mt='NO'
-             ;;
-        *)   echo "I don't understand this option: --enable-ticky-concurrent=$enableval"
-             exit 1
-             ;;
-    esac])
-
-AC_ARG_ENABLE(parallel,
-   [--enable-parallel      turn on \`parallel Haskell' features],
-   [case "$enableval" in
-        yes) Build_mp='YES';
-             ;;
-        no)  Build_mp='NO'
-             ;;
-        *)   echo "I don't understand this option: --enable-parallel=$enableval"
-             exit 1
-             ;;
-    esac])
-
-AC_ARG_ENABLE(gransim,
-   [--enable-gransim       turn on GranSim parallel simulator],
-   [case "$enableval" in
-        yes) Build_mg='YES';
-             ;;
-        no)  Build_mg='NO'
-             ;;
-        *)   echo "I don't understand this option: --enable-gransim=$enableval"
-             exit 1
-             ;;
-    esac])
-
-AC_ARG_ENABLE(gc-2s,
-   [--enable-gc-2s         a build with the 2-space copying garbage collector],
-   [case "$enableval" in
-        yes) Build_2s='YES'
-             ;;
-        no)  Build_2s='NO'
-             ;;
-        *)   echo "I don't understand this option: --enable-gc-2s=$enableval"
-             exit 1
-             ;;
-    esac])
-
-AC_ARG_ENABLE(gc-1s,
-   [--enable-gc-1s         a build with the 1-space compacting garbage collector],
-   [case "$enableval" in
-        yes) Build_1s='YES'
-             ;;
-        no)  Build_1s='NO'
-             ;;
-        *)   echo "I don't understand this option: --enable-gc-1s=$enableval"
-             exit 1
-             ;;
-    esac])
-
-AC_ARG_ENABLE(gc-du,
-   [--enable-gc-du         a build with \`dual-mode' (1s/2s) garbage collector],
-   [case "$enableval" in
-        yes) Build_du='YES'
-             ;;
-        no)  Build_du='NO'
-             ;;
-        *)   echo "I don't understand this option: --enable-gc-du=$enableval"
-             exit 1
-             ;;
-    esac])
-
-AC_ARG_ENABLE(user-way-a,
-   [--enable-user-way-a    build for \`user way a' (mostly for implementors)],
-   [case "$enableval" in
-        yes) Build_a='YES'
-             ;;
-        no)  Build_a='NO'
-             ;;
-        *)   echo "I don't understand this option: --enable-user-way-a=$enableval"
-             exit 1
-             ;;
-    esac])
-
-AC_ARG_ENABLE(user-way-b,
-   [--enable-user-way-b    build for \`user way b' (mostly for implementors)],
-   [case "$enableval" in
-        yes) Build_b='YES'
-             ;;
-        no)  Build_b='NO'
-             ;;
-        *)   echo "I don't understand this option: --enable-user-way-b=$enableval"
-             exit 1
-             ;;
-    esac])
-
-AC_ARG_ENABLE(user-way-c,
-   [--enable-user-way-c    build for \`user way c' (mostly for implementors)],
-   [case "$enableval" in
-        yes) Build_c='YES'
-             ;;
-        no)  Build_c='NO'
-             ;;
-        *)   echo "I don't understand this option: --enable-user-way-c=$enableval"
-             exit 1
-             ;;
-    esac])
-
-AC_ARG_ENABLE(user-way-d,
-   [--enable-user-way-d    build for \`user way d' (mostly for implementors)],
-   [case "$enableval" in
-        yes) Build_d='YES'
-             ;;
-        no)  Build_d='NO'
-             ;;
-        *)   echo "I don't understand this option: --enable-user-way-d=$enableval"
-             exit 1
-             ;;
-    esac])
-
-AC_ARG_ENABLE(user-way-e,
-   [--enable-user-way-e    build for \`user way e' (mostly for implementors)],
-   [case "$enableval" in
-        yes) Build_e='YES'
-             ;;
-        no)  Build_e='NO'
-             ;;
-        *)   echo "I don't understand this option: --enable-user-way-e=$enableval"
-             exit 1
-             ;;
-    esac])
-
-AC_ARG_ENABLE(user-way-f,
-   [--enable-user-way-f    build for \`user way f' (mostly for implementors)],
-   [case "$enableval" in
-        yes) Build_f='YES'
-             ;;
-        no)  Build_f='NO'
-             ;;
-        *)   echo "I don't understand this option: --enable-user-way-f=$enableval"
-             exit 1
-             ;;
-    esac])
-
-AC_ARG_ENABLE(user-way-g,
-   [--enable-user-way-g    build for \`user way g' (mostly for implementors)],
-   [case "$enableval" in
-        yes) Build_g='YES'
-             ;;
-        no)  Build_g='NO'
-             ;;
-        *)   echo "I don't understand this option: --enable-user-way-g=$enableval"
-             exit 1
-             ;;
-    esac])
-
-AC_ARG_ENABLE(user-way-h,
-   [--enable-user-way-h    build for \`user way h' (mostly for implementors)],
-   [case "$enableval" in
-        yes) Build_h='YES'
-             ;;
-        no)  Build_h='NO'
-             ;;
-        *)   echo "I don't understand this option: --enable-user-way-h=$enableval"
-             exit 1
-             ;;
-    esac])
-
-AC_ARG_ENABLE(user-way-i,
-   [--enable-user-way-i    build for \`user way i' (mostly for implementors)],
-   [case "$enableval" in
-        yes) Build_i='YES'
-             ;;
-        no)  Build_i='NO'
-             ;;
-        *)   echo "I don't understand this option: --enable-user-way-i=$enableval"
-             exit 1
-             ;;
-    esac])
-
-AC_ARG_ENABLE(user-way-j,
-   [--enable-user-way-j    build for \`user way j' (mostly for implementors)],
-   [case "$enableval" in
-        yes) Build_j='YES'
-             ;;
-        no)  Build_j='NO'
-             ;;
-        *)   echo "I don't understand this option: --enable-user-way-j=$enableval"
-             exit 1
-             ;;
-    esac])
-
-AC_ARG_ENABLE(user-way-k,
-   [--enable-user-way-k    build for \`user way k' (mostly for implementors)],
-   [case "$enableval" in
-        yes) Build_k='YES'
-             ;;
-        no)  Build_k='NO'
-             ;;
-        *)   echo "I don't understand this option: --enable-user-way-k=$enableval"
-             exit 1
-             ;;
-    esac])
-
-AC_ARG_ENABLE(user-way-l,
-   [--enable-user-way-l    build for \`user way l' (mostly for implementors)],
-   [case "$enableval" in
-        yes) Build_l='YES'
-             ;;
-        no)  Build_l='NO'
-             ;;
-        *)   echo "I don't understand this option: --enable-user-way-l=$enableval"
-             exit 1
-             ;;
-    esac])
-
-AC_ARG_ENABLE(user-way-m,
-   [--enable-user-way-m    build for \`user way m' (mostly for implementors)],
-   [case "$enableval" in
-        yes) Build_m='YES'
-             ;;
-        no)  Build_m='NO'
-             ;;
-        *)   echo "I don't understand this option: --enable-user-way-m=$enableval"
-             exit 1
-             ;;
-    esac])
-
-AC_ARG_ENABLE(user-way-n,
-   [--enable-user-way-n    build for \`user way n' (mostly for implementors)],
-   [case "$enableval" in
-        yes) Build_n='YES'
-             ;;
-        no)  Build_n='NO'
-             ;;
-        *)   echo "I don't understand this option: --enable-user-way-n=$enableval"
-             exit 1
-             ;;
-    esac])
-
-AC_ARG_ENABLE(user-way-o,
-   [--enable-user-way-o    build for \`user way o' (mostly for implementors)],
-   [case "$enableval" in
-        yes) Build_o='YES'
-             ;;
-        no)  Build_o='NO'
-             ;;
-        *)   echo "I don't understand this option: --enable-user-way-o=$enableval"
-             exit 1
-             ;;
-    esac])
-
-AC_ARG_ENABLE(user-way-A,
-   [--enable-user-way-A    build for \`user way A' (mostly for implementors)],
-   [case "$enableval" in
-        yes) Build_A='YES'
-             ;;
-        no)  Build_A='NO'
-             ;;
-        *)   echo "I don't understand this option: --enable-user-way-A=$enableval"
-             exit 1
-             ;;
-    esac])
-
-AC_ARG_ENABLE(user-way-B,
-   [--enable-user-way-B    build for \`user way B' (mostly for implementors)],
-   [case "$enableval" in
-        yes) Build_B='YES'
-             ;;
-        no)  Build_B='NO'
-             ;;
-        *)   echo "I don't understand this option: --enable-user-way-B=$enableval"
-             exit 1
-             ;;
-    esac])
-
-dnl We do not use AC_SUBST to communicate the Build_* info,
-dnl as some seds (notably OSF) only allow 99 commands (!!!).
-dnl We will do the equivalent by a HACK further down.
-
-# -------------------------------------------------------------------------
-dnl GHC CONFIGURATION STUFF
-
-dnl ** which Haskell compiler to bootstrap GHC with?
-# Figure out what Haskell compiler(s) to use for booting
-#
-# first, the defaults...
-WithGhcHc='haskell-compiler-unspecified'
-WithGhcHcType='HC_UNSPECIFIED'
-GhcBuilderVersion='28'
-
-AC_ARG_WITH(hc-for-ghc,
-   [
-The Haskell compiler for bootstrapping GHC (if any); this option,
-if used, overrides --with-hc=<...>:
-
-    --with-hc-for-ghc=<Haskell compiler>
-          ghc*     => Glasgow Haskell invoked by the name given
-          C or c   => Don't use a Haskell compiler;
-                      build from intermediate C (.hc) files.
-   ],
-   [case "$withval" in
-        ghc* | glhc* )
-                WithGhcHc=$withval
-                ;;
-       hbc* )  echo "HBC will not compile GHC 0.26 as is (sigh)"
-               exit 1
-               ;;
-        c | C)  WithGhcHc='C'
-               WithGhcHcType='HC_USE_HC_FILES'
-                ;;
-        *)      echo "I don't understand this option: --with-hc-for-ghc=$withval"
-                exit 1
-                ;;
-    esac])
-
-# make sure that what they said makes sense.... set WithGhcHcType
-case $WithGhcHc in
-    haskell-compiler-unspecified ) # maybe they said something earlier...
-           if test $WithHc = 'haskell-compiler-unspecified' ; then
-               echo "Neither --with-hc nor --with-hc-for-ghc was properly set"
-               exit 1
-           fi
-           if test $WithHcType = 'HC_GLASGOW_GHC' ; then
-                touch conftest.o
-                $WithHc -v -C conftest.o > conftest.out 2>&1
-                echo '/version (\d+)\.(\d+)/ && print ($1*100+$2);' > conftest.pl
-                GhcBuilderVersion=`eval $PerlCmd -n conftest.pl conftest.out`
-                rm -rf conftest*
-           fi
-           ;;
-    ghc* | glhc* )
-           WithGhcHcType='HC_GLASGOW_GHC'
-            AC_CHECK_PROG(have_ghc_ghc,$WithGhcHc,$ac_dir/$ac_word)
-            if test -z "$have_ghc_ghc"; then
-                echo "Can't find Glasgow Haskell to compile GHC with: $WithGhcHc"
-               exit 1
-           else
-                touch conftest.o
-                $WithGhcHc -v -C conftest.o > conftest.out 2>&1
-                echo '/version (\d+)\.(\d+)/ && print ($1*100+$2);' > conftest.pl
-                GhcBuilderVersion=`eval $PerlCmd -n conftest.pl conftest.out`
-                rm -rf conftest*
-            fi
-            ;;
-    c | C)  WithGhcHcType='HC_USE_HC_FILES'
-            ;;
-esac
-AC_SUBST(GhcBuilderVersion)
-AC_SUBST(WithGhcHc)
-AC_SUBST(WithGhcHcType)
-
-dnl ** use portable (slow) C? -- preferably not
-GhcWithRegisterised='YES'
-AC_ARG_ENABLE(portable-C,
-   [Other things for GHC:
-
---enable-portable-C       use portable C (slow), not \`registerised' (fast)],
-   [case "$enableval" in
-        yes) GhcWithRegisterised='NO'
-             ;;
-        no)  GhcWithRegisterised='YES'
-             ;;
-        *)   echo "I don't understand this option: --enable-portable-C=$enableval"
-             exit 1
-             ;;
-    esac])
-
-if test $GhcWithRegisterised = 'YES'; then
-    case $HostPlatform in
-    alpha-* | hppa1.1-* | i386-* | m68k-* | mips-* | powerpc-* | sparc-* )
-       ;;
-    *)
-       echo "Don't know non-portable C tricks for this platform: $HostPlatform"
-       GhcWithRegisterised='NO'
-       ;;
-    esac
-fi
-AC_SUBST(GhcWithRegisterised)
-
-if test $GhcWithRegisterised = 'NO'; then
-    Build_u='YES'
-    Build_normal='NO'
-    Build_p='NO'
-fi
-# ToDo: make sure we can do concurrent for platform/circs...
-# ToDo: make sure we can do profiling for platform/circs...
-# ToDo: make sure we can do parallel for platform/circs...
-# ToDo: make sure we can do gransim for platform/circs...
-
-dnl ** build GHC compiler proper (\`hsc') from .hc files?
-GhcWithHscBuiltViaC='NO'
-AC_ARG_ENABLE(hsc-built-via-C,
-   [--enable-hsc-built-via-C  build compiler proper (hsc) from intermediate .hc
-                          files (disabled by default)],
-   [case "$enableval" in
-        yes) GhcWithHscBuiltViaC='YES'
-             ;;
-        no)  GhcWithHscBuiltViaC='NO'
-             ;;
-        *)   echo "I don't understand this option: --enable-hsc-built-via-C=$enableval"
-             exit 1
-             ;;
-    esac])
-case $WithGhcHc in
-    haskell-compiler-unspecified ) # maybe they said something earlier...
-           if test $WithHcType = 'HC_USE_HC_FILES' ; then
-               GhcWithHscBuiltViaC='YES'
-           fi
-           ;;
-    c | C)  GhcWithHscBuiltViaC='YES'
-            ;;
-    *)     ;;
-esac
-AC_SUBST(GhcWithHscBuiltViaC)
-
-dnl ** build \`hsc' with -O?
-GhcWithHscOptimised='YES'
-AC_ARG_ENABLE(hsc-optimised,
-   [--disable-hsc-optimised   don't build compiler proper (hsc) with -O],
-   [case "$enableval" in
-        yes) GhcWithHscOptimised='YES'
-             ;;
-        no)  GhcWithHscOptimised='NO'
-             ;;
-        *)   echo "I don't understand this option: --enable-hsc-optimised=$enableval"
-             exit 1
-             ;;
-    esac])
-AC_SUBST(GhcWithHscOptimised)
-
-dnl ** build \`hsc' with -DDEBUG?
-GhcWithHscDebug='NO'
-AC_ARG_ENABLE(hsc-debug,
-   [--enable-hsc-debug        build compiler proper (hsc) with -DDEBUG],
-   [case "$enableval" in
-        yes) GhcWithHscDebug='YES'
-             ;;
-        no)  GhcWithHscDebug='NO'
-             ;;
-        *)   echo "I don't understand this option: --enable-hsc-debug=$enableval"
-             exit 1
-             ;;
-    esac])
-AC_SUBST(GhcWithHscDebug)
-
-dnl ** omit native-code generator from \`hsc'?
-GhcWithNativeCodeGen='YES'
-AC_ARG_ENABLE(native-code-generator,
-   [--enable-native-code-generator  build an n.c.g.
-                          [enabled for supported platforms]],
-   [case "$enableval" in
-        yes) GhcWithNativeCodeGen='YES'
-             ;;
-        no)  GhcWithNativeCodeGen='NO'
-             ;;
-        *)   echo "I don't understand this option: --enable-native-code-generator=$enableval"
-             exit 1
-             ;;
-    esac])
-if test $GhcWithNativeCodeGen = 'YES'; then
-    case $TargetPlatform in
-    i386-* | alpha-* | sparc-* )
-       ;;
-    *)
-       echo "Don't have a native-code generator for this platform: $TargetPlatform"
-       GhcWithNativeCodeGen='NO'
-       ;;
-    esac
-fi
-AC_SUBST(GhcWithNativeCodeGen)
-
-dnl ** include Marlow's deforester in \`hsc'?
-GhcWithDeforester='NO'
-AC_ARG_ENABLE(deforester,
-   [--enable-deforester       build deforester into compiler (HACKERS ONLY)],
-   [case "$enableval" in
-        yes) GhcWithDeforester='YES'
-             ;;
-        no)  GhcWithDeforester='NO'
-             ;;
-        *)   echo "I don't understand this option: --enable-deforester=$enableval"
-             exit 1
-             ;;
-    esac])
-AC_SUBST(GhcWithDeforester)
-
-dnl ** include Readline library?
-GhcWithReadline='NO'
-AC_ARG_ENABLE(readline-library,
-   [--enable-readline-library include (GNU) readline library in -syslib GHC],
-   [case "$enableval" in
-        yes) GhcWithReadline='YES'
-             ;;
-        no)  GhcWithReadline='NO'
-             ;;
-        *)   echo "I don't understand this option: --enable-readline-library=$enableval"
-             exit 1
-             ;;
-    esac])
-AC_SUBST(GhcWithReadline)
-
-dnl ** include Sockets library?
-GhcWithSockets='NO'
-AC_ARG_ENABLE(sockets-library,
-   [--enable-sockets-library  include the network-interface (sockets) library in -syslib GHC],
-   [case "$enableval" in
-        yes) GhcWithSockets='YES'
-             ;;
-        no)  GhcWithSockets='NO'
-             ;;
-        *)   echo "I don't understand this option: --enable-sockets-library=$enableval"
-             exit 1
-             ;;
-    esac])
-AC_SUBST(GhcWithSockets)
-
-# Here, by HACK means, we dump all the Build_ info
-# into a file.  See comment above.
-rm -f ghc/mk/buildinfo.mk
-echo creating ghc/mk/buildinfo.mk
-touch ghc/mk/buildinfo.mk
-for xx in normal p t u mc mr mt mp mg 2s 1s du a b c d e f g h i j k l m n o A B ; do
-    eval "yy=\$Build_$xx"
-    echo "Build_$xx = $yy" >> ghc/mk/buildinfo.mk
-done
-
-# -------------------------------------------------------------------------
-dnl
-dnl * `HsLibs' CONFIGURATION STUFF
-
-if test "xxx$DoingHsLibs" = 'xxxhslibs' ; then
-# a very big "if"!
-
-dnl ** which Haskell compiler to use on hslibs?
-WithHsLibsHc='haskell-compiler-unspecified'
-WithHsLibsHcType='HC_UNSPECIFIED'
-
-AC_ARG_WITH(hc-for-hslibs,
-   [
-*******************************************************************
-** \`HsLibs' HASKELL LIBRARIES OPTIONS:
-
-The Haskell compiler to compile the Haskell Libraries suite; this
-option, if used, overrides --with-hc=<...>:
-
-    --with-hc-for-hslibs=<Haskell compiler>
-          ghc*     => Glasgow Haskell invoked by the name given
-                      and you want to use it un-installed ("in-place").],
-   [case "$withval" in
-        ghc* | glhc* )
-                WithHsLibsHc=$withval
-                ;;
-        in-place )
-               WithHsLibsHc='IN-PLACE'
-                ;;
-        *)      echo "I don't understand this option: --with-hc-for-hslibs=$withval"
-                exit 1
-                ;;
-    esac])
-
-# make sure that what they said makes sense.... set WithHsLibsHcType
-case $WithHsLibsHc in
-    haskell-compiler-unspecified ) # maybe they said something earlier...
-           if test $WithHc = 'haskell-compiler-unspecified' ; then
-               echo "Neither --with-hc nor --with-hc-for-hslibs was properly set"
-               exit 1
-           fi
-           ;;
-    ghc* | glhc* )
-           WithHsLibsHcType='HC_GLASGOW_GHC'
-            AC_CHECK_PROG(have_ghc_hslibs,$WithHsLibsHc,$ac_dir/$ac_word)
-            if test -z "$have_ghc_hslibs"; then
-                echo "Can't find Glasgow Haskell to compile HsLibs with: $WithHsLibsHc"
-               exit 1
-            fi
-            ;;
-    IN-PLACE) WithHsLibsHcType='HC_GLASGOW_GHC'
-             WithHsLibsHc='$(TOP_PWD)/ghc/driver/ghc'
-           ;;
-esac
-AC_SUBST(WithHsLibsHc)
-AC_SUBST(WithHsLibsHcType)
-
-# Here, by HACK means, we dump all the Build_ info
-# into a file.  See comment above.
-rm -f hslibs/mk/buildinfo.mk
-echo creating hslibs/mk/buildinfo.mk
-cat > hslibs/mk/buildinfo.mk <<EOF
-# ** DO NOT EDIT! **
-# This file is obliterated every time 'configure' is run!
-
-EOF
-for xx in normal p t u mc mr mt mp mg 2s 1s du a b c d e f g h i j k l m n o A B ; do
-    eval "yy=\$Build_$xx"
-    echo "Build_$xx = $yy" >> hslibs/mk/buildinfo.mk
-done
-
-
-# here ends a very big if DoingHsLibs = 'hslibs' ...
-fi
-#
-# -------------------------------------------------------------------------
-dnl
-dnl * `Happy' CONFIGURATION STUFF
-
-if test "xxx$DoingHappy" = 'xxxhappy' ; then
-# a very big "if"!
-
-dnl ** which Haskell compiler to use on happy?
-WithHappyHc='haskell-compiler-unspecified'
-WithHappyHcType='HC_UNSPECIFIED'
-
-AC_ARG_WITH(hc-for-happy,
-   [
-*******************************************************************
-** \`Happy' PARSER-GENERATOR OPTIONS:
-
-The Haskell compiler to compile Happy; this option, if used, overrides
---with-hc=<...>:
-
-    --with-hc-for-happy=<Haskell compiler>
-          ghc*     => Glasgow Haskell invoked by the name given
-          hbc*     => Chalmers HBC, invoked by the name given
-          nhc*     => Niklas Rojemo's "nhc", invoked by the name given
-          in-place => Use ghc/driver/ghc; i.e. you've built GHC
-                      and you want to use it un-installed ("in-place").],
-   [case "$withval" in
-        ghc* | glhc* )
-                WithHappyHc=$withval
-                ;;
-        hbc* )  WithHappyHc=$withval
-                ;;
-        nhc* )  WithHappyHc=$withval
-                ;;
-        in-place )
-               WithHappyHc='IN-PLACE'
-                ;;
-        *)      echo "I don't understand this option: --with-hc-for-happy=$withval"
-                exit 1
-                ;;
-    esac])
-
-# make sure that what they said makes sense.... set WithHappyHcType
-case $WithHappyHc in
-    haskell-compiler-unspecified ) # maybe they said something earlier...
-           if test $WithHc = 'haskell-compiler-unspecified' ; then
-               echo "Neither --with-hc nor --with-hc-for-happy was properly set"
-               exit 1
-           fi
-           ;;
-    ghc* | glhc* )
-           WithHappyHcType='HC_GLASGOW_GHC'
-            AC_CHECK_PROG(have_ghc_happy,$WithHappyHc,$ac_dir/$ac_word)
-            if test -z "$have_ghc_happy"; then
-                echo "Can't find Glasgow Haskell to compile Happy with: $WithHappyHc"
-               exit 1
-            fi
-            ;;
-    hbc* )  # Look for the dastardly competition
-           WithHappyHcType='HC_CHALMERS_HBC'
-            AC_CHECK_PROG(have_hbc,$WithHappyHc,YES,NO)
-            if test $have_hbc = 'NO' ; then
-                echo "Can't find Chalmers HBC to compile with: $WithHappyHc"
-                exit 1
-            fi
-            ;;
-    nhc* )  # Look for Niklas Rojemo's "nhc"
-           WithHappyHcType='HC_ROJEMO_NHC'
-            AC_CHECK_PROG(have_nhc,$WithHappyHc,YES,NO)
-            if test $have_nhc = 'NO' ; then
-                echo "Can't find Niklas Rojemo's NHC to compile with: $WithHappyHc"
-                exit 1
-            fi
-            ;;
-    IN-PLACE) WithHappyHcType='HC_GLASGOW_GHC'
-                WithHappyHc='$(TOP_PWD)/ghc/driver/ghc'
-           ;;
-esac
-AC_SUBST(WithHappyHc)
-AC_SUBST(WithHappyHcType)
-
-# here ends a very big if DoingHappy = 'happy' ...
-fi
 #
-# -------------------------------------------------------------------------
-dnl
-dnl * `Haggis' CONFIGURATION STUFF
-
-if test "xxx$DoingHaggis" = 'xxxhaggis' ; then
-# a very big "if"!
-
-dnl ** which Haskell compiler to use on haggis?
-WithHaggisHc='haskell-compiler-unspecified'
-WithHaggisHcType='HC_UNSPECIFIED'
-
-AC_ARG_WITH(hc-for-haggis,
-   [
-*******************************************************************
-** \`Haggis' HASKELL GUI TOOLKIT OPTIONS:
-
-The Haskell compiler to compile the Haggis toolkit; this option, if
-used, overrides --with-hc=<...>:
-
-    --with-hc-for-haggis=<Haskell compiler>
-          ghc*     => Glasgow Haskell invoked by the name given
-                      and you want to use it un-installed ("in-place").],
-   [case "$withval" in
-        ghc* | glhc* )
-                WithHaggisHc=$withval
-                ;;
-        in-place )
-               WithHaggicHs='IN-PLACE'
-                ;;
-        *)      echo "I don't understand this option: --with-hc-for-haggis=$withval"
-                exit 1
-                ;;
-    esac])
-
-# make sure that what they said makes sense.... set WithHaggisHcType
-case $WithHaggisHc in
-    haskell-compiler-unspecified ) # maybe they said something earlier...
-           if test $WithHc = 'haskell-compiler-unspecified' ; then
-               echo "Neither --with-hc nor --with-hc-for-haggis was properly set"
-               exit 1
-           fi
-           ;;
-    ghc* | glhc* )
-           WithHaggisHcType='HC_GLASGOW_GHC'
-            AC_CHECK_PROG(have_ghc_haggis,$WithHaggisHc,$ac_dir/$ac_word)
-            if test -z "$have_ghc_haggis"; then
-                echo "Can't find Glasgow Haskell to compile Haggis with: $WithHaggisHc"
-               exit 1
-            fi
-            ;;
-    IN-PLACE) WithHaggisHcType='HC_GLASGOW_GHC'
-                WithHaggisHc='$(TOP_PWD)/ghc/driver/ghc'
-           ;;
-esac
-AC_SUBST(WithHaggisHc)
-AC_SUBST(WithHaggisHcType)
-
-# builds stuff?? ToDo
-
-# here ends a very big if DoingHaggis = 'haggis' ...
-fi
+# It'll break soon enough if it didn't, but we perform a sanity
+# check here on the generated config.mk file to see if the
+# sed that was used is of the well-behaved sort.
 #
-# -------------------------------------------------------------------------
-dnl
-dnl * `NoFib' CONFIGURATION STUFF
-
-if test "xxx$DoingNoFib" = 'xxxnofib' ; then
-# a very big "if"!
-
-dnl ** which Haskell compiler to test with NoFib?
-WithNoFibHc='haskell-compiler-unspecified'
-WithNoFibHcType='HC_UNSPECIFIED'
-
-AC_ARG_WITH(hc-for-nofib,
-   [
-*******************************************************************
-** NoFib HASKELL BENCHMARK SUITE OPTIONS:
-
-The Haskell compiler to compile the NoFib programs; this option, if
-used, overrides --with-hc=<...>:
-
-    --with-hc-for-nofib=<Haskell compiler>
-          ghc*     => Glasgow Haskell invoked by the name given
-          hbc*     => Chalmers HBC, invoked by the name given
-          nhc*     => Niklas Rojemo's "nhc", invoked by the name given
-          in-place => Use ghc/driver/ghc; i.e. you've built GHC
-                      and you want to use it un-installed ("in-place").
-   ],
-   [case "$withval" in
-        ghc* | glhc* )
-                WithNoFibHc=$withval
-                ;;
-        hbc* )  WithNoFibHc=$withval
-                ;;
-        nhc* )  WithNoFibHc=$withval
-                ;;
-        in-place )
-               WithNoFibHc='IN-PLACE'
-                ;;
-        *)      echo "I don't understand this option: --with-hc-for-nofib=$withval"
-                exit 1
-                ;;
-    esac])
-
-# make sure that what they said makes sense.... set WithHappyHcType
-case $WithNoFibHc in
-    haskell-compiler-unspecified ) # maybe they said something earlier...
-           if test $WithHc = 'haskell-compiler-unspecified' ; then
-               echo "Neither --with-hc nor --with-hc-for-nofib was properly set"
-               exit 1
-           fi
-           ;;
-    ghc* | glhc* )
-           WithNoFibHcType='HC_GLASGOW_GHC'
-            AC_CHECK_PROG(have_ghc_nofib,$WithNoFibHc,$ac_dir/$ac_word)
-            if test -z "$have_ghc_nofib"; then
-                echo "Can't find Glasgow Haskell to compile NoFib with: $WithNoFibHc"
-               exit 1
-            fi
-            ;;
-    hbc* )  # Look for the dastardly competition
-           WithNoFibHcType='HC_CHALMERS_HBC'
-            AC_CHECK_PROG(have_hbc,$WithNoFibHc,YES,NO)
-            if test $have_hbc = 'NO' ; then
-                echo "Can't find Chalmers HBC to compile NoFib with: $WithNoFibHc"
-                exit 1
-            fi
-            ;;
-    nhc* )  # Look for Niklas Rojemo's "nhc"
-           WithNoFibHcType='HC_ROJEMO_NHC'
-            AC_CHECK_PROG(have_nhc,$WithNoFibHc,YES,NO)
-            if test $have_nhc = 'NO' ; then
-                echo "Can't find Niklas Rojemo's NHC to compile NoFib with: $WithNoFibHc"
-                exit 1
-            fi
-            ;;
-    IN-PLACE) WithNoFibHcType='HC_GLASGOW_GHC'
-                WithNoFibHc='$(TOP_PWD)/ghc/driver/ghc'
-           ;;
-esac
-AC_SUBST(WithNoFibHc)
-AC_SUBST(WithNoFibHcType)
-
-dnl ** what mkworld \`setup' should be used?
-AC_ARG_WITH(setup,
-   [
---with-setup=<setup> : What mkworld \`setup' should be used?
-                       Choices: ghc, hbc, nhc
-],
-   [case "$withval" in
-        ghc )   MkWorldSetup='ghc'
-                ;;
-        hbc )   MkWorldSetup='hbc'
-                ;;
-        nhc )   MkWorldSetup='nhc'
-               ;;
-        *)      echo "I don't understand this option: --with-setup=$withval"
-                exit 1
-                ;;
-    esac])
-
-if test $MkWorldSetup = 'std' ; then
-    echo 'You must do --with-setup=... (one of: ghc, hbc, or nhc) for NoFib'
-    exit 1
-fi
-
-# ---------------------------------------
-# What sets of tests should be run.
-#
-IncludeRealNoFibTests='YES'    # defaults
-IncludeSpectralNoFibTests='YES'
-IncludeImaginaryNoFibTests='YES'
-IncludeSpecialiseNoFibTests='NO'
-IncludeGHC_ONLYNoFibTests='NO'
-IncludePRIVATENoFibTests='NO'
-IncludeParallelNoFibTests='NO'
-
-dnl ** should *all* NoFib tests be run?
-# special catch-all variant
-AC_ARG_ENABLE(all-tests,
-   [Possibly turn on *all* of the possible tests (a sane choice
-only if using GHC):
-
---enable-all-tests    do *all* tests],
-   [case "$enableval" in
-        yes) IncludeGHC_ONLYNoFibTests='YES'
-            IncludeSpecialiseNoFibTests='YES'
-            IncludePRIVATENoFibTests='YES'
-            IncludeParallelNoFibTests='YES'
-             ;;
-        no)  IncludeGHC_ONLYNoFibTests='NO'
-            IncludeSpecialiseNoFibTests='NO'
-            IncludePRIVATENoFibTests='NO'
-            IncludeParallelNoFibTests='NO'
-
-            IncludeRealNoFibTests='NO'
-            IncludeSpectralNoFibTests='NO'
-            IncludeImaginaryNoFibTests='NO'
-             ;;
-        *)   echo "I don't understand this option: --enable-all-tests=$enableval"
-             exit 1
-             ;;
-    esac])
-
-dnl ** turn on/off individual categories of tests...
-# individual categories
-AC_ARG_ENABLE(imaginary-tests,
-   [
-Enable/disable individual categories of tests:
-
---disable-imaginary-tests do *not* include imaginary tests],
-   [case "$enableval" in
-        yes) IncludeImaginaryNoFibTests='YES'
-             ;;
-        no)  IncludeImaginaryNoFibTests='NO'
-             ;;
-        *)   echo "I don't understand this option: --enable-imaginary-tests=$enableval"
-             exit 1
-             ;;
-    esac])
-
-AC_ARG_ENABLE(spectral-tests,
-   [--disable-spectral-tests  do *not* include spectral tests],
-   [case "$enableval" in
-        yes) IncludeSpectralNoFibTests='YES'
-             ;;
-        no)  IncludeSpectralNoFibTests='NO'
-             ;;
-        *)   echo "I don't understand this option: --enable-spectral-tests=$enableval"
-             exit 1
-             ;;
-    esac])
-
-AC_ARG_ENABLE(real-tests,
-   [--disable-real-tests      do *not* include real tests],
-   [case "$enableval" in
-        yes) IncludeRealNoFibTests='YES'
-             ;;
-        no)  IncludeRealNoFibTests='NO'
-             ;;
-        *)   echo "I don't understand this option: --enable-real-tests=$enableval"
-             exit 1
-             ;;
-    esac])
-
-AC_ARG_ENABLE(GHC-ONLY-tests,
-   [--enable-GHC-ONLY-tests   include GHC_ONLY tests],
-   [case "$enableval" in
-        yes) IncludeGHC_ONLYNoFibTests='YES'
-             ;;
-        no)  IncludeGHC_ONLYNoFibTests='NO'
-             ;;
-        *)   echo "I don't understand this option: --enable-GHC-ONLY-tests=$enableval"
-             exit 1
-             ;;
-    esac])
-
-AC_ARG_ENABLE(specialise-tests,
-   [--enable-specialise-tests  include specialisation tests],
-   [case "$enableval" in
-        yes) IncludeSpecialiseNoFibTests='YES'
-             ;;
-        no)  IncludeSpecialiseNoFibTests='NO'
-             ;;
-        *)   echo "I don't understand this option: --enable-specialise-tests=$enableval"
-             exit 1
-             ;;
-    esac])
-
-AC_ARG_ENABLE(PRIVATE-tests,
-   [--enable-PRIVATE-tests    include PRIVATE tests],
-   [case "$enableval" in
-        yes) IncludePRIVATENoFibTests='YES'
-             ;;
-        no)  IncludePRIVATENoFibTests='NO'
-             ;;
-        *)   echo "I don't understand this option: --enable-PRIVATE-tests=$enableval"
-             exit 1
-             ;;
-    esac])
-
-AC_ARG_ENABLE(parallel-tests,
-   [--enable-parallel-tests   include parallel tests
-],
-   [case "$enableval" in
-        yes) IncludeParallelNoFibTests='YES'
-             ;;
-        no)  IncludeParallelNoFibTests='NO'
-             ;;
-        *)   echo "I don't understand this option: --enable-parallel-tests=$enableval"
-             exit 1
-             ;;
-    esac])
-
-dnl not AC_SUBSTd because of 99-command seds (sigh)
-dnl (See what follows instead)
-dnl AC_SUBST(IncludeRealNoFibTests)
-dnl AC_SUBST(IncludeSpectralNoFibTests)
-dnl AC_SUBST(IncludeImaginaryNoFibTests)
-dnl AC_SUBST(IncludeGHC_ONLYNoFibTests)
-dnl AC_SUBST(IncludeSpecialiseNoFibTests)
-dnl AC_SUBST(IncludePRIVATENoFibTests)
-dnl AC_SUBST(IncludeParallelNoFibTests)
-
-# Here, by HACK means, we dump all the Include*NoFibTests info
-# into a file.  See comment above.
-rm -f nofib/mk/buildinfo.mk
-echo creating nofib/mk/buildinfo.mk
-cat > nofib/mkworld/buildinfo.jm <<EOF
-# ** DO NOT EDIT! **
-# This file is obliterated every time 'configure' is run!
-
-EOF
-for xx in Real Spectral Imaginary GHC_ONLY Specialise PRIVATE Parallel ; do
-    eval "yy=\$Include${xx}NoFibTests"
-    echo "Include${xx}NoFibTests = $yy" >> nofib/mk/buildinfo.mk
-done
-
-# Here, by HACK means, we add all the Build_ info
-# into a file.  See comment above.
-for xx in normal p t u mc mr mt mp mg 2s 1s du a b c d e f g h i j k l m n o A B ; do
-    eval "yy=\$Build_$xx"
-    echo "Build_$xx = $yy"     >> nofib/mk/buildinfo.mk
-done
-
-# here ends a very big if DoingNoFib = 'nofib' ...
+grep @ mk/config.mk > conftest.out
+if grep -v '#     enclosed in @at-signs@.' conftest.out >/dev/null 2>&1; then
+   :
+else
+   echo 'Hmm..suspicious, did the configure script perform all the @..@ substitutions in mk/config.mk?..';
+   grep -v '#     enclosed in @at-signs@.' conftest.out /dev/null
 fi
-#
-# -------------------------------------------------------------------------
-dnl
-dnl * extract non-header files with substitution (end)
-#
-AC_SUBST(MkWorldSetup)
-
-AC_OUTPUT(mk/platform.mk mk/utils.mk mk/install.mk ghc/mk/ghcconfig.mk ghc/includes/platform.h)
+rm -f conftest*
 
+echo ''
 echo '************************************************'
-echo '*** NOW DO: make boot; make all'
+echo '*** NOW DO: gmake boot followed by gmake all'
 echo '************************************************'
 exit 0
diff --git a/distrib/Makefile-bin.in b/distrib/Makefile-bin.in
new file mode 100644 (file)
index 0000000..404f4d1
--- /dev/null
@@ -0,0 +1,137 @@
+# Instructions for configuring an fptools package.
+#
+# There are two ways you can get started with an fptools package, either
+# by using the unpacked distribution tree in-situ or by installing the
+# package.
+#
+# Using the package directly is easy, just do `make config', i.e.,
+# the distribution will *not* work out-of-the-box, you'll have to do
+# this first.
+#
+# To install the package, you'll have to set one or more of the
+# following variables:
+#
+#  * bindir 
+#     path to directory of where you want the executables
+#     to be installed.
+#  * libdir
+#     where you want the library archives to go.
+#     Note, if you specify /usr/foo/lib for libdir,
+#     the library files for your fptools package will be
+#     installed in  /usr/foo/lib/<package>-<version>, i.e.,
+#     /usr/foo/lib/ghc-2.02. If you don't want the package/version
+#     directory appended, you'll have to modify $(real_libdir)
+#     below.
+#
+#  * datadir
+#     path to where the platform-independent files will go.
+#     As for libdir, the effective path for the platform-indep
+#     stuff is $(datadir)/<package>-<version>. If you want
+#     complete control, see $(real_libdir)
+#
+#  * platform 
+#     the platform you're installing for. The configure
+#     makes an educated guess what it, so you will only
+#     have to set this if it clashes with your reality.
+#
+#  * infodir
+#     where to install the Emacs info files
+#  * htmldir
+#     where to install the documentation HTML files.
+#  * dvidir
+#     where to install the DVI files.
+#
+# Installing the documentation is not via the `install' rule, but
+# via the rules: `install-docs', `install-html', `install-dvi'
+# and `install-info'.
+#
+# For more complete instructions, consult the INSTALL file
+# that came with the bundle, and/or consult the installation
+# documentation in one of the document directories.
+#
+bindir    = @bindir@
+libdir    = @libdir@
+datadir   = @datadir@
+platform  = @platform@
+
+infodir   = @infodir@
+htmldir   = @htmldir@
+dvidir    = @dvidir@
+
+#
+# Putting the package stuff in package-specific
+# directories:
+#
+real_libdir  = $(libdir)/$(package)-$(version)
+real_datadir = $(datadir)/$(package)-$(version)
+
+
+
+
+package   = ghc
+version   = 2.02
+PERL      = @PerlCmd@
+
+.PHONY: config install install-dirs
+
+config:
+       @echo Configuring $(package), version $(version), on $(platform)
+       @RM `pwd`/bin/$(platform)/$(package)-$(version)/$(package)-$(version)
+       @RM `pwd`/bin/$(platform)/$(package)-$(version)/$(package)
+       @echo $(PerlCmd)                  > `pwd`/bin/$(platform)/$(package)
+       @echo "$""bindir='"`pwd`"/bin/$(platform)/$(package)-$(version)';"    >> `pwd`/bin/$(platform)/$(package)-$(version)/$(package)
+       @echo "$""libdir='"`pwd`"/lib/$(platform)/$(package)-$(version)';"    >> `pwd`/bin/$(platform)/$(package)-$(version)/$(package)
+       @echo "$""datadir='"`pwd`"/share/$(platform)/$(package)-$(version)';" >> `pwd`/bin/$(platform)/$(package)-$(version)/$(package)
+       @cat `pwd`/bin/$(platform)/$(package)-$(version)/$(package).prl';"    >> `pwd`/bin/$(platform)/$(package)-$(version)/$(package)
+       @(cd `pwd`/bin/$(platform)/$(package)-$(version); $(LN_S) $(package) $(package)-$(version) )
+       @echo Finished..to use, add `pwd`/bin/$(platform)/$(package)-$(version) to your PATH.
+
+libdirs  = . imports include
+datadirs = . include
+
+install-dirs:
+       $(MKDIRHIER) $(bindir) 
+       @for i in $(libdirs) ; do \
+         echo (MKDIRHIER) $(real_libdir)/$$i; \
+         (MKDIRHIER) $(real_libdir)/$$i; \
+       done;
+       @for i in $(datadirs) ; do \
+         echo (MKDIRHIER) $(real_datadir)/$$i; \
+         (MKDIRHIER) $(real_datadir)/$$i; \
+       done;
+
+install : install-dirs
+
+install :
+       $(INSTALL_PROGRAM) `pwd`/bin/$(platform)/$(package)-$(version)/* $(bindir)
+       @for i in $(libdirs); do \
+          echo $(INSTALL) `pwd`/lib/$(platform)/$(package)-$(version)/$$i/* $(real_libdir)/$$i; \
+          $(INSTALL) `pwd`/lib/$(platform)/$(package)-$(version)/$$i/* $(real_libdir)/$$i; \
+       done; 
+       @for i in $(datadirs); do \
+          echo $(INSTALL) `pwd`/share/$(package)-$(version)/$$i/* $(real_datadir)/$$i; \
+          $(INSTALL) `pwd`/share/$(package)-$(version)/$$i/* $(real_datadir)/$$i; \
+       done; 
+
+install-docs : install-info install-html install-dvi
+
+install-dirs-html:
+       $(MKDIRHIER) $(htmldir) 
+
+install-dirs-info:
+       $(MKDIRHIER) $(infodir) 
+
+install-dirs-dvi:
+       $(MKDIRHIER) $(dvidir) 
+
+install-docs : install-html install-info install-dvi 
+
+install-dvi: install-dirs-dvi
+       $(INSTALL) `pwd`/dvi/$(package)-$(version)/* $(dvidir)
+
+install-info: install-dirs-info
+       $(INSTALL) `pwd`/info/$(package)-$(version)/* $(infodir)
+
+install-html: install-dirs-html
+       $(INSTALL) `pwd`/html/$(package)-$(version)/* $(htmldir)
+
diff --git a/distrib/configure-bin.in b/distrib/configure-bin.in
new file mode 100644 (file)
index 0000000..88579d2
--- /dev/null
@@ -0,0 +1,133 @@
+dnl
+dnl Binary distribution configure script
+dnl
+#!/bin/sh
+#
+
+AC_INIT(Makefile.in)
+
+#
+# First off, what system are we running under?
+#
+AC_CANONICAL_SYSTEM
+
+dnl ** canonicalize platform names
+# Canonicali[sz]e the platform name
+TargetPlatform=`/bin/sh $srcdir/config.sub $target` || exit 1
+
+#
+# The following will be more difficult when we *are* cross-compiling.
+# Suitable names to slam in *_CPP are in platform.h.in.
+# We also record the architecture, vendor, and operating system (OS)
+# separately.
+case $HostPlatform in
+alpha-dec-osf[[1234]]*)
+       TargetPlatform=alpha-dec-osf1;;
+hppa1.1-hp-hpux*)
+       TargetPlatform=hppa1.1-hp-hpux;;
+i[[3456]]86-*-linuxaout*)
+       TargetPlatform=i386-unknown-linuxaout;;
+i[[3456]]86-*-linux*)
+       TargetPlatform=i386-unknown-linux;;
+i[[3456]]86-*-freebsd*)
+       TargetPlatform=i386-unknown-freebsd;;
+i[[3456]]86-*-netbsd*)
+       TargetPlatform=i386-unknown-netbsd;;
+i[[3456]]86-*-solaris2*)
+       TargetPlatform=i386-unknown-solaris2;;
+i[[3456]]86-*-cygwin32*)
+       TargetPlatform=i386-unknown-cygwin32;;
+m68k-next-nextstep2)
+       TargetPlatform=m68k-next-nextstep2;;
+m68k-next-nextstep3)
+       TargetPlatform=m68k-next-nextstep3;;
+i[[3456]]86-next-nextstep3)
+       TargetPlatform=i386-next-nextstep3
+m68k-sun-sunos4*)
+       TargetPlatform=m68k-sun-sunos4 #hack
+mips-dec-ultrix*)
+        TargetPlaformP=mips-dec-ultrix;;
+mips-sgi-irix*)
+       TargetPlatform=mips-sgi-irix;;
+powerpc-ibm-aix*)
+       TargetPlatform=powerpc-ibm-aix;;
+sparc-sun-sunos4*)
+       TargetPlatform=sparc-sun-sunos4;;
+sparc-sun-solaris2*)
+       TargetPlatform=sparc-sun-solaris2;;
+*)
+        echo "Unrecognised platform: $TargetPlatform"
+        exit 1
+        ;;
+esac
+echo "Which we'll canonicalise into: $TargetPlatform"
+
+platform=$TargetPlatform
+AC_SUBST(platform)
+
+AC_CHECK_PROG(PerlCmd,perl,$ac_dir/$ac_word)
+if test -z "$PerlCmd"; then
+    echo "You must install perl before you can continue"
+    echo "Perhaps it is already installed, but not in your PATH?"
+    exit 1
+else
+    $PerlCmd -v >conftest.out 2>&1
+    if egrep "version 4" conftest.out >/dev/null 2>&1; then
+        if egrep "Patch level: 35" conftest.out >/dev/null 2>&1; then
+            echo "
+************************************************************************
+Uh-oh...looks like you have Perl 4.035.
+
+Perl version 4.035 has a bug to do with recursion that will bite if
+you run the lit2texi script, when making Info files from
+literate files of various sorts.  Either use the current version
+(4.036), an older version (e.g., perl 4.019) or apply the patch in
+glafp-utils/perl-4.035-fixes to your 4.035 perl.
+************************************************************************
+"
+        fi
+    else
+       if egrep "version 5" conftest.out >/dev/null 2>&1; then
+           :
+       else
+           echo "I'm not sure if your version of perl will work,"
+           echo "but it's worth a shot, eh?"
+       fi
+    fi
+    rm -fr conftest*
+fi
+#
+dnl ** does #!.../perl work? (sometimes it's too long...)
+echo "checking if \`#!$PerlCmd' works in shell scripts"
+echo "#!$PerlCmd"'
+exit $1;
+' > conftest
+chmod u+x conftest
+(SHELL=/bin/sh; export SHELL; ./conftest 69 > /dev/null)
+if test $? -ne 69; then
+   echo "It does!"
+else
+   echo "It doesn't!  Perhaps \`#!$PerlCmd' is too long (often 32 characters max)"
+   exit 1
+fi
+rm -f conftest
+#
+dnl ** check if perl library is properly installed
+# (by seeing if a "do 'getopts.pl'" works...
+if $PerlCmd -e 'do "getopts.pl" || exit(1); exit(0);' > /dev/null 2>&1 ; then
+    :
+else
+    echo "I think your perl library is misinstalled."
+    echo "The following script did not work:"
+    echo '      do "getopts.pl" || exit(1); exit(0);'
+    exit 1
+fi
+
+dnl ** figure out how to do a BSD-ish install
+#
+AC_PROG_INSTALL
+#
+
+
+AC_OUTPUT(Makefile)
+
diff --git a/docs/Makefile b/docs/Makefile
new file mode 100644 (file)
index 0000000..851469d
--- /dev/null
@@ -0,0 +1,8 @@
+TOP = ..
+include $(TOP)/mk/boilerplate.mk
+
+DOC_SRCS = installing.lit release.lit
+
+SRC_TEXI2HTML_OPTS += -number -monolithic -invisible xbm
+
+include $(TOP)/mk/target.mk
diff --git a/docs/installing.lit b/docs/installing.lit
new file mode 100644 (file)
index 0000000..81bdeee
--- /dev/null
@@ -0,0 +1,1730 @@
+%      Building and installing the Glasgow Functional Programming Tools Suite
+%
+%                              Version 2.02
+%                              Feb 1997
+
+
+                       
+
+\begin{onlystandalone}
+\documentstyle[11pt,literate]{article}
+\begin{document}
+\title{Building and installing the Glasgow Functional Programming Tools Suite\\
+Version~2.02}
+\author{The GHC Team\\
+Department of Computing Science\\
+University of Glasgow\\
+Glasgow, Scotland\\
+G12 8QQ\\
+\\
+Email: glasgow-haskell-\{users,bugs\}\@dcs.gla.ac.uk}
+\maketitle
+\begin{rawlatex}
+\tableofcontents
+\end{rawlatex}
+\clearpage
+\end{onlystandalone}
+
+This guide is intended for people who want to install or modify
+programs from the Glasgow @fptools@ suite (as distinct from those
+who merely want to {\em run} them.
+
+The whole install-and-make system has been completely re-done
+between GHC 2.01 and 2.02, so it will be worth your while to re-read this guide
+even if you have done so before.
+
+\section{Getting the Glasgow @fptools@ suite}
+
+Building the Glasgow tools {\em can} be complicated, mostly because
+there are so many permutations of what/why/how, e.g., ``Build Happy
+with HBC, everything else with GHC, leave out profiling, and test it
+all on the `real' NoFib programs.''  Yeeps!
+
+Happily, such complications don't apply to most people.  A few common
+``strategies'' serve most purposes.  Pick one and proceed
+as suggested:
+
+\begin{description}
+\item[Binary distribution.]  If your only purpose is to install
+some of the @fptools@ suite then the easiest thing to do is to
+get a binary distribution.  In the binary distribution everything is
+pre-compiled for your particular machine architecture and operating
+system, so all you should have to do is install the binaries and libraries
+in suitable places.  {\em Need pointer to info about doing binary installation.}
+
+A binary distribution may not work for you for two reasons.  
+First, we may not have built the suite for the particular
+architecture/OS platform you want.  That may be due to lack of time and
+energy (in which case you can get a source distribution and build from it;
+see below).  Alternatively, it may be because we havn't yet ported the
+suite to your architecture, in which case you are considerably worse off.
+
+The second reason a binary distribution may not be what you want is
+if you want to read or modify the souce code.
+
+\item[Source distribution.]
+You have a supported
+platform, but (a)~you like the warm fuzzy feeling of compiling things
+yourself; (b)~you want to build something ``extra''---e.g., a set of
+libraries with strictness-analysis turned off; or (c)~you want to hack
+on GHC yourself.
+
+A source distribution contains complete sources for the @fptools@ suite.
+Not only that, but the more awkward machine-independent steps are done
+for you.  For example, if you don't have @flex@ you'll it convenient that
+the source distribution contains the result of running @flex@ on the
+lexical analyser specification.  If you don't want to alter the lexical
+analyser then this saves you having to find and install @flex@.
+You will still need a working version of GHC on your machine in order to 
+compile (most of) the sources, however.
+
+
+\item[Build GHC from intermediate C \tr{.hc} files:] 
+You need a working GHC to use a source distribution. What if you don't have a working GHC?
+Then you have no choice but to ``bootstrap'' up from the
+intermediate C (\tr{.hc}) files that we provide.
+Building GHC on an unsupported platform falls into this category.
+Please see \sectionref{booting-from-C}.
+
+NB: For GHC~2.01, bootstrapping from \tr{.hc} files means you will get
+an all-2.01 system---possibly unduly slow.  Building with GHC~0.29
+will get you a faster compiler...
+
+Once you have built GHC, you can build the other Glasgow tools with
+it.
+
+In theory, you can build GHC with another Haskell compiler (e.g.,
+HBC).  We havn't tried to do this for ages and it almost certainly
+doesn't work any more.
+
+\item[The CVS repository.]
+We make source distributions at the same time as binary distributions;
+i.e. infrequently.  They should, however, be pretty throughly tested.
+If you want more up-to-the minute (but less tested) source code then you 
+need to get access to our CVS repository.
+
+All the @fptools@ 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.
+
+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 so that you can build all the derived files
+from scratch.
+
+Giving you access to the repository entails some systems administration
+at our end; and we are a bit nervous about being submerged in bug reports
+about our current working copy (which is, by definition, in flux).  So
+we are a bit cautious about offering CVS access.  Feel free to ask though!
+\end{description} 
+
+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.
+
+
+%************************************************************************
+%*                                                                     *
+\section{Things to check before you start typing}
+%*                                                                     *
+%************************************************************************
+
+Here's a list of things to check before you get started.
+\begin{enumerate}
+\item
+\index{disk space needed}
+Disk space needed: About 30MB (five hamburgers' worth) of disk space
+for the most basic binary distribution of GHC; more for some
+platforms, e.g., Alphas.  An extra ``bundle'' (e.g., concurrent
+Haskell libraries) might take you to 8--10 hamburgers.
+
+You'll need over 100MB (say, 20 hamburgers' worth) if you need to
+build the basic stuff from scratch.
+
+I don't yet know the disk requirements for the non-GHC tools.
+
+All of the above are {\em estimates} of disk-space needs.
+
+\item
+Use an appropriate machine, compilers, and things.
+
+SPARC boxes and DEC Alphas running OSF/1 are fully supported.
+Linux, MIPS, and HP boxes are in pretty good shape.
+\Sectionref{port-info} gives the full run-down on ports or lack
+thereof.
+
+\item
+Be sure that the ``pre-supposed'' utilities are installed.
+Section~\ref{sect_std-utils} elaborates.
+
+\item
+If you have any problem when building or installing the Glasgow tools,
+please check the ``known pitfalls'' (\sectionref{build-pitfalls}).  If
+you feel there is still some shortcoming in our procedure or
+instructions, please report it.
+
+For GHC, please see the bug-reporting section of the User's guide
+(separate document), to maximise the usefulness of your report.
+
+If in doubt, please send a message to
+\tr{glasgow-haskell-bugs@dcs.gla.ac.uk}.
+\end{enumerate}
+
+
+%************************************************************************
+%*                                                                     *
+\section[port-info]{What machines the Glasgow tools, version~2.01, run on}
+\index{ports, GHC}
+\index{GHC ports}
+\index{supported platforms}
+\index{platforms, supported}
+%*                                                                     *
+%************************************************************************
+
+The main question is whether or not the Haskell compiler (GHC) runs on
+your platform.
+
+A ``platform'' is a
+architecture/manufacturer/operating-system combination,
+such as @sparc-sun-solaris2.5.1@.  Other common ones are
+@alpha-dec-osf2@, @hppa1.1-hp-hpux9@, @i386-unknown-linux@,
+@i386-unknown-solaris2@, @i386-unknown-freebsd@,
+@m68k-sun-sunos4@, @mips-sgi-irix5@,
+@sparc-sun-sunos4@, @sparc-sun-solaris2@.
+
+Bear in mind that certain ``bundles'', e.g. parallel Haskell, may not
+work on all machines for which basic Haskell compiling is supported.
+
+Some libraries may only work on a limited number of platforms; for
+example, a sockets library is of no use unless the operating system
+supports the underlying BSDisms.
+
+%************************************************************************
+%*                                                                     *
+\subsection{What platforms the Haskell compiler (GHC) runs on}
+%*                                                                     *
+%************************************************************************
+\index{fully-supported platforms}
+\index{native-code generator}
+\index{registerised ports}
+\index{unregisterised ports}
+
+The GHC hierarchy of Porting Goodness: (a)~Best is a native-code
+generator; (b)~next best is a ``registerised''
+port; (c)~the bare minimum is an ``unregisterised'' port.
+``Unregisterised'' is so terrible that we won't say more about it.
+
+We use Sun4s running SunOS~4.1.3 and Solaris 2.5, and DEC~Alphas
+running OSF/1~V2.0, so those are the ``fully-supported'' platforms,
+unsurprisingly.  Both have native-code generators, for quicker
+compilations.  The native-code generator for iX86 platforms (e.g.,
+Linux ELF) is {\em nearly} working; but is not turned on by default.
+
+Here's everything that's known about GHC ports, as of 2.01. We
+identify platforms by their ``canonical GNU-style'' names.
+
+Note that some ports are fussy about which GCC version you use; or
+require GAS; or ...
+
+\begin{description}
+%-------------------------------------------------------------------
+\item[\tr{alpha-dec-osf1}:]
+\index{alpha-dec-osf1: fully supported}
+(We have OSF/1 V2.0.) Fully supported, including native-code generator.
+We recommend GCC 2.6.x or later.
+
+%-------------------------------------------------------------------
+\item[\tr{sparc-sun-sunos4}:]
+\index{sparc-sun-sunos4: fully supported}
+Fully supported, including native-code generator.
+
+%-------------------------------------------------------------------
+\item[\tr{sparc-sun-solaris2}:]
+\index{sparc-sun-solaris2: fully supported}
+Fully supported, including native-code generator.  A couple of quirks,
+though: (a)~the profiling libraries are bizarrely huge; (b)~the
+default \tr{xargs} program is atrociously bad for building GHC
+libraries (see \sectionref{Pre-supposed} for details).
+
+%-------------------------------------------------------------------
+\item[HP-PA box running HP/UX 9.x:]
+\index{hppa1.1-hp-hpux: registerised port}
+Works registerised.  No native-code generator.
+For GCC, you're best off with one of the Utah releases of
+GCC~2.6.3 (`u3' or later), from \tr{jaguar.cs.utah.edu}.
+We think a straight GCC 2.7.x works, too.
+
+Concurrent/Parallel Haskell probably don't work (yet).
+\index{hppa1.1-hp-hpux: concurrent---no}
+\index{hppa1.1-hp-hpux: parallel---no}
+
+%-------------------------------------------------------------------
+\item[\tr{i386-*-linux} (PCs running Linux---ELF format):]
+\index{i386-*-linux: registerised port}
+GHC~2.01 works registerised.
+You {\em must} have GCC 2.7.x or later.
+The iX86 native-code generator is {\em nearly} there, but it
+isn't turned on by default.
+
+Profiling works, and Concurrent Haskell works.
+\index{i386-*-linux: profiling---yes}
+\index{i386-*-linux: concurrent---yes}
+Parallel Haskell probably works.
+\index{i386-*-linux: parallel---maybe}
+
+On old Linux a.out systems: should be the same.
+\index{i386-*-linuxaout: registerised port}
+
+%-------------------------------------------------------------------
+\item[\tr{i386-*-*bsd} (PCs running FreeBSD (and NetBSD?):]
+\index{i386-*-freebsd: registerised port}
+GHC~2.01 works registerised. Supports same set of bundles
+as the above.
+
+\index{i386-*-freebsd: profiling---yes}
+\index{i386-*-freebsd: concurrent---yes}
+\index{i386-*-freebsd: parallel---maybe}
+
+%-------------------------------------------------------------------
+\item[\tr{i386-unknown-cygwin32}:]
+\index{i386-unknown-cygwin32: fully supported}
+Fully supported under Win95/NT, including a native
+code generator. Requires the @cygwin32@ compatibility library and
+a healthy collection of GNU tools (i.e., gcc, GNU ld, bash etc.)
+Profiling works, so does Concurrent Haskell. 
+\index{i386-*-cygwin32: profiling---yes}
+\index{i386-*-cygwin32: concurrent---yes}
+
+% ToDo: more documentation on this is reqd here.
+
+%-------------------------------------------------------------------
+\item[\tr{mips-sgi-irix5}:]
+\index{mips-sgi-irix5: registerised port}
+GHC~2.01 works registerised (no native-code generator).
+I suspect any GCC~2.6.x (or later) is OK.  The GCC that I used
+was built with \tr{--with-gnu-as}; turns out that is important!
+
+Concurrent/Parallel Haskell probably don't work (yet).
+Profiling might work, but it is untested.
+\index{mips-sgi-irix5: concurrent---no}
+\index{mips-sgi-irix5: parallel---no}
+\index{mips-sgi-irix5: profiling---maybe}
+
+%-------------------------------------------------------------------
+\item[\tr{m68k-apple-macos7} (Mac, using MPW):]
+\index{m68k-apple-macos7: historically ported}
+Once upon a time, David Wright in Tasmania has actually
+gotten GHC to run on a Macintosh.  Ditto James Thomson here at Glasgow.
+You may be able to get Thomson's from here.  (Not sure that it will
+excite you to death, but...)
+
+No particularly recent GHC is known to work on a Mac.
+
+%-------------------------------------------------------------------
+\item[\tr{m68k-next-nextstep3}:]
+\index{m68k-next-nextstep3: historically ported}
+Carsten Schultz succeeded with a ``registerised'' port of GHC~0.19.
+There's probably a little bit-rot since then, but otherwise it should
+still be fine.  Had a report that things were basically OK at 0.22.
+
+Concurrent/Parallel Haskell probably won't work (yet).
+\index{m68k-next-nextstep3: concurrent---no}
+\index{m68k-next-nextstep3: parallel---no}
+
+%-------------------------------------------------------------------
+\item[\tr{m68k-sun-sunos4} (Sun3):]
+\index{m68k-sun-sunos4: registerised port}
+GHC~2.01 hasn't been tried on a Sun3.  GHC~0.26 worked registerised.
+No native-code generator.
+
+Concurrent/Parallel Haskell probably don't work (yet).
+\index{m68k-sun-sunos4: concurrent---no}
+\index{m68k-sun-sunos4: parallel---no}
+\end{description}
+
+%************************************************************************
+%*                                                                     *
+\subsection{What machines the other tools run on}
+%*                                                                     *
+%************************************************************************
+
+Unless you hear otherwise, the other tools work if GHC works.
+
+Haggis requires Concurrent Haskell to work.
+\index{Haggis, Concurrent Haskell}
+
+
+%************************************************************************
+%*                                                                     *
+\section[installing-bin-distrib]{Installing from binary distributions}
+\index{binary installations}
+\index{installation, of binaries}
+%*                                                                     *
+%************************************************************************
+
+Installing from binary distributions is easiest, and recommended!
+(Why binaries?  Because GHC is a Haskell compiler written in Haskell,
+so you've got to ``bootstrap'' it, somehow.  We provide
+machine-generated C-files-from-Haskell for this purpose, but it's
+really quite a pain to use them.  If you must build GHC from its
+sources, using a binary-distributed GHC to do so is a sensible way to
+proceed. For the other @fptools@ programs, many are written in Haskell,
+so binary distributions allow you to install them without having a Haskell compiler.)
+
+
+\subsection{Bundle structure}
+
+Binary distributions come in ``bundles,''\index{bundles of binary stuff}
+one bundle per file called \tr{<bundle>-<platform>.tar.gz}.
+(See Section~\ref{port-info} for what a platform is.)
+Suppose that you untar a binary-distribution bundle, thus:
+\begin{verbatim}
+  % cd /your/scratch/space
+  % gunzip < ghc-2.02-sun-sparc-solaris2.tar.gz | tar xvf -
+\end{verbatim}
+Then you should find a single directory, @fptools@, with the following
+structure:
+\begin{description}
+\item[@Makefile.in@] the raw material from which the @Makefile@ will be made (\sectionref{sect_install}).
+\item[@configure@] the configuration script (\sectionref{sect_install}).
+\item[@README@] Contains this file summary.
+\item[@INSTALL@] Contains this description of how to install the bundle.
+\item[@ANNOUNCE-<bundle>@] The announcement message for the bundle.
+\item[@NEWS-<bundle>@] release notes for the bundle -- a longer version of @ANNOUNCE@.
+\item[@bin/<platform>/@] contains platform-specific executable files to be invoked
+directly by the user.  These are the files that must end up in your path.
+\item[@lib/<platform>@] contains platform-specific support files for the installation.
+Typically there is a subdirectory for each @fptools@ project, whose name is
+the name of the project with its version number.
+For example, for GHC 2.02 there would be a sub-directory @ghc-2.02/@.
+
+These sub-directories have the following general structure:
+\begin{description}
+\item[@libHS.a@ etc:] supporting library archives.
+\item[@ghc-iface.prl@ etc:] support scripts.
+\item[@import/@] Interface files (@.hi@) for the prelude.
+\item[@include/@] A few C @#include@ files.
+\end{description}
+
+\item[@share/@] contains platform-independent support files for the installation.
+Again, there is a sub-directory for each @fptools@ project.
+
+\item[@info/@] contains Emacs info documentation files (one sub-directory per project).
+\item[@html/@] contains HTML documentation files (one sub-directory per project).
+\item[@man/@] contains Unix manual pages.
+\end{description}
+This structure is designed so that you can unpack multiple bundles (including
+ones from different releases or platforms) into a single @fptools@ directory:
+\begin{verbatim}
+  % cd /your/scratch/space
+  % gunzip < ghc-2.02-sun-sparc-solaris2.tar.gz | tar xvf -
+  % gunzip < happy-1.09-sun-sparc-sunos4.tar.gz | tar xvf -
+\end{verbatim}
+When you do multiple unpacks like this, the top level @Makefile@, @README@,
+and @INSTALL@ get overwritten each time.  That's fine -- they should be the same.
+Likewise, the @ANNOUNCE-<bundle>@ and @NEWS-<bundle>@ files will be duplicated
+across multiple platforms, so they will be harmlessly overwritten when you do 
+multiple unpacks.
+Finally, the @share/@ stuff will get harmlessly overwritten when you do multiple
+unpacks for one bundle on different platforms.
+
+\subsection[sect_install]{Installing}
+
+OK, so let's assume that you have unpacked your chosen bundles into
+a scratch directory @fptools@. What next? Well, you will at least need
+to run the @configure@ script by changing your directory to @fptools@.
+That should convert @Makefile.in@ to @Makefile@.
+
+You can now either start using the tools {\em in-situ} without going
+through any installation process, just type @make config@ to set the
+tools up for this (you have to be in the @fptools@ directory). You'll
+also want to add the path which @make@ echoes to your @PATH@
+environment variable. This option is useful if you simply want to try
+out the package or you don't have the necessary priviledges (or
+inclination) to properly install the tools locally. Note that if you
+do decide to install the package `properly' at a later date, you have
+to go through the installation steps that 
+follows.
+
+To install an @fptools@ package, you'll have to do the following:
+
+\begin{enumerate}
+\item Edit the @Makefile@ and check the settings of the following variables:
+\begin{description}
+\item[@platform@] the platform you are going to install for.
+\item[@bindir@] the directory in which to install user-invokable binaries.
+\item[@libdir@] the directory in which to install platform-dependent support files.
+\item[@datadir@] the directory in which to install platform-independent support files. 
+\item[@infodir@] the directory in which to install Emacs info files.
+\item[@htmldir@] the directory in which to install HTML documentation.
+\item[@dvidir@] the directory in which to install DVI documentation.
+\end{description}
+The values for these variables can be set through invocation of the
+@configure@ script that comes with the distribution, but doing an optical
+diff to see if the values match your expectations is always a Good Idea. 
+
+{\em Instead of running @configure@, it is perfectly OK to copy
+@Makefile.in@ to @Makefile@ and set all these variables directly
+yourself.  But do it right!}
+
+\item Run @make install@.  This {\em  should} works with ordinary Unix
+@make@ -- no need for fancy stuff like GNU @make@. 
+
+\item \tr{rehash} (t?csh users), so your shell will see the new stuff
+in your bin directory.
+
+\item
+Once done, test your ``installation'' as suggested in
+\sectionref{GHC_test}.  Be sure to use a \tr{-v} option, so you
+can see exactly what pathnames it's using.
+
+If things don't work as expected, check the list of know pitfalls
+\sectionref{build-pitfalls}. 
+\end{enumerate}
+
+When installing the user-invokable binaries, this installation
+procedure will install, say, @GHC@ version 2.02 as @ghc-2.02@.  It
+will also make a link (in the binary installation directory) from
+@ghc@ to @ghc-2.02@.  If you install multiple versions of GHC then the
+last one ``wins'', and ``@ghc@'' will invoke the last one installed.
+You can change this manually if you want.  But regardless, @ghc-2.02@
+should always invoke @GHC@ version 2.02.
+
+\subsection{What bundles there are}
+
+There are plenty of ``non-basic'' GHC bundles.  The files for them are
+called \tr{ghc-2.01-<bundle>-<platform>.tar.gz}, where the
+\tr{<platform>} is as above, and \tr{<bundle>} is one of these:
+\begin{description}
+\item[\tr{prof}:]  Profiling with cost-centres.  You probably want this.
+
+\item[\tr{conc}:] Concurrent Haskell features.  You may want this.
+
+\item[\tr{par}:] Parallel Haskell features (sits on top of PVM).
+You'll want this if you're into that kind of thing.
+
+\item[\tr{gran}:] The ``GranSim'' parallel-Haskell simulator
+(hmm... mainly for implementors).
+
+\item[\tr{ticky}:] ``Ticky-ticky'' profiling; very detailed
+information about ``what happened when I ran this program''---really
+for implementors.
+
+\item[\tr{prof-conc}:] Cost-centre profiling for Concurrent Haskell.
+
+\item[\tr{prof-ticky}:]  Ticky-ticky profiling for Concurrent Haskell.
+\end{description}
+
+One likely scenario is that you will grab {\em three} binary
+bundles---basic, profiling, and concurrent. 
+
+
+
+%************************************************************************
+%*                                                                     *
+\subsection[GHC_test]{Test that GHC seems to be working}
+\index{testing a new GHC}
+%*                                                                     *
+%************************************************************************
+
+The way to do this is, of course, to compile and run {\em this} program
+(in a file \tr{Main.hs}):
+\begin{verbatim}
+main = putStr "Hello, world!\n"
+\end{verbatim}
+
+First, give yourself a convenient way to execute the driver script
+\tr{ghc/driver/ghc}, perhaps something like...
+\begin{verbatim}
+% ln -s /local/src/ghc-2.01/ghc/driver/ghc ~/bin/alpha/ghc
+% rehash
+\end{verbatim}
+
+Compile the program, using the \tr{-v} (verbose) flag to verify that
+libraries, etc., are being found properly:
+\begin{verbatim}
+% ghc -v -o hello Main.hs
+\end{verbatim}
+
+Now run it:
+\begin{verbatim}
+% ./hello
+Hello, world!
+\end{verbatim}
+
+Some simple-but-profitable tests are to compile and run the
+notorious \tr{nfib} program, using different numeric types.  Start
+with \tr{nfib :: Int -> Int}, and then try \tr{Integer}, \tr{Float},
+\tr{Double}, \tr{Rational} and maybe \tr{Complex Float}.  Code
+for this is distributed in \tr{ghc/misc/examples/nfib/}.
+
+For more information on how to ``drive'' GHC,
+either do \tr{ghc -help} or consult the User's Guide (distributed in
+\tr{ghc/docs/users_guide}).
+
+
+%************************************************************************
+%*                                                                     *
+\section[Pre-supposed]{Installing pre-supposed utilities}
+\index{pre-supposed utilities}
+\index{utilities, pre-supposed}
+%*                                                                     *
+%************************************************************************
+
+\label{sect_std-utils}
+
+Here are the gory details about some utility programs you may need;
+\tr{perl} and \tr{gcc} are the only important ones. (PVM is important
+if you're going for Parallel Haskell.) The \tr{configure} script will
+tell you if you are missing something.
+
+\begin{description}
+\item[Perl:]
+\index{pre-supposed: Perl}
+\index{Perl, pre-supposed}
+{\em You have to have Perl to proceed!} Perl is a language quite good
+for doing shell-scripty tasks that involve lots of text processing.
+It is pretty easy to install.
+
+(Perl~5 is the current version; GHC might be Perl~4 friendly, we've
+run into some trouble with our scripts on \tr{alpha-dec-osf\{1,2\}}
+using Perl~4 (patchlevel 36))
+
+Perl should be put somewhere so that it can be invoked by the \tr{#!}
+script-invoking mechanism. (I believe \tr{/usr/bin/perl} is preferred;
+we use \tr{/usr/local/bin/perl} at Glasgow.)  The full pathname should
+be less than 32 characters long.
+
+\item[GNU C (\tr{gcc}):]
+\index{pre-supposed: GCC (GNU C compiler)}
+\index{GCC (GNU C compiler), pre-supposed}
+The current version is 2.7.2.  It has a bug that it ticked if you
+compile the @gmp@ library without the @-O@ flag.  So the Makefile in
+there has the @-O@ flag switched on!  Otherwise, 2.7.2 has no problems that we know of.
+
+If your GCC dies with ``internal error'' on some GHC source file,
+please let us know, so we can report it and get things improved.
+(Exception: on \tr{iX86} boxes---you may need to fiddle with GHC's
+\tr{-monly-N-regs} option; ask if confused...)
+
+\item[PVM version 3:]
+\index{pre-supposed: PVM3 (Parallel Virtual Machine)}
+\index{PVM3 (Parallel Virtual Machine), pre-supposed}
+PVM is the Parallel Virtual Machine on which Parallel Haskell programs
+run.  (You only need this if you plan to run Parallel Haskell.  
+Concurent Haskell, which runs concurrent threads on a uniprocessor)
+doesn't need it.)
+Underneath PVM, you can have (for example) a network of
+workstations (slow) or a multiprocessor box (faster).
+
+The current version of PVM is 3.3.11; we use 3.3.7.  It is readily available on
+the net; I think I got it from \tr{research.att.com}, in \tr{netlib}.
+
+A PVM installation is slightly quirky, but easy to do.  Just follow
+the \tr{Readme} instructions.
+
+\item[\tr{xargs} on Solaris2:]
+\index{xargs, presupposed (Solaris only)}
+\index{Solaris: alternative xargs}
+The GHC libraries are put together with something like:
+\begin{verbatim}
+find bunch-of-dirs -name '*.o' -print | xargs ar q ...
+\end{verbatim}
+Unfortunately the Solaris \tr{xargs} (the shell-script equivalent
+of \tr{map}) only ``bites off'' the \tr{.o} files a few at a
+time---with near-infinite rebuilding of the symbol table in
+the \tr{.a} file.
+
+The best solution is to install a sane \tr{xargs} from the GNU
+findutils distribution.  You can unpack, build, and install the GNU
+version in the time the Solaris \tr{xargs} mangles just one GHC
+library.
+
+\item[\tr{bash} (Parallel Haskell only):]
+\index{bash, presupposed (Parallel Haskell only)}
+Sadly, the \tr{gr2ps} script, used to convert ``parallelism profiles''
+to PostScript, is written in Bash (GNU's Bourne Again shell).
+This bug will be fixed (someday).
+
+\item[Makeindex:]
+\index{pre-supposed: makeindex}
+\index{makeindex, pre-supposed}
+You won't need this unless you are re-making our documents.  Makeindex
+normally comes with a \TeX{} distribution, but if not, we can provide
+the latest and greatest.
+
+\item[Tgrind:]
+\index{pre-supposed: tgrind}
+\index{tgrind, pre-supposed}
+This is required only if you remake lots of our documents {\em and}
+you use the \tr{-t tgrind} option with \tr{lit2latex} (also literate
+programming), to do ``fancy'' typesetting of your code.  {\em
+Unlikely.}
+
+\item[Flex:]
+\index{pre-supposed: flex}
+\index{flex, pre-supposed}
+This is a quite-a-bit-better-than-Lex lexer.  Used in the
+literate-programming stuff.  You won't need it unless you're hacking
+on some of our more obscure stuff.
+
+\item[Yacc:]
+\index{pre-supposed: non-worthless Yacc}
+\index{Yacc, pre-supposed}
+If you mess with the Haskell parser, you'll need a Yacc that can cope.
+The unbundled \tr{/usr/lang/yacc} is OK; the GNU \tr{bison} is OK;
+Berkeley yacc, \tr{byacc}, is not OK.
+
+\item[@sed@]
+\index{pre-supposed: sed}
+\index{sed, pre-supposed}
+You need a working @sed@ if you are going to build from sources.
+The build-configuration stuff needs it.
+GNU sed version 2.0.4 is no good! It has a bug in it that is tickled by the
+build-configuration.  2.0.5 is ok. Others are probably ok too
+(assuming we don't create too elaborate configure scripts..)
+\end{description}
+
+Two @fptools@ projects are worth a quick note at this point, because
+they are useful for all the others:
+\begin{itemize}
+\item @glafp-utils@ contains several small utilities 
+which aren't particularly Glasgow-ish, but which are sometimes not
+available on Unix systems. 
+
+\item @literate@ contains the Glasgow-built tools for generating
+documentation.  (The unoriginal idea is to be able to generate @latex@, @info@,
+and program code from a single source file.) To get anywhere you'll
+need at least @lit2pgm@, either from the @literate@ project, or
+because it's already installed on your system. 
+\end{itemize}
+
+
+
+
+%************************************************************************
+%*                                                                     *
+\section{Building from source}
+%*                                                                     *
+%************************************************************************
+
+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.
+
+Gingerly, you type @make all@.  Wrong already!
+
+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.
+
+\subsection{Your source tree}
+
+The source code is held in your {\em source tree}.
+The root directory of your source tree {\em must}
+contain the following directories and files:
+\begin{itemize}
+\item @Makefile@: the root Makefile.
+\item @mk/@: the directory that contains the
+main Makefile code, shared by all the
+@fptools@ software.
+\item @configure.in@: a file that tells the GNU configuration 
+tools what @fptools@ needs to know about the host platform and
+operating system. 
+\end{itemize}
+All the other directories are individual {\em projects} of the
+@fptools@ system --- for example, the Glasgow Haskell Compiler (@ghc@),
+the Happy parser generator (@happy@), the @nofib@ benchmark stuite, 
+and so on.
+You can have zero or more of these.  Needless to say, some of them
+are needed to build others.  For example, you need @happy@ to build
+@ghc@.  You can either grab @happy@ too, or else you can use
+an version of @happy@ that's already installed on your system, or 
+grab a binary distribution of @happy@ and install it.
+
+The important thing to remember is that even if you want only
+one project (@happy@, say), you must have a source tree
+whose root directory contains @Makefile@, 
+@mk/@, @configure.in@, and the project(s) you 
+want (@happy/@ in this case).  You cannot get by with 
+just the @happy/@ directory.
+
+\subsection{Build trees}
+
+While you can build a system in the source tree, we don't recommend it.
+We often want to build multiple versions of our software
+for different architectures, or with different options (e.g. profiling).
+It's very desirable to share a single copy of the source code among
+all these builds.
+
+So for every source tree we have zero or more {\em build trees}.
+Each build tree is initially an exact copy of the source tree,
+except that each file is a symbolic link to the source file, 
+rather than being a copy of the source file.  There are ``standard''
+Unix utilities that make such copies, so standard that they go by
+different names: @lndir@, @mkshadowdir@ are two.  
+
+The build
+tree does not need to be anywhere near the source tree in the
+file system.
+Indeed, one advantage of separating the build tree from the source
+is that the build tree can be placed in a non-backed-up partition,
+saving your systems support people from backing up untold megabytes 
+of easily-regenerated, and rapidly-changing, gubbins.  The golden rule is 
+that (with a single exception -- Section~\ref{sect_build-config})
+{\em absolutely
+everything in the build tree is either a symbolic link to the source
+tree, or else is mechanically generated}.  It should be perfectly 
+OK for your build tree to vanish overnight; an hour or two compiling 
+and you're on the road again.
+
+You need to be a bit careful, though, that any new files you create
+(if you do any development work) are in the source tree, not a build tree!
+
+Like the source tree, the top level of your build tree must (a linked copy of)
+the root directory of the @fptools@ suite.
+Inside Makefiles, the root of your build tree is called @$(FPTOOLS_TOP)@.
+In the rest of this document path names are relative to @$(FPTOOLS_TOP)@ 
+unless otherwise stated.  For example, the file @ghc/mk/target.mk@ is
+actually @$(FPTOOLS_TOP)/ghc/mk/target.mk@.
+
+
+\subsection{Getting the build you want}
+\label{sect_build-config}
+
+When you build @fptools@ you will be compiling code 
+on a particular {\em host platform},
+to run on a particular {\em target platform} (usually the same
+as the host platform)\index{platform}.   The difficulty is 
+that there are minor differences between different platforms;
+minor, but enough that the code needs to be a bit different
+for each.  There are some big differences too: for
+a different architecture we need to build GHC with a different
+native-code generator.
+
+There are also knobs you can turn to control how the @fptools@
+software is built.  For example, you might want to build GHC
+optimised (so that it runs fast) or unoptimised (so that you can
+compile it fast after you've modified it.
+Or, you might want to compile it with debugging on (so that
+extra consistency-checking code gets included) or off.  And so on.
+
+All of this stuff is called the {\em configuration} of your build.
+You set the configuration using an exciting two-step process.
+\begin{description}
+\item[Step 1: system configuration.]  This is easy, provided you
+have the programs mentioned in Section~\ref{sect_std-utils}.  Just
+@cd@ to @$(FPTOOLS)@ and say @gmake configure@.  This 
+command does three things:
+\begin{itemize}
+\item
+It runs a GNU program called @autoconf@, which
+converts @$(FPTOOLS)/configure.in@ to a shell script 
+called @$(FPTOOLS)/configure@.
+
+This step is completely platform-independent; it just means
+that the human-written file (@configure.in@) can be short, although
+the resulting shell script, @configure@ is long. 
+
+\item It runs a second GNU program called @autoheader@, which converts
+@$(FPTOOLS)/configure.in@ to @$(FPTOOLS)/mk/config.h.in@.
+Again, this step is platform-independent.
+
+\item It then runs the newly-created @configure@ script.  @configure@'s mission
+is to scurry round your computer working out what architecture it has,
+what operating system, whether it has the @vfork@ system call,
+where @yacc@ is kept, whether @gcc@ is available, where various
+obscure @#include@ files are, whether it's a leap year, and
+what the systems manager had for lunch.
+It communicates these snippets of information in two ways:
+\begin{itemize}
+\item It translates @mk/config.mk.in@ to @mk/config.mk@,
+substituting for things between ``{\tt @@@@}'' brackets.  So,
+``{\tt @@HaveGcc@@}'' will be replaced by ``@YES@'' or ``@NO@''
+depending on what @configure@ finds.
+@mk/config.mk@ is included by every Makefile (directly or indirectly),
+so the configuration information is thereby communicated to
+all Makefiles.
+
+\item It translates @mk/config.h.in@ to @mk/config.h@.
+The latter is @#include@d by various C programs, which
+can thereby make use of configuration information.
+\end{itemize}
+\end{itemize}
+
+
+\item[Step 2: build configuration.] Next, you say how this build
+of @fptools@ is to differ from the standard defaults by creating a new 
+file @mk/build.mk@
+{\em in the build tree}.  This file is the one and only
+file you edit in the build tree, precisely because it says how
+this build differs from the source.  (Just in case your build tree
+does die, you might want to keep a private directory of @build.mk@ files,
+and use a symbolic link in each build tree to point to the appropriate one.)
+So @mk/build.mk@ never
+exists in the source tree --- you create one in each build tree
+from the template.  We'll discuss what to put in it shortly.
+\end{description}
+And that's it for configuration. Simple, eh?
+
+What do you put in your build-specific configuration
+file @mk/build.mk@?  {\em For almost all purposes all you will do is
+put make variable definitions that override those in @mk/config.mk.in@}.
+The whole point of @mk/config.mk.in@ --- and its derived 
+counterpart @mk/config.mk@ --- is to define the build configuration. It is heavily
+commented, as you will see if you look at it.
+So generally, what you do is edit @mk/config.mk.in@ (read-only), and add definitions
+in @mk/build.mk@ that override any of the @config.mk@ definitions that you
+want to change.  (The override occurs because the main boilerplate file,
+@mk/boilerplate.mk@, includes @build.mk@ after @config.mk@.)
+
+For example, @config.mk.in@ contains the definition:
+\begin{verbatim}
+  SUBDIRS = glafp-utils literate ghc
+\end{verbatim}
+The accompanying comment explains that this is the list of enabled
+projects; that is, if (after configuring) you type @gmake all@
+in @FPTOOLS_TOP@ three specified projects will be made.
+If you want to add @happy@, you can add this line to @build.mk@:
+\begin{verbatim}
+  SUBDIRS += happy
+\end{verbatim}
+or, if you prefer,
+\begin{verbatim}
+  SUBDIRS = glafp-utils literate ghc happy
+\end{verbatim}
+(GNU @make@ allows existing definitions to have new text appended using
+the ``@+=@'' operator, which is quite a convenient feature.)
+
+When reading @config.mk.in@, remember that anything between ``{\tt @@...@@}'' signs
+is going to be substituted by @configure@ later.  You {\em can} override
+the resulting definition if you want, 
+but you need to be a bit surer what you are doing.
+For example, there's a line that says:
+\begin{verbatim}
+  YACC = @Yacc@
+\end{verbatim}
+This defines the Make variables @YACC@ to the pathname for a Yacc that
+@configure@ finds somewhere.  If you have your own pet Yacc you want
+to use instead, that's fine. Just add this line to @mk/build.mk@:
+\begin{verbatim}
+  YACC = myyacc
+\end{verbatim}
+You do not {\em have} to have a @mk/build.mk@ file at all; if you don't,
+you'll get all the default settings from @mk/config.mk.in@.
+
+
+\subsection{The story so far}
+
+Let's summarise the steps you need to carry to get yourself
+a fully-configured build tree from scratch.
+
+\begin{enumerate}
+\item Get your source tree from somewhere (CVS repository or
+source distribution).  Say you call the root directory
+@myfptools@ (it does not have to be called @fptools@).
+
+\item Use @lndir@ or @mkshadowdir@ to create a build tree.
+\begin{verbatim}
+    cd myfptools
+    mkshadowdir . /scratch/joe-bloggs/myfptools-sun4
+\end{verbatim}
+You probably want to give the build tree a name that
+suggests its main defining characteristic (in your mind at least),
+in case you later add others.
+
+\item Change directory to the build tree.  Everything is going
+to happen there now.
+\begin{verbatim}
+    cd /scratch/joe-bloggs/myfptools-sun4
+\end{verbatim}
+\item Do system configuration:
+\begin{verbatim}
+    gmake configure
+\end{verbatim}
+\item Create the file @mk/build.mk@, 
+adding definitions for your desired configuration options.
+\begin{verbatim}
+    emacs mk/build.mk
+\end{verbatim}
+\end{enumerate}
+You can make subsequent changes to @mk/build.mk@ as often 
+as you like.  You do not have to run any further configuration 
+programs to make these changes take effect.
+In theory you should, however, say @gmake clean@, @gmake all@,
+because configuration option changes could affect anything --- but in practice you are likely to know what's affected.
+
+\subsection{Making things}
+
+At this point you have made yourself a fully-configured build tree,
+so you are ready to start building real things.
+
+The first thing you need to know is that 
+{\em you must use GNU @make@, usually called @gmake@, not standard Unix @make@}.
+If you use standard Unix @make@ you will get all sorts of error messages
+(but no damage) because the @fptools@ @Makefiles@ use GNU @make@'s facilities
+extensively.
+
+\subsection[sect_standard-targets]{Standard targets}
+
+In any directory you should be able to make the following:
+\begin{description}
+\item[@boot@:] does the one-off preparation required to get ready
+for the real work.  Notably, it does @gmake depend@ in all directories
+that contain programs.  But @boot@ does more.  For example, you can't
+do @gmake depend@ in a directory of C program until you have converted
+the literate @.lh@ header files into standard @.h@ header files.  Similarly, you convert a literate file to illiterate
+form until you have built the @literate@ tools.  @boot@ takes care of these
+inter-directory dependencies.
+
+You should say @gmake boot@ right after configuring your build tree.
+
+\item[@all@:] makes all the final target(s) for this Makefile.
+Depending on which directory you are in a ``final target''
+may be an executable program, a library archive, a shell script,
+or a Postscript file.
+Typing @gmake@ alone is generally the same as typing @gmake all@.
+
+\item[@install@:] installs the things built by @all@.  Where does it
+install them?  That is specified by @mk/config.mk.in@; you can 
+override it in @mk/build.mk@.
+
+\item[@uninstall@:] reverses the effect of @install@.
+
+\item[@clean@:] remove all easily-rebuilt files.
+
+\item[@veryclean@:] remove all files that can be rebuilt at all.
+There's a danger here that you may remove a file that needs a more
+obscure 
+utility to rebuild it (especially if you started from a source
+distribution).
+
+\item[@check@:] run the test suite.
+\end{description}
+All of these standard targets
+automatically recurse into sub-directories.
+Certain other standard targets do not:
+\begin{description}
+\item[@configure@:] is only available in the root directory @$(FPTOOLS)@;
+it has been discussed in Section~\ref{sect_build-config}.
+
+\item[@depend@:] make a @.depend@ file in each directory that needs
+it. This @.depend@ file contains mechanically-generated dependency
+information; for example, suppose a directory contains a Haskell 
+source module @Foo.lhs@ which imports another module @Baz@.
+Then the generated @.depend@ file will contain the dependency:
+\begin{verbatim}
+  Foo.o : Baz.hi
+\end{verbatim}
+which says that the object file @Foo.o@ depends on the interface
+file @Baz.hi@ generated by compiling module @Baz@.
+The @.depend@ file is automatically included by every Makefile.
+
+\item[@binary-dist@:] make a binary distribution.
+
+\item[@dist@:] make a source distribution.
+\end{description}
+
+\subsection{Other targets}
+
+Most @Makefiles@ have targets other than these.  You can find
+this out by looking in the @Makefile@ itself.
+
+
+
+
+%************************************************************************
+%*                                                                     *
+\section{The @Makefile@ architecture}
+%*                                                                     *
+%************************************************************************
+
+
+@make@ is great if everything works --- you type @gmake install@ and, lo,
+the right things get compiled and installed in the right places.
+Our goal is to make this happen often, but somehow it often doesn't;
+instead
+some wierd error message eventually emerges from the bowels of a directory
+you didn't know existed.
+
+The purpose of this section is to give you a road-map to help you figure
+out what is going right and what is going wrong.
+
+\subsection{A small project}
+
+To get started, let us look at the @Makefile@ for an imaginary small
+@fptools@ project, @small@.  Each project in @fptools@ has its own
+directory in @FPTOOLS_TOP@, so the @small@ project will have its own
+directory @FPOOLS_TOP/small/@.  Inside the @small/@ directory there
+will be a @Makefile@, looking something like this:
+\begin{verbatim}
+  #    Makefile for fptools project "small"
+
+  TOP = ..
+  include $(TOP)/mk/boilerplate.mk
+
+  SRCS = $(wildcard *.lhs) $(wildcard *.c)
+  HS_PROG = small
+
+  include $(TOP)/target.mk
+\end{verbatim}
+This @Makefile@ has three sections:
+\begin{enumerate}
+\item The first section includes\footnote{One of the
+most important features of GNU @make@ that we use is the ability
+for a @Makefile@ to include another named file, very like @cpp@'s @#include@ directive.}
+a file of ``boilerplate'' code from the
+level above (which in this case will be @FPTOOLS_TOP/mk/boilerplate.mk@).
+As its name suggests, @boilerplate.mk@ consists of a large quantity of standard
+@Makefile@ code.  We discuss this boilerplate in more detail in Section~\ref{sect_boiler}.
+
+Before the @include@ statement, you must define the @make@ variable
+@TOP@ to be the directory containing the @mk@ directory in which
+the @boilerplate.mk@ file is.
+It is {\em not} OK to simply say
+\begin{verbatim}
+  include ../mk/boilerplate.mk # NO NO NO
+\end{verbatim}
+Why?  Because the @boilerplate.mk@ file needs to know where it is,
+so that it can, in turn, @include@ other files.
+(Unfortunately, when an @include@d file does an
+@include@, the filename is treated
+relative to the directory in which @gmake@ is being run, not
+the directory in which the @included@ sits.) 
+In general,
+{\em every file @foo.mk@ 
+assumes that @$(TOP)/mk/foo.mk@ refers to itself.}  
+It is up to the @Makefile@ doing the @include@ to ensure this
+is the case.
+
+Files intended for inclusion in other @Makefile@s are written to have
+the following property:
+{\em after @foo.mk@ is @include@d, it leaves @TOP@ containing the same
+value as it had just before the @include@ statement}.
+In our example, this invariant guarantees that the @include@
+for @target.mk@ will look in the same directory as that for
+@boilerplate.mk@.
+
+\item The second section 
+defines the following standard @make@ variables: @SRCS@ (the source files from
+which is to be built), and @HS_PROG@ (the
+executable binary to be built).  
+We will discuss in more detail what the ``standard variables'' are,
+and how they affect what happens, in Section~\ref{sect_targets}.
+
+The definition for @SRCS@ uses the useful GNU @make@
+construct @$(wildcard@~$pat$@)@, which expands to a list of all the
+files matching the pattern $pat$ in the current directory.
+In this example, @SRCS@ is set to the list of all the @.lhs@ and @.c@ files
+in the directory.  (Let's suppose there is one of each, @Foo.lhs@
+and @Baz.c@.)
+
+\item The last section includes a second file of standard code,
+called @target.mk@.  It contains the rules that tell @gmake@
+how to make the standard targets
+(Section~\ref{sect_standard-targets}).
+Why, you ask, can't this standard code
+be part of @boilerplate.mk@?  Good question.
+We discuss the reason later, in Section~\ref{sect_boiler-arch}.
+
+You do not {\em have} to @include@ the @target.mk@ file.  Instead,
+you can write rules of your own for all the standard targets.
+Usually, though, you will find quite a big payoff from using
+the canned rules in
+@target.mk@; the price tag is that you have to understand
+what canned rules get enabled, and what they do (Section~\ref{sect_targets}).
+\end{enumerate}
+
+In our example @Makefile@, most of the work is done 
+by the two @include@d files.  When you say @gmake all@,
+the following things happen:
+\begin{itemize}
+\item @gmake@ figures out that the object files are @Foo.o@ and @Baz.o@.
+\item It uses a boilerplate pattern rule to compile 
+@Foo.lhs@ to @Foo.o@ using
+a Haskell compiler.  (Which one?  That is set in the build configuration.)
+\item It uses another standard pattern rule to compile @Baz.c@ to @Baz.o@,
+using a C compiler.  (Ditto.)
+\item It links the resulting @.o@ files together to make @small@,
+using the Haskell compiler to do the link step.  (Why not use @ld@?  Because
+the Haskell compiler knows what standard librarise to link in.  How did @gmake@
+know to use the Haskell compiler to do the link, rather than the C compiler?
+Because we set the variable @HS_PROG@ rather than @C_PROG@.)
+\end{itemize}
+All @Makefile@s should follow the above three-section format.
+
+\subsection{A larger project}
+
+Larger projects are usually structured into a nummber of sub-directories,
+each of which has its own @Makefile@.  (In very large projects, this
+sub-structure might be iterated recursively, though that is rare.)
+To give you the idea, here's part of the directory structure for
+the (rather large) @ghc@ project:
+\begin{verbatim}
+  $(FPTOOLS_TOP)/ghc/
+    Makefile
+
+    mk/
+      boilerplate.mk
+      rules.mk
+
+    docs/
+      Makefile
+      ...source files for documentation...
+
+    driver/
+      Makefile
+      ...source files for driver...
+
+    compiler/
+      Makefile
+      parser/...source files for parser...
+      renamer/...source files for renamer...
+      ...etc...
+\end{verbatim}
+The sub-directories @docs@, @driver@, @compiler@, and so on, each contains
+a sub-component of @ghc@, and each has its own @Makefile@.
+There must also be a @Makefile@ in @$(FPTOOLS_TOP)/ghc@.
+It does most of its work by recursively invoking @gmake@
+on the @Makefile@s in the sub-directories.
+We say that @ghc/Makefile@ is a {\em non-leaf @Makefile@},
+because it does little except organise its children, while the @Makefile@s
+in the sub-directories are all {\em leaf @Makefile@s}.  (In principle
+the sub-directories might themselves contain a non-leaf @Makefile@ and
+several sub-sub-directories, but that does not happen in @ghc@.)
+
+The @Makefile@ in @ghc/compiler@ is considered a leaf @Makefile@ even
+though the @ghc/compiler@ has sub-directories, because these sub-directories
+do not themselves have @Makefile@ in them.  They are just used to structure
+the collection of modules that make up @ghc@, but all are managed by the
+single @Makefile@ in @ghc/compiler@.
+
+You will notice that @ghc/@ also contains a directory @ghc/mk/@.
+It contains @ghc@-specific @Makefile@ boilerplate code.
+More precisely:
+\begin{itemize}
+\item @ghc/mk/boilerplate.mk@ is included at the top of @ghc/Makefile@,
+and of all the leaf @Makefile@s in the sub-directories.
+It in turn @include@s the main boilerplate file @mk/boilerplate.mk@.
+
+\item @ghc/mk/target.mk@ is @include@d at the bottom of @ghc/Makefile@,
+and of all the leaf @Makefiles@ in the sub-directories.
+It in turn @include@s the file @mk/target.mk@.
+\end{itemize}
+So these two files are the place to look for @ghc@-wide customisation
+of the standard boilerplate.
+
+
+
+\subsection{Boilerplate architecture}
+\label{sect_boiler-arch}
+
+Every @Makefile@ includes a @boilerplate.mk@ file at the top,
+and @target.mk@ file at the bottom.  In this section we discuss
+what is in these files, and why there have to be two of them.
+In general:
+\begin{itemize}
+\item @boilerplate.mk@ consists of:
+\begin{itemize}
+\item {\em Definitions of millions of @make@ variables} that collectively
+specify the build configuration.  Examples: @HC_OPTS@, the options to
+feed to the Haskell compiler; @NoFibSubDirs@, the sub-directories to
+enable within the @nofib@ project; @GhcWithHc@, the name of the
+Haskell compiler to use when compiling @GHC@ in the @ghc@ project.
+\item {\em Standard pattern rules} that tell @gmake@ how to construct
+one file from another.  
+\end{itemize}
+@boilerplate.mk@ needs to be @include@d at the {\em top} of each 
+@Makefile@, so that the 
+user can replace the boilerplate definitions or pattern rules by simply 
+giving a new definition or pattern rule in the @Makefile@.  @gmake@ simply
+takes the last definition as the definitive one.
+
+Instead of {\em replacing} boilerplate definitions, it is also quite
+common to {\em augment} them. For example, a @Makefile@ might say:
+\begin{verbatim}
+  SRC_HC_OPTS += -O
+\end{verbatim}
+thereby adding ``@-O@'' to the end of @SRC_HC_OPTS@. 
+
+\item @target.mk@ contains @make@ rules for the standard targets described
+in Section~\ref{sect_standard-targets}.
+These rules are selectively included, depending on the setting of
+certain @make@ variables.  These variables are usually set in the middle
+section of the @Makefile@ between the two @include@s.
+
+@target.mk@ must be included at the end (rather than being part of @boilerplate.mk@)
+for several tiresome reasons:
+\begin{itemize}
+\item @gmake@ commits target and dependency lists earlier than it should.
+For example, @target.mk@ has a rule that looks like this:
+\begin{verbatim}
+  $(HS_PROG) : $(OBJS)
+       $(HC) $(LD_OPTS) $< -o $@
+\end{verbatim}
+If this rule was in @boilerplate.mk@ then @$(HS_PROG)@ and @$(OBJS)@
+would not have their final values at the moment @gmake@ encountered the
+rule.  Alas, @gmake@ takes a snapshot of their current values, and 
+wires that snapshot into the rule.
+(In contrast, the commands executed when the rule ``fires'' are
+only substituted at the moment of firing.)
+So, the rule must follow the definitions given in the @Makefile@ itself.
+
+\item Unlike pattern rules, ordinary rules cannot be overriden or
+replaced by subsequent rules for the same target (at least not without an
+error message).  Including ordinary rules in @boilerplate.mk@ would
+prevent the user from writing rules for specific targets in specific cases.
+
+\item There are a couple of other reasons I've forgotten, but it doesn't
+matter too much.
+\end{itemize}
+\end{itemize}
+
+\subsection{The main @mk/boilerplate.mk@ file}
+\label{sect_boiler}
+
+If you look at @$(FPTOOLS_TOP)/mk/boilerplate.mk@ you will find that
+it consists of the following sections, each held in a separate file:
+\begin{description}
+\item[@config.mk@] is the build configuration file we discussed at length
+in Section~\ref{sect_build-config}.
+
+\item[@paths.mk@] defines @make@ variables for pathnames and file
+lists.  In particular, it gives definitions for:
+\begin{description}
+\item[@SRCS@:] all source files in the current directory.
+\item[@HS_SRCS@:] all Haskell source files in the current directory.
+It is derived from @$(SRCS)@, so if you override @SRCS@ with a new value
+@HS_SRCS@ will follow suit.
+\item[@C_SRCS@:] similarly for C source files.
+\item[@HS_OBJS@:] the @.o@ files derived from @$(HS_SRCS)@.
+\item[@C_OBJS@:] similarly for @$(C_SRCS)@.
+\item[@OBJS@:] the concatenation of @$(HS_OBJS)@ and @$(C_OBJS)@.
+\end{description}
+Any or all of these definitions can easily be overriden by giving new
+definitions in your @Makefile@.  For example, 
+if there are things in the current directory that look like source files
+but aren't, then you'll need to set @SRCS@ manually in your @Makefile@.
+The other definitions will then work from this new definition.
+
+What, exactly, does @paths.mk@ consider a ``source file'' to be.
+It's based the file's suffix (e.g. @.hs@, @.lhs@, @.c@, @.lc@, etc), 
+but this is the kind of detail that changes
+more rapidly, so rather than enumerate the source suffices here the best thing
+to do is to look in @paths.mk@.
+
+\item[@opts.mk@] defines @make@ variables for option strings to
+pass to each program. For example, it defines @HC_OPTS@, the
+option strings to pass to the Haskell compiler.  See  \sectionref{sect_suffix}.
+
+\item[@suffix.mk@] defines standard pattern rules -- see \sectionref{sect_suffix}
+\end{description}
+Any of the variables and pattern rules defined by the boilerplate file
+can easily be overridden in any particular @Makefile@, because
+the boilerplace @include@ comes first.  Definitions after this
+@include@ directive simply override the default ones in @boilerplate.mk@.
+
+\subsection[sect_suffix]{Pattern rules and options}
+
+The file @suffix.mk@ defines standard {\em pattern rules} that say how to build one kind
+of file from another, for example, how to build a @.o@ file from a @.c@ file.
+(GNU @make@'s {\em pattern rules} are more powerful and easier to use than
+Unix @make@'s {\em suffix rules}.)
+
+Almost all the rules look something like this:
+\begin{verbatim}
+%.o : %.c
+       @$(RM) $@
+       $(CC) $(CC_OPTS) -c $< -o $@
+\end{verbatim}
+Here's how to understand the rule.  It says that $something@.o@$ (say @Foo.o@)
+can be built from $something@.c@$ (@Foo.c@), by invoking the C compiler
+(path name held in @$(CC)@), passing to it the options @$(CC_OPTS)@ and the rule's 
+dependent
+file of the rule @$<@ (@Foo.c@ in this case), and putting the result in
+the rule's target @$@@@ (@Foo.o@ in this case).
+
+Every program is held in a @make@ variable defined in @mk/config.mk@ --- look in @mk/config.mk@ for
+the complete list.  One important one is the Haskell compiler, which is called @$(HC)@.
+
+Every programs options are are held in a @make@ variables called @<prog>_OPTS@.
+the @<prog>_OPTS@ variables are defined in @mk/opts.mk@.  Almost all of them are defined
+like this:
+\begin{verbatim}
+  CC_OPTS = $(SRC_CC_OPTS) $(WAY$(_way)_CC_OPTS) $($*_CC_OPTS) $(EXTRA_CC_OPTS)
+\end{verbatim}
+The four variables from which @CC_OPTS@ is built have the following meaning:
+\begin{description}
+\item[@SRC_CC_OPTS@:] options passed to all C compilations.
+\item[@WAY_<way>_CC_OPTS@:] options passed to C compilations for way @<way>@. For example,
+@WAY_mp_CC_OPTS@ gives options to pass to the C compiler when compiling way @mp@.
+The variable @WAY_CC_OPTS@ holds options to pass to the C compiler when compiling the standard way.
+(Section~\ref{sect_ways} dicusses multi-way compilation.)
+\item[@<module>_CC_OPTS@:] options to pass to the C compiler that are specific to module @<module>@.
+For example, @SMap_CC_OPTS@ gives the specific options to pass to the C compiler when compiling
+@SMap.c@.
+\item[@EXTRA_CC_OPTS@:] extra options to pass to all C compilations.  This is intended for command
+line use, thus;
+\begin{verbatim}
+  gmake libHS.a EXTRA_CC_OPTS="-v"
+\end{verbatim}
+\end{description}
+
+
+\subsection{The main @mk/target.mk@ file}
+\label{sect_targets}
+
+@target.mk@ contains canned rules for all the standard targets described in
+Section~\ref{sect_standard-targets}.  It is complicated by the fact
+that you don't want all of these rules to be active in every @Makefile@.
+Rather than have a plethora of tiny files which you can include selectively,
+there is a single file, @target.mk@, which selectively includes rules 
+based on whether you have defined certain variables in your @Makefile@.
+This section explains what rules you get, what variables control them, and 
+what the rules do.  Hopefully, you will also get enough of an idea of what is supposed
+to happen that you can read and understand any wierd special cases yourself.
+
+\begin{description}
+\item{@HS_PROG@.}  If @HS_PROG@ is defined, you get rules with the
+following targets:
+\begin{description}
+\item[@HS_PROG@] itself.  This rule links @$(OBJS)@ with the Haskell
+runtime system to get an executable called @$(HS_PROG)@.
+\item[@install@] installs @$(HS_PROG)@ in @$(bindir)@ with the execute bit set.
+\end{description}
+
+\item[@C_PROG@] is similar to @HS_PROG@, except that the link step
+links @$(C_OBJS)@ with the C runtime system.
+
+\item[@LIBRARY@] is similar to @HS_PROG@, except
+that it links @$(LIB_OBJS)@ to make the library archive @$(LIBRARY)@,
+and @install@ installs it in @$(libdir)@, with the execute bit not set.
+
+\item[@LIB_DATA@] ...
+\item[@LIB_EXEC@] ...
+
+\item[@HS_SRCS@, @C_SRCS@.] If @HS_SRCS@ is defined and non-empty, a rule for
+the target @depend@ is included, which generates dependency information for
+Haskell programs.  Similarly for @C_SRCS@.
+\end{description}
+
+All of these rules are ``double-colon'' rules, thus
+\begin{verbatim}
+  install :: $(HS_PROG)
+       ...how to install it...
+\end{verbatim}
+GNU @make@ treats double-colon rules as separate entities.  If there
+are several double-colon rules for the same target it takes each in turn
+and fires it if its dependencies say to do so.  This means that you can,
+for example, define both @HS_PROG@ and @LIBRARY@, which will generate two
+rules for @install@.  When you type @gmake install@ both rules will be fired,
+and both the program and the library will be installed, just as you wanted.
+
+\subsection{Recursion}
+\label{sect_subdirs}
+
+In leaf @Makefiles@ the variable @SUBDIRS@ is undefined.  In non-leaf
+@Makefiles@, @SUBDIRS@ is set to the list of sub-directories that contain subordinate
+@Makefile@s.  {\em It is up to you to set @SUBDIRS@ in the @Makefile@.}
+There is no automation here --- @SUBDIRS@ is too important automate.
+
+When @SUBDIRS@ is defined, @target.mk@ includes a rather neat rule for
+the standard targets (Section~\ref{sect_standard-targets}) that 
+simply invokes @make@ recursively in each of the sub-directories.
+
+{\em These recursive invocations are guaranteed to occur in the order in 
+which the list of directories is specified in @SUBDIRS@.}  This guarantee can
+be important.  For example, when you say @gmake boot@ it can be important
+that the recursive invocation of @make boot@ is done in one sub-directory (the include
+files, say) before another (the source files).
+Generally, put the most independent sub-directory first, and the most dependent
+last.
+
+\subsection{Way management}
+\label{sect_ways}
+
+We sometimes want to build essentially the same system in several different
+``ways''.  For example, we want to build @ghc@'s @Prelude@ libraries with
+and without profiling, with and without concurrency, and so on, so that
+there is an appropriately-built library archive to link with when the user compiles
+his program.
+It would be possible to have a completely separate build tree for each such ``way'',
+but it would be horribly bureaucratic, especially since often only parts of the
+build tree need to be constructed in multiple ways.
+
+Instead, the @template.mk@ contains some clever magic to allow you to build
+several versions of a system; and to control locally how many versions are built
+and how they differ.  This section explains the magic.
+
+The files for a particular way are distinguished by munging the suffix.
+The ``normal way'' is always built, and its files have the standard suffices
+@.o@, @.hi@, and so on.  In addition, you can build one or more extra ways,
+each distinguished by a {\em way tag}.  The object files and interface files
+for one of these extra ways are distinguished by their suffix.  For example,
+way @mp@ has files @.mp_o@ and @.mp_hi@.  Library archives have their way
+tag the other side of the dot, for boring reasons; thus, @libHS_mp.a@.
+
+A @make@ variable called @way@ holds the current way tag.  {\em @way@ is only ever
+set on the command line of a recursive invocation of @gmake@.}  It is
+never set inside a @Makefile@.  So it is a global constant for any one invocation
+of @gmake@.  Two other @make@ variables, @way_@ and @_way@ are immediately derived
+from @$(way)@ and never altered.  If @way@ is not set, then neither are @way_@
+and @_way@, and the invocation of @make@ will build the ``normal way''.
+If @way@ is set, then the other two variables are set in sympathy. 
+For example, if @$(way)@ is ``@mp@'', then @way_@ is set to ``@mp_@''
+and @_way@ is set to ``@_mp@''.   These three variables are then used
+when constructing file names.
+
+So how does @make@ ever get recursively invoked with @way@ set?  There
+are two ways in which this happens:
+\begin{itemize}
+\item For some (but not all) of the standard targets, when in a leaf sub-directory,
+@make@ is recursively invoked for each way tag in @$(WAYS)@.  You set @WAYS@ to
+the list of way tags you want these targets built for.  The mechanism here is
+very much like the recursive invocation of @make@ in sub-directories
+(Section~\ref{sect_subdirs}).
+
+It is up to you to set @WAYS@ in your @Makefile@; this is how you control
+what ways will get built.
+\item For a useful collection of targets (such as @libHS_mp.a@, @Foo.mp_o@)
+there is a rule which recursively invokes @make@ to make the specified
+target, setting the @way@ variable.  So if you say @gmake Foo.mp_o@
+you should see a recursive invocation @gmake Foo.mp_o way=mp@,
+and {\em in this recursive invocation the pattern rule for compiling a Haskell
+file into a @.o@ file will match}.  The key pattern rules (in @suffix.mk@)
+look like this:
+\begin{verbatim}
+  %.$(way_)o : %.lhs
+       $(HC) $(HC_OPTS) $< -o $@
+\end{verbatim}
+Neat, eh?
+\end{itemize}
+
+
+\subsection{When the canned rule isn't right}
+
+Sometimes the canned rule just doesn't do the right thing.  For example, in 
+the @nofib@ suite we want the link step to print out timing information.
+The thing to do here is {\em not} to define @HS_PROG@ or @C_PROG@, and instead
+define a special purpose rule in your own @Makefile@.
+By using different variable names you will avoid the canned rules being included,
+and conflicting with yours.
+
+
+%************************************************************************
+%*                                                                     *
+\section[booting-from-C]{Booting/porting from C (\tr{.hc}) files}
+\index{building GHC from .hc files}
+\index{booting GHC from .hc files}
+%*                                                                     *
+%************************************************************************
+
+This section is for people trying to get GHC going by using the
+supplied intermediate C (\tr{.hc}) files.  This would probably be
+because no binaries have been provided, or because the machine
+is not ``fully supported.''
+
+THIS SECTION HASN'T BEEN UPDATED YET.  Please let us know if you want to use this
+route. Unless someone does, this section may never get written, and the
+.hc files distribution may not get built!
+
+
+%************************************************************************
+%*                                                                     *
+\section[build-pitfalls]{Known pitfalls in building Glasgow Haskell}
+\index{problems, building}
+\index{pitfalls, in building}
+\index{building pitfalls}
+%*                                                                     *
+%************************************************************************
+
+WARNINGS about pitfalls and known ``problems'':
+
+\begin{enumerate}
+%------------------------------------------------------------------------
+\item
+One difficulty that comes up from time to time is running out of space
+in \tr{/tmp}.  (It is impossible for the configuration stuff to
+compensate for the vagaries of different sysadmin approaches re temp
+space.)
+
+The quickest way around it is \tr{setenv TMPDIR /usr/tmp} or
+even \tr{setenv TMPDIR .} (or the equivalent incantation with the
+shell of your choice).
+
+The best way around it is to say
+\begin{verbatim}
+  TMPDIR=<dir>
+\end{verbatim}
+in your @build.mk@ file.
+Then GHC and the other @fptools@ programs will use the appropriate directory
+in all cases.
+
+%------------------------------------------------------------------------
+\item
+In compiling some support-code bits, e.g., in \tr{ghc/runtime/gmp} and
+even in \tr{ghc/lib}, you may get a few C-compiler warnings.  We think
+these are OK.
+
+%------------------------------------------------------------------------
+\item
+When compiling via C, you'll sometimes get ``warning:
+assignment from incompatible pointer type'' out of GCC.  Harmless.
+
+%------------------------------------------------------------------------
+\item
+Similarly, \tr{ar}chiving warning messages like the following are not
+a problem:
+\begin{verbatim}
+ar: filename GlaIOMonad__1_2s.o truncated to GlaIOMonad_
+ar: filename GlaIOMonad__2_2s.o truncated to GlaIOMonad_
+...
+\end{verbatim}
+
+%------------------------------------------------------------------------
+\item
+Also harmless are some specialisation messages that you may see when
+compiling GHC; e.g.:
+\begin{verbatim}
+SPECIALISATION MESSAGES (Desirable):
+*** INSTANCES
+{-# SPECIALIZE instance Eq [Class] #-}
+{-# SPECIALIZE instance Eq (Class, [Class]) #-}
+{-# SPECIALIZE instance Outputable [ClassOp] #-}
+{-# SPECIALIZE instance Outputable [Id] #-}
+\end{verbatim}
+
+%------------------------------------------------------------------------
+\item
+In compiling the compiler proper (in \tr{compiler/}), you {\em may} get an
+``Out of heap space'' error message.  These
+can vary with the vagaries of different systems, it seems.  The
+solution is simple: (1)~add a suitable \tr{-H} flag to the @<module>_HC_OPTS@
+@make@ variable in the appropriate @Makefile@;
+(2)~try again: \tr{gmake}.
+(Section~\ref{sect_suffix}.)
+
+Alternatively, just cut to the chase scene:
+\begin{verbatim}
+% cd ghc/compiler
+% make EXTRA_HC_OPTS=-H32m  # or some nice big number
+\end{verbatim}
+
+%------------------------------------------------------------------------
+\item
+Not too long into the build process, you may get a huge complaint
+of the form:
+\begin{verbatim}
+Giant error 'do'ing getopts.pl:  at ./lit2pgm.BOOT line 27.
+\end{verbatim}
+This indicates that your \tr{perl} was mis-installed; the binary is
+unable to find the files for its ``built-in'' library.  Speak to your
+perl installer, then re-try.
+
+%------------------------------------------------------------------------
+\item
+If you try to compile some Haskell, and you get errors from GCC
+about lots of things from \tr{/usr/include/math.h}, then your GCC
+was mis-installed.  \tr{fixincludes} wasn't run when it should've
+been.
+
+As \tr{fixincludes} is now automagically run as part of GCC
+installation, this bug also suggests that you have an old GCC.
+
+
+%------------------------------------------------------------------------
+\item
+You {\em may} need to re-\tr{ranlib} your libraries (on Sun4s).
+\begin{verbatim}
+% cd $(libdir)/ghc-2.01/sparc-sun-sunos4
+% foreach i ( `find . -name '*.a' -print` ) # or other-shell equiv...
+?    ranlib $i
+?    # or, on some machines: ar s $i
+? end
+\end{verbatim}
+We'd be interested to know if this is still necessary.
+
+%------------------------------------------------------------------------
+\item
+If you end up making documents that involve (La)TeX and/or \tr{tib}
+(Simon's favourite), the odds are that something about your/our setup
+will reach out and bite you.  Yes, please complain; meanwhile,
+you can do \tr{make -n whatever.dvi} to see the intended commands,
+then try to muddle through, doing them by hand.
+
+\end{enumerate}
+
+
+
+% ====================================================================
+Here follow pitfalls that apply to pre-2.02 releases.  They should not
+happen any more If they do crop up with 2.02 or later, please let us
+know.
+
+\begin{enumerate}
+%------------------------------------------------------------------------
+\item
+When configuring the support code (mkworld, glafp-utils, etc.), you
+will see mention of \tr{NO_SPECIFIC_PROJECT} and
+\tr{NO_SPECIFIC_VERSION}.  This is cool.
+
+
+%------------------------------------------------------------------------
+\item
+Sooner or later in your ``make-worlding'' life you will do and see
+something like:
+\begin{verbatim}
+% make Makefile
+        rm -f Makefile.bak; mv Makefile Makefile.bak
+../.././mkworld/jmake -P ghc -S std -I../.././mkworld -DTopDir=../../. -DTopDir=...
+../.././mkworld/jrestoredeps
+==== The new Makefile is for: ====
+make: Fatal error in reader: Makefile, line 850: Unexpected end of line seen
+Current working directory /export/users/fp/grasp/ghc-0.26/ghc/runtimes/standard
+*** Error code 1
+make: Fatal error: Command failed for target `Makefile'
+\end{verbatim}
+
+Don't panic!  It should restore your previous \tr{Makefile}, and
+leave the junk one in \tr{Makefile.bad}.  Snoop around at your leisure.
+
+% ------------------------------------------------------------------------
+\item
+If you do corrupt a \tr{Makefile} totally, or you need to glue a new
+directory into the directory structure (in \tr{newdir}---which must
+have a \tr{Jmakefile}, even if empty), here's a neat trick:
+\begin{verbatim}
+#
+# move to the directory just above the one where you want a Makefile...
+cd ..
+#
+# make Makefiles, but lie about the directories below...
+make Makefiles SUBDIRS=newdir
+\end{verbatim}
+
+This will create a \tr{Makefile} {\em ex nihilo} in \tr{newdir}, and
+it will be properly wired into the general make-world structure.
+
+% ------------------------------------------------------------------------
+\item
+Don't configure/build/install using a variety of machines.  A
+mistake we've made is to do \tr{make Makefiles} on a Sun4, then try to
+build GHC (\tr{make all}) on a Sun3.
+
+%------------------------------------------------------------------------
+%\item
+%If you build an ``unregisterised'' build, you will get bazillions of
+%warnings about `ANSI C forbids braced-groups within expressions'.
+%Especially in \tr{ghc/lib}.  These are OK.
+
+\end{enumerate}
+
+
+\begin{onlystandalone}
+\printindex
+\end{document}
+\end{onlystandalone}
+
diff --git a/ghc/CONTRIB/README b/ghc/CONTRIB/README
deleted file mode 100644 (file)
index 79aca73..0000000
+++ /dev/null
@@ -1,19 +0,0 @@
-This directory contains contributed software/bits related to the
-Glasgow Haskell compiler.
-
-fptags         Denis Howe <dbh@doc.ic.ac.uk>
-               Bourne-shell script.
-               Create an emacs TAGS file for one or more functional programs.
-
-haskell-modes/ A collection of all known "Haskell modes" for GNU Emacs.        
-
-haskel.gif     Provided by Lennart Augustsson <augustss@cs.chalmers.se>
-
-haskell_poem   Speaks for itself.
-
-mira2hs                Denis Howe <dbh@doc.ic.ac.uk>
-               Bourne-shell script.
-               Convert Miranda code to Haskell, more-or-less.
-
-pphs           Pretty-print Haskell code in LaTeX documents.  Written by
-               Andrew Preece while a student at Glasgow.
diff --git a/ghc/CONTRIB/fptags b/ghc/CONTRIB/fptags
deleted file mode 100644 (file)
index be4b5a5..0000000
+++ /dev/null
@@ -1,53 +0,0 @@
-#!/bin/sh
-
-#fptags - Create an emacs tags file for functional programs
-
-#Please send me a copy of any modifications you make.
-#Denis Howe <dbh@doc.ic.ac.uk>
-#0.00 20-Sep-1991 created
-#0.01 09-Apr-1992 don't count ==, <=, >= as definition
-#0.02 09-Feb-1994 fix bug in fix 0.01.  Add /=.
-
-# partain: got it from wombat.doc.ic.ac.uk:pub
-
-#The algorithm for spotting identifiers is crude to the point of
-#vulgarity.  Any line containing an = is assumed to define an
-#identifier.  If there are no non-white characters before the = then
-#the definition is assumed to start on the previous line.  White
-#characters are space, tab and > (for literate programs).  The =s in
-#the relations ==, <=, >= and /= are temporarily transformed while
-#searching for =s.
-
-#The tags file is not in the format produced by ctags but rather,
-#that produced by etags and used by GNU-Emacs's find-tag command.
-
-#Does not tag constructors in sum data types.
-
-#The tags file, TAGS, is created in the current directory.  It
-#contains an entry for each argument file.  The entry begins with a
-#line containing just ^L.  The next line contains the filename, a
-#comma and the number of following bytes before the next ^L or EOF.
-#Subsequent lines should give the location within the argument file of
-#identifier definitions.  Each line contains a prefix of a line from
-#the argument file, a ^?, the line number within the argument file, a
-#comma and the position of the start of that line in the argument file
-#(first character = 1).
-
-[ -z "$1" ] && echo usage: $0 files && exit 1
-exec > TAGS
-tf=/tmp/fp$$
-for f
-do     echo "\f"
-       sed 's/==/\1d\1d/g
-       s/>=/>\1d/g
-       s/<=/<\1d/g
-       s|/=|/\1d|g' $f | awk '
-       /^[>    ]*=/{ print prevline "\7f" NR-1 "," prevpos; }
-       /[^>    ].*=/{ print $0 "\7f" NR "," pos; }
-       { prevline = $0; prevpos = pos; pos += length($0)+1; }
-       ' pos=1 | sed 's/[       )]*=.*\7f/\7f/
-       s/\1d/=/g' > $tf
-       echo -n $f,; echo `wc -c < $tf` #lose spaces
-       cat $tf
-done
-rm -f $tf
diff --git a/ghc/CONTRIB/haskel.gif b/ghc/CONTRIB/haskel.gif
deleted file mode 100644 (file)
index 89b20ab..0000000
Binary files a/ghc/CONTRIB/haskel.gif and /dev/null differ
diff --git a/ghc/CONTRIB/haskell-modes/README b/ghc/CONTRIB/haskell-modes/README
deleted file mode 100644 (file)
index c931787..0000000
+++ /dev/null
@@ -1,55 +0,0 @@
-I've collected all the Haskell modes for GNU Emacs that I could lay my
-hands on -- there are billions.  A list is attached, grouped by
-"family".
-
-I don't like "mode junk" myself, so I don't use any of them.  I will
-include advertising or testimonials from happy users if they send them
-along...
-
-Will Partain
-partain@dcs.gla.ac.uk
-95/12/05
-
-=======================================================================
-
-* "Chalmers Haskell mode family" -- "Major mode for editing Haskell",
-  by Lars Bo Nielsen and Lennart Augustsson.
-
-  chalmers/original -- the original -- version 0.1.
-
-  chalmers/thiemann -- Peter Thiemann added "indentation stuff"
-       and fontification -- version 0.2.
-
-  chalmers/sof -- Sigbjorn Finne's <sof@dcs.gla.ac.uk> hacked
-       version of Thiemann's.
-
-.......................................................................
-
-* "Glasgow Haskell mode family" -- originally written by Richard McPhee
-  et al., at Glasgow University, as a student project, for Kevin
-  Hammond.
-
-  glasgow/original : version 1.0, now maintained by
-       gem@minster.york.ac.uk
-
-.......................................................................
-
-* "Simon Marlow Haskell mode family" -- This is the one that comes
-  with GHC, versions 0.16 up to at least 0.26.
-
-  simonm/real : the real thing
-
-  simonm/ghc : the one distributed with GHC 0.16-0.26; no particular
-       reason to prefer this one...
-
-.......................................................................
-
-* "Yale Haskell mode family" -- Especially good for chatting to a
-  Yale-Haskell inferior process :-)
-
-  yale/original : the real thing
-
-  yale/chak : "extended by Manuel M.T. Chakravarty with rudimentary
-       editing features (including better syntax table) and support
-       for the font-lock-mode."  Via Hans Wolfgang Loidl
-       <hwloidl@dcs.gla.ac.uk>
diff --git a/ghc/CONTRIB/haskell-modes/chalmers/original/haskell-mode.el b/ghc/CONTRIB/haskell-modes/chalmers/original/haskell-mode.el
deleted file mode 100644 (file)
index 167956d..0000000
+++ /dev/null
@@ -1,543 +0,0 @@
-;; haskell-mode.el. Major mode for editing Haskell.
-;; Copyright (C) 1989, Free Software Foundation, Inc., Lars Bo Nielsen
-;; and Lennart Augustsson
-
-;; This file is not officially part of GNU Emacs.
-
-;; GNU Emacs is distributed in the hope that it will be useful,
-;; but WITHOUT ANY WARRANTY.  No author or distributor
-;; accepts responsibility to anyone for the consequences of using it
-;; or for whether it serves any particular purpose or works at all,
-;; unless he says so in writing.  Refer to the GNU Emacs General Public
-;; License for full details.
-
-;; Everyone is granted permission to copy, modify and redistribute
-;; GNU Emacs, but only under the conditions described in the
-;; GNU Emacs General Public License.   A copy of this license is
-;; supposed to have been given to you along with GNU Emacs so you
-;; can know your rights and responsibilities.  It should be in a
-;; file named COPYING.  Among other things, the copyright notice
-;; and this notice must be preserved on all copies.
-
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-;;
-;; Haskell Mode. A major mode for editing and running Haskell. (Version 0.0)
-;; =================================================================
-;;
-;; This is a mode for editing and running Haskell.
-;; It is very much based on the sml mode for GNU Emacs. It
-;; features:
-;;
-;;      - Inferior shell running Haskell. No need to leave emacs, just
-;;        keep right on editing while Haskell runs in another window.
-;;
-;;      - Automatic "load file" in inferior shell. Send regions of code
-;;        to the Haskell program.
-;;
-;;
-;; 1. HOW TO USE THE Haskell-MODE
-;; ==========================
-;;
-;; Here is a short introduction to the mode.
-;;
-;; 1.1 GETTING STARTED
-;; -------------------
-;;
-;; If you are an experienced user of Emacs, just skip this section.
-;;
-;; To use the haskell-mode, insert this in your "~/.emacs" file (Or ask your
-;; emacs-administrator to help you.):
-;;
-;;    (setq auto-mode-alist (cons '("\\.hs$" . haskell-mode) (cons '("\\.lhs$" . haskell-mode)
-;;                           auto-mode-alist)))
-;;    (autoload 'haskell-mode "haskell-mode" "Major mode for editing Haskell." t)
-;;
-;; Now every time a file with the extension `.hs' or `.lhs' is found, it is
-;; automatically started up in haskell-mode.
-;;
-;; You will also have to specify the path to this file, so you will have
-;; to add this as well:
-;;
-;;    (setq load-path (cons "/usr/me/emacs" load-path))
-;;
-;; where "/usr/me/emacs" is the directory where this file is.
-;;
-;; You may also want to compile the this file (M-x byte-compile-file)
-;; for speed.
-;;
-;; You are now ready to start using haskell-mode. If you have tried other
-;; language modes (like lisp-mode or C-mode), you should have no
-;; problems. There are only a few extra functions in this mode.
-;;
-;; 1.2. EDITING COMMANDS.
-;; ----------------------
-;;
-;; The following editing and inferior-shell commands can ONLY be issued
-;; from within a buffer in haskell-mode.
-;;
-;; LFD (reindent-then-newline-and-indent).  
-;;     This is probably the function you will be using the most (press
-;;     CTRL while you press Return, press C-j or press Newline). It
-;;     will reindent the line, then make a new line and perform a new
-;;     indentation.
-;;
-;; M-; (indent-for-comment).
-;;     Like in other language modes, this command will give you a comment
-;;     at the of the current line. The column where the comment starts is
-;;     determined by the variable comment-column (default: 40).
-;;    
-;; C-c C-v (haskell-mode-version). 
-;;     Get the version of the haskell-mode.
-;;
-;;
-;; 1.3. COMMANDS RELATED TO THE INFERIOR SHELL
-;; -------------------------------------------
-;;
-;; C-c C-s (haskell-pop-to-shell).
-;;     This command starts up an inferior shell running haskell. If the shell
-;;     is running, it will just pop up the shell window.
-;;
-;; C-c C-u (haskell-save-buffer-use-file).
-;;     This command will save the current buffer and send a "load file",
-;;     where file is the file visited by the current buffer, to the
-;;     inferior shell running haskell.
-;;
-;; C-c C-f (haskell-run-on-file).
-;;     Will send a "load file" to the inferior shell running haskell,
-;;     prompting you for the file name.
-;;    
-;; C-c C-r (haskell-send-region). 
-;;     Will send region, from point to mark, to the inferior shell
-;;     running haskell.
-;;
-;; C-c C-b (haskell-send-buffer). 
-;;     Will send whole buffer to inferior shell running haskell.
-;;
-;; 2. INDENTATION
-;; ================
-;; Not yet.
-;;
-;; 3. INFERIOR SHELL.
-;; ==================
-;;
-;; The mode for Standard ML also contains a mode for an inferior shell
-;; running haskell. The mode is the same as the shell-mode, with just one
-;; extra command.
-;;
-;; 3.1. INFERIOR SHELL COMMANDS
-;; ----------------------------
-;;
-;; C-c C-f (haskell-run-on-file).  Send a `load file' to the process running
-;; haskell.
-;;
-;; 3.2. CONSTANTS CONTROLLING THE INFERIOR SHELL MODE
-;; --------------------------------------------------
-;;
-;; Because haskell is called differently on various machines, and the
-;; haskell-systems have their own command for reading in a file, a set of
-;; constants controls the behavior of the inferior shell running haskell (to
-;; change these constants: See CUSTOMIZING YOUR Haskell-MODE below).
-;;
-;; haskell-prog-name (default "hbi").
-;;     This constant is a string, containing the command to invoke
-;;     Standard ML on your system. 
-;;
-;; haskell-use-right-delim (default "\"")
-;; haskell-use-left-delim  (default "\"")
-;;     The left and right delimiter used by your version of haskell, for
-;;     `use file-name'.
-;;
-;; haskell-process-name (default "Haskell"). 
-;;     The name of the process running haskell. (This will be the name
-;;     appearing on the mode line of the buffer)
-;;
-;; NOTE: The haskell-mode functions: haskell-send-buffer, haskell-send-function and
-;; haskell-send-region, creates temporary files (I could not figure out how
-;; to send large amounts of data to a process). These files will be
-;; removed when you leave emacs.
-;;
-;;
-;; 4. CUSTOMIZING YOUR Haskell-MODE
-;; ============================
-;;
-;; If you have to change some of the constants, you will have to add a
-;; `hook' to the haskell-mode. Insert this in your "~/.emacs" file.
-;;
-;;    (setq haskell-mode-hook 'my-haskell-constants)
-;;
-;; Your function "my-haskell-constants" will then be executed every time
-;; "haskell-mode" is invoked.  Now you only have to write the emacs-lisp
-;; function "my-haskell-constants", and put it in your "~/.emacs" file.
-;;
-;; Say you are running a version of haskell that uses the syntax `load
-;; ["file"]', is invoked by the command "OurHaskell" and you don't want the
-;; indentation algorithm to indent according to open parenthesis, your
-;; function should look like this:
-;;
-;;    (defun my-haskell-constants ()
-;;       (setq haskell-prog-name "OurHaskell")
-;;       (setq haskell-use-left-delim "[\"")
-;;       (setq haskell-use-right-delim "\"]")
-;;       (setq haskell-paren-lookback nil))
-;;
-;; The haskell-shell also runs a `hook' (haskell-shell-hook) when it is invoked.
-;;
-;;
-;;
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-;;
-;;
-;; ORIGINAL AUTHOR
-;;         Lars Bo Nielsen
-;;         Aalborg University
-;;         Computer Science Dept.
-;;         9000 Aalborg
-;;         Denmark
-;;
-;;         lbn@iesd.dk
-;;         or: ...!mcvax!diku!iesd!lbn
-;;         or: mcvax!diku!iesd!lbn@uunet.uu.net
-;;
-;; MODIFIED FOR Haskell BY
-;;        Lennart Augustsson
-;;
-;;
-;; Please let me know if you come up with any ideas, bugs, or fixes.
-;;
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-
-(defconst haskell-mode-version-string
-  "HASKELL-MODE, Version 0.1")
-
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-;;;
-;;; CONSTANTS CONTROLLING THE MODE.
-;;;
-;;; These are the constants you might want to change
-;;; 
-
-;; The command used to start up the haskell-program.
-(defconst haskell-prog-name "hbi" "*Name of program to run as haskell.")
-
-;; The left delimmitter for `load file'
-(defconst haskell-use-left-delim "\""
-  "*The left delimiter for the filename when using \"load\".")
-
-;; The right delimmitter for `load file'
-(defconst haskell-use-right-delim "\""
-  "*The right delimiter for the filename when using \"load\".")
-
-;; A regular expression matching the prompt pattern in the inferior
-;; shell
-(defconst haskell-shell-prompt-pattern "^> *"
-  "*The prompt pattern for the inferion shell running haskell.")
-
-;; The template used for temporary files, created when a region is
-;; send to the inferior process running haskell.
-(defconst haskell-tmp-template "/tmp/haskell.tmp."
-  "*Template for the temporary file, created by haskell-simulate-send-region.")
-
-;; The name of the process running haskell (This will also be the name of
-;; the buffer).
-(defconst haskell-process-name "Haskell" "*The name of the Haskell-process")
-
-;;;
-;;; END OF CONSTANTS CONTROLLING THE MODE.
-;;;
-;;; If you change anything below, you are on your own.
-;;; 
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-
-
-(defvar haskell-mode-syntax-table nil "The syntax table used in haskell-mode.")
-
-(defvar haskell-mode-map nil "The mode map used in haskell-mode.")
-
-(defun haskell-mode ()
-  "Major mode for editing Haskell code.
-Tab indents for Haskell code.
-Comments are delimited with --
-Paragraphs are separated by blank lines only.
-Delete converts tabs to spaces as it moves back.
-
-Key bindings:
-=============
-
-\\[haskell-pop-to-shell]\t  Pop to the haskell window.
-\\[haskell-save-buffer-use-file]\t  Save the buffer, and send a \"load file\".
-\\[haskell-send-region]\t  Send region (point and mark) to haskell.
-\\[haskell-run-on-file]\t  Send a \"load file\" to haskell.
-\\[haskell-send-buffer]\t  Send whole buffer to haskell.
-\\[haskell-mode-version]\t  Get the version of haskell-mode.
-\\[haskell-evaluate-expression]\t  Prompt for an expression and evalute it.
-
-
-Mode map
-========
-\\{haskell-mode-map}
-Runs haskell-mode-hook if non nil."
-  (interactive)
-  (kill-all-local-variables)
-  (if haskell-mode-map
-      ()
-    (setq haskell-mode-map (make-sparse-keymap))
-    (define-key haskell-mode-map "\C-c\C-v" 'haskell-mode-version)
-    (define-key haskell-mode-map "\C-c\C-u" 'haskell-save-buffer-use-file)
-    (define-key haskell-mode-map "\C-c\C-s" 'haskell-pop-to-shell)
-    (define-key haskell-mode-map "\C-c\C-r" 'haskell-send-region)
-    (define-key haskell-mode-map "\C-c\C-m" 'haskell-region)
-    (define-key haskell-mode-map "\C-c\C-f" 'haskell-run-on-file)
-    (define-key haskell-mode-map "\C-c\C-b" 'haskell-send-buffer)
-    (define-key haskell-mode-map "\C-ce"    'haskell-evaluate-expression)
-    (define-key haskell-mode-map "\C-j" 'reindent-then-newline-and-indent)
-    (define-key haskell-mode-map "\177" 'backward-delete-char-untabify))
-  (use-local-map haskell-mode-map)
-  (setq major-mode 'haskell-mode)
-  (setq mode-name "Haskell")
-  (define-abbrev-table 'haskell-mode-abbrev-table ())
-  (setq local-abbrev-table haskell-mode-abbrev-table)
-  (if haskell-mode-syntax-table
-      ()
-    (setq haskell-mode-syntax-table (make-syntax-table))
-    (modify-syntax-entry ?\( "()1" haskell-mode-syntax-table)
-    (modify-syntax-entry ?\) ")(4" haskell-mode-syntax-table)
-    (modify-syntax-entry ?\\ "." haskell-mode-syntax-table)
-    (modify-syntax-entry ?* ". 23" haskell-mode-syntax-table)
-        ;; Special characters in haskell-mode to be treated as normal
-    ;; characters:
-    (modify-syntax-entry ?_ "w" haskell-mode-syntax-table)
-    (modify-syntax-entry ?\' "w" haskell-mode-syntax-table)
-    )
-  (set-syntax-table haskell-mode-syntax-table)
-  (make-local-variable 'require-final-newline) ; Always put a new-line
-  (setq require-final-newline t)       ; in the end of file
-  (make-local-variable 'indent-line-function)
-  (setq indent-line-function 'haskell-indent-line)
-  (make-local-variable 'comment-start)
-  (setq comment-start "-- ")
-  (make-local-variable 'comment-end)
-  (setq comment-end "")
-  (make-local-variable 'comment-column)
-  (setq comment-column 39)             ; Start of comment in this column
-  (make-local-variable 'comment-start-skip)
-  (setq comment-start-skip "(\\*+[ \t]?") ; This matches a start of comment
-  (make-local-variable 'comment-indent-hook)
-  (setq comment-indent-hook 'haskell-comment-indent)
-  ;;
-  ;; Adding these will fool the matching of parens. I really don't
-  ;; know why. It would be nice to have comments treated as
-  ;; white-space
-  ;; 
-  ;; (make-local-variable 'parse-sexp-ignore-comments)
-  ;; (setq parse-sexp-ignore-comments t)
-  ;; 
-  (run-hooks 'haskell-mode-hook))              ; Run the hook
-
-(defun haskell-mode-version ()
-  (interactive)
-  (message haskell-mode-version-string))
-
-
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-;;;
-;;; INDENTATION
-;;;
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-(defun haskell-indent-line ()
-  "Indent current line of Haskell code."
-  (interactive)
-  (let ((indent (haskell-calculate-indentation)))
-    (if (/= (current-indentation) indent)
-       (let ((beg (progn (beginning-of-line) (point))))
-         (skip-chars-forward "\t ")
-         (delete-region beg (point))
-         (indent-to indent))
-      ;; If point is before indentation, move point to indentation
-      (if (< (current-column) (current-indentation))
-         (skip-chars-forward "\t ")))))
-
-(defun haskell-calculate-indentation ()
-  (save-excursion
-    (previous-line 1)
-    (beginning-of-line)                        ; Go to first non whitespace
-    (skip-chars-forward "\t ")         ; on the line.
-    (current-column)))
-
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-;;;
-;;; INFERIOR SHELL
-;;;
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-
-(defvar haskell-shell-map nil "The mode map for haskell-shell.")
-
-(defun haskell-shell ()
-  "Inferior shell invoking Haskell.
-It is not possible to have more than one shell running Haskell.
-Like the shell mode with the additional command:
-
-\\[haskell-run-on-file]\t Runs haskell on the file.
-\\{haskell-shell-map}
-Variables controlling the mode:
-
-haskell-prog-name (default \"hbi\")
-    The string used to invoke the haskell program.
-
-haskell-use-right-delim (default \"\\\"\")
-haskell-use-left-delim  (default \"\\\"\")
-    The left and right delimiter used by your version of haskell, for
-    \"load file-name\".
-
-haskell-process-name (default \"Haskell\")
-    The name of the process running haskell.
-
-haskell-shell-prompt-pattern (default \"^> *\")
-    The prompt pattern.
-
-Runs haskell-shell-hook if not nil."
-  (interactive)
-  (if (not (process-status haskell-process-name))
-      (save-excursion                  ; Process is not running
-       (message "Starting Haskell...") ; start up a new process
-       (require 'shell)
-       (set-buffer (make-shell haskell-process-name haskell-prog-name))
-       (erase-buffer)                  ; Erase the buffer if a previous
-       (if haskell-shell-map           ; process died in there
-           ()
-         (setq haskell-shell-map (copy-sequence shell-mode-map))
-         (define-key haskell-shell-map "\C-c\C-f" 'haskell-run-on-file))
-       (use-local-map haskell-shell-map)
-       (make-local-variable 'shell-prompt-pattern)
-       (setq shell-prompt-pattern haskell-shell-prompt-pattern)
-       (setq major-mode 'haskell-shell)
-       (setq mode-name "Haskell Shell")
-       (setq mode-line-format 
-             "-----Emacs: %17b   %M   %[(%m: %s)%]----%3p--%-")
-       (set-process-filter (get-process haskell-process-name) 'haskell-process-filter)
-       (message "Starting Haskell...done.")
-       (run-hooks 'haskell-shell-hook))))
-
-(defun haskell-process-filter (proc str)
-  (let ((cur (current-buffer))
-       (pop-up-windows t))
-    (pop-to-buffer (concat "*" haskell-process-name "*"))
-    (goto-char (point-max))
-    (if (string= str "\b\b\b  \b\b\b")
-       (backward-delete-char 4)
-      (insert str))
-    (set-marker (process-mark proc) (point-max))
-    (pop-to-buffer cur)))
-
-(defun haskell-pop-to-shell ()
-  (interactive)
-  (haskell-shell)
-  (pop-to-buffer (concat "*" haskell-process-name "*")))
-
-(defun haskell-run-on-file (fil)
-  (interactive "FRun Haskell on : ")
-  (haskell-shell)
-  (save-some-buffers)
-  (send-string haskell-process-name
-              (concat "load " haskell-use-left-delim (expand-file-name fil)
-                      haskell-use-right-delim ";\n")))
-
-(defun haskell-save-buffer-use-file ()
-  "Save the buffer, and send a `use file' to the inferior shell
-running Haskell."
-  (interactive)
-  (let (file)
-    (if (setq file (buffer-file-name)) ; Is the buffer associated
-       (progn                          ; with file ?
-         (save-buffer)
-         (haskell-shell)
-         (send-string haskell-process-name
-                      (concat "load " haskell-use-left-delim
-                              (expand-file-name file)
-                              haskell-use-right-delim ";\n")))
-      (error "Buffer not associated with file."))))
-
-(defvar haskell-tmp-files-list nil
-  "List of all temporary files created by haskell-simulate-send-region.
-Each element in the list is a list with the format:
-
-      (\"tmp-filename\"  buffer  start-line)")
-
-(defvar haskell-simulate-send-region-called-p nil
-  "Has haskell-simulate-send-region been called previously.")
-
-(defun haskell-make-temp-name (pre)
-  (concat (make-temp-name pre) ".m"))
-
-(defun haskell-simulate-send-region (point1 point2)
-  "Simulate send region. As send-region only can handle what ever the
-system sets as the default, we have to make a temporary file.
-Updates the list of temporary files (haskell-tmp-files-list)."
-  (let ((file (expand-file-name (haskell-make-temp-name haskell-tmp-template))))
-    ;; Remove temporary files when we leave emacs
-    (if (not haskell-simulate-send-region-called-p)
-       (progn
-         (setq haskell-old-kill-emacs-hook kill-emacs-hook)
-         (setq kill-emacs-hook 'haskell-remove-tmp-files)
-         (setq haskell-simulate-send-region-called-p t)))
-    (save-excursion
-      (goto-char point1)
-      (setq haskell-tmp-files-list
-           (cons (list file
-                       (current-buffer)
-                       (save-excursion ; Calculate line no.
-                         (beginning-of-line)
-                         (1+ (count-lines 1 (point)))))
-                 haskell-tmp-files-list)))
-    (write-region point1 point2 file nil 'dummy)
-    (haskell-shell)
-    (message "Using temporary file: %s" file)
-    (send-string
-     haskell-process-name
-     ;; string to send: load file;
-     (concat "load " haskell-use-left-delim file haskell-use-right-delim ";\n"))))
-
-(defvar haskell-old-kill-emacs-hook nil
-  "Old value of kill-emacs-hook")
-
-(defun haskell-remove-tmp-files ()
-  "Remove the temporary files, created by haskell-simulate-send-region, if
-they still exist. Only files recorded in haskell-tmp-files-list are removed."
-  (message "Removing temporary files created by haskell-mode...")
-  (while haskell-tmp-files-list
-    (condition-case ()
-       (delete-file (car (car haskell-tmp-files-list)))
-      (error ()))
-    (setq haskell-tmp-files-list (cdr haskell-tmp-files-list)))
-  (message "Removing temporary files created by haskell-mode...done.")
-  (run-hooks 'haskell-old-kill-emacs-hook))
-
-(defun haskell-send-region ()
-  "Send region."
-  (interactive)
-  (let (start end)
-    (save-excursion
-      (setq end (point))
-      (exchange-point-and-mark)
-      (setq start (point)))
-    (haskell-simulate-send-region start end)))
-
-(defun haskell-send-buffer ()
-  "Send the buffer."
-  (interactive)
-  (haskell-simulate-send-region (point-min) (point-max)))
-
-(defun haskell-evaluate-expression (h-expr)
-  "Prompt for and evaluate an expression"
-  (interactive "sExpression: ")
-  (let ((str (concat h-expr ";\n"))
-       (buf (current-buffer)))
-    (haskell-pop-to-shell)
-    (insert str)
-    (send-string haskell-process-name str)
-    (pop-to-buffer buf)))
-
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-;;;
-;;; END OF Haskell-MODE
-;;;
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
diff --git a/ghc/CONTRIB/haskell-modes/chalmers/sof/haskell-mode.el b/ghc/CONTRIB/haskell-modes/chalmers/sof/haskell-mode.el
deleted file mode 100644 (file)
index 25a4324..0000000
+++ /dev/null
@@ -1,825 +0,0 @@
-;; haskell-mode.el. Major mode for editing Haskell.
-;; Copyright (C) 1989, Free Software Foundation, Inc., Lars Bo Nielsen
-;; and Lennart Augustsson
-;; modified by Peter Thiemann, March 1994
-
-;; This file is not officially part of GNU Emacs.
-
-;; GNU Emacs is distributed in the hope that it will be useful,
-;; but WITHOUT ANY WARRANTY.  No author or distributor
-;; accepts responsibility to anyone for the consequences of using it
-;; or for whether it serves any particular purpose or works at all,
-;; unless he says so in writing.  Refer to the GNU Emacs General Public
-;; License for full details.
-
-;; Everyone is granted permission to copy, modify and redistribute
-;; GNU Emacs, but only under the conditions described in the
-;; GNU Emacs General Public License.   A copy of this license is
-;; supposed to have been given to you along with GNU Emacs so you
-;; can know your rights and responsibilities.  It should be in a
-;; file named COPYING.  Among other things, the copyright notice
-;; and this notice must be preserved on all copies.
-
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-;;
-;; Haskell Mode. A major mode for editing and running Haskell. (Version 0.0)
-;; =================================================================
-;;
-;; This is a mode for editing and running Haskell.
-;; It is very much based on the sml mode for GNU Emacs. It
-;; features:
-;;
-;;      - Inferior shell running Haskell. No need to leave emacs, just
-;;        keep right on editing while Haskell runs in another window.
-;;
-;;      - Automatic "load file" in inferior shell. Send regions of code
-;;        to the Haskell program.
-;;
-;;
-;; 1. HOW TO USE THE Haskell-MODE
-;; ==========================
-;;
-;; Here is a short introduction to the mode.
-;;
-;; 1.1 GETTING STARTED
-;; -------------------
-;;
-;; If you are an experienced user of Emacs, just skip this section.
-;;
-;; To use the haskell-mode, insert this in your "~/.emacs" file (Or ask your
-;; emacs-administrator to help you.):
-;;
-;;    (setq auto-mode-alist (cons '("\\.hs$" . haskell-mode) (cons '("\\.lhs$" . haskell-mode)
-;;                           auto-mode-alist)))
-;;    (autoload 'haskell-mode "haskell-mode" "Major mode for editing Haskell." t)
-;;
-;; Now every time a file with the extension `.hs' or `.lhs' is found, it is
-;; automatically started up in haskell-mode.
-;;
-;; You will also have to specify the path to this file, so you will have
-;; to add this as well:
-;;
-;;    (setq load-path (cons "/usr/me/emacs" load-path))
-;;
-;; where "/usr/me/emacs" is the directory where this file is.
-;;
-;; You may also want to compile the this file (M-x byte-compile-file)
-;; for speed.
-;;
-;; You are now ready to start using haskell-mode. If you have tried other
-;; language modes (like lisp-mode or C-mode), you should have no
-;; problems. There are only a few extra functions in this mode.
-;;
-;; 1.2. EDITING COMMANDS.
-;; ----------------------
-;;
-;; The following editing and inferior-shell commands can ONLY be issued
-;; from within a buffer in haskell-mode.
-;;
-;; LFD (haskell-newline-and-indent).  
-;;     This is probably the function you will be using the most (press
-;;     CTRL while you press Return, press C-j or press Newline). It
-;;     makes a new line and performs indentation based on the last 
-;;     preceding non-comment line.
-;;
-;; M-; (indent-for-comment).
-;;     Like in other language modes, this command will give you a comment
-;;     at the of the current line. The column where the comment starts is
-;;     determined by the variable comment-column (default: 40).
-;;    
-;; C-c C-v (haskell-mode-version). 
-;;     Get the version of the haskell-mode.
-;;
-;;
-;; 1.3. COMMANDS RELATED TO THE INFERIOR SHELL
-;; -------------------------------------------
-;;
-;; C-c C-s (haskell-pop-to-shell).
-;;     This command starts up an inferior shell running haskell. If the shell
-;;     is running, it will just pop up the shell window.
-;;
-;; C-c C-u (haskell-save-buffer-use-file).
-;;     This command will save the current buffer and send a "load file",
-;;     where file is the file visited by the current buffer, to the
-;;     inferior shell running haskell.
-;;
-;; C-c C-f (haskell-run-on-file).
-;;     Will send a "load file" to the inferior shell running haskell,
-;;     prompting you for the file name.
-;;    
-;; C-c C-r (haskell-send-region). 
-;;     Will send region, from point to mark, to the inferior shell
-;;     running haskell.
-;;
-;; C-c C-b (haskell-send-buffer). 
-;;     Will send whole buffer to inferior shell running haskell.
-;;
-;; 2. INDENTATION
-;; ================
-;; 
-;; The first indentation command (using C-j or TAB) on a given line
-;; indents like the last preceding non-comment line. The next TAB
-;; indents to the indentation of the innermost enclosing scope. Further
-;; TABs get you to further enclosing scopes. After indentation has
-;; reached the first column, the process restarts using the indentation
-;; of the preceding non-comment line, again.
-;;
-;; 3. INFERIOR SHELL.
-;; ==================
-;;
-;; The mode for Standard ML also contains a mode for an inferior shell
-;; running haskell. The mode is the same as the shell-mode, with just one
-;; extra command.
-;;
-;; 3.1. INFERIOR SHELL COMMANDS
-;; ----------------------------
-;;
-;; C-c C-f (haskell-run-on-file).  Send a `load file' to the process running
-;; haskell.
-;;
-;; 3.2. CONSTANTS CONTROLLING THE INFERIOR SHELL MODE
-;; --------------------------------------------------
-;;
-;; Because haskell is called differently on various machines, and the
-;; haskell-systems have their own command for reading in a file, a set of
-;; constants controls the behavior of the inferior shell running haskell (to
-;; change these constants: See CUSTOMIZING YOUR Haskell-MODE below).
-;;
-;; haskell-prog-name (default "hbi").
-;;     This constant is a string, containing the command to invoke
-;;     Standard ML on your system. 
-;;
-;; haskell-use-right-delim (default "\"")
-;; haskell-use-left-delim  (default "\"")
-;;     The left and right delimiter used by your version of haskell, for
-;;     `use file-name'.
-;;
-;; haskell-process-name (default "Haskell"). 
-;;     The name of the process running haskell. (This will be the name
-;;     appearing on the mode line of the buffer)
-;;
-;; NOTE: The haskell-mode functions: haskell-send-buffer, haskell-send-function and
-;; haskell-send-region, creates temporary files (I could not figure out how
-;; to send large amounts of data to a process). These files will be
-;; removed when you leave emacs.
-;;
-;; 4. FONTIFICATION
-;;
-;; There is support for Jamie Zawinski's font-lock-mode through the
-;; variable "haskell-font-lock-keywords".
-;;
-;; 5. CUSTOMIZING YOUR Haskell-MODE
-;; ============================
-;;
-;; If you have to change some of the constants, you will have to add a
-;; `hook' to the haskell-mode. Insert this in your "~/.emacs" file.
-;;
-;;    (setq haskell-mode-hook 'my-haskell-constants)
-;;
-;; Your function "my-haskell-constants" will then be executed every time
-;; "haskell-mode" is invoked.  Now you only have to write the emacs-lisp
-;; function "my-haskell-constants", and put it in your "~/.emacs" file.
-;;
-;; Say you are running a version of haskell that uses the syntax `load
-;; ["file"]', is invoked by the command "OurHaskell" and you don't want the
-;; indentation algorithm to indent according to open parenthesis, your
-;; function should look like this:
-;;
-;;    (defun my-haskell-constants ()
-;;       (setq haskell-prog-name "OurHaskell")
-;;       (setq haskell-use-left-delim "[\"")
-;;       (setq haskell-use-right-delim "\"]")
-;;       (setq haskell-paren-lookback nil))
-;;
-;; The haskell-shell also runs a `hook' (haskell-shell-hook) when it is invoked.
-;;
-;;
-;;
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-;;
-;;
-;; ORIGINAL AUTHOR
-;;         Lars Bo Nielsen
-;;         Aalborg University
-;;         Computer Science Dept.
-;;         9000 Aalborg
-;;         Denmark
-;;
-;;         lbn@iesd.dk
-;;         or: ...!mcvax!diku!iesd!lbn
-;;         or: mcvax!diku!iesd!lbn@uunet.uu.net
-;;
-;; MODIFIED FOR Haskell BY
-;;        Lennart Augustsson
-;;        indentation stuff by Peter Thiemann
-;;
-;;
-;; Please let me know if you come up with any ideas, bugs, or fixes.
-;;
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-
-(defconst haskell-mode-version-string
-  "HASKELL-MODE, Version 0.2, PJT indentation")
-
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-;;;
-;;; CONSTANTS CONTROLLING THE MODE.
-;;;
-;;; These are the constants you might want to change
-;;; 
-
-;; The command used to start up the haskell-program.
-(defconst haskell-prog-name "hbi" "*Name of program to run as haskell.")
-
-;; The left delimmitter for `load file'
-(defconst haskell-use-left-delim "\""
-  "*The left delimiter for the filename when using \"load\".")
-
-;; The right delimmitter for `load file'
-(defconst haskell-use-right-delim "\""
-  "*The right delimiter for the filename when using \"load\".")
-
-;; A regular expression matching the prompt pattern in the inferior
-;; shell
-(defconst haskell-shell-prompt-pattern "^> *"
-  "*The prompt pattern for the inferion shell running haskell.")
-
-;; The template used for temporary files, created when a region is
-;; send to the inferior process running haskell.
-(defconst haskell-tmp-template "/tmp/haskell.tmp."
-  "*Template for the temporary file, created by haskell-simulate-send-region.")
-
-;; The name of the process running haskell (This will also be the name of
-;; the buffer).
-(defconst haskell-process-name "Haskell" "*The name of the Haskell-process")
-
-;;;
-;;; END OF CONSTANTS CONTROLLING THE MODE.
-;;;
-;;; If you change anything below, you are on your own.
-;;; 
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-
-
-(defvar haskell-mode-syntax-table nil "The syntax table used in haskell-mode.")
-
-(defvar haskell-mode-map nil "The mode map used in haskell-mode.")
-
-(defvar haskell-mode-abbrev-table nil "The abbrev-table used in haskell-mode.")
-
-(defvar haskell-old-kill-emacs-hook nil "Old value of kill-emacs-hook")
-
-(defun haskell-mode ()
-  "Major mode for editing Haskell code.
-Tab indents for Haskell code.
-Comments are delimited with --
-Paragraphs are separated by blank lines only.
-Delete converts tabs to spaces as it moves back.
-
-Key bindings:
-=============
-
-\\[haskell-pop-to-shell]\t  Pop to the haskell window.
-\\[haskell-save-buffer-use-file]\t  Save the buffer, and send a \"load file\".
-\\[haskell-send-region]\t  Send region (point and mark) to haskell.
-\\[haskell-run-on-file]\t  Send a \"load file\" to haskell.
-\\[haskell-send-buffer]\t  Send whole buffer to haskell.
-\\[haskell-mode-version]\t  Get the version of haskell-mode.
-\\[haskell-evaluate-expression]\t  Prompt for an expression and evalute it.
-
-
-Mode map
-========
-\\{haskell-mode-map}
-Runs haskell-mode-hook if non nil."
-  (interactive)
-  (kill-all-local-variables)
-  (if haskell-mode-map
-      ()
-    (setq haskell-mode-map (make-sparse-keymap))
-    (define-key haskell-mode-map "\C-c\C-v" 'haskell-mode-version)
-    (define-key haskell-mode-map "\C-c\C-u" 'haskell-save-buffer-use-file)
-    (define-key haskell-mode-map "\C-c\C-s" 'haskell-pop-to-shell)
-    (define-key haskell-mode-map "\C-c\C-r" 'haskell-send-region)
-    (define-key haskell-mode-map "\C-c\C-m" 'haskell-region)
-    (define-key haskell-mode-map "\C-c\C-f" 'haskell-run-on-file)
-    (define-key haskell-mode-map "\C-c\C-b" 'haskell-send-buffer)
-    (define-key haskell-mode-map "\C-c\C-l" 'comment-line)
-    (define-key haskell-mode-map "\C-ce"    'haskell-evaluate-expression)
-;    (define-key haskell-mode-map "\C-j"     'haskell-newline-and-indent)
-    (define-key haskell-mode-map [S-tab]    'tab-to-tab-stop)
-    (define-key haskell-mode-map "\177"     'backward-delete-char-untabify))
-  (use-local-map haskell-mode-map)
-  (setq major-mode 'haskell-mode)
-  (setq mode-name "Haskell")
-  (define-abbrev-table 'haskell-mode-abbrev-table ())
-  (setq local-abbrev-table haskell-mode-abbrev-table)
-  (if haskell-mode-syntax-table
-      ()
-    (setq haskell-mode-syntax-table (make-syntax-table))
-    (modify-syntax-entry ?{  "(}1"    haskell-mode-syntax-table)
-    (modify-syntax-entry ?}  "){4"    haskell-mode-syntax-table)
-; partain: out
-;    (modify-syntax-entry ?-  "_ 2356" haskell-mode-syntax-table)
-;    (modify-syntax-entry ?\f "> b"    haskell-mode-syntax-table)
-;    (modify-syntax-entry ?\n "> b"    haskell-mode-syntax-table)
-; partain: end out
-; partain: in
-    (modify-syntax-entry ?-  "_ 23" haskell-mode-syntax-table)
-;    (modify-syntax-entry ?\f "> b"    haskell-mode-syntax-table)
-;    (modify-syntax-entry ?\n "> b"    haskell-mode-syntax-table)
-; partain: end in
-    (modify-syntax-entry ?\\ "\\"     haskell-mode-syntax-table)
-    (modify-syntax-entry ?*  "_"      haskell-mode-syntax-table)
-    (modify-syntax-entry ?_  "_"      haskell-mode-syntax-table)
-    (modify-syntax-entry ?'  "_"      haskell-mode-syntax-table)
-    (modify-syntax-entry ?:  "_"      haskell-mode-syntax-table)
-    (modify-syntax-entry ?|  "."      haskell-mode-syntax-table)
-    )
-  (set-syntax-table haskell-mode-syntax-table)
-  (make-local-variable 'require-final-newline) ; Always put a new-line
-  (setq require-final-newline t)       ; in the end of file
-;  (make-local-variable 'change-major-mode-hook)
-;  (setq change-major-mode-hook nil)
-;  (make-local-variable 'indent-line-function)
-;  (setq indent-line-function 'haskell-indent-line)
-  (make-local-variable 'comment-start)
-  (setq comment-start "-- ")
-;  (setq comment-start "{- ")
-  (make-local-variable 'comment-end)
-  (setq comment-end "")
-;  (setq comment-end " -}")
-  (make-local-variable 'comment-column)
-  (setq comment-column 60)             ; Start of comment in this column
-  (make-local-variable 'comment-start-skip)
-  (setq comment-start-skip "{-+ *\\|--+ *") ; This matches a start of comment
-  (make-local-variable 'comment-multi-line)
-  (setq comment-multi-line nil)
-;  (make-local-variable 'comment-indent-function)
-;  (setq comment-indent-function 'haskell-comment-indent)
-  ;;
-  ;; Adding these will fool the matching of parens. I really don't
-  ;; know why. It would be nice to have comments treated as
-  ;; white-space
-  ;; 
-  ;; (make-local-variable 'parse-sexp-ignore-comments)
-  ;; (setq parse-sexp-ignore-comments t)
-  ;; 
-  (run-hooks 'haskell-mode-hook))              ; Run the hook
-
-(defun haskell-mode-version ()
-  (interactive)
-  (message haskell-mode-version-string))
-
-
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-;;;
-;;; INDENTATION
-;;;
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-
-;;; some variables for later use
-
-(defvar haskell-open-comment "{-")
-(defvar haskell-close-comment "-}")
-(defvar haskell-indentation-counter 0
-  "count repeated invocations of indent-for-tab-command")
-(defvar haskell-literate-flag nil
-  "used to guide literate/illiterate behavior, set automagically")
-
-(defun haskell-newline-and-indent ()
-  (interactive)
-  (setq haskell-literate-flag
-       (save-excursion
-         (beginning-of-line)
-         (= (following-char) ?>)))
-  (newline)
-  (if haskell-literate-flag (insert ">"))
-  (haskell-indent-line))
-
-(defun haskell-indent-line ()
-  "Indent current line of ordinary or literate Haskell code."
-  (interactive)
-  (let ((indent (haskell-calculate-indentation-pjt-2)))
-    (if (/= (current-indentation) indent)
-       (let ((beg (progn
-                    (beginning-of-line)
-                    (if (= (following-char) ?>) (forward-char 1)) ;LITERATE
-                    (point))))
-         (skip-chars-forward "\t ")
-         (delete-region beg (point))
-         (indent-to indent))
-      ;; If point is before indentation, move point to indentation
-      (if (< (current-column) (current-indentation))
-         (skip-chars-forward "\t ")))))
-
-(defun haskell-calculate-indentation ()
-  (save-excursion
-    (let ((col (current-column)))
-      (while (and (not (bobp))                 ;skip over empty and comment-only lines
-                 (= col (current-column)))
-       (previous-line 1)
-       (beginning-of-line)                     ; Go to first non whitespace
-       (if (= (following-char) ?>)             ;LITERATE
-           (forward-char 1)
-         (if haskell-literate-flag             ;ignore illiterate lines
-             (end-of-line)))
-       (skip-chars-forward "\t ")              ; on the line.
-       (setq col (current-column))
-       (search-forward-regexp (concat haskell-open-comment "\\|--\\|\n") nil 0)
-       (goto-char (match-beginning 0)))
-      (search-backward-regexp "\\b\\(where\\|let\\|of\\|in\\)\\b\\|\n" nil 0)
-      (if (looking-at "\n")
-         ()
-       (setq col (current-column))
-       (forward-word 1)
-       (skip-chars-forward "\t ")
-       (if (looking-at "\\w")
-           (setq col (current-column))
-         (setq col (+ 2 col))))
-      col)))
-
-(defun haskell-calculate-indentation-pjt-2 ()
-  "Calculate indentation for Haskell program code, versatile version"
-  (save-excursion
-    (if (eq last-command 'haskell-indentation)
-       (setq haskell-indentation-counter (1+ haskell-indentation-counter))
-      (setq haskell-indentation-counter -1))
-    (setq this-command 'haskell-indentation)
-    (let* ((simple-indent (haskell-calculate-indentation))
-          (count haskell-indentation-counter)
-          (min-indent simple-indent)   ; minimum indentation found in a non-comment line
-          (last-indent simple-indent)  ; indentation of the following non-comment line
-          (return-indent nil)          ; computed indentation
-          (comment-depth 0))
-      (previous-line 1)
-      (if (< haskell-indentation-counter 0) ; 1st tab gives simple indentation
-         (setq return-indent simple-indent))
-      (while (not return-indent)
-       (if (search-backward-regexp "\\b\\(where\\|let\\|of\\)\\b\\|\n\\|{-\\|-}" nil t 1)
-           (cond
-            ((looking-at haskell-open-comment)
-             (setq comment-depth (1- comment-depth)))
-            ((looking-at haskell-close-comment)
-             (setq comment-depth (1+ comment-depth)))
-            ((= 0 comment-depth)
-             (cond
-              ((looking-at "\n")
-               (save-excursion
-                 (forward-char 1)
-                 (if (= (following-char) ?>)
-                     (forward-char 1)
-                   (if haskell-literate-flag
-                       (end-of-line))) ;LITERATE: ignore lines w/o >
-                 (skip-chars-forward "\t ")
-                 (if (looking-at (concat haskell-open-comment "\\|--\\|\n"))
-                     ()
-                   (setq last-indent (current-column))
-                   (if (< last-indent min-indent)
-                       (setq min-indent last-indent)))))
-              (t                       ; looking at a keyword
-               (save-excursion
-                 (forward-word 1)
-                 (skip-chars-forward " \t")
-                 (if (and haskell-literate-flag ;LITERATE: ignore lines w/o >
-                          (save-excursion
-                            (beginning-of-line)
-                            (/= (following-char) ?>)))
-                     (end-of-line))
-                 (if (looking-at (concat haskell-open-comment "\\|--\\|\n"))
-                     ()
-                   (setq last-indent (current-column)))
-                 (if (<= last-indent min-indent)
-                     (if (> count 0)
-                         (setq count (1- count))
-                       (setq return-indent last-indent)))
-                 (if (< last-indent min-indent)
-                     (setq min-indent last-indent)))))))
-         (setq return-indent simple-indent)
-         (setq haskell-indentation-counter -1)))
-      return-indent)))
-
-(defun haskell-skip-nested-comment ()
-  ;; point looks at opening {-, move over closing -}
-  ;; todo: specify what happens on failure, bounds check ...
-  (forward-char 2)
-  (let ((comment-depth 1))
-    (while (> comment-depth 0)
-      (search-forward-regexp "{-\\|-}")
-      (goto-char (match-beginning 0))
-      (setq comment-depth
-           (if (= (following-char) 123) ; code for opening brace
-               (1+ comment-depth)
-             (1- comment-depth)))
-      (goto-char (match-end 0)))))
-
-
-;;;seemingly obsolete functions
-(defun haskell-inside-of-inline-comment ()
-  (let ((bolp (save-excursion
-              (beginning-of-line)
-              (point))))
-    (search-backward comment-start bolp t 1)))
-
-(defun haskell-inside-of-nested-comment ()
-  (save-excursion
-    (let ((count 0))
-      (while
-         (search-backward-regexp "\\({-\\|-}\\)" 0 t 1)
-       (if (haskell-inside-of-inline-comment)
-           ()
-         (if (looking-at haskell-open-comment)
-             (setq count (1+ count))
-           (setq count (1- count)))))
-      (> count 0))))
-
-(defun haskell-inside-of-comment ()
-  (or (haskell-inside-of-inline-comment)
-      (haskell-inside-of-nested-comment)))
-
-;;;stolen from sml-mode.el
-(defun haskell-comment-indent ()
-  "Compute indentation for Haskell comments"
-  (if (looking-at "^--")
-      0
-    (save-excursion
-      (skip-chars-backward " \t")
-      (max (1+ (current-column))
-          comment-column))))
-
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-;;;
-;;; INFERIOR SHELL
-;;;
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-
-(defvar haskell-shell-map nil "The mode map for haskell-shell.")
-
-(defun haskell-shell ()
-  "Inferior shell invoking Haskell.
-It is not possible to have more than one shell running Haskell.
-Like the shell mode with the additional command:
-
-\\[haskell-run-on-file]\t Runs haskell on the file.
-\\{haskell-shell-map}
-Variables controlling the mode:
-
-haskell-prog-name (default \"hbi\")
-    The string used to invoke the haskell program.
-
-haskell-use-right-delim (default \"\\\"\")
-haskell-use-left-delim  (default \"\\\"\")
-    The left and right delimiter used by your version of haskell, for
-    \"load file-name\".
-
-haskell-process-name (default \"Haskell\")
-    The name of the process running haskell.
-
-haskell-shell-prompt-pattern (default \"^> *\")
-    The prompt pattern.
-
-Runs haskell-shell-hook if not nil."
-  (interactive)
-  (if (not (process-status haskell-process-name))
-      (save-excursion                  ; Process is not running
-       (message "Starting Haskell...") ; start up a new process
-       (require 'shell)
-       (set-buffer (make-comint haskell-process-name haskell-prog-name))
-       (erase-buffer)                  ; Erase the buffer if a previous
-       (if haskell-shell-map           ; process died in there
-           ()
-         (setq haskell-shell-map (copy-keymap shell-mode-map))
-         (define-key haskell-shell-map "\C-c\C-f" 'haskell-run-on-file))
-       (use-local-map haskell-shell-map)
-       (make-local-variable 'shell-prompt-pattern)
-       (setq shell-prompt-pattern haskell-shell-prompt-pattern)
-       (setq major-mode 'haskell-shell)
-       (setq mode-name "Haskell Shell")
-       (setq mode-line-format 
-             "-----Emacs: %17b   %M   %[(%m: %s)%]----%3p--%-")
-       (set-process-filter (get-process haskell-process-name) 'haskell-process-filter)
-       (message "Starting Haskell...done.")
-       (run-hooks 'haskell-shell-hook))))
-
-(defun haskell-process-filter (proc str)
-  (let ((cur (current-buffer))
-       (pop-up-windows t))
-    (pop-to-buffer (concat "*" haskell-process-name "*"))
-    (goto-char (point-max))
-    (if (string= str "\b\b\b  \b\b\b")
-       (backward-delete-char 4)
-      (insert str))
-    (set-marker (process-mark proc) (point-max))
-    (pop-to-buffer cur)))
-
-(defun haskell-pop-to-shell ()
-  (interactive)
-  (haskell-shell)
-  (pop-to-buffer (concat "*" haskell-process-name "*")))
-
-(defun haskell-run-on-file (fil)
-  (interactive "FRun Haskell on : ")
-  (haskell-shell)
-  (save-some-buffers)
-  (process-send-string haskell-process-name
-              (concat "load " haskell-use-left-delim (expand-file-name fil)
-                      haskell-use-right-delim ";\n")))
-
-(defun haskell-save-buffer-use-file ()
-  "Save the buffer, and send a `use file' to the inferior shell
-running Haskell."
-  (interactive)
-  (let (file)
-    (if (setq file (buffer-file-name)) ; Is the buffer associated
-       (progn                          ; with file ?
-         (save-buffer)
-         (haskell-shell)
-         (process-send-string haskell-process-name
-                      (concat "load " haskell-use-left-delim
-                              (expand-file-name file)
-                              haskell-use-right-delim ";\n")))
-      (error "Buffer not associated with file."))))
-
-(defvar haskell-tmp-files-list nil
-  "List of all temporary files created by haskell-simulate-send-region.
-Each element in the list is a list with the format:
-
-      (\"tmp-filename\"  buffer  start-line)")
-
-(defvar haskell-simulate-send-region-called-p nil
-  "Has haskell-simulate-send-region been called previously.")
-
-(defun haskell-make-temp-name (pre)
-  (concat (make-temp-name pre) ".m"))
-
-(defun haskell-simulate-send-region (point1 point2)
-  "Simulate send region. As send-region only can handle what ever the
-system sets as the default, we have to make a temporary file.
-Updates the list of temporary files (haskell-tmp-files-list)."
-  (let ((file (expand-file-name (haskell-make-temp-name haskell-tmp-template))))
-    ;; Remove temporary files when we leave emacs
-    (if (not haskell-simulate-send-region-called-p)
-       (progn
-         (setq haskell-old-kill-emacs-hook kill-emacs-hook)
-         (setq kill-emacs-hook 'haskell-remove-tmp-files)
-         (setq haskell-simulate-send-region-called-p t)))
-    (save-excursion
-      (goto-char point1)
-      (setq haskell-tmp-files-list
-           (cons (list file
-                       (current-buffer)
-                       (save-excursion ; Calculate line no.
-                         (beginning-of-line)
-                         (1+ (count-lines 1 (point)))))
-                 haskell-tmp-files-list)))
-    (write-region point1 point2 file nil 'dummy)
-    (haskell-shell)
-    (message "Using temporary file: %s" file)
-    (process-send-string
-     haskell-process-name
-     ;; string to send: load file;
-     (concat "load " haskell-use-left-delim file haskell-use-right-delim ";\n"))))
-
-(defun haskell-remove-tmp-files ()
-  "Remove the temporary files, created by haskell-simulate-send-region, if
-they still exist. Only files recorded in haskell-tmp-files-list are removed."
-  (message "Removing temporary files created by haskell-mode...")
-  (while haskell-tmp-files-list
-    (condition-case ()
-       (delete-file (car (car haskell-tmp-files-list)))
-      (error ()))
-    (setq haskell-tmp-files-list (cdr haskell-tmp-files-list)))
-  (message "Removing temporary files created by haskell-mode...done.")
-  (run-hooks 'haskell-old-kill-emacs-hook))
-
-(defun haskell-send-region ()
-  "Send region."
-  (interactive)
-  (let (start end)
-    (save-excursion
-      (setq end (point))
-      (exchange-point-and-mark)
-      (setq start (point)))
-    (haskell-simulate-send-region start end)))
-
-(defun haskell-send-buffer ()
-  "Send the buffer."
-  (interactive)
-  (haskell-simulate-send-region (point-min) (point-max)))
-
-(defun haskell-evaluate-expression (h-expr)
-  "Prompt for and evaluate an expression"
-  (interactive "sExpression: ")
-  (let ((str (concat h-expr ";\n"))
-       (buf (current-buffer)))
-    (haskell-pop-to-shell)
-    (insert str)
-    (process-send-string haskell-process-name str)
-    (pop-to-buffer buf)))
-
-
-;;
-;; font-lock-mode patterns, based on specs. in an earlier version
-;; of haskell-mode.el
-;; (these patterns have only been tested with 19.30)
-
-(defconst haskell-font-lock-keywords nil
- "Conservative highlighting of a Haskell buffer
-(using font-lock.)")
-
-(let ((haskell-id "[a-z_][a-zA-Z0-9_'#]+")
-      (haskell-reserved-ids
-          (concat "\\b\\(" 
-                   (mapconcat 
-                      'identity
-                      '("case"    "class"     "data"
-                        "default" "deriving"  "else"
-                        "hiding"  "if" "import"   "in"
-                        "instance" "interface" "let"
-                        "module" "of"   "renaming"
-                        "then"  "to" "type" "where" "infix[rl]?")
-                       "\\|")
-                  "\\)[ \t\n:,]"))
-       (haskell-basic-types 
-          (concat "\\b\\("
-                   (mapconcat 'identity
-                             '("Bool" "()" "String" "Char" "Int"
-                               "Integer" "Float" "Double" "Ratio"
-                               "Assoc" "Rational" "Array")
-                             "\\|")
-                  "\\)\\b"))
-       (haskell-prelude-classes
-          (concat "\\b\\("
-                   (mapconcat 'identity
-                             '("Eq" "Ord" "Text" "Num" "Real" "Fractional" 
-                                 "Integral"   "RealFrac" "Floating" "RealFloat"
-                                "Complex" "Ix" "Enum"
-                                ;; ghc-isms
-                                "_CCallable" "_CReturnable")
-                             "\\|")
-                  "\\)\\b"))
-       (haskell-reserved-ops 
-          (mapconcat 'identity
-                     '("\\.\\."  "::"
-                       "=>" "/=" "@"
-                       "<-" "->")
-                     "\\|"))
-       (glasgow-haskell-ops
-          (concat "\\b\\(" 
-                   (mapconcat 
-                     'identity
-                     '(">>"    ">>="  "thenPrimIO"
-                       "seqPrimIO" "returnPrimIO" 
-                       "return" "_ccall_" "_casm_"
-                       "thenST" "seqST" "returnST"
-                       "thenStrictlyST" "seqStrictlyST" "returnStrictlyST"
-                       "unsafeInterleavePrimIO" "unsafePerformIO")
-                     "\\|")
-                  "\\)\\b"))
-       (glasgow-haskell-types
-          (concat "\\b\\(" 
-                   (mapconcat 
-                     'identity
-                     '("IO"    "PrimIO"  "_?ST"
-                       "_Word" "_Addr"   "_?MVar"
-                       "_?IVar" "_RealWorld"
-                       "_?MutableByteArray"
-                       "_?ByteArray")
-                     "\\|")
-                  "\\)\\b")))
-      (setq haskell-font-lock-keywords
-       (list
-         '("--.*$" . font-lock-comment-face)
-        (list "[ \t\n]*\\([A-Za-z[(_][]A-Za-z0-9_$', ~@|:[)(#]*[ \t\n]*\\)=" 1 font-lock-function-name-face)
-        (list (concat "^>?[ \t\n]*\\(" haskell-id "\\)[ \t]*::") 1 'font-lock-function-name-face)
-         (list haskell-reserved-ids    0 'font-lock-function-name-face)
-         (list glasgow-haskell-ops     0 'font-lock-function-name-face)
-         (list glasgow-haskell-types   0 'font-lock-type-face)
-        (list haskell-basic-types     0 'font-lock-type-face)
-        (list haskell-prelude-classes 0 'font-lock-type-face)
-        (list "^[ \t\n]*\\([A-Za-z[(_][]A-Za-z0-9_$', @:[)(#]*[ \t\n]*\\)->" 1 font-lock-variable-name-face)
-        )))
-
-;;
-;; To enable font-lock-mode for Haskell buffers, add something
-;; like this to your ~/.emacs
-
-;(cond (window-system
-;  (require 'font-lock)
-;  (add-hook 'haskell-mode-hook
-;    '(lambda () (make-local-variable 'font-lock-defaults)
-;              (make-local-variable 'font-lock-mode-hook) ; don't affect other buffers      
-;              (setq font-lock-mode-hook nil)
-;              (add-hook 'font-lock-mode-hook 
-;                   '(lambda ()
-;                        (setq font-lock-keywords haskell-font-lock-keywords)))
-;              (font-lock-mode 1))))
-
-
-
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-;;;;
-;;;; END OF Haskell-MODE
-;;;;
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-(provide 'haskell-mode)
diff --git a/ghc/CONTRIB/haskell-modes/chalmers/thiemann/haskell-mode.el b/ghc/CONTRIB/haskell-modes/chalmers/thiemann/haskell-mode.el
deleted file mode 100644 (file)
index e900f01..0000000
+++ /dev/null
@@ -1,764 +0,0 @@
-;; haskell-mode.el. Major mode for editing Haskell.
-;; Copyright (C) 1989, Free Software Foundation, Inc., Lars Bo Nielsen
-;; and Lennart Augustsson
-;; modified by Peter Thiemann, March 1994
-
-;; This file is not officially part of GNU Emacs.
-
-;; GNU Emacs is distributed in the hope that it will be useful,
-;; but WITHOUT ANY WARRANTY.  No author or distributor
-;; accepts responsibility to anyone for the consequences of using it
-;; or for whether it serves any particular purpose or works at all,
-;; unless he says so in writing.  Refer to the GNU Emacs General Public
-;; License for full details.
-
-;; Everyone is granted permission to copy, modify and redistribute
-;; GNU Emacs, but only under the conditions described in the
-;; GNU Emacs General Public License.   A copy of this license is
-;; supposed to have been given to you along with GNU Emacs so you
-;; can know your rights and responsibilities.  It should be in a
-;; file named COPYING.  Among other things, the copyright notice
-;; and this notice must be preserved on all copies.
-
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-;;
-;; Haskell Mode. A major mode for editing and running Haskell. (Version 0.0)
-;; =================================================================
-;;
-;; This is a mode for editing and running Haskell.
-;; It is very much based on the sml mode for GNU Emacs. It
-;; features:
-;;
-;;      - Inferior shell running Haskell. No need to leave emacs, just
-;;        keep right on editing while Haskell runs in another window.
-;;
-;;      - Automatic "load file" in inferior shell. Send regions of code
-;;        to the Haskell program.
-;;
-;;
-;; 1. HOW TO USE THE Haskell-MODE
-;; ==========================
-;;
-;; Here is a short introduction to the mode.
-;;
-;; 1.1 GETTING STARTED
-;; -------------------
-;;
-;; If you are an experienced user of Emacs, just skip this section.
-;;
-;; To use the haskell-mode, insert this in your "~/.emacs" file (Or ask your
-;; emacs-administrator to help you.):
-;;
-;;    (setq auto-mode-alist (cons '("\\.hs$" . haskell-mode) (cons '("\\.lhs$" . haskell-mode)
-;;                           auto-mode-alist)))
-;;    (autoload 'haskell-mode "haskell-mode" "Major mode for editing Haskell." t)
-;;
-;; Now every time a file with the extension `.hs' or `.lhs' is found, it is
-;; automatically started up in haskell-mode.
-;;
-;; You will also have to specify the path to this file, so you will have
-;; to add this as well:
-;;
-;;    (setq load-path (cons "/usr/me/emacs" load-path))
-;;
-;; where "/usr/me/emacs" is the directory where this file is.
-;;
-;; You may also want to compile the this file (M-x byte-compile-file)
-;; for speed.
-;;
-;; You are now ready to start using haskell-mode. If you have tried other
-;; language modes (like lisp-mode or C-mode), you should have no
-;; problems. There are only a few extra functions in this mode.
-;;
-;; 1.2. EDITING COMMANDS.
-;; ----------------------
-;;
-;; The following editing and inferior-shell commands can ONLY be issued
-;; from within a buffer in haskell-mode.
-;;
-;; LFD (haskell-newline-and-indent).  
-;;     This is probably the function you will be using the most (press
-;;     CTRL while you press Return, press C-j or press Newline). It
-;;     makes a new line and performs indentation based on the last 
-;;     preceding non-comment line.
-;;
-;; M-; (indent-for-comment).
-;;     Like in other language modes, this command will give you a comment
-;;     at the of the current line. The column where the comment starts is
-;;     determined by the variable comment-column (default: 40).
-;;    
-;; C-c C-v (haskell-mode-version). 
-;;     Get the version of the haskell-mode.
-;;
-;;
-;; 1.3. COMMANDS RELATED TO THE INFERIOR SHELL
-;; -------------------------------------------
-;;
-;; C-c C-s (haskell-pop-to-shell).
-;;     This command starts up an inferior shell running haskell. If the shell
-;;     is running, it will just pop up the shell window.
-;;
-;; C-c C-u (haskell-save-buffer-use-file).
-;;     This command will save the current buffer and send a "load file",
-;;     where file is the file visited by the current buffer, to the
-;;     inferior shell running haskell.
-;;
-;; C-c C-f (haskell-run-on-file).
-;;     Will send a "load file" to the inferior shell running haskell,
-;;     prompting you for the file name.
-;;    
-;; C-c C-r (haskell-send-region). 
-;;     Will send region, from point to mark, to the inferior shell
-;;     running haskell.
-;;
-;; C-c C-b (haskell-send-buffer). 
-;;     Will send whole buffer to inferior shell running haskell.
-;;
-;; 2. INDENTATION
-;; ================
-;; 
-;; The first indentation command (using C-j or TAB) on a given line
-;; indents like the last preceding non-comment line. The next TAB
-;; indents to the indentation of the innermost enclosing scope. Further
-;; TABs get you to further enclosing scopes. After indentation has
-;; reached the first column, the process restarts using the indentation
-;; of the preceding non-comment line, again.
-;;
-;; 3. INFERIOR SHELL.
-;; ==================
-;;
-;; The mode for Standard ML also contains a mode for an inferior shell
-;; running haskell. The mode is the same as the shell-mode, with just one
-;; extra command.
-;;
-;; 3.1. INFERIOR SHELL COMMANDS
-;; ----------------------------
-;;
-;; C-c C-f (haskell-run-on-file).  Send a `load file' to the process running
-;; haskell.
-;;
-;; 3.2. CONSTANTS CONTROLLING THE INFERIOR SHELL MODE
-;; --------------------------------------------------
-;;
-;; Because haskell is called differently on various machines, and the
-;; haskell-systems have their own command for reading in a file, a set of
-;; constants controls the behavior of the inferior shell running haskell (to
-;; change these constants: See CUSTOMIZING YOUR Haskell-MODE below).
-;;
-;; haskell-prog-name (default "hbi").
-;;     This constant is a string, containing the command to invoke
-;;     Standard ML on your system. 
-;;
-;; haskell-use-right-delim (default "\"")
-;; haskell-use-left-delim  (default "\"")
-;;     The left and right delimiter used by your version of haskell, for
-;;     `use file-name'.
-;;
-;; haskell-process-name (default "Haskell"). 
-;;     The name of the process running haskell. (This will be the name
-;;     appearing on the mode line of the buffer)
-;;
-;; NOTE: The haskell-mode functions: haskell-send-buffer, haskell-send-function and
-;; haskell-send-region, creates temporary files (I could not figure out how
-;; to send large amounts of data to a process). These files will be
-;; removed when you leave emacs.
-;;
-;; 4. FONTIFICATION
-;;
-;; There is support for Jamie Zawinski's font-lock-mode through the
-;; variable "haskell-font-lock-keywords".
-;;
-;; 5. CUSTOMIZING YOUR Haskell-MODE
-;; ============================
-;;
-;; If you have to change some of the constants, you will have to add a
-;; `hook' to the haskell-mode. Insert this in your "~/.emacs" file.
-;;
-;;    (setq haskell-mode-hook 'my-haskell-constants)
-;;
-;; Your function "my-haskell-constants" will then be executed every time
-;; "haskell-mode" is invoked.  Now you only have to write the emacs-lisp
-;; function "my-haskell-constants", and put it in your "~/.emacs" file.
-;;
-;; Say you are running a version of haskell that uses the syntax `load
-;; ["file"]', is invoked by the command "OurHaskell" and you don't want the
-;; indentation algorithm to indent according to open parenthesis, your
-;; function should look like this:
-;;
-;;    (defun my-haskell-constants ()
-;;       (setq haskell-prog-name "OurHaskell")
-;;       (setq haskell-use-left-delim "[\"")
-;;       (setq haskell-use-right-delim "\"]")
-;;       (setq haskell-paren-lookback nil))
-;;
-;; The haskell-shell also runs a `hook' (haskell-shell-hook) when it is invoked.
-;;
-;;
-;;
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-;;
-;;
-;; ORIGINAL AUTHOR
-;;         Lars Bo Nielsen
-;;         Aalborg University
-;;         Computer Science Dept.
-;;         9000 Aalborg
-;;         Denmark
-;;
-;;         lbn@iesd.dk
-;;         or: ...!mcvax!diku!iesd!lbn
-;;         or: mcvax!diku!iesd!lbn@uunet.uu.net
-;;
-;; MODIFIED FOR Haskell BY
-;;        Lennart Augustsson
-;;        indentation stuff by Peter Thiemann
-;;
-;;
-;; Please let me know if you come up with any ideas, bugs, or fixes.
-;;
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-
-(defconst haskell-mode-version-string
-  "HASKELL-MODE, Version 0.2, PJT indentation")
-
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-;;;
-;;; CONSTANTS CONTROLLING THE MODE.
-;;;
-;;; These are the constants you might want to change
-;;; 
-
-;; The command used to start up the haskell-program.
-(defconst haskell-prog-name "hbi" "*Name of program to run as haskell.")
-
-;; The left delimmitter for `load file'
-(defconst haskell-use-left-delim "\""
-  "*The left delimiter for the filename when using \"load\".")
-
-;; The right delimmitter for `load file'
-(defconst haskell-use-right-delim "\""
-  "*The right delimiter for the filename when using \"load\".")
-
-;; A regular expression matching the prompt pattern in the inferior
-;; shell
-(defconst haskell-shell-prompt-pattern "^> *"
-  "*The prompt pattern for the inferion shell running haskell.")
-
-;; The template used for temporary files, created when a region is
-;; send to the inferior process running haskell.
-(defconst haskell-tmp-template "/tmp/haskell.tmp."
-  "*Template for the temporary file, created by haskell-simulate-send-region.")
-
-;; The name of the process running haskell (This will also be the name of
-;; the buffer).
-(defconst haskell-process-name "Haskell" "*The name of the Haskell-process")
-
-;;;
-;;; END OF CONSTANTS CONTROLLING THE MODE.
-;;;
-;;; If you change anything below, you are on your own.
-;;; 
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-
-
-(defvar haskell-mode-syntax-table nil "The syntax table used in haskell-mode.")
-
-(defvar haskell-mode-map nil "The mode map used in haskell-mode.")
-
-(defvar haskell-mode-abbrev-table nil "The abbrev-table used in haskell-mode.")
-
-(defvar haskell-old-kill-emacs-hook nil "Old value of kill-emacs-hook")
-
-(defun haskell-mode ()
-  "Major mode for editing Haskell code.
-Tab indents for Haskell code.
-Comments are delimited with --
-Paragraphs are separated by blank lines only.
-Delete converts tabs to spaces as it moves back.
-
-Key bindings:
-=============
-
-\\[haskell-pop-to-shell]\t  Pop to the haskell window.
-\\[haskell-save-buffer-use-file]\t  Save the buffer, and send a \"load file\".
-\\[haskell-send-region]\t  Send region (point and mark) to haskell.
-\\[haskell-run-on-file]\t  Send a \"load file\" to haskell.
-\\[haskell-send-buffer]\t  Send whole buffer to haskell.
-\\[haskell-mode-version]\t  Get the version of haskell-mode.
-\\[haskell-evaluate-expression]\t  Prompt for an expression and evalute it.
-
-
-Mode map
-========
-\\{haskell-mode-map}
-Runs haskell-mode-hook if non nil."
-  (interactive)
-  (kill-all-local-variables)
-  (if haskell-mode-map
-      ()
-    (setq haskell-mode-map (make-sparse-keymap))
-    (define-key haskell-mode-map "\C-c\C-v" 'haskell-mode-version)
-    (define-key haskell-mode-map "\C-c\C-u" 'haskell-save-buffer-use-file)
-    (define-key haskell-mode-map "\C-c\C-s" 'haskell-pop-to-shell)
-    (define-key haskell-mode-map "\C-c\C-r" 'haskell-send-region)
-    (define-key haskell-mode-map "\C-c\C-m" 'haskell-region)
-    (define-key haskell-mode-map "\C-c\C-f" 'haskell-run-on-file)
-    (define-key haskell-mode-map "\C-c\C-b" 'haskell-send-buffer)
-    (define-key haskell-mode-map "\C-ce"    'haskell-evaluate-expression)
-    (define-key haskell-mode-map "\C-j"     'haskell-newline-and-indent)
-    (define-key haskell-mode-map "\177"     'backward-delete-char-untabify))
-  (use-local-map haskell-mode-map)
-  (setq major-mode 'haskell-mode)
-  (setq mode-name "Haskell")
-  (define-abbrev-table 'haskell-mode-abbrev-table ())
-  (setq local-abbrev-table haskell-mode-abbrev-table)
-  (if haskell-mode-syntax-table
-      ()
-    (setq haskell-mode-syntax-table (make-syntax-table))
-    (modify-syntax-entry ?{  "(}1"    haskell-mode-syntax-table)
-    (modify-syntax-entry ?}  "){4"    haskell-mode-syntax-table)
-; partain: out
-;    (modify-syntax-entry ?-  "_ 2356" haskell-mode-syntax-table)
-;    (modify-syntax-entry ?\f "> b"    haskell-mode-syntax-table)
-;    (modify-syntax-entry ?\n "> b"    haskell-mode-syntax-table)
-; partain: end out
-; partain: in
-    (modify-syntax-entry ?-  "_ 23" haskell-mode-syntax-table)
-;    (modify-syntax-entry ?\f "> b"    haskell-mode-syntax-table)
-;    (modify-syntax-entry ?\n "> b"    haskell-mode-syntax-table)
-; partain: end in
-    (modify-syntax-entry ?\\ "\\"     haskell-mode-syntax-table)
-    (modify-syntax-entry ?*  "_"      haskell-mode-syntax-table)
-    (modify-syntax-entry ?_  "_"      haskell-mode-syntax-table)
-    (modify-syntax-entry ?'  "_"      haskell-mode-syntax-table)
-    (modify-syntax-entry ?:  "_"      haskell-mode-syntax-table)
-    (modify-syntax-entry ?|  "."      haskell-mode-syntax-table)
-    )
-  (set-syntax-table haskell-mode-syntax-table)
-  (make-local-variable 'require-final-newline) ; Always put a new-line
-  (setq require-final-newline t)       ; in the end of file
-  (make-local-variable 'indent-line-function)
-  (setq indent-line-function 'haskell-indent-line)
-  (make-local-variable 'comment-start)
-  (setq comment-start "-- ")
-  (make-local-variable 'comment-end)
-  (setq comment-end "")
-  (make-local-variable 'comment-column)
-  (setq comment-column 60)             ; Start of comment in this column
-  (make-local-variable 'comment-start-skip)
-  (setq comment-start-skip "--[^a-zA-Z0-9]*") ; This matches a start of comment
-  (make-local-variable 'comment-indent-function)
-  (setq comment-indent-function 'haskell-comment-indent)
-  ;;
-  ;; Adding these will fool the matching of parens. I really don't
-  ;; know why. It would be nice to have comments treated as
-  ;; white-space
-  ;; 
-  ;; (make-local-variable 'parse-sexp-ignore-comments)
-  ;; (setq parse-sexp-ignore-comments t)
-  ;; 
-  (run-hooks 'haskell-mode-hook))              ; Run the hook
-
-(defun haskell-mode-version ()
-  (interactive)
-  (message haskell-mode-version-string))
-
-
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-;;;
-;;; INDENTATION
-;;;
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-
-;;; some variables for later use
-
-(defvar haskell-open-comment "{-")
-(defvar haskell-close-comment "-}")
-(defvar haskell-indentation-counter 0
-  "count repeated invocations of indent-for-tab-command")
-(defvar haskell-literate-flag nil
-  "used to guide literate/illiterate behavior, set automagically")
-
-(defun haskell-newline-and-indent ()
-  (interactive)
-  (setq haskell-literate-flag
-       (save-excursion
-         (beginning-of-line)
-         (= (following-char) ?>)))
-  (newline)
-  (if haskell-literate-flag (insert ">"))
-  (haskell-indent-line))
-
-(defun haskell-indent-line ()
-  "Indent current line of ordinary or literate Haskell code."
-  (interactive)
-  (let ((indent (haskell-calculate-indentation-pjt-2)))
-    (if (/= (current-indentation) indent)
-       (let ((beg (progn
-                    (beginning-of-line)
-                    (if (= (following-char) ?>) (forward-char 1)) ;LITERATE
-                    (point))))
-         (skip-chars-forward "\t ")
-         (delete-region beg (point))
-         (indent-to indent))
-      ;; If point is before indentation, move point to indentation
-      (if (< (current-column) (current-indentation))
-         (skip-chars-forward "\t ")))))
-
-(defun haskell-calculate-indentation ()
-  (save-excursion
-    (let ((col (current-column)))
-      (while (and (not (bobp))         ;skip over empty and comment-only lines
-                 (= col (current-column)))
-       (previous-line 1)
-       (beginning-of-line)                     ; Go to first non whitespace
-       (if (= (following-char) ?>)     ;LITERATE
-           (forward-char 1)
-         (if haskell-literate-flag     ;ignore illiterate lines
-             (end-of-line)))
-       (skip-chars-forward "\t ")              ; on the line.
-       (setq col (current-column))
-       (search-forward-regexp (concat haskell-open-comment "\\|--\\|\n") nil 0)
-       (goto-char (match-beginning 0)))
-      (search-backward-regexp "\\b\\(where\\|let\\|of\\|in\\)\\b\\|\n" nil 0)
-      (if (looking-at "\n")
-         ()
-       (setq col (current-column))
-       (forward-word 1)
-       (skip-chars-forward "\t ")
-       (if (looking-at "\\w")
-           (setq col (current-column))
-         (setq col (+ 2 col))))
-      col)))
-
-(defun haskell-calculate-indentation-pjt-2 ()
-  "Calculate indentation for Haskell program code, versatile version"
-  (save-excursion
-    (if (eq last-command 'haskell-indentation)
-       (setq haskell-indentation-counter (1+ haskell-indentation-counter))
-      (setq haskell-indentation-counter -1))
-    (setq this-command 'haskell-indentation)
-    (let* ((simple-indent (haskell-calculate-indentation))
-          (count haskell-indentation-counter)
-          (min-indent simple-indent)   ; minimum indentation found in a non-comment line
-          (last-indent simple-indent)  ; indentation of the following non-comment line
-          (return-indent nil)          ; computed indentation
-          (comment-depth 0))
-      (previous-line 1)
-      (if (< haskell-indentation-counter 0) ; 1st tab gives simple indentation
-         (setq return-indent simple-indent))
-      (while (not return-indent)
-       (if (search-backward-regexp "\\b\\(where\\|let\\|of\\)\\b\\|\n\\|{-\\|-}" nil t 1)
-           (cond
-            ((looking-at haskell-open-comment)
-             (setq comment-depth (1- comment-depth)))
-            ((looking-at haskell-close-comment)
-             (setq comment-depth (1+ comment-depth)))
-            ((= 0 comment-depth)
-             (cond
-              ((looking-at "\n")
-               (save-excursion
-                 (forward-char 1)
-                 (if (= (following-char) ?>)
-                     (forward-char 1)
-                   (if haskell-literate-flag
-                       (end-of-line))) ;LITERATE: ignore lines w/o >
-                 (skip-chars-forward "\t ")
-                 (if (looking-at (concat haskell-open-comment "\\|--\\|\n"))
-                     ()
-                   (setq last-indent (current-column))
-                   (if (< last-indent min-indent)
-                       (setq min-indent last-indent)))))
-              (t                       ; looking at a keyword
-               (save-excursion
-                 (forward-word 1)
-                 (skip-chars-forward " \t")
-                 (if (and haskell-literate-flag ;LITERATE: ignore lines w/o >
-                          (save-excursion
-                            (beginning-of-line)
-                            (/= (following-char) ?>)))
-                     (end-of-line))
-                 (if (looking-at (concat haskell-open-comment "\\|--\\|\n"))
-                     ()
-                   (setq last-indent (current-column)))
-                 (if (<= last-indent min-indent)
-                     (if (> count 0)
-                         (setq count (1- count))
-                       (setq return-indent last-indent)))
-                 (if (< last-indent min-indent)
-                     (setq min-indent last-indent)))))))
-         (setq return-indent simple-indent)
-         (setq haskell-indentation-counter -1)))
-      return-indent)))
-
-(defun haskell-skip-nested-comment ()
-  ;; point looks at opening {-, move over closing -}
-  ;; todo: specify what happens on failure, bounds check ...
-  (forward-char 2)
-  (let ((comment-depth 1))
-    (while (> comment-depth 0)
-      (search-forward-regexp "{-\\|-}")
-      (goto-char (match-beginning 0))
-      (setq comment-depth
-           (if (= (following-char) 123) ; code for opening brace
-               (1+ comment-depth)
-             (1- comment-depth)))
-      (goto-char (match-end 0)))))
-
-
-;;;seemingly obsolete functions
-(defun haskell-inside-of-inline-comment ()
-  (let ((bolp (save-excursion
-              (beginning-of-line)
-              (point))))
-    (search-backward comment-start bolp t 1)))
-
-(defun haskell-inside-of-nested-comment ()
-  (save-excursion
-    (let ((count 0))
-      (while
-         (search-backward-regexp "\\({-\\|-}\\)" 0 t 1)
-       (if (haskell-inside-of-inline-comment)
-           ()
-         (if (looking-at haskell-open-comment)
-             (setq count (1+ count))
-           (setq count (1- count)))))
-      (> count 0))))
-
-(defun haskell-inside-of-comment ()
-  (or (haskell-inside-of-inline-comment)
-      (haskell-inside-of-nested-comment)))
-
-;;;stolen from sml-mode.el
-(defun haskell-comment-indent ()
-  "Compute indentation for Haskell comments"
-  (if (looking-at "^--")
-      0
-    (save-excursion
-      (skip-chars-backward " \t")
-      (max (1+ (current-column))
-          comment-column))))
-
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-;;;
-;;; INFERIOR SHELL
-;;;
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-
-(defvar haskell-shell-map nil "The mode map for haskell-shell.")
-
-(defun haskell-shell ()
-  "Inferior shell invoking Haskell.
-It is not possible to have more than one shell running Haskell.
-Like the shell mode with the additional command:
-
-\\[haskell-run-on-file]\t Runs haskell on the file.
-\\{haskell-shell-map}
-Variables controlling the mode:
-
-haskell-prog-name (default \"hbi\")
-    The string used to invoke the haskell program.
-
-haskell-use-right-delim (default \"\\\"\")
-haskell-use-left-delim  (default \"\\\"\")
-    The left and right delimiter used by your version of haskell, for
-    \"load file-name\".
-
-haskell-process-name (default \"Haskell\")
-    The name of the process running haskell.
-
-haskell-shell-prompt-pattern (default \"^> *\")
-    The prompt pattern.
-
-Runs haskell-shell-hook if not nil."
-  (interactive)
-  (if (not (process-status haskell-process-name))
-      (save-excursion                  ; Process is not running
-       (message "Starting Haskell...") ; start up a new process
-       (require 'shell)
-       (set-buffer (make-comint haskell-process-name haskell-prog-name))
-       (erase-buffer)                  ; Erase the buffer if a previous
-       (if haskell-shell-map           ; process died in there
-           ()
-         (setq haskell-shell-map (copy-keymap shell-mode-map))
-         (define-key haskell-shell-map "\C-c\C-f" 'haskell-run-on-file))
-       (use-local-map haskell-shell-map)
-       (make-local-variable 'shell-prompt-pattern)
-       (setq shell-prompt-pattern haskell-shell-prompt-pattern)
-       (setq major-mode 'haskell-shell)
-       (setq mode-name "Haskell Shell")
-       (setq mode-line-format 
-             "-----Emacs: %17b   %M   %[(%m: %s)%]----%3p--%-")
-       (set-process-filter (get-process haskell-process-name) 'haskell-process-filter)
-       (message "Starting Haskell...done.")
-       (run-hooks 'haskell-shell-hook))))
-
-(defun haskell-process-filter (proc str)
-  (let ((cur (current-buffer))
-       (pop-up-windows t))
-    (pop-to-buffer (concat "*" haskell-process-name "*"))
-    (goto-char (point-max))
-    (if (string= str "\b\b\b  \b\b\b")
-       (backward-delete-char 4)
-      (insert str))
-    (set-marker (process-mark proc) (point-max))
-    (pop-to-buffer cur)))
-
-(defun haskell-pop-to-shell ()
-  (interactive)
-  (haskell-shell)
-  (pop-to-buffer (concat "*" haskell-process-name "*")))
-
-(defun haskell-run-on-file (fil)
-  (interactive "FRun Haskell on : ")
-  (haskell-shell)
-  (save-some-buffers)
-  (process-send-string haskell-process-name
-              (concat "load " haskell-use-left-delim (expand-file-name fil)
-                      haskell-use-right-delim ";\n")))
-
-(defun haskell-save-buffer-use-file ()
-  "Save the buffer, and send a `use file' to the inferior shell
-running Haskell."
-  (interactive)
-  (let (file)
-    (if (setq file (buffer-file-name)) ; Is the buffer associated
-       (progn                          ; with file ?
-         (save-buffer)
-         (haskell-shell)
-         (process-send-string haskell-process-name
-                      (concat "load " haskell-use-left-delim
-                              (expand-file-name file)
-                              haskell-use-right-delim ";\n")))
-      (error "Buffer not associated with file."))))
-
-(defvar haskell-tmp-files-list nil
-  "List of all temporary files created by haskell-simulate-send-region.
-Each element in the list is a list with the format:
-
-      (\"tmp-filename\"  buffer  start-line)")
-
-(defvar haskell-simulate-send-region-called-p nil
-  "Has haskell-simulate-send-region been called previously.")
-
-(defun haskell-make-temp-name (pre)
-  (concat (make-temp-name pre) ".m"))
-
-(defun haskell-simulate-send-region (point1 point2)
-  "Simulate send region. As send-region only can handle what ever the
-system sets as the default, we have to make a temporary file.
-Updates the list of temporary files (haskell-tmp-files-list)."
-  (let ((file (expand-file-name (haskell-make-temp-name haskell-tmp-template))))
-    ;; Remove temporary files when we leave emacs
-    (if (not haskell-simulate-send-region-called-p)
-       (progn
-         (setq haskell-old-kill-emacs-hook kill-emacs-hook)
-         (setq kill-emacs-hook 'haskell-remove-tmp-files)
-         (setq haskell-simulate-send-region-called-p t)))
-    (save-excursion
-      (goto-char point1)
-      (setq haskell-tmp-files-list
-           (cons (list file
-                       (current-buffer)
-                       (save-excursion ; Calculate line no.
-                         (beginning-of-line)
-                         (1+ (count-lines 1 (point)))))
-                 haskell-tmp-files-list)))
-    (write-region point1 point2 file nil 'dummy)
-    (haskell-shell)
-    (message "Using temporary file: %s" file)
-    (process-send-string
-     haskell-process-name
-     ;; string to send: load file;
-     (concat "load " haskell-use-left-delim file haskell-use-right-delim ";\n"))))
-
-(defun haskell-remove-tmp-files ()
-  "Remove the temporary files, created by haskell-simulate-send-region, if
-they still exist. Only files recorded in haskell-tmp-files-list are removed."
-  (message "Removing temporary files created by haskell-mode...")
-  (while haskell-tmp-files-list
-    (condition-case ()
-       (delete-file (car (car haskell-tmp-files-list)))
-      (error ()))
-    (setq haskell-tmp-files-list (cdr haskell-tmp-files-list)))
-  (message "Removing temporary files created by haskell-mode...done.")
-  (run-hooks 'haskell-old-kill-emacs-hook))
-
-(defun haskell-send-region ()
-  "Send region."
-  (interactive)
-  (let (start end)
-    (save-excursion
-      (setq end (point))
-      (exchange-point-and-mark)
-      (setq start (point)))
-    (haskell-simulate-send-region start end)))
-
-(defun haskell-send-buffer ()
-  "Send the buffer."
-  (interactive)
-  (haskell-simulate-send-region (point-min) (point-max)))
-
-(defun haskell-evaluate-expression (h-expr)
-  "Prompt for and evaluate an expression"
-  (interactive "sExpression: ")
-  (let ((str (concat h-expr ";\n"))
-       (buf (current-buffer)))
-    (haskell-pop-to-shell)
-    (insert str)
-    (process-send-string haskell-process-name str)
-    (pop-to-buffer buf)))
-
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-;;;
-;;; keywords for jwz's font-look-mode (lemacs 19)
-;;;
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-(setq haskell-font-lock-keywords
-      (list (concat "\\b\\("
-                   (mapconcat 'identity 
-                              '("case" "class" "data" "default" "deriving" "else" "hiding"
-                                "if" "import" "in" "infix" "infixl" "infixr" "instance"
-                                "interface" "let" "module" "of" "renaming" "then" "to"
-                                "type" "where")
-                              "\\|")
-                   "\\)\\b")
-           (list "^\\(#[ \t]*\\(if\\|ifdef\\|ifndef\\|else\\|endif\\|include\\)\\)")
-           (list "\\(^>?\\|\\bwhere\\b\\|\\blet\\b\\)[ \t]*\\(\\(\\w\\|\\s_\\)+\\)\\(\\([^=\n]*\\S.\\)?=\\(\\S.\\|$\\)\\|[ \t]*::\\S.\\).*$"
-                   2 'font-lock-function-name-face)
-           (list "\\b\\(data\\|type\\)\\b[ \t]+\\(\\(\\w\\|\\s_\\)+\\)"
-                    2 'font-lock-type-face)
-           (list (concat "'\\([^\\]\\|\\\\\\([0-9]+\\|"
-                         (mapconcat 'identity
-                                    '("a" "b" "f" "n" "r" "t" "v" "\\\\" "\"" "'" "&")
-                                    "\\|")
-                         "\\|\\^\\([][_^A-Z@\\\\]\\)"
-                         "\\)\\)'") 1 'font-lock-string-face)))
-
-;;; font-lock-keywords for literate style files
-
-(setq haskell-font-lock-keywords-2
-      (list (concat "^>.*\\b\\("
-                   (mapconcat 'identity 
-                              '("case" "class" "data" "default" "deriving" "else" "hiding"
-                                "if" "import" "in" "infix" "infixl" "infixr" "instance"
-                                "interface" "let" "module" "of" "renaming" "then" "to"
-                                "type" "where")
-                              "\\|")
-                   "\\)\\b")
-           (list "^>\\(.*\\(\\bwhere\\b\\|\\blet\\b\\)\\|\\)[ \t]*\\(\\(\\w\\|\\s_\\)+\\)\\(\\([^=\n]*\\S.\\)?=\\(\\S.\\|$\\)\\|[ \t]*::\\S.\\).*$"
-                   3 'font-lock-function-name-face)
-           (list "^>.*\\b\\(data\\|type\\)\\b[ \t]+\\(\\(\\w\\|\\s_\\)+\\)"
-                    2 'font-lock-type-face)
-           (list (concat "^>.*'\\([^\\]\\|\\\\\\([0-9]+\\|"
-                         (mapconcat 'identity
-                                    '("a" "b" "f" "n" "r" "t" "v" "\\\\" "\"" "'" "&")
-                                    "\\|")
-                         "\\|\\^\\([][_^A-Z@\\\\]\\)"
-                         "\\)\\)'") 1 'font-lock-string-face)))
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-;;;
-;;; END OF Haskell-MODE
-;;;
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-(provide 'haskell-mode)
diff --git a/ghc/CONTRIB/haskell-modes/glasgow/original/haskell-mode.el b/ghc/CONTRIB/haskell-modes/glasgow/original/haskell-mode.el
deleted file mode 100644 (file)
index b9a490f..0000000
+++ /dev/null
@@ -1,1935 +0,0 @@
-;; Haskell major mode
-;; (c) Copyright, Richard McPhee et al. 
-;; University of Glasgow, February 1993
-
-
-
-;; if .hs is not recognised then put the extension in auto-mode-list
-
-(if (assoc "\\.hs" auto-mode-alist)
-    nil
-  (nconc auto-mode-alist '(("\\.hs". haskell-mode))))
-
-(if (assoc "\\.hi" auto-mode-alist)
-    nil
-  (nconc auto-mode-alist '(("\\.hi". haskell-mode))))
-
-(if (assoc "\\.gs" auto-mode-alist)
-    nil
-  (nconc auto-mode-alist '(("\\.gs". haskell-mode))))
-
-(defvar haskell-mode-syntax-table nil
-  "Syntax table for haskell-mode buffers.")
-
-(defvar haskell-mode-abbrev-table nil
-  "Abbrev table for haskell-mode buffers.")
-
-(defvar haskell-mode-map (make-sparse-keymap)
-  "Keymap for haskell-mode-buffers.")
-
-
-
-;;; Here are the keymaps used in haskell-mode
-
-(define-key haskell-mode-map "\M-;"  'haskell-insert-comment)
-(define-key haskell-mode-map "\C-c=" 'haskell-insert-concat)
-(define-key haskell-mode-map "\C-c;" 'set-haskell-comment-column)
-(define-key haskell-mode-map "\C-c+" 'set-haskell-concat-column)
-(define-key haskell-mode-map "\C-cn" 'set-haskell-indent-offset)
-(define-key haskell-mode-map "\C-cl" 'set-haskell-list-offset)
-(define-key haskell-mode-map "\C-ci" 'set-haskell-if-offset)
-(define-key haskell-mode-map "\C-ce" 'set-haskell-let-offset)
-(define-key haskell-mode-map "\C-cc" 'set-haskell-case-offset)
-(define-key haskell-mode-map "\C-ct" 'set-haskell-then-offset)
-(define-key haskell-mode-map "\C-co" 'set-haskell-comp-offset)
-(define-key haskell-mode-map "\C-cw" 'set-haskell-where-offset)
-(define-key haskell-mode-map "\C-cg" 'goto-line)
-(define-key haskell-mode-map "\C-j"  'haskell-reindent-then-newline-and-indent)
-(define-key haskell-mode-map "\t"    'haskell-indent-line)
-(define-key haskell-mode-map "}"     'electric-haskell-brace)
-(define-key haskell-mode-map "]"     'electric-haskell-brace)
-(define-key haskell-mode-map ")"     'haskell-insert-round-paren)
-(define-key haskell-mode-map "\C-cr" 'haskell-indent-region)
-(define-key haskell-mode-map "\C-cf" 'haskell-further-indent)
-(define-key haskell-mode-map "\C-cb" 'haskell-lesser-indent)
-(define-key haskell-mode-map "\177"  'backward-delete-char-untabify)
-(define-key haskell-mode-map "\M-\C-\177" 'delete-horizontal-space)
-                                       
-(defun haskell-set-local-vars ()
-  "Set the local variables for haskell-mode."
-  (kill-all-local-variables)
-
-  (setq indent-line-function 'haskell-indent-line)
-
-  (make-local-variable 'haskell-std-list-indent)
-  ;;Non-nil means indent to the offset, 'haskell-list-offset' in a bracket rather than
-  ;; moving to the next word afer a function name
-  (setq haskell-std-list-indent t)
-
-  (make-local-variable 'haskell-nest-ifs)
-  ;;Non-nil means that 'if' statements are nested ie. lined up with `if' not `else'.
-  (setq haskell-nest-ifs nil)
-
-  (make-local-variable 'haskell-align-else-with-then)
-  ;;Non-nil means align an `else' under it's corresponding `then'
-  (setq haskell-align-else-with-then nil)
-
-
-  ;;The local vars for 'where' indentation
-
-  (make-local-variable 'haskell-align-where-with-eq)
-  ;;Non-nil means align a 'where' under it's corresponding equals sign
-  (setq haskell-align-where-with-eq t)
-
-  (make-local-variable 'haskell-align-where-after-eq)
-  ;;Non-nil means align a 'where' after it's corresponding equals sign
-  (setq haskell-align-where-after-eq nil)
-
-  (make-local-variable 'haskell-std-indent-where)
-  ;;put the 'where' the standard offset ie. 'haskell-indent-offset'
-  (setq haskell-std-indent-where nil)  
-
-
-  (make-local-variable 'haskell-always-fixup-comment-space)
-  ;;Non-nil means always insert a (single) space after a comment, even
-  ;; if there is more or less than one.
-  (setq haskell-always-fixup-comment-space t)
-
-  
-  (make-local-variable 'haskell-indent-offset)
-  ;;Extra indentation for a line continued after a keyword.
-  (setq haskell-indent-offset 4)
-
-  (make-local-variable 'haskell-list-offset)
-  ;;Extra indentation for continuing a list.
-  (setq haskell-list-offset 4)
-  
-  (make-local-variable 'haskell-comp-offset)
-  ;;Extra indentation for a list comprehension.
-  (setq haskell-comp-offset 4)
-  
-  (make-local-variable 'haskell-case-offset)
-  (setq haskell-case-offset 4)
-
-  (make-local-variable 'haskell-where-offset)
-  (setq haskell-where-offset 4)
-
-  (make-local-variable 'haskell-let-offset)
-  (setq haskell-let-offset 4)
-
-  (make-local-variable 'haskell-then-offset)
-  (setq haskell-then-offset 0)
-
-  (make-local-variable 'haskell-if-offset)
-  (setq haskell-if-offset 4)
-
-  (make-local-variable 'haskell-comment-column)
-  (setq haskell-comment-column 35)
-  
-  (make-local-variable 'haskell-concat-column)
-  (setq haskell-concat-column 69)
-  
-  (make-local-variable 'haskell-where-threshold)
-  (setq haskell-where-threshold 35)
-  
-  (make-local-variable 'line-comment)
-  (setq line-comment "-- ")
-
-  (make-local-variable 'haskell-indent-style)
-  (setq haskell-indent-style "none"))
-
-
-(defun haskell-set-syntax-table ()
-  "Set the syntax table for Haskell-mode."
-  (setq haskell-mode-syntax-table (make-syntax-table))
-  (set-syntax-table haskell-mode-syntax-table)
-  (modify-syntax-entry ?\" "\"")
-  (modify-syntax-entry ?\\ "\\")
-  (modify-syntax-entry ?\' "w")
-  (modify-syntax-entry ?_  "w")
-  (modify-syntax-entry ?#  "_")
-  (modify-syntax-entry ?$  "_")
-  (modify-syntax-entry ?%  "_")
-  (modify-syntax-entry ?:  "_")
-  (modify-syntax-entry ??  "_")
-  (modify-syntax-entry ?@  "_")
-  (modify-syntax-entry ?!  "_")
-  (modify-syntax-entry ?^  "_")
-  (modify-syntax-entry ?~  "_")
-  (modify-syntax-entry ?-  "_ 12")
-  (modify-syntax-entry ?\n ">")
-  (modify-syntax-entry ?{  "(}")
-  (modify-syntax-entry ?}  "){")
-  (set-syntax-table haskell-mode-syntax-table))
-
-
-
-(defun haskell-mode ()
-  "Major mode for editing Haskell code.
-Linefeed reindents current line, takes newline and indents.
-Tab indents current line for Haskell code.
-Functions are seperated by blank lines.
-Delete converts tabs to spaces as it moves back.
-\\{haskell-mode-map}
-Variables controlling indentation style:
- haskell-indent-offset
-    Standard extra indentation for continuing Haskell
-    code under the scope of an expression.  The default is 4.
-
- haskell-list-offset
-    Extra indentation for indenting in a list.  Used if variable
-    haskell-std-list-indent is non-nil.  The default is 4.
-
- haskell-comp-offset
-    Extra indentation for continuing a list comprehension.  
-    The default is 4.
-
- haskell-case-offset
-    Standard extra indentation for continuing Haskell
-    code under the scope of an expression.  The default is 4.
-
- haskell-where-offset
-    Standard extra indentation for continuing Haskell
-    code under the scope of a `where'.  The default is 4.
-
- haskell-let-offset
-    Standard extra indentation for continuing Haskell
-    code under the scope of a `let'.  The default is 4.
-
- haskell-then-offset
-    Standard extra indentation for a `then' beyond
-    its corresponding `if'.  The default is 0.
-
- haskell-if-offset
-    Standard extra indentation for continuing Haskell
-    code under the scope of an `if'.  The default is 4.
-
- haskell-comment-column
-    Column to which line comments `--' will be inserted.
-    The default is 35.
-
- haskell-concat-column
-    Column to which concatenation operator `++' will be inserted.
-    The default is 69.
-
- haskell-where-threshold
-    Column beyond which a `where' will be indented to the
-    start of a line (to avoid spilling over lines).
-    The default is 35.
-
- set-haskell-indent-offset (C-c i)
-    Changes the default value of the local variable,
-    haskell-indent-offset.  May be a number from 0-10.
-
- set-haskell-list-indent (C-c l)
-    Change the value of the local variable, 
-    haskell-list-offset.  May be a number from 0-100.
-
- set-haskell-comment-column (C-x ;)
-    Changes the value of the local variable,
-    haskell-comment-column.  May be any number from 0-100."
-
-  (interactive)
-  (haskell-set-local-vars)
-  (haskell-set-syntax-table)
-  (use-local-map haskell-mode-map)
-  (setq major-mode 'haskell-mode)
-  (setq mode-name "Haskell") 
-  (define-abbrev-table 'haskell-mode-abbrev-table ()))
-
-
-
-
-;;; Returns the indentation column for a comment on this line.
-;;; The point is positioned at the last char of any code on the line.
-
-(defun haskell-comment-indent ()
-  "Returns the indentation for a comment on the given line.
-If the line has code on it or the point is not at the beginning of the line,
-then indent to indent-column.
-Otherwise, don't indent."
-  (cond ((or (haskell-code-on-linep)   
-            (not (bolp)))               
-        ;;There is code before the haskell-comment-column
-        ;; or not at the beginning of the line
-        ;;Return the largest of
-        ;; the current column +1 and the haskell-comment-column
-        (max (1+ (current-column))     
-             haskell-comment-column))          
-       (t
-        ;;Otherwise, return 0
-        0)))
-
-
-
-;;; Returns whether a comment is on the current line
-;;; Search from bol, and beware of "--", {-- etc!
-;;; DOES NOT RECOGNISE {- COMMENTS YET or -- within a string
-
-(defun haskell-comment-on-linep ()
-  "Returns the truth value of whether there is a '--' comment on the current line."
-  (save-excursion
-    (beginning-of-line)                
-    (looking-at ".*--")))
-
-
-;;; This doesn't account for comments '{-'.  Test explicitly if you use this function!
-
-(defun haskell-code-on-linep ()
-  "Returns a truth value as to whether there is code on the current line."
-  (save-excursion
-    (beginning-of-line)
-    (not
-     ;; Code on line if not looking at a comment directly
-     ;; and the line is not blank
-     (or
-         (looking-at "^[ \t]*--")      
-         (looking-at "^[ \t]*$")))))   
-
-
-;;; Insert a Haskell "--" comment on the current line.
-;;; Move to the comment position if there's already a comment here.
-;;; Otherwise, the comment is inserted either at the comment column
-;;; or one column after the last non-space character, whichever is further
-;;; to the right.
-;;; This function is executed by M-;
-
-(defun haskell-insert-comment ()
-  "Inserts a '--' comment on the given line."
-  (interactive)
-  (cond ((haskell-comment-on-linep)
-        ;;There is a comment on the line
-        ;;Just reindent existing comment
-        (haskell-reindent-comment))    
-       (t
-        (if (haskell-code-on-linep)
-            ;;There is code on the line
-            ;; and guarenteed that a comment
-            ;; does not already exist.
-            ;;Move to the last nonspace char
-            ;; (there may be spaces after the last char)
-            (progn
-              (end-of-line)                    
-              (skip-chars-backward " \t")))
-        ;;Indent to required level
-        ;; and insert the line comment '--'
-        (indent-to (haskell-comment-indent)) 
-        (insert line-comment))))               
-
-
-;;; Reindents a comment.
-;;; The comment is indented according to the normal rules.
-;;; Skips over ---- and following spaces or tabs
-
-(defun haskell-reindent-comment ()
-  "Indents a comment on a line to keep it at haskell-comment-column,
-if possible.
-It is guaranteed that a comment exists on the current line."
-    (beginning-of-line)
-    ;;Go back to beginning of comment 
-    (re-search-forward "--")           
-    (forward-char -2)
-    ;;Delete all spaces and reindent to
-    ;; the correct location.
-    (delete-horizontal-space)          
-    (indent-to (haskell-comment-indent)) 
-    ;;Move past the comment and insert
-    ;; only one space between it and the text.
-    ;;Leave point just after comment.
-    (skip-chars-forward "- \t")
-    (if haskell-always-fixup-comment-space
-       (progn
-       (fixup-whitespace)                      
-       (forward-char 1))))
-
-
-
-;;; Inserts a haskell concatenation operator, `++', at the
-;;; column dictated by haskell-concat-column
-
-(defun haskell-insert-concat()
-  "Inserts a `++' operator on the given line."
-  (interactive)
-  (end-of-line)                        
-  (skip-chars-backward " \t")
-  ;;Indent to required level
-  ;; and insert the concat operator `++'
-  (indent-to (haskell-concat-indent)) 
-  (insert "++"))
-
-
-
-;;; Returns the indentation column for a concatenation operator on this line.
-;;; The point is positioned at the last char of any code on the line.
-
-(defun haskell-concat-indent ()
-  "Returns the indentation for a concat operator on the given line."
-  (max (1+ (current-column))   
-       haskell-concat-column)) 
-
-
-
-;;; Returns the indentation of the current line of haskell code.
-;;; A blank line has ZERO indentation
-
-(defun haskell-current-indentation ()
-  "Returns the indentation for the current haskell line. A blank line has 
-indentation zero."
-  (save-excursion
-    (beginning-of-line)
-    (if (looking-at "^[ \t]*$")
-       ;;The line is empty
-       ;; so the indentation is zero
-       0
-      ;;Otherwise find the normal value of indentation
-      (current-indentation))))         
-
-
-
-;;; Returns the indentation of the previous line of haskell code.
-;;; A blank line has ZERO indentation
-
-(defun haskell-previous-indentation ()
-  "Returns the previous line's indentation as Haskell indentation."
-  (save-excursion
-    (if (not (bobp))
-       ;;Not at the start of the buffer
-       ;; so get the previous lines indentation
-       (progn
-         (forward-line -1)
-         (haskell-current-indentation))
-      ;;We are at the start of buffer
-      ;;There is no previous line; Indent is zero
-      0)))                             
-
-
-
-;;; Move back to the last line which is aligned in the left column.
-;;; Ignores comments and blank lines.
-;;; The point is left at the beginning of the line.
-
-(defun haskell-back-to-zero-indent ()
-  "Moves point to last line which has zero as indentation."
-  ;;Not at the beginning of buffer.
-  ;;Continue to go to the previous line until
-  ;; we find a line whose indentation is non-zero.
-  ;;Blank lines and lines containing only comments
-  ;; are ignored.
-  (beginning-of-line)
-  (while (and
-         (or (not (zerop (haskell-current-indentation)))       
-             (looking-at "^[ \t]*\\($\\|--\\)"))
-           (not (bobp)))
-    (haskell-backward-to-noncomment)
-    (beginning-of-line)))
-
-
-
-;;; Find the last symbol, usually an equality.
-
-;;; Note: we check for "=" as a complete WORD (and ignore
-;;; comments) when searching for this.  Ie. an `=' may be
-;;; surrounded only by a letter, digit, or whitespace .
-;;; Strings are not considered.
-;;; Don't go beyond the first character in the (possibly narrowed) buffer.
-;;;   From the beginning of the line,
-;;;     find the comment position (or end-of-line)
-;;;     search forward to this position, looking for a "where"
-;;;     If one's found, then search forward for "\b=\b"
-;;;        If there's no equality sign then
-;;;            search forward from the start of the line for an equals
-;;;       Otherwise we found it.
-;;;    If there's no where then search forward for an equals, as above.
-                                
-(defun haskell-back-to-symbol (exp)
-  "Goes backward from point until a symbol, EXP, is found.
-The point is left at the first symbol matching the context 
-of the haskell code."
-  (let* ((found nil)
-        (symbol (concat "[ \ta-z0-9A-Z]" exp "[ \t\na-z0-9A-Z]"))
-        eol-limit
-        bol-limit
-        (zero-indent (save-excursion
-                       (haskell-back-to-zero-indent)
-                       (point)))
-        (initial-depth (car (parse-partial-sexp
-                             (point)
-                             zero-indent))))
-       
-    (while (and (not found)
-               (> (point) zero-indent))
-      ;;Not found and point > point min
-      ;;Record the limit of search for the beginning and
-      ;; end of the line.
-      (setq eol-limit (point)) 
-      (beginning-of-line)
-      (setq bol-limit (point)) 
-      (goto-char eol-limit)            
-      (re-search-backward "\\bwhere\\b" bol-limit 't)
-      ;;Search back from the end of the line
-      ;; to find the most recent 'where'.
-
-      (cond ((and (re-search-backward symbol bol-limit 't)
-                 (= initial-depth
-                    (car (parse-partial-sexp
-                          (point)
-                          zero-indent))))
-            ;;Found a symbol sign surrounded by
-            ;; a letter, digit or space only, or at the
-            ;; beginning of the buffer and they are at
-            ;; the same depth level
-            (setq found 't))
-           ((and (re-search-backward symbol bol-limit 't)
-                 (zerop
-                  (car (parse-partial-sexp
-                        (point)
-                        zero-indent))))
-            ;; Found a symbol and it is not in any parens
-            (setq found 't))
-           ;;Otherwise, go back a line.
-           (t (haskell-backward-to-noncomment))))
-    (if found
-       (forward-char 1))))
-
-
-;;; Goes back to the last keyword.  The point is left at the
-;;; beginning of the keyword.
-;;; The words recognised are:
-;;;   `case',`of',`where',`let',`in',`if',`then',`else'
-
-(defun haskell-back-to-keyword ()
-  "Goes backward from point until a keyword is found.
-The point is left after the first keyword."
-  (let* ((found nil)
-        eol-limit
-        bol-limit
-        (zero-indent (save-excursion
-                       (haskell-back-to-zero-indent)
-                       (point)))
-        (initial-depth (car (parse-partial-sexp
-                             (point)
-                             zero-indent))))
-
-    (while (and (not found)
-               (>= (point) zero-indent))
-      ;;Not found and point > point min
-      ;;Go back past any comment.
-      ;;Record the limit of search for the beginning and
-      ;; end of the line.
-      (setq eol-limit (point)) 
-      (beginning-of-line)
-      (setq bol-limit (point)) 
-      (goto-char eol-limit)            
-      (if (and (re-search-backward
-               "\\b\\(case\\|of\\|where\\|let\\|in\\|if\\|then\\|else\\)\\b"
-               bol-limit 't)
-              (= initial-depth
-                 (car (parse-partial-sexp
-                       (point)
-                       zero-indent))))
-         ;;Found a keyword and it is at the same level as the initial position
-         (progn
-           (setq found 't)
-           (forward-word 1))
-       ;;Otherwise, go back a line.
-       (haskell-backward-to-noncomment)))))
-
-
-
-;;; Returns the end of line (point) of the current line, excluding any
-;;; line comments on it.
-
-(defun haskell-eol ()
-  "Returns the end (point) of the current line, excluding any line comments."
-  (save-excursion
-    (end-of-line)
-    (let ((eol-limit (point))) 
-      (beginning-of-line)
-      (if (search-forward "--" eol-limit 'move-to-eol)
-         ;;Found a '--' 
-         ;;So move to the beginning of the comment
-         ;;If fail then move to end of line
-         (forward-char -2)))
-    (point)))
-
-
-
-;;; Returns whether or not the current line contains an equality outwith a
-;;; comment.  The equality may only be surrounded by a letter, digit or
-;;; whitespace. 
-
-(defun haskell-looking-at-eqp ()
-  "Returns whether or not the current line contains an equality outwith a
-comment."
-  (save-excursion
-    (beginning-of-line)
-    (re-search-forward "[ \ta-z0-9A-Z]=[ \t\na-z0-9A-Z]" (1+ (haskell-eol)) 't)))
-         
-         
-;;; This function does not require all keywords, just those which
-;;; may have a bracket before them.
-(defun haskell-looking-at-keywordp ()
-  "Returns whether or not there is a keyword after the point outwith a
-comment."
-  (save-excursion
-    (re-search-forward 
-     "\\(\\(=>\\|=\\|++\\|->\\|<-\\|::\\)\\|\\b\\(case\\|of\\|if\\|then\\|else\\|let\\|in\\)\\b\\)"
-     (haskell-eol) 't)))
-         
-         
-;;; This function returns whether or not there is a keyword contained in
-;;; the region START END.  START < END.
-
-(defun haskell-keyword-in-regionp (start end)
-  "Returns whether or not there is a keyword between START and END."
-  (save-excursion
-    (goto-char start)
-    (let ((found nil)
-         (eol-limit (haskell-eol)))
-      (while (and (not found) (< (point) end))
-       (if (> eol-limit end)
-           (setq eol-limit end))
-       (if (re-search-forward
-            "\\b\\(case\\|of\\|if\\|then\\|else\\|let\\|in\\)\\b"
-            eol-limit 'move)
-           (setq found t)
-         ;;Otherwise, have not found a keyword.  Now at haskell-eol.
-         (if (< (point) end)
-             ;;We still have an area to search
-             ;; so go forward one line
-             (progn
-               (beginning-of-line)
-               (forward-line 1)
-               (setq eol-limit (haskell-eol))))))
-      ;;found is `t' or point >= end
-      found)))
-        
-
-;;;  Goes back to the last line which is not entirely commented out.
-;;;  The point is left just before the comment.  
-         
-(defun haskell-backward-to-noncomment ()
-  "Sets the point to the last char on the line of Haskell code before a comment."
-  (let ((comment 't)
-       (limit (point-min)))
-      (while (and comment (> (point) limit))
-       ;; comment is true and point > limit
-       (beginning-of-line)
-       (if (< (forward-line -1) 0)
-           ;;This was the first line in the buffer
-           (setq comment nil)
-         ;;Otherwise, this was not the first line
-         (if (not (looking-at "^[ \t]*\\($\\|--\\)"))
-             ;;There is not a comment at the beginning of the line
-             ;; and the line is not blank
-             (progn
-               ;;The line is either blank or has code on it.
-               (setq comment nil)
-               (goto-char (haskell-eol))))))
-
-      ;;return point
-      (point)))
-
-
-
-;;; Indents a region (by applying "tab" to each line).
-;;; The marker upper-marker is set to the end of the region.
-;;; We indent from the beginning of the region to this marker.
-;;; Implements C-c r.
-                     
-(defun haskell-indent-region ()
-  "Indents the region between the point and mark."
-  (interactive)
-  (let ((lower-limit (min (point) (mark)))
-       (upper-limit (max (point) (mark))))
-    (indent-region lower-limit upper-limit 'nil)))
-      
-
-
-;;; Implements TAB.
-;;; This actually indents a line.
-;;; Eventually it will handle a line split at any point,
-
-(defun haskell-indent-line ()
-  "Indent current line as Haskell code.
-Keeps the point at the same position on the line unless the 
-point is less then the current indentation, in which case the 
-point is moved to the first char."
-  (interactive)
-  (save-excursion
-    (let ((indent (haskell-calculate-indentation)))
-      (beginning-of-line)
-      (delete-horizontal-space)
-      ;;Kill any spaces that may preceed the code
-      ;; and reindent to the correct level.
-      (indent-to indent)))
-  (if (< (current-column) (current-indentation))
-      ;;The point is in the indentation
-      ;; so move to the first char on the line
-      (move-to-column (current-indentation))))
-
-
-
-;;; This is the haskell version of the Emacs function
-;;; reindent-then-newline-and-indent.  It was necessary
-;;; to write this because the Emacs version has the 
-;;; terrible property of deleting whitespace BEFORE 
-;;; reindenting the original line.
-
-(defun haskell-reindent-then-newline-and-indent ()
-  "Reidents the current line of Haskell code then takes a
-newline and indents this new line."
-  (interactive)
-  (skip-chars-backward " \t")
-  (haskell-indent-line)
-  (newline)
-  (delete-horizontal-space)
-  (haskell-indent-line))
-
-
-
-;;; Returns whether the first word of the last line with zero indentation 
-;;; is the same as the first word of the current line.
-;;; This function is based on the (reasonable?) assumption that 
-;;; a function definition occurs on the left hand margin.
-;;; This is not quit reasonable since recusive functions are not
-;;; recognised.
-
-(defun haskell-continued-fn-defp ()
-  "Returns whether the first word on the last line with zero indentation
-matches the first word on the current line."
-  (save-excursion
-    (beginning-of-line)
-    (skip-chars-forward " \t")
-    ;;Goto the first non space char 
-    (haskell-word-eq (point)
-                    (save-excursion
-                      (forward-line -1)
-                      (haskell-back-to-zero-indent)
-                      (point)))))
-
-
-;;; Returns whether two words are the same.
-;;; The beginning of both words are given as their
-;;; respective points in the buffer.  
-
-(defun haskell-word-eq (current-pos previous-pos)
-  (let ((OK 't))
-    (goto-char previous-pos)
-    ;;We shall compare the two words starting
-    ;; at previous-pos and current-pos.
-      (while (and OK (looking-at "\\S-"))
-       ;;OK and looking at a word constituent
-       (if (eq (char-after current-pos) 
-               (char-after previous-pos))
-           ;;The two chars are the same
-           (progn
-             ;;Increment the two postions
-             ;; and update location of point
-             (setq current-pos (1+ current-pos))
-             (setq previous-pos (1+ previous-pos))
-             (goto-char previous-pos))
-         ;;The two chars are different
-         ;; so set OK to be false
-         (setq OK 'nil)))
-
-      ;;Return the value of OK
-      OK))                             
-      
-
-
-
-;;; This function returns the column of the last unbalanced
-;;; expression.
-;;; It is called when an keyword is found.  The point is 
-;;; initially placed before the corresponding keyword.
-;;; The function looks at every word to see if it is a
-;;; `let' or `in'.  Each word must be outwith a comment.
-
-(defun haskell-last-unbalanced-key-column (open close)
-  "Returns the column of the last unbalanced keyword, open."
-  (save-excursion
-    (let ((original-pos (point))
-         (bol-limit (save-excursion
-                      (beginning-of-line)
-                      (setq bol-limit (point))))
-         (depth  1))
-      (setq open (concat "\\b" open "\\b"))
-      (setq close (concat "\\b" close "\\b"))
-      (while (and
-             (> depth 0)
-             (> (point) (point-min)))
-       (forward-word -1)
-       (if (< (point) bol-limit)
-           ;;Moved past the beginning of line limit
-           ;; so go back to the previous line past
-           ;; any comments.
-           (progn
-             (goto-char original-pos)
-             (haskell-backward-to-noncomment)
-             (setq original-pos (point))
-             (setq bol-limit (save-excursion
-                               (beginning-of-line)
-                               (point))))
-         ;;Otherwise, still on the same line
-         (if (looking-at open)
-             ;;This word is an open keyword
-             (setq depth (1- depth))
-           ;;Otherwise,
-           (if (looking-at close)
-               ;;This word is a close keyword
-               (setq depth (1+ depth))))))
-
-      (if (string= open "\\bif\\b")
-         ;;The argument is `if'
-         (if (not (save-excursion (skip-chars-backward " \t") (bolp)))
-             ;;There is something before the `if'
-             (if (and (save-excursion
-                        (forward-word -1)
-                        (looking-at "\\belse\\b"))
-                      (not haskell-nest-ifs))
-                 ;;There is an `else' before the 'if'
-                 (forward-word -1))))
-      
-      
-      (current-column))))
-       
-         
-
-;;; Return the indentation for a line given that we expect a `where'.
-;;; The point lies on the corresponding symbol 
-;;; that the `where' scopes over.
-
-(defun haskell-indent-where ()
-  "Return the indentation for a line, given that we expect a `where'
-clause."
-  (let ((symbol (if (looking-at "=")
-                   "="
-                 "->")))
-    
-    (cond ((or haskell-std-indent-where
-              (> (current-column) haskell-where-threshold))
-          ;;Set indentation as the sum of the previous
-          ;; line's layout column and the standard offset
-          ;; (ie. 'haskell-where-offset)
-          (save-excursion
-            (beginning-of-line)
-            (cond ((looking-at (concat "^[ \t]*" symbol))
-                   ;;The line starts with the symbol
-                   (setq indent (current-indentation)))
-                  ((looking-at "^[ \t]*where\\b")
-                   ;;The line starts with a 'where'
-                   (forward-word 1)
-                   (skip-chars-forward " \t")
-                   (setq indent (+ (current-column) haskell-where-offset)))
-                  (t
-                   ;;The line begins on the layout column
-                   (setq indent (+ (current-indentation) 
-                                   haskell-indent-offset))))))
-         ((or haskell-align-where-with-eq
-              haskell-align-where-after-eq)
-          (if (looking-at (concat symbol "[ \t]*$"))
-              ;;The symbol is at the end of the line
-              (setq indent (+ (current-indentation)
-                              haskell-where-offset))
-            (save-excursion
-              ;;Set the indentation as required
-              (if haskell-align-where-after-eq
-                  (skip-chars-forward (concat symbol " \t")))
-              (setq indent (current-column))))))))
-
-
-
-;;; Calculates the indentation for the current line.
-;;; When we come here, we are in a line which we want to indent.
-;;; We should leave the point at the same relative position it
-;;; was in before we called the function, that is, if a line
-;;; is already correctly indented, nothing happens!
-
-;;; The main problems are handling "where" definitions
-;;; and the syntax of expressions when these are continued
-;;; over multiple lines (e.g. tuples, lists, or just plain
-;;; bracketed expressions).  Watch out for let ... in, too!
-
-;;; For example, think about the following tricky cases:
-
-;;;    f x = x + <NL>
-      
-;;;    f x = [  x + y, <NL>
-
-;;;    f x = [  <NL>
-
-;;;    f x = [  -- start of a large list
-;;;             -- which I'm commenting in as I go
-;;;  <TAB>
-
-(defun haskell-calculate-indentation ()
-  "Returns the indentation level for the current line of haskell code."
-  (save-excursion
-    (let ((indent 0)
-         (eol-position (point)))
-      (beginning-of-line)
-      (cond ((bobp)
-            ;;We are at the beginning of the buffer so do nothing at all
-            (setq indent 0))   
-
-           ((looking-at "^[ \t]*--")
-            ;;There is a comment on the line by itself
-            ;;Leave it the way it is
-            (setq indent (current-indentation)))
-
-           ((looking-at "^[ \t]*\\(data\\|type\\|module\\|import\\|instance\\)\\b")
-            ;;There is a 'data', 'type', 'module' or 'import' at start of line
-            (setq indent 0))
-
-           ((haskell-continued-fn-defp)
-            ;;This is clearly same function
-            ;; so set indent to be 0
-            (setq indent 0))
-                 
-           ((looking-at "^[ \t]*[]}]")
-            ;;There is a "]" or "}" at the start of the line
-            (let ((state (parse-partial-sexp (match-end 0)
-                                             (save-excursion
-                                               (haskell-back-to-zero-indent)
-                                               (point)))))
-              (if (>= (car state) 0)
-                  ;;Since the point is just after a parenthesis
-                  ;; it has a match if the depth is >= 0
-                  (save-excursion
-                    (goto-char (nth 2 state))
-                    ;;Move to the match.
-                    (if (not
-                         (save-excursion
-                           (skip-chars-backward " \t")
-                           (bolp)))
-                        ;;There is something before the brace.
-                        (progn
-                          (let ((initial-pos (point)))
-                            (forward-word -1)
-                            (if (not (looking-at
-                                      "\\(let\\|where\\)"))
-                                ;;The word is not `where' or `let'
-                                ;; so go back.
-                                (progn
-                                  (goto-char initial-pos)
-                                  (skip-chars-forward " \t"))))))
-                    (setq indent (current-column)))
-                (setq indent 0))))
-
-           ((looking-at "^[ \t]*\\(->\\|=>\\)")
-            ;; '->' or '=>' at start of line
-            (save-excursion
-              (haskell-backward-to-noncomment)
-              ;;Go back to previous line
-              (let ((eol-limit (point)))
-                (beginning-of-line)
-                (if (re-search-forward "::" eol-limit 't)
-                    ;;There is a '::' on this (previous) line
-                    ;; set indent to be at the start of it
-                    (setq indent (- (current-column) 2))
-                  ;;Otherwise copy this (previous) line's indentation
-                  (setq indent (current-indentation)))))) 
-                            
-           ((looking-at "^[ \t]*where\\b")
-            ;;There is a 'where' at the start of the line
-            ;;Look for the equality (which will not
-            ;; be on this line).
-            (haskell-backward-to-noncomment)
-            (goto-char (max (save-excursion
-                              (haskell-back-to-symbol "=")
-                              (point))
-                             (save-excursion
-                              (haskell-back-to-symbol "->")
-                              (point))))
-            (setq indent (haskell-indent-where)))
-
-           ((looking-at "^[ \t]*then\\b")
-            ;;The first thing on the line is a `then'
-            (setq indent (+ (haskell-last-unbalanced-key-column "if" "then")
-                            haskell-then-offset)))
-
-           ((looking-at "^[ \t]*else\\b")
-            ;;The first thing on the line is a `else'
-            (if haskell-align-else-with-then
-                (setq indent (haskell-last-unbalanced-key-column "then" "else"))
-              (setq indent (haskell-last-unbalanced-key-column "if" "else"))))
-                            
-           ((looking-at "^[ \t]*|")
-            ;;There is a `|' at beginning of line
-            (save-excursion
-              (let ((state
-                    (parse-partial-sexp (save-excursion
-                                          (haskell-back-to-zero-indent)
-                                          (point))
-                                        (point))))
-                (if (not (or (nth 3 state) (nth 4 state)))
-                    ;;Not in a comment or string
-                    (if (> (car state) 0)
-                        ;;In an unbalanced parenthesis.
-                        (progn
-                          (goto-char (nth 1 state))
-                          ;;Move to the beginning of the unbalanced parentheses
-                          (if (and (looking-at "\\[")
-                                   (search-forward "|" (haskell-eol) 't))
-                              ;;It is a list comprehension
-                              (setq indent (1- (current-column)))
-                            (setq indent (+ (current-column)
-                                            haskell-comp-offset))))
-                      ;;Otherwise, not in an unbalanced parenthesis
-                      (setq indent (save-excursion
-                                     (haskell-back-to-symbol "=")
-                                     (cond ((not (looking-at "="))
-                                            ;;Did not find an equals
-                                            (+ (haskell-previous-indentation)
-                                               haskell-indent-offset))
-                                           ((save-excursion
-                                              (beginning-of-line)
-                                              (looking-at "^[ \t]*data\\b"))
-                                            ;;There is a `data' at beginning
-                                            (setq indent (current-column)))
-                                           ((save-excursion
-                                              (beginning-of-line)
-                                              (search-forward
-                                               "|" (haskell-eol) 't))
-                                            ;;There is a `|' on this line
-                                            ;; so set this to be the indent
-                                            (save-excursion
-                                              (goto-char (match-beginning 0))
-                                              (current-column)))
-                                           (t
-                                            ;;Otherwise, set `=' as indent
-                                            (current-column))))))))))
-                  
-           ((looking-at "^[ \t]*=")
-            ;;There is an equals at the start of the line
-            ;;Set the indentation to be the previous line's 
-            ;; indentation plus the standard offset
-            (setq indent (+ haskell-indent-offset
-                            (haskell-previous-indentation))))
-
-           ((looking-at "^[ \t]*in\\b")
-            ;;The line starts with 'in'
-            (beginning-of-line)
-            (setq indent (haskell-last-unbalanced-key-column "let" "in")))
-
-           ((looking-at "^[ \t]*of\\b")
-            ;;The line starts with `of'
-            (beginning-of-line)
-            (setq indent (haskell-last-unbalanced-key-column "case" "of")))
-
-           ((looking-at "^.*::")
-            ;;There is a '::' in the line
-            ;;There are several possibilities for indentation
-            (if (looking-at "[ \t]*::")
-                ;;The '::' is the first thing on the line
-                ;; so set indent to be the previous line's
-                ;; indentation plus the standard offset
-                (setq indent (+ (haskell-previous-indentation)
-                                haskell-indent-offset))
-              (save-excursion
-                ;;Otherwise, the '::' is contained in the line somewhere
-                ;; so use contextual indentation
-                (setq indent (haskell-context-indent)))))
-          
-           (t
-            ;;Do not recognise the first word on the line.
-            (setq indent (haskell-context-indent))))
-      
-      indent)))                                ;return indent as indentation value
-
-
-
-;;; Returns the indentation for the current line by looking at the 
-;;; previous line to give clues to the indentation.
-
-(defun haskell-context-indent ()
-  "Returns the indentation for the current line by looking at 
-the previous line to dictate the indentation."
-  (save-excursion
-    (let ((original-position (point))
-         indent)
-      (beginning-of-line)
-      (if (bobp)
-         ;;At the beginning of the buffer
-         (setq indent 0)
-       ;;Otherwise, we are not at the beginning of the buffer
-       (haskell-backward-to-noncomment)
-       (let ((eol-limit (point))
-             ;;Record the (upper) limit for any search on this line
-             bol-limit
-             (paren-indent 'nil))
-         ;;`paren-indent' flags whether we are indenting a list or not
-         (beginning-of-line)
-         (setq bol-limit (point))
-         ;;Record the (lower) limit for any search on this line
-         (goto-char eol-limit) ;goto the end of the line
-         (flag)
-         (if (save-excursion
-               (goto-char eol-limit)
-               (and (re-search-backward
-                     "[])][^][()]*" bol-limit 't)
-                    (save-excursion
-                      (goto-char (match-beginning 0))
-                      (not (haskell-looking-at-keywordp)))))
-                       
-             ;;There is a close parenthesis at the end of the line
-             ;; followed by anything except "(", ")", "[", "]"
-             ;; or a keyword
-             (progn
-               ;;Search back for the close parenthesis
-               ;; and move to just after it.
-               (re-search-backward "[])]" bol-limit 't)
-               (forward-char 1) 
-               (let ((state
-                      (parse-partial-sexp (save-excursion
-                                            (haskell-back-to-zero-indent)
-                                            (point))
-                                          (point))))
-                 (if (not (or (nth 3 state) (nth 4 state)))
-                     ;;Not in a comment or string
-                     (if (>= (car state) 0)
-                         ;;The parenthesis has a match
-                         (progn
-                           (goto-char (nth 2 state))
-                           ;;Move to the beginning of the parentheses
-                           ;; as this new line will determine
-                           ;; further indentation
-                           (if (zerop (car state))
-                               ;;This paren closes all unbalanced parens
-                               ;; so move to
-                               ;; the eol of last line with an equality.
-                               (progn
-                                 (setq eol-limit (point))
-                                 (goto-char
-                                  (max (save-excursion
-                                         (haskell-back-to-symbol "=")
-                                         (point))
-                                       (save-excursion
-                                         (haskell-back-to-keyword)
-                                         (point))))
-                                 (goto-char eol-limit))
-                             ;;esle just go to the end of the line
-                             (goto-char (haskell-eol)))
-                           (setq paren-indent 't)
-                           ;;Set 'paren-indent' to true to indicate we
-                           ;; are indenting a list.
-                           (setq eol-limit (point))
-                           (beginning-of-line) 
-                           (setq bol-limit (point))
-                           ;;Reduce the scope of any later
-                           ;; indentation to
-                           ;; exclude the balanced parentheses
-                           ;; by making this point
-                           ;; be the eol-limit.  
-                           (goto-char eol-limit)))))))
-         (flag)
-         ;;This cond expression is structured, to an 
-         ;; extent, such that the keywords with highest
-         ;; indentation precedence come first.  Order is important.
-         ;;In each condition, the point of match is noted so
-         ;; that we can see if this point is in a string.
-         (let ((indent-point (point)))
-           (cond ((re-search-backward "\\bof\\b" bol-limit 't)
-                  ;; `of' is contained in previous line
-                  (setq indent-point (point))
-                  (if (looking-at "of[ \t]*$")
-                    ;;`of' at end of line
-                      (setq indent (+ (haskell-last-unbalanced-key-column
-                                       "case" "of")
-                                      haskell-case-offset))
-                    ;;Otherwise, `of' is in line
-                    (forward-word 1)
-                    (skip-chars-forward " \t")
-                    (setq indent (current-column))
-                    (setq indent (list indent))))
-                 
-                 ((re-search-backward
-                   "\\bthen[ \t]*$" bol-limit 't)
-                  ;;There is a `then' at the end of the line.
-                  (setq indent-point (point))
-                  (if haskell-align-else-with-then
-                      ;;We want to align the `else' (to follow) with the `then'
-                      (setq indent (+ (current-column)
-                                      haskell-if-offset))
-                    (setq indent (+ (haskell-last-unbalanced-key-column 
-                                     "if" "then")      
-                                    haskell-if-offset))))
-                 ;; This was here but don't know why (setq indent (list indent))))
-                 
-                 ((save-excursion
-                    (and (re-search-backward "\\bif\\b" bol-limit 't)
-                         (setq indent-point (point))
-                         (not (re-search-forward "\\bthen\\b" eol-limit 't))))
-                  ;;There is an `if' on the (previous) line and the line does
-                  ;; not have a `then' on it.
-                  (setq indent (+ (haskell-last-unbalanced-key-column 
-                                   "if" "then")
-                                  haskell-then-offset)))
-                 
-                 ((save-excursion
-                    (and (re-search-backward "\\bif\\b" bol-limit 't)
-                         (setq indent-point (point))
-                         (not (re-search-forward "\\belse\\b" eol-limit 't))))
-                  ;;There is an `if' on the (previous) line (the line may
-                  ;; have a `then' on it) and does not have an else on it.
-                  (if (re-search-backward "\\bthen\\b" bol-limit 't)
-                      ;;There is a then on the line and it is followed by
-                      ;; some code.
-                      (progn
-                        (forward-word 1)
-                        (skip-chars-forward " \t")
-                        (setq indent (current-column)))
-                    (if haskell-align-else-with-then
-                        ;;We want to align the `else' with the `then'
-                        (setq indent (haskell-last-unbalanced-key-column 
-                                      "then" "else"))  
-                      (setq indent (haskell-last-unbalanced-key-column 
-                                    "if" "else")))))
-                 
-                 ((re-search-backward "\\b\\(let\\|in\\)\\b" bol-limit 't)
-                  ;; 'let' or 'in' is contained in the (previous) line
-                  (setq indent-point (point))
-                  (forward-word 1) ;skip past the word
-                  (skip-chars-forward " \t{")
-                  (if (looking-at "\\($\\|--\\)")
-                      ;;looking-at eol or comment
-                      (progn
-                        (forward-word -1)
-                        (setq indent (+ (current-column)
-                                        haskell-let-offset)))
-                    (setq indent (current-column))))
-                 
-                 ((re-search-backward
-                   "\\belse[ \t]*$" bol-limit 't)
-                  ;;There is a `else' at end of line
-                  (setq indent-point (point))
-                  (save-excursion
-                    (goto-char eol-limit)
-                    (forward-word -1)
-                    (setq indent (+ (current-column)
-                                    haskell-if-offset))))
-                 
-                 ((re-search-backward
-                   "\\belse\\b" bol-limit 't)
-                  ;;There is a `else' on the line with no if or then
-                  (setq indent-point (point))
-                  (save-excursion
-                    (forward-word 1)
-                    (skip-chars-forward " \t")
-                    (setq indent (current-column))))
-                 
-                 ((save-excursion
-                    (beginning-of-line)
-                    (looking-at 
-                     "^[ \t]*then\\b"))
-                  ;;There is a 'then' at beginning of line
-                  (setq indent-point (point))
-                  (setq indent (current-indentation)))
-                 
-                 ((save-excursion
-                    (beginning-of-line)
-                    (looking-at "^[ \t]*else[ \t]*if\\b"))
-                  (setq indent-point (point))
-                  ;;There is an 'else if' at start of (previous) line
-                  (save-excursion
-                    (beginning-of-line)
-                    (if haskell-nest-ifs
-                        (save-excursion
-                          (forward-word 1)
-                          (skip-chars-forward " \t")
-                          (setq indent (current-column)))
-                      (skip-chars-forward " \t")
-                      (setq indent (current-column)))))
-                 
-                 ((re-search-backward "\\bcase\\b" bol-limit 't)
-                  ;;There is a 'case' on the previous line
-                  ;; so copy this line's indentation and add on
-                  ;; the offset unless there is not an of.
-                  (setq indent-point (point))
-                  (setq indent (+ (current-column) 
-                                  haskell-case-offset)))
-                 
-                 ((save-excursion
-                    (beginning-of-line)
-                    (looking-at "^\\(instance\\|class\\)\\b"))
-                  ;;This (previous) line has an 'instance' or 'class' at start
-                  ;; so just set indentation to be this line indentation
-                  ;; plus the standard offset
-                  (setq indent-point (point))
-                  (setq indent (+ (current-indentation)
-                                  haskell-indent-offset)))
-                 
-                 ((re-search-backward "where\\b" bol-limit 't)
-                  ;;There is a 'where' on the (previous) line
-                  (setq indent-point (point))
-                  (if (looking-at "where[ \t]*$")
-                      ;;There is nothing after the 'where'
-                      ;; so set indent to be this column
-                      ;; (ie. the column of the 'w')
-                      ;; plus the standard offset
-                      (if (save-excursion
-                            (skip-chars-backward " \t")
-                            (bolp))
-                          ;;The 'where' is the only thing on the line.
-                          (setq indent (+ (current-column) 
-                                          haskell-where-offset))
-                        ;;Otherwise, the 'where' is at the end
-                        ;; of the line and there is code before it.
-                        ;;Look before the 'where' for the symbol
-                        ;; it scopes over.
-                        (forward-word -1)
-                        (goto-char (max (save-excursion
-                                          (haskell-back-to-symbol "=")
-                                          (point))
-                                        (save-excursion
-                                          (haskell-back-to-symbol "->")
-                                          (point))))
-                        (setq indent (haskell-indent-where)))
-                    
-                    ;;Otherwise, go past the 'where'
-                    ;; and goto the last non space character.
-                    ;;Set this column to be the indentation.
-                    (forward-word 1) 
-                    (skip-chars-forward " \t") 
-                    (setq indent (current-column))))   
-                 
-                 ((re-search-backward
-                   "[ \ta-z0-9A-Z]=[ \t]*$" bol-limit 't)
-                  ;;There is an equals is at the end of line
-                  ;; so make the indentation be this line's indentation
-                  ;; plus the standard offset
-                  (setq indent-point (point))
-                  (setq indent (+ (current-indentation)
-                                  haskell-indent-offset))) 
-                 
-                 ((re-search-backward
-                   "[ \ta-z0-9A-Z]\\+\\+[ \t]*$" bol-limit 't)
-                  ;;There is a concat operator at the end of line
-                  ;; so make the indentation be this line's indentation
-                  (setq indent-point (point))
-                  (setq indent (current-indentation)))
-                 
-                 ((save-excursion
-                    (beginning-of-line)
-                    (looking-at
-                     "^[ \t]*=[ \ta-z0-9A-Z]"))
-                  ;;There is an equals is at the beginning of line
-                  ;; so make the indentation be the previous line's
-                  ;; indentation unless the previous line's
-                  ;; indentation is zero.
-                  (setq indent-point (point))
-                  (save-excursion
-                    (haskell-backward-to-noncomment)
-                    (if (zerop (current-indentation))
-                        (setq indent (+ (current-indentation)
-                                        haskell-indent-offset))
-                      (setq indent (haskell-current-indentation)))))
-                 
-                 ((re-search-backward "|" bol-limit 't)
-                  ;;There is  an `|' on this line.
-                  (setq indent-point (point))
-                  (if (save-excursion
-                        (goto-char original-position)
-                        (looking-at "^[ \t]*\\($\\|--\\||\\)"))
-                      ;;The original line is empty or has a `|' at the 
-                      ;; start.  So set indent to be first `|' on this line
-                      (save-excursion
-                        (goto-char bol-limit)
-                        (re-search-forward "|" eol-limit 't)
-                        (setq indent (1- (current-column))))
-                    ;;Otherwise set indent to be this (previous) line's
-                    (setq indent 0)))
-                 
-                 ((re-search-backward "->" bol-limit 't)
-                  ;;There is a `->' in the line.
-                  ;;This may be from a `case' or a
-                  ;; type declaration.
-                  (setq indent-point (point))
-                  (save-excursion
-                    (if (re-search-backward "::" bol-limit 't)
-                        ;;There is a '::' on this line
-                        (if (looking-at ".*->[ \t]*$")
-                            ;;The '->' is at the end of line.
-                            ;;Move past the '::' and any spaces
-                      &n