xtool/contrib/mORMot/SyNode/mozjs/BuildInstructionSM52.md

4.3 KiB

SpiderMonkey 52

Main information about SpiderMonkey is here

Build instruction

Official Mozilla instruction is here Let's describe the details

Preparing

In first step you must install the next items:

  • Visual Studio(2013 for SpiderMonkey 45, or 2015 for SpiderMonkey 52).
  • MozillaBuild
  • Mercurial. At the moment of writing this instruction last version(4.1) could not download source code. The source code was downloaded by version 4.0

The next step is downloading SpiderMonkey source code:

  • (recommended method) Download from official release page. At the moment of writing this instruction, version 52 was absent in this page, so we could not use this method. But 45 version was present.
  • Download directly from repository (the version may be unstable). It is placed at folder mozilla-esr<version_number>

Modification of SpiderMonkey source code for Delphi compability

Our main task is to translate everything that will be imported to Delphi into extern “C” mode, and to write wrappers to things which cannot be translated

Usually it is enough to edit this files:

  • js\public\Initialization.h
  • js\src\jsfriendapi.h
  • js\src\jsapi.h

by adding extern "C" to functions that we need, and in files:

  • js\src\jsapi.h
  • js\src\jsapi.cpp

we must to write the wrappers to functions which we cannot import directly(that ones which use class instances).

For realization in Delphi we need to have an idea about internal structure of SpiderMonkey instances. The simplest way is to create C++ project in Visual Studio and run it in debug mode. Then we can create variables of unclear types and examine them in "Watch" window. Interesting for us information is sizeof(variable) and offset of addresses of fields of variables. This information is enough to understand structure.

For working with objects which allocated in stack we need to write wrappers, which works with void* type and apply reinterpret_cast to them

For SpiderMonkey 52 we created a patch Delphi patch 52.patch (for version from repository, *for version from release page it may be could not be applied)

Building

Then run MozillaBuild. It located in the directory where we install it (C:\mozilla-build by default). There are different *.bat files in this directory. For SpiderMonkey 45 we need start-shell-msvc2013.bat(for 32-bit version) or start-shell-msvc2013-x64.bat(for 64-bit version) For SpiderMonkey 52 we need start-shell-msvc2015.bat(for 32-bit version) or start-shell-msvc2015-x64.bat(for 64-bit version) Now we can see MozillaBuild console. Then we go to the source code folder(we downloaded them to d:\mozilla-releases\mozilla-esr52 folder).

cd d:
cd mozilla-releases\mozilla-esr52
cd js\src

Then we recommend to create new folder for binary files location

mkdir obj
cd obj

For 64-bit version we create obj64 folder Then run build configurator:

../configure --enable-ctypes --disable-jemalloc [--disable-sm-promise]

For 64-bit version:

../configure --enable-ctypes --disable-jemalloc [--disable-sm-promise] --host=x86_64-pc-mingw32 --target=x86_64-pc-mingw32

--enable-ctypes activate ctypes(Mozilla realization of ffi in JS layer).

--disable-jemalloc deactivate jemalloc(memory manager). We use FastMM and if conflicts with jemalloc - there are AV on application exit.

--disable-sm-promise deactivate promises if you don't need them. At the moment of writing this instruction deactivation of promises fail build. If you not deactivate promises you must set promises callbacs SetEnqueuePromiseJobCallback, SetGetIncumbentGlobalCallback and SetAsyncTaskCallbacks else you get AV when work with promise.

Then we can run build

mozmake.exe

After successfully build binary files will be located in dist\bin folder. We need to take all *.dll from here. In order to be aligned with Linux version, the name of the mozjs-52.dll file should be changed to synmozjs52.dll