summaryrefslogblamecommitdiffstatshomepage
path: root/docs/emscripten.txt
blob: dbc8bd5ad486eb154d095638ece3a45d3adb44d4 (plain) (tree)



























































                                                                                                
Compiling MAME to JavaScript via Emscripten
===========================================

First, download and install Emscripten by following the instructions at the
official site:

https://kripken.github.io/emscripten-site/docs/getting_started/downloads.html

Once Emscripten has been installed, it should be possible to compile MAME
out-of-the-box using Emscripten's 'emmake' tool. Because a full MAME compile is
too large to load into a web browser at once, you will want to use the SOURCES
parameter to compile only a subset of the project, e.g. (in the mame directory):

emmake make SUBTARGET=pacmantest SOURCES=src/mame/drivers/pacman.cpp

The SOURCES parameter should have the path to at least one driver .cpp file.
The make process will attempt to locate and include all dependencies necessary
to produce a complete build including the specified driver(s). However, 
sometimes it is necessary to manually specify additional files (using commas) if
this process misses something. E.g.:

emmake make SUBTARGET=apple2e SOURCES=src/mame/drivers/apple2e.cpp,src/mame/machine/applefdc.cpp

The value of the SUBTARGET parameter serves only to differentiate multiple
builds and need not be set to any specific value.

Other make parameters can also be used, e.g. -j for multithreaded compilation.

When the compilation reaches the emcc phase, you may see a number of "unresolved
symbol" warnings. At the moment, this is expected for OpenGL-related functions
such as glPointSize. Any others may indicate that an additional dependency file
needs to be specified in the SOURCES list. Unfortunately this process is not
automated and you will need to search the source tree to locate the files
supplying the missing symbols. You may also be able to get away with ignoring
the warnings if the code path referencing them is not used at run-time.

If all goes well, a .js file will be output to the current directory. This file
cannot be run by itself, but requires an HTML loader to provide it with a canvas
to output to and pass in command-line parameters. The Emularity project provides
such a loader:

https://github.com/db48x/emularity

There are example .html files in that repository which can be edited to point
to your newly compiled MAME js filename and pass in whatever parameters you
desire. You will then need to place all of the following on a web server:

* The compiled MAME .js file
* The .js files from the Emularity package (loader.js, browserfs.js, etc.)
* A .zip file with the ROMs for the MAME driver you would like to run (if any)
* Any software files you would like to run with the MAME driver
* An Emularity loader .html modified to point to all of the above

You need to use a web server instead of opening the local files directly due to
security restrictions in modern web browsers.

If the result fails to run, you can open the Web Console in your browser to see
any error output which may have been produced (e.g. missing or incorrect ROM
files). A "ReferenceError: foo is not defined" error most likely indicates that
a needed source file was omitted from the SOURCES list.