Modifying an Example

This section describes how to update the build files when modifying an example from the Examples Guide.

The build files provided with an example have the following properties:

  • Building is managed using Make.

  • A target is provided for all supported compilers.

  • For Poly/ML, compilation is incremental in two stages: the library dependencies are loaded in the first stage and the application source code is loaded in the second stage. The library dependencies are not reloaded if only the application source code changes which substantially reduces build times.

In addition to the SML source code, an example contains the following build files that may need to be updated:

  • mlton.mlb

  • mlton-main.sml

  • polyml-libs.sml

  • polyml-app.sml

  • app.mk

and the following files for building with Make that do not need to be changed:

  • Makefile

  • make-polyml-app.sml

  • make-polyml-libs.sml

Note that mlton-main.sml should not be changed because Makefile expects the main function to be called main for Poly/ML.

Changing the application name

Before changing the application name, make distclean should be performed.

The application executable name is defined in app.mk by the Make variables

  • TARGET_MLTON for MLton and

  • TARGET_POLYML for Poly/ML

These variables should be updated to the desired application names. To retain the MLton and Poly/ML application names of the form NAME-mlton and NAME-polyml, respectively, only the variable NAME needs to be updated in app.mk.

Changing application source files

After adding, removing or renaming an application source file, the application source file names should be updated in:

  • mlton.mlb for MLton

  • polyml-app.sml for Poly/ML

The source file dependencies are defined in app.mk by the Make variables

  • SRC_MLTON for MLton and

  • SRC_POLYML for Poly/ML

These are derived automatically so do not need to be updated.

Changing library dependencies

If the application source code introduces or removes dependence on an SML structure Namespace for a namespace Namespace-Version, the library dependency (with the indicated form) should be added or removed, respectively, in:

  • app.mk, in the Make variable LIB_NAMES (namespace-version)

  • mlton.mlb for MLton ($(GIRAFFE_SML_LIB)/namespace-version/mlton.mlb)

  • polyml-libs.sml for Poly/ML ($(GIRAFFE_SML_LIB)/namespace-version/polyml.sml)

The file polyml-libs.sml also includes library dependencies of the library dependencies, i.e. the transitive closure of the library dependencies. Therefore, after adding a dependency, it may be necessary to add other dependencies and, after removing a dependency, it may be possible to remove other dependencies.

Note that the variable LIB_NAMES in app.mk should include namespace-version if and only if the file mlton.mlb includes $(GIRAFFE_SML_LIB)/namespace-version/mlton.mlb.