You can compile MLton with 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 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).