Compiling

Automatic defaults

If you compile Duktape with no compiler options, Duktape will detect the compiler and the platform automatically and select defaults appropriate in most cases. Recommended compiler options (for GCC/clang, use similar options in your compiler):

Duktape feature defaults are, at a high level:

Usually the automatic defaults are OK. If you're using Duktape on a platform where Duktape's automatic feature detection doesn't (yet) work, you may need to force a specific byte order or alignment requirements with feature options described below.

Feature options (DUK_OPT_xxx)

If you wish to modify the defaults, you can provide feature options in the form of DUK_OPT_xxx compiler defines. These will be taken into account by the internal duk_features.h file, which resolves the final internal features based on feature requests, compiler features, and platform features.

The available feature options can be found in duk_features.h. The table below summarizes the available options, in no particular order:

Define Description
DUK_OPT_NO_PACKED_TVAL Don't use the packed 8-byte internal value representation even if otherwise possible. The packed representation has more platform/compiler portability issues than the unpacked one.
DUK_OPT_FORCE_ALIGN Use -DDUK_OPT_FORCE_ALIGN=4 or -DDUK_OPT_FORCE_ALIGN=8 to force a specific struct/value alignment instead of relying on Duktape's automatic detection. This shouldn't normally be needed.
DUK_OPT_FORCE_BYTEORDER Use this to skip byte order detection and force a specific byte order: 1 for little endian, 2 for ARM "mixed" endian (integers little endian, IEEE doubles mixed endian), 3 for big endian. Byte order detection relies on unstandardized platform specific header files, so this may be required for custom platforms if compilation fails in endianness detection.
DUK_OPT_DEEP_C_STACK By default Duktape imposes a sanity limit on the depth of the C stack because it is often limited in embedded environments. This option forces Duktape to use a deep C stack which relaxes e.g. recursion limits. Automatic feature detection enables deep C stacks on some platforms known to have them (e.g. Linux, BSD, Windows).
DUK_OPT_NO_REFERENCE_COUNTING Disable reference counting and use only mark-and-sweep for garbage collection. Although this reduces memory footprint of heap objects, the downside is much more fluctuation in memory usage.
DUK_OPT_NO_MARK_AND_SWEEP Disable mark-and-sweep and use only reference counting for garbage collection. This reduces code footprint and eliminates garbage collection pauses, but objects participating in unreachable reference cycles won't be collected until the Duktape heap is destroyed. In particular, function instances won't be collected because they're always in a reference cycle with their default prototype object. Unreachable objects are collected if you break reference cycles manually (and are always freed when a heap is destroyed).
DUK_OPT_NO_VOLUNTARY_GC Disable voluntary periodic mark-and-sweep collection. A mark-and-sweep collection is still triggered in an out-of-memory condition. This option should usually be combined with reference counting, which collects all non-cyclical garbage. Application code should also request an explicit garbage collection from time to time when appropriate. When this option is used, Duktape will have no garbage collection pauses in ordinary use, which is useful for timing sensitive applications like games.
DUK_OPT_NO_MS_STRINGTABLE_RESIZE Disable forced string intern table resize during mark-and-sweep garbage collection. This may be useful when reference counting is disabled, as mark-and-sweep collections will be more frequent and thus more expensive.
DUK_OPT_GC_TORTURE Development time option: force full mark-and-sweep on every allocation to stress test memory management.
DUK_OPT_NO_AUGMENT_ERRORS Don't augment Ecmascript error objects with custom fields like fileName, lineNumber, and traceback data. Also disables Duktape.errcreate and Duktape.errthrow error handler callbacks. Implies DUK_OPT_NO_TRACEBACKS.
DUK_OPT_NO_TRACEBACKS Don't record traceback data into Ecmascript error objects (but still record fileName and lineNumber). Reduces footprint and makes error handling a bit faster, at the cost of less nformative Ecmascript errors.
DUK_OPT_NO_VERBOSE_ERRORS Don't provide error message strings or filename/line information for errors generated by Duktape. Reduces footprint, at the cost of much less informative Ecmascript errors.
DUK_OPT_TRACEBACK_DEPTH Override default traceback collection depth. The default is currently 10.
DUK_OPT_NO_PC2LINE Don't record a "pc2line" map into function instances. Without this map, exceptions won't have meaningful line numbers (virtual machine program counter values cannot be translated to line numbers) but function instances will have a smaller footprint.
DUK_OPT_NO_REGEXP_SUPPORT Disable support for regular expressions. Regexp literals are treated as a SyntaxError, RegExp constructor and prototype functions throw an error, String.prototype.replace() throws an error if given a regexp search value, String.prototype.split() throws an error if given a regexp separator value, String.prototype.search() and String.prototype.match() throw an error unconditionally.
DUK_OPT_STRICT_UTF8_SOURCE Enable strict UTF-8 parsing of source code. When enabled, non-shortest encodings (normally invalid UTF-8) and surrogate pair codepoints are accepted as valid source code characters. This option breaks compatibility with some test262 tests.
DUK_OPT_NO_OCTAL_SUPPORT Disable optional octal number support (Ecmascript E5/E5.1 Annex B).
DUK_OPT_NO_SOURCE_NONBMP Disable accurate Unicode support for non-BMP characters in source code. Non-BMP characters are then always accepted as identifier characters.
DUK_OPT_NO_BROWSER_LIKE Disable browser-like functions. Makes print() and alert() throw an error. This option is confusing when used with the Duktape command line tool, as the command like tool will immediately panic.
DUK_OPT_NO_SECTION_B Disable optional features in Ecmascript specification Annex B. Causes escape(), unescape(), and String.prototype.substr() to throw an error.
DUK_OPT_NO_FUNC_STMT Disable support for function declarations outside program or function top level (also known as "function statements"). Such declarations are non-standard and the strictly compliant behavior is to treat them as a SyntaxError. Default behavior is to treat them like ordinary function declarations ("hoist" them to function top) with V8-like semantics.
DUK_OPT_FUNC_NONSTD_CALLER_PROPERTY Add a non-standard caller property to non-strict function instances for better compatibility with existing code. The semantics of this property are not standardized and may vary between engines; Duktape tries to behave close to V8 and Spidermonkey. See Mozilla description of the property. This feature disables tail call support.
DUK_OPT_FUNC_NONSTD_SOURCE_PROPERTY Add a non-standard source property to function instances. This allows function toString() to print out the actual function source. The property is disabled by default because it increases memory footprint.
DUK_OPT_NO_ARRAY_SPLICE_NONSTD_DELCOUNT For better compatibility with existing code, Array.prototype.splice() has non-standard behavior by default when the second argument (deleteCount) is not given: the splice operation is extended to the end of the array. If this option is given, splice() will behave in a strictly conforming fashion, treating a missing deleteCount the same as an undefined (or 0) value.
DUK_OPT_NO_OBJECT_ES6_PROTO_PROPERTY Disable the non-standard (ES6 draft) Object.prototype.__proto__ property which is enabled by default.
DUK_OPT_NO_OBJECT_ES6_SETPROTOTYPEOF Disable the non-standard (ES6 draft) Object.setPrototypeOf method which is enabled by default.
DUK_OPT_NO_JSONX Disable support for the JSONX format. Reduces code footprint. Causes JSONX calls to throw an error.
DUK_OPT_NO_JSONC Disable support for the JSONC format. Reduces code footprint. Causes JSONC calls to throw an error.
DUK_OPT_NO_FILE_IO Disable use of ANSI C file I/O which might be a portability issue on some platforms. Causes duk_eval_file() to throw an error, makes built-in print() and alert() no-ops, and suppresses writing of a panic message to stderr on panic. This option does not suppress debug printing so don't enable debug printing if you wish to avoid I/O.
DUK_OPT_NO_INTERRUPT_COUNTER Disable the internal bytecode executor periodic interrupt counter. The mechanism is used to implement e.g. execution step limit, custom profiling, and debugger interaction. Disabling the interrupt counter improves bytecode execution performance very slightly but disables all features depending on it.
DUK_OPT_NO_ZERO_BUFFER_DATA By default Duktape zeroes data allocated for buffer values. Define this to disable the zeroing (perhaps for performance reasons).
DUK_OPT_PANIC_HANDLER(code,msg) Provide a custom panic handler, see detailed description below.
DUK_OPT_DECLARE Provide declarations or additional #include directives to be used when compiling Duktape. You may need this if you set DUK_OPT_PANIC_HANDLER to call your own panic handler function (see example below). You can also use this option to cause additional files to be included when compiling Duktape.
DUK_OPT_SEGFAULT_ON_PANIC Cause the default panic handler to cause a segfault instead of using abort() or exit(). This is useful when debugging with valgrind, as a segfault provides a nice C traceback in valgrind.
DUK_OPT_SELF_TESTS Perform run-time self tests when a Duktape heap is created. Catches platform/compiler problems which cannot be reliably detected during compile time. Not enabled by default because of the extra footprint.
DUK_OPT_ASSERTIONS Enable internal assert checks. These slow down execution considerably so only use when debugging.
DUK_OPT_DEBUG Enable debug printouts.
DUK_OPT_DDEBUG Enable more debug printouts.
DUK_OPT_DDDEBUG Enable even more debug printouts. Not recommended unless you have grep handy.
DUK_OPT_DPRINT_COLORS Enable coloring of debug prints with ANSI escape codes. The behavior is not sensitive to terminal settings.
DUK_OPT_DPRINT_RDTSC Print RDTSC cycle count in debug prints if available.
DUK_OPT_DEBUG_BUFSIZE Debug code uses a static buffer as a formatting temporary to avoid side effects in debug prints. The static buffer is large by default, which may be an issue in constrained environments. You can set the buffer size manually with this option. Example: -DDUK_OPT_DEBUG_BUFSIZE=2048.
DUK_OPT_HAVE_CUSTOM_H Enable user-provided duk_custom.h customization header (see below for details). Not recommended unless really necessary.

