# Installing SML/NJ on Unix

version 110.99.4, August 1, 2023

## Introduction

These instructions are for installing Standard ML of New Jersey (SML/NJ) on Unix and Unix-like operating systems (including Cygwin, Linux, and macOS) from source and the pre-compiled bin files.

To install SML/NJ on macOS using the installer package, see the macOS installation instructions.

To install SML/NJ on Windows using the installer, the Windows installation instructions.

## Basic installation

The standard Unix installation of SML/NJ is mostly automated via a installation shell script and installer written in SML. The only manual steps are downloading the installer, unbundling it, and running the script.

1. Create a directory to do the installation and cd to that directory.

2. Then use either curl or wget to down load the config.tgz file. For example,

       % wget https://smlnj.org/dist/working/110.99.4/config.tgz

3. Unbundle the `config.tgz` file.

       % tar -xzf config.tgz

4. Optionally edit the `config/targets` file to add or remove installation targets.

5. Run the install script. For some x86 Unix systems, there is a choice of 32 vs. 64-bit installations, with the default being 64 bits. For other systems, the installation is always 32-bit.

       % config/install.sh options

   For systems that support 64-bit installations, the installer options are

   -default size

     specify the default size for the sml and other commands, where size is either 32 or 64.

   -32

     install the 32-bit version of the system (see below for details).

   -64

     install the 64-bit version of the system (see below for details).

## Installing 64-bit SML/NJ

As of version 110.94, SML/NJ supports 64-bit installations on most x86-based Unix systems. It is possible to have both the 32 and 64-bit versions installed in the same place (see below for details). The default installation for these systems is 64-bits (as of version 110.98); thus, one can just run the installer command without options:

    % config/install.sh

## Installing 32-bit SML/NJ

For non-x86 systems, the only installation option is 32-bits, which is what you get by running the install command without options:

    % config/install.sh

As noted above, the default on x86 systems that report their hardware as “`x86_64`” is 64-bits. If you want to install a 32-bit version instead, you can use the following command:

    % config/install.sh -default 32

It is also possible to have both the 32 and 64-bit versions installed in the same place (see below for details).

### Troubleshooting the 32-bit install

To install the 32-bit version on a 64-bit architecture, you must have support for compiling and running 32-bit binaries. On macOS (prior to Mojave), this support is standard, but most 64-bit Linux systems are not configured with 32-bit support. In such a case, you will get the message

    !!! SML/NJ requires support for 32-bit executables

during the install process. To fix this problem, you will need to acquire the 32-bit emulation libraries for your particular Linux distribution.

For Debian (7.0 Wheezy and later) and recent version of Ubuntu, you will need to enable multiarch support. See https://wiki.ubuntu.com/MultiarchSpec for details, or try the following commands:

    % dpkg --add-architecture i386
    % apt-get update
    % apt-get install libc6:i386

You may also need to install the two following packages:

    % apt-get install gcc-multilib g++-multilib

For RedHat Fedora (at least Fedora 16), you will need to install `glibc-devel.i686`:

    % yum install glibc-devel.i686

For Red Hat Enterprise Linux (or CentOS), you may also have to install the rpm package libgcc-multilib, e.g.:

    % yum groupinstall "Development tools"
    % yum install libgcc.i686
    % yum install glibc-devel.i686

Older instructions for RHEL and CentOS: download the `libgcc-multilib` package from rpmseek.com and then run

    rpm -ivh libgcc-multilib-xxx.x86_64.rpm

where the libgcc-multilib package is the one you downloaded. For openSUSE use the YaST administration tool to install the `gcc-32bit` package.

## Installing both 32-bit and 64-bit versions of SML/NJ

It is possible to install both versions in the same location by running the `install.sh` script twice. For example, the commands

    % config/install.sh -32
    % config/install.sh -default 64

will install both versions with the 64-bit version as default. One can then use the command sml -32 to run the 32-bit version of the system. Note that the default version must be installed second.