Since the output of mzc relies on MzScheme to provide all run-time support, there is no way to use mzc to obtain small stand-alone executables. However, it is possible to produce a large stand-alone executable that contains an embedded copy of the MzScheme (or MrEd) run-time engine.
The command-line flag --exe directs mzc to embed a module (from source or byte code) into a copy of the MzScheme executable. The created executable invokes the embedded module on startup. The --gui-exe flag is similar, but copies the MrEd executable.
If the embedded module refers statically (i.e., through
require) to modules in MzLib or other collections, then
those modules are also included in the embedding executable.
Library modules that are referenced dynamically -- through
, eval, or load -- are not
automatically embedded into the created executable, but they can be
explicitly included using mzc's --lib flag.dynamic-require
The --exe and --gui-exe flags work only with
module-based programs. The embed.ss library in the
compiler collection provides a more general interface to the
embedding mechanism.
Creating a stand-alone executable that embeds native code from mzc requires downloading the MzScheme source code and using a C compiler and linker directly.
To build an executable with an embedded MzScheme engine:
Download the source code from http://www.drscheme.org/ and compile MzScheme.
Recompile MzScheme's main.c with the preprocessor symbol STANDALONE_WITH_EMBEDDED_EXTENSION defined. Under Unix, the Makefile distributed with MzScheme provides a target ee-main that performs this step.
The preprocessor symbol causes MzScheme's startup code to skip
command line parsing, the user's initialization file, and the
read-eval-print loop. Instead, the C function scheme_initialize is called, which is the entry point into
mzc-compiled Scheme code. After compiling main.c with STANDALONE_WITH_EMBEDDED_EXTENSION defined, MzScheme will not
link by itself; it must be linked with objects produced by mzc.
Compile each Scheme source file in the program with mzc's -o or --object flag and the --embedded flag, producing a set of .kp files and object (.o or .obj) files.
After each Scheme file is compiled, run mzc with the -g or --link-glue and the --embedded flag, providing all of the .kp files and object files on the command line. (Put the object files in the order that they should be ``loaded.'') The -g or --link-glue step produces a new object file, _loader.o or _loader.obj.
Each of the Scheme source files in the program must have a different base name (i.e., the file name without its directory path or extension), otherwise _loader cannot distinguish them. The files need not reside in the same directory.
Link all of the mzc-created object files with the MzScheme implementation (having compiled main.c with STANDALONE_WITH_EMBEDDED_EXTENSION defined) to produce a stand-alone executable.
Under Unix, the Makefile distributed with MzScheme provides a target ee-app that performs the final linking step. To use the target, call mzmake with a definition for the makefile macro EEAPP to the output file name, and a definition for the makefile macro EEOBJECTS to to the list of mzc-created object files. (The example below demonstrates how to define makefile variables on the command line.)
For example, under Unix, to create a standalone executable MyApp that is equivalent to
mzscheme -mv -f file1.ss -f file2.ss
unpack the MzScheme source code and perform the following steps:
cd plt/src/mzscheme
./mzmake
./mzmake ee-main
mzc --object --embedded file1.ss
mzc --object --embedded file2.ss
mzc --link-glue --embedded file1.kp file1.o file2.kp file2.o
./mzmake EEAPP=MyApp EEOBJECTS="file1.o file2.o _loader.o" ee-app
To produce an executable that embeds the MrEd engine, the procedure is essentially the same; MrEd's main file is mrmain.cxx instead of main.c. See the compilation notes in the MrEd source code distribution for more information.