Suggested feature options for some environments

Timing sensitive applications (e.g. games)

Memory constrained applications

DUK_OPT_HAVE_CUSTOM_H and duk_custom.h

Normally you define DUK_OPT_xxx feature options and the internal duk_features.h header resolves these with platform/compiler constraints to determine effective compilation options for Duktape internals. The effective options are provided as DUK_USE_xxx defines which you normally never see.

If you define DUK_OPT_HAVE_CUSTOM_H, Duktape will include duk_custom.h after determining the appropriate DUK_USE_xxx defines but before compiling any code. The duk_custom.h header, which you provide, can then tweak the active DUK_USE_xxx defines freely. See duk_features.h for the available defines.

This approach is useful when the DUK_OPT_xxx feature options don't provide enough flexibility to tweak the build. The downside is that you can easily create inconsistent DUK_USE_xxx flags, the customization header will be version specific, and you need to peek into Duktape internals to know what defines to tweak.

DUK_OPT_PANIC_HANDLER

The default panic handler will print an error message to stdout unless I/O is disabled by DUK_OPT_NO_FILE_IO. It will then call abort() or cause a segfault if DUK_OPT_SEGFAULT_ON_PANIC is defined.

You can override the entire panic handler by defining DUK_OPT_PANIC_HANDLER. For example, you could add the following to your compiler options:

