CompilingWithSMLNJ
==================

You can compile MLton with <:SMLNJ:SML/NJ>, however the resulting
compiler will run much more slowly than MLton compiled by itself.  We
don't recommend using SML/NJ as a means of
<:PortingMLton:porting MLton> to a new platform or bootstrapping on a
new platform.

If you do want to build MLton with SML/NJ, it is best to have a binary
MLton package installed.  If you don't, here are some issues you may
encounter when you run `make nj-mlton`.

You will get (many copies of) the error message:

----
/bin/sh: mlton: not found
----

The `Makefile` calls `mlton` to determine dependencies, and can
proceed in spite of this error.

If you don't have a `mlton` executable, you will get the error
message:

----
Error: cannot upgrade basis because the compiler doesn't work
----

We use `upgrade-basis.sml` to work around basis library differences,
allowing a version of MLton written for a newer basis library to be
compiled by an older version of MLton.  The file isn't necessary when
building with SML/NJ, but is listed in `$(SOURCES)`, so the `Makefile`
is attempting to build it.  Building `upgrade-basis.sml` requires the
old version of MLton to be around so that the right stubs can be
built.

To work around this problem, do one of the following.

* Manually tweak sources to remove `$(UP)` until you're finished
building MLton with SML/NJ and have a working MLton.

* Build `upgrade-basis.sml` on some other machine with a working MLton
and copy it over.

If you don't have an `mllex` executable, you will get the error
message:

----
mllex: Command not found
----

Building MLton requires `mllex` and `mlyacc` executables, which are
distributed with a binary package of MLton.  The easiest solution is
to copy the front-end lexer/parser files from a different machine
(`ml.grm.sml`, `ml.grm.sig`, `ml.lex.sml`, `mlb.grm.sig`,
`mlb.grm.sml`).