'-DDUK_OPT_PANIC_HANDLER(code,msg)={printf("*** %d:%s\n",(code),(msg));abort();}'

You can also use:

'-DDUK_OPT_PANIC_HANDLER(code,msg)={my_panic_handler((code),(msg))}'

which calls your custom handler:

void my_panic_handler(int code, const char *msg) {
    /* Your panic handling.  Must not return. */
}

The DUK_OPT_PANIC_HANDLER macro is used internally by Duktape, so your panic handler function needs to be declared for Duktape compilation to avoid compiler warnings about undeclared functions. You can "inject" a declaration for your function into Duktape compilation with:

'-DDUK_OPT_DECLARE=extern void my_panic_handler(int code, const char *msg);'

After this you might still get a compilation warning like "a noreturn function must not return" as the compiler doesn't know your panic handler doesn't return. You can fix this by either using a (compiler specific) "noreturn" declaration, or by modifying the panic handler macro to something like:

'-DDUK_OPT_PANIC_HANDLER(code,msg)={my_panic_handler((code),(msg));abort()}'

As abort() is automatically a "noreturn" function the panic macro body can no longer return. Duktape always includes stdlib.h which provides the abort() prototype so no additional include files are needed.

Adding new feature options

This section only applies if you customize Duktape internals and wish to submit a patch to be included in the mainline distribution:

Memory management alternatives

There are three supported memory management alternatives:

When using only reference counting it is important to avoid creating unreachable reference cycles. Reference cycles are usually easy to avoid in application code e.g. by using only forward pointers in data structures. Even if reference cycles are necessary, garbage collection can be allowed to work simply by breaking the cycles before deleting the final references to such objects. For example, if you have a tree structure where nodes maintain references to both children and parents (creating reference cycles for each node) you could walk the tree and set the parent reference to null before deleting the final reference to the tree.

Unfortunately every Ecmascript function instance is required to be in a reference loop with an automatic prototype object created for the function. You can break this loop manually if you wish. For internal technical reasons, named function expressions are also in a reference loop; this loop cannot be broken from user code and only mark-and-sweep can collect such functions. See Limitations.

Compiler warnings

Current goal is for the Duktape compile to be clean when:

There are still some warnings present when you compile with -Wextra or equivalent option.

When your compiler is not C99 compliant, Duktape uses an awkward replacement for variadic macros. This may cause, as a side effect, a lot of harmless warnings if you set the compiler warning level too high. This is difficult to fix, so C99 compilation may not be clean at the moment.