Emscriptenコンパイラ設定

以下は、コマンドラインで -s を介して emscripten に渡すことができる設定の完全なリストです。例:-sASSERTIONS または -sASSERTIONS=0。詳細については、emcc ドキュメントを参照してください。

特に明記しない限り、これらの設定はリンク時にのみ適用され、コンパイル中は効果がありません。

ASSERTIONS

ランタイムアサーションを追加するかどうか。これは、JSとシステムライブラリのビルド方法の両方に影響します。ASSERTIONS == 2 は、非常に遅くなる可能性がある、より多くのランタイムチェックを提供します。たとえば、内部の dlmalloc アサーションが含まれます。

デフォルト値:1

STACK_OVERFLOW_CHECK

生成されたコードにどの種類のスタック破壊チェックを生成するかを選択します。ASSERTIONS=1 でビルドすると、STACK_OVERFLOW_CHECK のデフォルトは 1 になります。ASSERTIONS=1 が -O0 でのデフォルトであり、-O0 自体がデフォルトの最適化レベルであるため、これは、他の設定がない場合、この設定も事実上 1 にデフォルト設定されることを意味します。

  • 0: スタックオーバーフローはチェックされません。

  • 1:スタックの先頭にセキュリティクッキーを追加し、各ティックの終了時と終了時にチェックします(実質的にパフォーマンスオーバーヘッドはゼロ)。

  • 2:上記と同じですが、すべてのスタックポインタ割り当てにチェックを追加する binaryen パスも実行します。パフォーマンスコストはわずかです。

デフォルト値:0

CHECK_NULL_WRITES

STACK_OVERFLOW_CHECK が有効になっている場合、アドレスゼロへの書き込みもチェックします。これは、NULL ポインタの使用を検出するのに役立ちます。(たとえば、アドレスゼロからの読み取りで常にゼロを返すようにしたい場合は)この追加チェックをスキップする場合は、ここで無効にすることができます。この設定は、STACK_OVERFLOW_CHECK が無効になっている場合は効果がありません。

デフォルト値:true

VERBOSE

1に設定すると、コンパイル中により詳細な出力が生成されます。[全般]

デフォルト値:false

INVOKE_RUN

main() 関数を実行するかどうか。生成されたコードを独自に埋め込み、適切なタイミングで自分で main() を呼び出す場合は無効にします(これは、Module.callMain() を使用して、コマンドライン引数のオプションパラメータを使用して実行できます)。

デフォルト値:true

EXIT_RUNTIME

0 の場合、main() が完了してもランタイムは終了しません(たとえば、ブラウザのメインイベントループから後でコードを実行できます)。atexit() も実行されず、stdio ストリームのフラッシュなど、ランタイムシャットダウンのコードを含めることを回避できます。atexit() または stdio ストリームを終了時にフラッシュする場合は、これを 1 に設定します。この設定は、STANDALONE_WASM モードで自動的に制御されます。

  • コマンド(main 関数を持つ)の場合、これは常に 1 です。

  • リアクタ(main 関数がない)の場合、これは常に 0 です。

デフォルト値:false

STACK_SIZE

合計スタックサイズ。スタックを拡大する方法はないため、この値はプログラムの要件に対して十分に大きくなければなりません。アサーションが有効になっている場合、これを超えないことをアサートします。それ以外の場合は、何も警告なく失敗します。

デフォルト値:64*1024

MALLOC

使用する malloc()/free()(次の中から):

  • dlmalloc - 強力な汎用 malloc

  • emmalloc - emscripten 用に設計されたシンプルでコンパクトな malloc

  • emmalloc-debug - emmalloc を使用し、追加のアサーションチェックを追加します

  • emmalloc-memvalidate - アサーション + ヒープ整合性チェックを使用して emmalloc を使用します。

  • emmalloc-verbose - アサーション + 詳細ログを使用して emmalloc を使用します。

  • emmalloc-memvalidate-verbose - アサーション + ヒープ整合性チェック + 詳細ログを使用して emmalloc を使用します。

  • mimalloc - 強力なマルチスレッドアロケータ。これは、malloc() の競合がある大規模なアプリケーションで推奨されますが、より大きく、より多くのメモリを使用します。

  • none - malloc() の実装は提供されていませんが、malloc() と free() を自分で実装する必要があります。

dlmalloc は、分割メモリやその他の特別なモードで必要であり、これらのケースでは自動的に使用されます。一般に、これらの特別なモードのいずれも必要ない場合、および非常に多くの小さなオブジェクトを割り当てない場合は、emmalloc の方が小さいため使用する必要があります。それ以外の場合、多くの小さなオブジェクトを割り当てる場合は、通常、dlmalloc を使用する価値があります。dlmalloc は、emmalloc が実行しない(内部データ構造内のメタデータの破損に気づくなど)追加のセキュリティチェックが必要な場合にも適しています。

デフォルト値:「dlmalloc」

ABORTING_MALLOC

1 の場合、malloc が失敗すると abort() します。これは非標準の動作ですが、Web では、最初にすべて割り当てる必要がある固定量のメモリがあるため、理にかなっています。(a) malloc の失敗は他のプラットフォームよりもはるかに多く、(b) 人々は初期割り当て(INITIAL_MEMORY)がどのくらいの大きさでなければならないかを知る方法が必要です。これを 0 に設定すると、失敗したときに NULL (0) を返すという標準の malloc 動作が得られます。

ALLOW_MEMORY_GROWTH を設定すると、標準システムのように、成長を試みて失敗時に malloc から 0 を返すという動作がデフォルトになるため、これはオフになります。ただし、このフラグを設定して上書きすることもできます。これは、ほとんど下位互換性のある変更です。以前は、成長がオンの場合、このオプションは無視されていました。現在の動作は、成長によりデフォルトでオフになるため、フラグを指定しなかったユーザーの場合は何も変わりません。ただし、指定した場合、以前は効果がなかったものが、今回は効果があります。そうしたくない場合は、リンク時に渡さないようにするだけです。

この設定は、C++ の operator new の動作には影響しないことに注意してください。例外が無効になっている場合、この関数は常に割り当ての失敗時にアボートします。失敗時に new が 0 を返すようにする場合は、std::nothrow とともに使用します。

デフォルト値:true

INITIAL_HEAP

プログラムで使用可能な初期ヒープメモリ量。これは、sbrkmalloc、および new を介した動的割り当てに使用できるメモリ領域です。

INITIAL_MEMORY とは異なり、この設定により、プログラムのメモリの静的領域と動的領域を個別に拡張できます。ほとんどの場合、INITIAL_MEMORY ではなく、この設定を使用することをお勧めします。ただし、この設定は、インポートされたメモリでは機能しません(たとえば、動的リンクが使用されている場合)。

デフォルト値:16777216

INITIAL_MEMORY

使用する初期メモリ量。これより多くのメモリを使用すると、ヒープが拡張されます。これにより、型付き配列を使用する場合はコストがかかる可能性があります。その場合、古いヒープを新しいヒープにコピーする必要があるからです。ALLOW_MEMORY_GROWTH が設定されている場合、この初期メモリ量は後で増やすことができます。設定されていない場合は、これが最終的な合計メモリ量になります。

デフォルトでは、この値は、INITIAL_HEAP、STACK_SIZE、および入力モジュールの静的データのサイズに基づいて計算されます。

(このオプションは、以前は TOTAL_MEMORY と呼ばれていました。)

デフォルト値:-1

MAXIMUM_MEMORY

wasm モジュール内の最大メモリサイズ(バイト単位)を設定します。これは、ALLOW_MEMORY_GROWTH が設定されている場合にのみ関連します。成長がない場合、INITIAL_MEMORY のサイズが最終的なメモリサイズになるからです。

ここでデフォルト値は 2GB であり、これは、デフォルトでメモリの拡張を有効にした場合、最大 2GB まで拡張できますが、それ以上は拡張できないことを意味します。2GB はいくつかの理由から自然な制限です。

  • 最大ヒープサイズが 2GB を超える場合、ポインタは JavaScript で符号なしである必要があり、コードサイズが増加します。2GB を超えるヒープを明示的に選択しない限り、メモリ拡張ビルドを大きくしたくありません。

  • 歴史的に、VM は 2GB+ を超えるメモリをサポートしておらず、最近(2020 年 3 月)になってサポートが表示され始めました。サポートが限られているため、すべての VM で動作しない可能性のあるビルドを取得するのではなく、2GB+ を超えるヒープを明示的に選択する方が安全です。

2GB を超えるメモリを使用するには、これを 4GB のような大きな値に設定します。

(このオプションは、以前は WASM_MEM_MAX および BINARYEN_MEM_MAX と呼ばれていました。)

デフォルト値:2147483648

ALLOW_MEMORY_GROWTH

falseの場合、(INITIAL_MEMORY)よりも多くのメモリを割り当てようとするとエラーで中断します。trueの場合、メモリ配列をランタイム時にシームレスかつ動的に拡張します。Chromeでのメモリ拡張のパフォーマンスについては、https://code.google.com/p/v8/issues/detail?id=3907を参照してください。メモリの拡張は、一度作成するとサイズ変更できないため、JSの型付き配列ビューを置き換えることを意味します。(wasmではメモリを拡張できますが、JS用の新しいビューを作成する必要があります。)このオプションを有効にすると、ABORTING_MALLOCが無効になります。言い換えれば、ALLOW_MEMORY_GROWTHは、mallocが失敗時に0を返すという標準的な動作と、必要に応じてシステムからより多くのメモリを割り当てることができる動作の両方を完全に有効にします。

デフォルト値:false

MEMORY_GROWTH_GEOMETRIC_STEP

ALLOW_MEMORY_GROWTHがtrueの場合、この変数は、リサイズ時のヒープの幾何学的過剰成長率を指定します。ヒープの過剰成長を完全に無効にするにはMEMORY_GROWTH_GEOMETRIC_STEP=0を指定し、例えば、MEMORY_GROWTH_GEOMETRIC_STEP=1.0を指定すると、各拡張ステップでヒープが2倍(+100%)になります。この値が大きいほど、WebAssemblyヒープはメモリリサイズによるパフォーマンスの低下を軽減するために多くのメモリを過剰に予約します。この値が小さいほど、ヒープが拡張するときにパフォーマンスが低下してより多くのメモリが節約されます(プロファイルによると約20ミリ秒のオーダーです)。

デフォルト値:0.20

MEMORY_GROWTH_GEOMETRIC_CAP

最大幾何学的過剰成長サイズ(バイト単位)の上限を指定します。この値を使用して、幾何学的拡張が特定のレートを超えないように制限します。上限を無効にして無制限のサイズ増加を許可するには、MEMORY_GROWTH_GEOMETRIC_CAP=0を渡します。

デフォルト値:96*1024*1024

MEMORY_GROWTH_LINEAR_STEP

ALLOW_MEMORY_GROWTHがtrueで、MEMORY_GROWTH_LINEAR_STEP == -1の場合、幾何学的メモリ過剰成長が利用されます(上記の変数)。幾何学的過剰成長率を一定の拡張ステップサイズに置き換えるには、MEMORY_GROWTH_LINEAR_STEPをWASMページサイズ(64KB)の倍数(例:16MB)に設定します。MEMORY_GROWTH_LINEAR_STEPが使用されている場合、変数MEMORY_GROWTH_GEOMETRIC_STEPおよびMEMORY_GROWTH_GEOMETRIC_CAPは無視されます。

デフォルト値:-1

MEMORY64

コンパイル対象の「アーキテクチャ」。0はデフォルトのwasm32、1は完全なエンドツーエンドのwasm64モード、2はclang/lld用のwasm64ですが、Binaryenでwasm32に下げられます(内部でi64ポインターを使用しながら、wasm32エンジンで実行できるようにするため)。WASM_BIGINTを想定しています。

注記

リンクとコンパイルの両方で適用可能

注記

これは実験的な設定です

デフォルト値:0

INITIAL_TABLE

MAIN_MODULEまたはSIDE_MODULEが使用されている場合(それ以外の場合ではない)、テーブルの初期サイズを設定します。通常、Emscriptenはリンク時にテーブルのサイズを決定できますが、SPLIT_MODULEモードでは、wasm-splitがテーブルを拡張する必要があることが多いため、計装されたビルド用のJSに組み込まれたテーブルサイズは、モジュール分割後には小さすぎます。これは、ユーザーが両方のビルドで一貫性のある十分に大きなテーブルサイズを指定できるようにするためのハックです。この設定はいつでも削除される可能性があり、SPLIT_MODULEおよび動的リンクと組み合わせて使用する場合を除き、使用しないでください。

デフォルト値:-1

ALLOW_TABLE_GROWTH

trueの場合、ランタイム時にテーブルにさらに関数を追加できます。これは動的リンクに必要であり、そのモードでは自動的に設定されます。

デフォルト値:false

GLOBAL_BASE

グローバルデータが開始する場所。静的メモリの開始。GLOBAL_BASEが1024以上の場合、ロード/ストアオフセットを最適化するのに役立ちます。これにより、–low-memory-unusedパスが有効になります。

デフォルト値:1024

TABLE_BASE

テーブルスロット(関数アドレス)が割り当てられる場所。これは、ヌルポインタ用にゼロスロットを予約するために、少なくとも1である必要があります。

デフォルト値:1

USE_CLOSURE_COMPILER

この出力でClosureコンパイルが実行されているかどうか

デフォルト値:false

CLOSURE_WARNINGS

非推奨:代わりに標準の警告フラグを使用してください。例:-Wclosure-Wno-closure-Werror=closure。オプション:「quiet」、「warn」、「error」。 「warn」に設定すると、Closureの警告がコンソールに出力されます。 「error」に設定すると、Closureの警告は-Werrorコンパイラフラグと同様にエラーとして扱われます。

注記

この設定は非推奨です

デフォルト値:'quiet'

IGNORE_CLOSURE_COMPILER_ERRORS

(重複定義などの)Closureの警告とエラーを無視します

デフォルト値:false

DECLARE_ASM_MODULE_EXPORTS

1に設定すると、各wasmモジュールエクスポートはJavaScriptの「var」定義で個別に宣言されます。これはシンプルで推奨されるアプローチです。ただし、これによりコードサイズが増加します(特にそのようなエクスポートが多い場合)。これは、これを0に設定することで安全でない方法で回避できます。その場合、各エクスポートに対して「var」は作成されず、代わりに、(エクスポートの数に関係なく、コードサイズが小さい)ループが、受信したすべてのエクスポートをグローバルスコープに書き込みます。グローバルスコープのこのような変更は外部のJSミニファイアツールを混乱させる可能性があり、コードが属するスコープがグローバルスコープでない場合(たとえば、手動で関数スコープで囲んだ場合)に問題が発生する可能性があるため、これは危険です。

デフォルト値:true

INLINING_LIMIT

1に設定すると、インライン化が防止されます。0の場合、LLVMで通常どおりインライン化します。これは、Binaryenでのインライン化ポリシーには影響しません。

注記

コンパイル時にのみ適用可能

デフォルト値:false

SUPPORT_BIG_ENDIAN

1に設定すると、各HEAPアクセスを、DataViewを使用してHEAPバッファにLEバイト順を強制する関数呼び出しに変換するacornパスを実行します。これにより、生成されたJavaScriptは、BEマシンとLEマシンの両方で実行されます。(0の場合、LEシステムのみがサポートされます)。生成されたwasmには影響しません。

デフォルト値:false

SAFE_HEAP

ヒープへの各書き込みをチェックします。たとえば、これによりネイティブビルドでセグメンテーションフォルトになるようなもの(0の逆参照など)について明確なエラーが発生します。実行される実際のチェックについては、runtime_safe_heap.jsを参照してください。Wasm + Wasm2JSビルドの両方で安全な動作をテストするには、値1に設定します。Wasmビルドでのみ安全な動作をテストするには、値2に設定します。(特に、Wasmのみのビルドでは、アラインされていないメモリアクセスが許可されます。ただし、一部のアーキテクチャでは、アラインされていないアクセスが非常に遅くなる可能性があるため、より厳密なモード1でコードを検証することをお勧めします。)

デフォルト値:0

SAFE_HEAP_LOG

すべてのSAFE_HEAP操作をログ出力します

デフォルト値:false

EMULATE_FUNCTION_POINTER_CASTS

関数ポインタのキャストを許可し、正しくないタイプの各呼び出しをランタイム修正でラップします。これによりオーバーヘッドが発生するため、通常は使用しないでください。呼び出しが失敗しないようにするだけでなく、可能な限り最善の方法で値を変換しようとします。送信された値をメモリに書き込み、同じメモリから受信したタイプをロードしたかのように(truncs / extends / reinterpretsを使用して)、値を表すために64ビット(i64)を使用します。これは、タイプが一致しない場合、エミュレートされた値が一致しない可能性があることを意味します(これはネイティブでも当てはまります。これはすべて未定義の動作です)。このアプローチは、この機能を動機付ける主なユースケースであるPythonをサポートするのに十分であると思われます。

デフォルト値:false

EXCEPTION_DEBUG

Emscripten化されたコードで例外を出力します。

デフォルト値:false

DEMANGLE_SUPPORT

1の場合、demangleおよびstackTraceJSライブラリ関数をエクスポートします。

注記

この設定は非推奨です

デフォルト値:false

LIBRARY_DEBUG

ライブラリ呼び出し(library * .js)に入るときに出力します。また、ログを停止するためにランタイムでruntimeDebugをオフにすることができ、必要に応じてオンに戻すことができます。C++で設定する簡単な方法は次のとおりです。

emscripten_run_script("runtimeDebug = ...;");

デフォルト値:false

SYSCALL_DEBUG

すべてのmuslシステムコールを、デバッグに便利な数値インデックスを文字列名に変換することを含めて出力します。(その他のシステムコールは番号付けされておらず、すでに明確な名前が付いています。それらすべてのログを取得するには、LIBRARY_DEBUGを使用してください。)

デフォルト値:false

SOCKET_DEBUG

ソケット/ネットワークデータ転送をログ出力します。

デフォルト値:false

FS_DEBUG

library_fs.jsでtrackingDelegateを使用してファイルシステムコールバックを登録します

デフォルト値:false

SOCKET_WEBRTC

" -s"オプションを介してコンパイル時に構成できるだけでなく、WEBSOCKET_URLおよびWEBSOCKET_SUBPROTOCOL設定は、Moduleオブジェクト(例:Module [‘websocket’] = {subprotocol:'base64, binary, text’}; Module [‘websocket’] = {url:'wss://'、subprotocol:'base64'})を介してランタイム時に構成できます。複数の異なるサービスをアプリケーションで選択できるようにする場合、ランタイム構成は役立つ場合があります。「subprotocol」をnullに設定して、指定しないようにすることができます。

デフォルト値:false

WEBSOCKET_URL

WebSocket URLプレフィックス(ws://またはwss://)または完全なRFC 6455 URL「ws[s]:」「//」host [「:」port] path [「?」query]のいずれかを含む文字列。プレフィックスのみが指定されている(デフォルトの)場合、URLは、プレフィックス+ addr + ‘:’ + portから構築されます。ここで、addrとportはソケット接続/バインド/受け入れ呼び出しから派生します。

デフォルト値:'ws://'

PROXY_POSIX_SOCKETS

1の場合、POSIXソケットAPIは、ネイティブブリッジプロセスサーバーを使用して、ブラウザーからネイティブワールドへのソケット呼び出しをプロキシします。

デフォルト値:false

WEBSOCKET_SUBPROTOCOL

Sec-WebSocket-Protocolヘッダーに表示されるように、WebSocketサブプロトコルのカンマ区切りリストを含む文字列です。指定しない場合は、「null」を設定できます。

デフォルト値:'binary'

OPENAL_DEBUG

OpenAL実装からデバッグ情報を出力します。

デフォルト値:false

WEBSOCKET_DEBUG

1の場合、emscripten/websocket.hemscripten_web_socket_*関数からの呼び出しに関連するデバッグを出力します。2の場合、さらにソケットを介して通信されたバイトをトレースします。

デフォルト値:false

GL_ASSERTIONS

GLライブラリのエラー状況に対する追加のチェックを追加します。パフォーマンスに影響を与える可能性があります。

デフォルト値:false

TRACE_WEBGL_CALLS

有効にすると、WebGLコンテキストへのすべてのAPI呼び出しを出力します。(非常に冗長になります)

デフォルト値:false

GL_DEBUG

WebGL関連の操作に関するより詳細なデバッグ出力を有効にします。LIBRARY_DEBUGと同様に、これはオプションGL.debugを使用して実行時に切り替え可能です。

デフォルト値:false

GL_TESTING

有効にすると、テストが機能するようにコンテキストでpreserveDrawingBufferを設定します(ただし、オーバーヘッドが追加されます)。

デフォルト値:false

GL_MAX_TEMP_BUFFER_SIZE

GLエミュレーションの一時バッファのサイズ

デフォルト値:2097152

GL_UNSAFE_OPTS

GLエミュレーションコードで、潜在的に安全でない最適化をいくつか有効にします。

デフォルト値:true

FULL_ES2

WebGLフレンドリーなサブセットだけでなく、すべてのGLES2機能を強制的にサポートします。

デフォルト値:false

GL_EMULATE_GLES_VERSION_STRING_FORMAT

trueの場合、GL_VERSIONおよびGL_SHADING_LANGUAGE_VERSIONに対するglGetString()は、WebGL形式ではなくOpenGL ES形式の文字列「Open GL ES ... (WebGL...)」を返します。falseの場合、直接のWebGL形式の文字列が返されます。これらのバージョン文字列でGLコンテキストをOpenGL ESコンテキストのように見せるには(少しコードサイズが増える犠牲を払って)、これをtrueに設定し、GLコンテキストをWebGLコンテキストのように見せ、出力からいくつかのバイトを節約するにはfalseに設定します。

デフォルト値:true

GL_EXTENSIONS_IN_PREFIXED_FORMAT

trueの場合、すべてのGL拡張機能は、プレフィックスなしのWebGL拡張形式だけでなく、GL_プレフィックス付きのデスクトップ/モバイルGLES/GL拡張形式でもアドバタイズされます。

デフォルト値:true

GL_SUPPORT_AUTOMATIC_ENABLE_EXTENSIONS

trueの場合、GLES/GLエミュレーションの目的で、すべてのGL拡張機能を自動的に有効にするサポートを追加します。これにより、コードサイズが大きくなります。これを0に設定すると、必要な拡張機能を手動で有効にする必要があります。

デフォルト値:true

GL_SUPPORT_SIMPLE_ENABLE_EXTENSIONS

trueの場合、emscripten_webgl_enable_extension()関数を呼び出して、任意のWebGL拡張機能を有効にできます。falseの場合、コードサイズを節約するために、emscripten_webgl_enable_extension()を呼び出して、拡張機能'ANGLE_instanced_arrays'、'OES_vertex_array_object'、'WEBGL_draw_buffers'、'WEBGL_multi_draw'、'WEBGL_draw_instanced_base_vertex_base_instance'、または'WEBGL_multi_draw_instanced_base_vertex_base_instance'を有効にすることはできませんが、html5.hにある専用の関数emscripten_webgl_enable_*()を使用して、これらの各拡張機能を有効にします。このようにして、実際に使用される拡張機能のみにコードサイズが増加します。注意:これを0に設定する場合、GL_SUPPORT_AUTOMATIC_ENABLE_EXTENSIONSも0に設定する必要があります。

デフォルト値:true

GL_TRACK_ERRORS

0に設定すると、Emscripten GLES2->WebGL変換レイヤーは、GLES2には存在するがWebGLには存在しないGLエラーの種類を追跡しません。これを0に設定すると、コードサイズを節約できます。(開発中は1に保つことをお勧めします)

デフォルト値:true

GL_SUPPORT_EXPLICIT_SWAP_CONTROL

trueの場合、GLコンテキストはexplicitSwapControlコンテキスト作成フラグをサポートします。不要なプロジェクトのスペースを少し節約するには、0に設定します。

デフォルト値:false

GL_POOL_TEMP_BUFFERS

trueの場合、glUniform*fvおよびglUniformMatrix*fvの呼び出しは、WebGL 1の不要な一時的なゴミを生成しないように、一般的な小さなサイズのために事前割り当てられた一時バッファのプールを利用します。WebGLライブラリの生成サイズを少し最適化するためにこれを無効にしますが、WebGL 1でゴミを生成する犠牲を払います。WebGL 2のみを使用しており、WebGL 1をサポートしていない場合は、これは必要なく、オフにすることができます。

デフォルト値:true

GL_EXPLICIT_UNIFORM_LOCATION

trueの場合、EMSCRIPTEN_explicit_uniform_location WebGL拡張機能のサポートを有効にします。docs/EMSCRIPTEN_explicit_uniform_location.txtを参照してください。

デフォルト値:false

GL_EXPLICIT_UNIFORM_BINDING

trueの場合、EMSCRIPTEN_uniform_layout_binding WebGL拡張機能のサポートを有効にします。docs/EMSCRIPTEN_explicit_uniform_binding.txtを参照してください。

デフォルト値:false

USE_WEBGL2

非推奨。WebGL 2.0をターゲットにするには、-sMAX_WEBGL_VERSION=2を渡します。

デフォルト値:false

MIN_WEBGL_VERSION

ターゲットとするWebGLの最小バージョンを指定します。WebGL 1をターゲットにするには-sMIN_WEBGL_VERSION=1を渡し、WebGL 1のサポートを削除するには-sMIN_WEBGL_VERSION=2を渡します。

デフォルト値:1

MAX_WEBGL_VERSION

ターゲットとするWebGLの最大バージョンを指定します。WebGL 2をターゲットにするには、-sMAX_WEBGL_VERSION=2を渡します。WebGL 2が有効になっている場合、一部のAPI(EGL、GLUT、SDL)は、バージョンが指定されていない場合にWebGL 2コンテキストをデフォルトで作成します。ユーザーのデバイスでWebGL2がサポートされていない場合でも、アプリケーションが常にそれを望んでいるとは限らないため、WebGL1とWebGL2の両方のサポートでビルドした場合でも、WebGL1への自動フォールバックはないことに注意してください。そのようなフォールバックが必要な場合は、WebGL2でコンテキストを作成し、失敗した場合はWebGL1でコンテキストを作成してみてください。

デフォルト値:1

WEBGL2_BACKWARDS_COMPATIBILITY_EMULATION

trueの場合、WebGL 2コンテキストでWebGL 1の機能をいくつかエミュレートします。これは、WebGL 1/GLES 2を使用するアプリケーションがWebGL 2/GLES3コンテキストを初期化できるが、WebGL2/GLES3ではサポートされなくなったWebGL1/GLES 2機能を引き続き使用できることを意味します。現在、これはGLSLES 1.00シェーダーのGL_EXT_shader_texture_lod拡張機能、サイズのない内部テクスチャ形式のサポート、およびGL_HALF_FLOAT_OES != GL_HALF_FLOATの混同をエミュレートします。

デフォルト値:false

FULL_ES3

WebGL2フレンドリーなサブセットだけでなく、すべてのGLES3機能を強制的にサポートします。これにより、FULL_ES2とWebGL2サポートが自動的にオンになります。

デフォルト値:false

LEGACY_GL_EMULATION

さまざまなデスクトップGL機能をエミュレートするためのコードが含まれています。不完全ですが、一部のケースで役立ちます。 http://kripken.github.io/emscripten-site/docs/porting/multimedia_and_graphics/OpenGL-support.htmlを参照してください。

デフォルト値:false

GL_FFP_ONLY

LEGACY_GL_EMULATION = 1を指定し、コードで固定機能パイプラインのみを使用している場合は、ユーザーコードがシェーダーをまったく使用しないことを知ることにより、GLエミュレーションレイヤーが追加の最適化を実行できることを通知するために、これを1に設定することもできます。LEGACY_GL_EMULATION = 0の場合、この設定は影響しません。

デフォルト値:false

GL_PREINITIALIZED_CONTEXT

JSコードでWebGLコンテキストを事前に作成する場合は、これを1に設定し、Module['preinitializedWebGLContext']を事前に作成されたWebGLコンテキストに設定します。その後のWebGLの初期化では、このGLコンテキストを使用してレンダリングします。

デフォルト値:false

USE_WEBGPU

WebGPU(「webgpu/webgpu.h」経由)のサポートを有効にします。

デフォルト値:false

STB_IMAGE

画像のデコード用の小さなパブリックドメインライブラリであるstb-imageのビルドを有効にし、ブラウザの内蔵デコーダーを使用せずに画像のデコードを可能にします。利点は、これを同期的に実行できることですが、ブラウザ自体ほど高速ではありません。有効にすると、stb-imageはIMG_LoadおよびIMG_Load_RWから自動的に使用されます。stbi_*関数を直接呼び出すこともできます。

デフォルト値:false

GL_DISABLE_HALF_FLOAT_EXTENSION_IF_BROKEN

(SafariにWebGLが導入された)Safari 8以降、OES_texture_half_floatおよびOES_texture_half_float_linear拡張機能は破損しており、ソーステクスチャとして使用した場合に正しく機能しません。https://bugs.webkit.org/show_bug.cgi?id=183321https://bugs.webkit.org/show_bug.cgi?id=169999https://stackoverflow.com/questions/54248633/cannot-create-half-float-oes-texture-from-uint16array-on-ipadを参照してください。

デフォルト値:false

GL_WORKAROUND_SAFARI_GETCONTEXT_BUG

Safari WebGLの問題を回避します。キャンバスでWebGLコンテキストを正常に取得した後、.getContext()を呼び出すと、渡された'webgl'または'webgl2'コンテキストバージョンに関係なく、常にそのコンテキストが返されます。https://bugs.webkit.org/show_bug.cgi?id=222758およびhttps://github.com/emscripten-core/emscripten/issues/13295を参照してください。この問題が影響しないことがわかっている場合は、これを0に設定して、回避策を強制的に無効にします。

デフォルト値:true

GL_ENABLE_GET_PROC_ADDRESS

1の場合、glGetProcAddress()機能のサポートをリンクします。WebGLでは、WebGLはこのような機能をネイティブに提供しておらず、エミュレートする必要があるため、glGetProcAddress()はコードサイズとパフォーマンスに大きな影響を与えます。glGetProcAddress()を使用することはお勧めできません。既存のレンダラーを移植する場合など、それでもこれを使用する必要がある場合は、-sGL_ENABLE_GET_PROC_ADDRESS=1でリンクして、この機能のサポートを取得できます。

デフォルト値:true

JS_MATH

Math.tanなどのJavaScriptの数学関数を使用します。これにより、コンパイル済みのmuslコードを同梱する必要がなくなるため、コードサイズを節約できます。ただし、JSへの呼び出しが発生するため、大幅に遅くなる可能性があります。また、JSの数学はlibcとはやや異なる仕様であり、ブラウザによって異なる場合もあるため、結果も異なる可能性があります。

デフォルト値:false

POLYFILL_OLD_MATH_FUNCTIONS

設定されている場合、Math.clz32、Math.trunc、Math.imul、Math.froundのポリフィルを有効にします。

デフォルト値:false

LEGACY_VM_SUPPORT

古い JavaScript エンジンとの互換性のためのエミュレーションを有効にするには、これを設定します。これにより、まれな古いブラウザやシェル環境を含め、あらゆる場所でコードが動作する可能性が最大限に高まります。具体的には、

  • Math.clz32、Math.trunc、Math.imul、Math.fround のポリフィルを追加します。(-sPOLYFILL_OLD_MATH_FUNCTIONS)

  • WebAssembly を無効にします。(-sWASM=0 と組み合わせる必要があります)

  • すべてのブラウザバージョンをサポートするために、MIN_X_VERSION 設定を 0 に調整します。

  • 必要に応じて、zeroMemory ユーティリティ関数で TypedArray.fill を回避します。

上記オプションは個別に設定することもできます。

デフォルト値:false

ENVIRONMENT

JS 出力が実行可能なランタイム環境を指定します。最大の移植性のために、これはすべての環境をサポートするように構成することも、全体的なコードサイズを削減するために制限することもできます。サポートされている環境は次のとおりです。

  • ‘web’ - 通常の Web 環境。

  • ‘webview’ - web と同様ですが、Cordova のような webview 内です。ほとんどの場合 “web” と同じとみなされます

  • ‘worker’ - Web Worker 環境。

  • ‘node’ - Node.js。

  • ‘shell’ - d8、js、jsc などの JS シェル。

この設定は、"web,worker" のように、これらの環境のコンマ区切りリストにすることができます。これが空文字列の場合、すべての環境がサポートされます。

ここで認識される環境のセットは、ENVIRONMENT_IS_* を使用してランタイム時に識別するセットと同一ではないことに注意してください。具体的には

  • ランタイム時に pthread であるかどうかを検出しますが、それはワーカーに対して設定されており、メインファイルに対しては設定されないため、ここで指定することは意味がありません。

  • webview ターゲットは基本的に web のサブセットです。web とともに (例: "web,webview") 指定する必要があり、コンパイル時のコード生成でのみ使用され、ランタイムの動作変更はありません。

デフォルトでは、d8、js、jsc の直接使用は非常にまれであるため、'shell' 環境は含めないことに注意してください。

デフォルト値: ‘web,webview,worker,node’

LZ4

lz4 圧縮ファイルパッケージをサポートするには、これを有効にします。これらはメモリに圧縮された状態で格納され、オンザフライで解凍されるため、解凍されたデータ全体を一度にメモリに格納することを回避できます。ファイルパッカーを個別に実行する場合でも、このフラグを指定してメインプログラムをビルドし、ファイルパッカーに –lz4 を渡す必要があります。(クライアントで LZ4.loadPackage() を使用して手動で圧縮することもできますが、あまり推奨されません。)制限事項

  • LZ4 圧縮ファイルは必要なときにのみ解凍されるため、ブラウザコーデックを使用した画像の事前デコードや preloadPlugin のような特別なプリロード操作には使用できません。

  • LZ4 ファイルは読み取り専用です。

デフォルト値:false

DISABLE_EXCEPTION_CATCHING

例外を実際にキャッチするコードの生成を無効にします。例外のオーバーヘッドは現在サイズと速度の点で非常に高いため(将来的には wasm で改善されるはずです)、この無効化はデフォルトで有効になっています。例外が無効になっている場合、実際に例外が発生してもキャッチされず、プログラムは停止します(したがって、これによりサイレントエラーが発生することはありません)。

注記

これにより、速度の主な問題である例外のキャッチが削除されますが、決してキャッチされないスローされた例外が含まれている可能性があるため(たとえば、std::vector を使用するだけでもそれが発生する可能性があります)、-fno-exceptions でソースファイルをビルドして、すべての例外コードのオーバーヘッドを実際に取り除く必要があります。-fno-rtti も役立つ場合があります。

このオプションは、EXCEPTION_CATCHING_ALLOWED と相互に排他的です。

このオプションは、Emscripten (JavaScript ベース) の例外処理にのみ適用され、ネイティブの Wasm 例外処理は制御しません。

[コンパイル + リンク] - コンパイル時のユーザーコードとリンク時のシステムライブラリに影響します

デフォルト値:1

EXCEPTION_CATCHING_ALLOWED

リストされた関数でのみ例外をキャッチすることを有効にします。このオプションは、DISABLE_EXCEPTION_CATCHING=0 のより正確なバージョンとして機能します。

このオプションは、DISABLE_EXCEPTION_CATCHING と相互に排他的です。

このオプションは、Emscripten (JavaScript ベース) の例外処理にのみ適用され、ネイティブの Wasm 例外処理は制御しません。

[コンパイル + リンク] - コンパイル時のユーザーコードとリンク時のシステムライブラリに影響します

デフォルト値: []

DISABLE_EXCEPTION_THROWING

内部: Emscripten が例外スロー (C++ 'throw') サポートライブラリにリンクするかどうかを追跡します。これは直接設定する必要はありませんが、ビルドに -fno-exceptions を渡して例外サポートを無効にします。(これは基本的には -fno-exceptions ですが、個々の .cpp ファイルのコンパイル時ではなく、最終リンク時にチェックされます)プログラムにスローコード (一部のソースファイルが -fno-exceptions でコンパイルされていない) が含まれており、このフラグがリンク時に設定されている場合、例外スローコードがリンクされていないため、未定義のシンボルでエラーが発生します。その場合は、オプションの設定を解除するか(例外が必要な場合)、ソースファイルのコンパイルを修正して、実際に例外が使用されていないようにする必要があります。TODO(sbc): (テストコードでの使用のため現在ブロックされている) settings_internal に移動します。

このオプションは、Emscripten (JavaScript ベース) の例外処理にのみ適用され、ネイティブの Wasm 例外処理は制御しません。

デフォルト値:false

EXPORT_EXCEPTION_HANDLING_HELPERS

例外メッセージの印刷関数である 'getExceptionMessage' を、EXPORTED_FUNCTIONS に必要なシンボルを追加することにより、JS ライブラリで使用できるようにします。

これは、Emscripten EH と Wasm EH の両方で機能します。JS から例外をキャッチすると、Emscripten EH の場合はユーザーがスローした値が、Wasm EH の場合は WebAssembly.Exception オブジェクトが与えられます。'getExceptionMessage' は、Emscripten EH の場合はユーザーがスローした値を、Wasm EH の場合は WebAssembly.Exception オブジェクトを受け取ります。つまり、どちらの場合も、キャッチされた例外を関数に直接渡すことができます。

Wasm EH と共に使用する場合、このオプションは JS ライブラリでこれらの関数を追加で提供します

  • getCppExceptionTag: C++ タグを返します

  • getCppExceptionThrownObjectFromWebAssemblyException: WebAssembly.Exception オブジェクトを指定すると、Wasm メモリ内の実際のユーザーがスローした C++ オブジェクトのアドレスを返します。

このオプションを設定すると、JS ライブラリに参照カウントを増減する関数 ('incrementExceptionRefcount' と 'decrementExceptionRefcount') も追加されます。これは、JS から例外をキャッチした場合、メモリリークを防ぐために手動で参照カウントを操作する必要があるためです。実行する必要があることは、使用する EH の種類によって異なります (https://github.com/emscripten-core/emscripten/issues/17115)。

使用例については、test/test_core.py の test_EXPORT_EXCEPTION_HANDLING_HELPERS を参照してください。

デフォルト値:false

EXCEPTION_STACK_TRACES

これを有効にすると、例外にはスタックトレースが含まれ、キャッチされない例外は終了時にスタックトレースを表示します。これは、ASSERTIONS が有効になっている場合はデフォルトで true になります。このオプションは、例外のスタックトレースが必要だが、ASSERTIONS が発生する可能性のある他のオーバーヘッドは必要ないユーザーを対象としています。このオプションは、EXPORT_EXCEPTION_HANDLING_HELPERS を意味します。

デフォルト値:false

WASM_EXNREF

2023 年 10 月に採択された新しい Wasm 例外処理提案用の exnref を使用した命令を発行します。新しい提案の実装はまだ進行中であり、この機能は現在実験的です。

デフォルト値:false

NODEJS_CATCH_EXIT

Emscripten は exit() が呼び出されたときにアンワインドするために ExitStatus 例外をスローします。この設定が有効になっていない場合、これは最上位の未処理例外として表示される可能性があります。

この設定を有効にすると、ExitStatus 例外をキャッチして処理するためにグローバルな uncaughtException ハンドラーが使用されます。ただし、これは他のすべての未処理例外もキャッチされて再スローされることを意味し、必ずしも望ましいとは限りません。

デフォルト値:false

NODEJS_CATCH_REJECTION

node で未処理の拒否をキャッチします。これは、15 より前のバージョンの node にのみ影響します。これがないと、古いバージョンの node は警告を出力しますが、ゼロの戻りコードで終了します。この設定を有効にすると、未処理の拒否を処理して例外をスローします。これにより、プロセスは非 0 の戻りコードですぐに終了します。これは Node 15 以降では必要ないため、MIN_NODE_VERSION が 150000 以上の場合、この設定はデフォルトで false になります。

デフォルト値:true

ASYNCIFY

コンパイルされたコードで非同期操作をサポートするかどうか。これにより、C/C++ で同期的に見えるコードから JS 関数を呼び出すことができます。

  • 1 (デフォルト): asyncify を使用してコードを変換するために、binaryen の Asyncify パスを実行します。これにより、最後に通常の wasm ファイルが発行されるため、あらゆる場所で機能しますが、コードサイズと速度の点で大きなコストがかかります。https://emscripten.dokyumento.jp/docs/porting/asyncify.html を参照してください。

  • 2 (非推奨): 代わりに -sJSPI を使用してください。

デフォルト値:0

ASYNCIFY_IMPORTS

emscripten_sleep のような emscripten が定義するデフォルトのインポートに加えて、非同期操作を実行できるインポート。さらに追加する場合は、ここに記述する必要があります。そうしないと、機能しません (ASSERTIONS ビルドではエラーが表示されます)。このリストには以前はデフォルトのリストが含まれていたため、独自に追加する際にリストする必要がありました。デフォルトのリストは自動的に追加されるようになりました。

デフォルト値: []

ASYNCIFY_IGNORE_INDIRECT

アンワインド/リワインド中に間接呼び出しがスタック上にあるかどうか。それらがないことがわかっている場合、これを設定すると非常に役立ちます。そうしないと、asyncify は間接呼び出しがほぼどこにでも到達する可能性があると想定する必要があるためです。

デフォルト値:false

ASYNCIFY_STACK_SIZE

asyncify スタックのサイズ - アンワインド/リワインド情報を格納するために使用される領域。これは、コールスタックとローカルを格納するのに十分な大きさである必要があります。小さすぎると、「到達不能」命令の実行により wasm トラップが発生します。その場合は、このサイズを大きくする必要があります。

デフォルト値: 4096

ASYNCIFY_REMOVE

Asyncifyの削除リストが提供された場合、そのリストにある関数は、必要と思われる場合でもインストルメントされません。これは、全プログラム解析ではわからないことを知っている場合に便利です。例えば、特定の非間接呼び出しが安全でアンワインドしないことを知っている場合などです。しかし、リストを間違えると、動作が壊れてしまいます(そして、本番ビルドでは、テスト中に見逃したコードパスにユーザー入力が到達する可能性があるため、正しくリストを作成できたかを知ることは困難です)。したがって、本当に何をすべきかを知っていて、スピードとサイズを最大限に最適化する必要がある場合以外は、推奨されません。

このリストの名前は、WebAssemblyの名前セクションの名前です。wasmバックエンドは、通常のC++のマングリングではなく、人間が読める形式でこれらの名前を出力します。たとえば、_ZN6Struct4FuncEvではなく、Struct::func()と記述する必要があります。CもC++とは異なり、Cの名前はパラメータで終わりません。結果として、C++のfoo(int)はCでは単にfooとして表示されます(C++には、オーバーロードされた関数を区別する必要があるため、パラメータがあります)。リストにない名前がある場合は、コンソールに警告が表示されます(インライン化などにより、-O0ビルドと-O1ビルドの両方で単一のリストが機能しない可能性があるため、これはエラーではありません)。wasmバイナリを直接検査するか、wasm-objdumpやwasm-disなどを使用して、実際の名を探すことができます。

単純な*ワイルドカードマッチングがサポートされています。

オペレーティングシステムのシェルまたはビルドシステムのエスケープの制限に対処するために、次の置換を行うことができます。

  • ‘ ‘ -> .,

  • & -> #,

  • , -> ?.

つまり、関数“foo(char const*, int&)”は、コマンドラインで“foo(char.const*?.int#)”として入力できます。

注意: 空白は関数シグネチャの一部です!つまり、“foo(char const , int &)”は“foo(char const, int&)”と一致せず、“foo(const char*, int &)”とも一致しません。

デフォルト値: []

ASYNCIFY_ADD

Asyncifyの追加リストにある関数は、インストルメントされる関数のリストに追加されます。つまり、Asyncifyがインストルメントする必要がないと考える場合でも、インストルメントされます。デフォルトでは、すべてが可能な限り安全な方法でインストルメントされるため、これは、IGNORE_INDIRECTを使用し、このリストを使用して、インストルメントする必要がある一部の非間接呼び出しを修正する場合にのみ役立ちます。

ワイルドカードマッチングと文字置換を含む、名前に関するASYNCIFY_REMOVEの注意を参照してください。

デフォルト値: []

ASYNCIFY_PROPAGATE_ADD

有効にすると、インストルメントの状態は追加リストから伝播されます。つまり、その呼び出し元、およびその呼び出し元の呼び出し元などが伝播されます。無効にすると、すべての呼び出し元を(only-listのように)手動で追加リストに追加する必要があります。

デフォルト値:true

ASYNCIFY_ONLY

Asyncifyのonly-listが提供された場合、リストにある関数のみがインストルメントされます。remove-listと同様に、これを間違えるとアプリケーションが壊れます。

ワイルドカードマッチングと文字置換を含む、名前に関するASYNCIFY_REMOVEの注意を参照してください。

デフォルト値: []

ASYNCIFY_ADVISE

有効にすると、どの関数がインストルメントされたか、またその理由が出力されます。

デフォルト値:false

ASYNCIFY_LAZY_LOAD_CODE

遅延コード読み込みを許可します。emscripten_lazy_load_code()が記述されている場所で、実行を一時停止し、残りのコードを読み込んでから、再開します。

デフォルト値:false

ASYNCIFY_DEBUG

asyncify内部からのランタイムデバッグロギング。

  • 1:最小限のロギング。

  • 2:詳細なロギング。

デフォルト値:0

ASYNCIFY_EXPORTS

非推奨。代わりにJSPI_EXPORTSを使用してください。

注記

この設定は非推奨です

デフォルト値: []

JSPI

JavaScript Promise IntegrationプロポーザルのVMサポートを使用します。これにより、wasmを変更するオーバーヘッドなしに非同期操作を実行できます。これは仕様の議論が進行中であるため、現在実験的です。 https://github.com/WebAssembly/js-promise-integration/を参照してください。TODO: このモードで以下のどのフラグがまだ関連しているかを文書化してください(たとえば、IGNORE_INDIRECTなどは不要です)。

デフォルト値:0

JSPI_EXPORTS

非同期になるエクスポートされたモジュール関数のリスト。各エクスポートは、結果で解決されるPromiseを返します。非同期インポート(JSPI_IMPORTSにリストされている)を呼び出すエクスポートはすべて、ここに含める必要があります。

デフォルトでは、mainが含まれています。

デフォルト値: []

JSPI_IMPORTS

非同期処理を行う可能性のあるインポートされたモジュール関数のリスト。インポートされた関数は、非同期処理を行うときにPromiseを返す必要があります。

--js-libraryを使用する場合は、この設定の代わりに、ライブラリ内で<function_name>_async:: trueで関数をマークできます。

デフォルト値: []

EXPORTED_RUNTIME_METHODS

デフォルトでModuleにエクスポートされるランタイム要素。以前はここでかなり多くエクスポートしていましたが、すべて削除しました。ランタイムからエクスポートしたいものには、EXPORTED_RUNTIME_METHODSを使用する必要があります。これはメソッドだけでなく、あらゆるJSライブラリ要素を対象としているため、名前が少し誤解を招く可能性があることに注意してください。たとえば、このリストに「FS」を含めることで、FSオブジェクトをエクスポートできます。

デフォルト値: []

EXTRA_EXPORTED_RUNTIME_METHODS

非推奨。代わりにEXPORTED_RUNTIME_METHODSを使用してください。

注記

この設定は非推奨です

デフォルト値: []

INCOMING_MODULE_JS_API

Moduleオブジェクト上のJSの受信値のうち、関心のあるもののリスト。値がこのリストにない場合、Moduleオブジェクトで提供するかどうかを確認するコードは出力しません。たとえば、次のものがある場合

var Module = {
  print: (x) => console.log('print: ' + x),
  preRun: [() => console.log('pre run')]
};

次に、MODULE_JS_APIには「print」と「preRun」が含まれている必要があります。含まれていない場合、その値を読み取って使用するコードは出力されない可能性があります。言い換えれば、このオプションを使用すると、コンパイル時に静的に、実行時に提供するModule JS値のリストを設定できるため、コンパイラは最適化を改善できます。

このリストを[]に設定するか、少なくとも実際に使用する短い簡潔な名前のセットに設定すると、コードサイズを削減するのに非常に役立ちます。デフォルトでは、リストには一般的に使用される記号のセットが含まれています。

FIXME: すべてが必要な場合、これは単に0にする必要がありますか?

デフォルト値:(複数行の値、settings.jsを参照)

CASE_INSENSITIVE_FS

ゼロ以外の値に設定すると、提供された仮想ファイルシステムは、WindowsやmacOSのように大文字と小文字を区別せずに扱われます。0に設定すると、VFSはLinuxのように大文字と小文字を区別します。

デフォルト値:false

FILESYSTEM

0に設定すると、ファイルシステムのサポートは組み込まれません。純粋な計算だけを実行する場合、ファイルを読み込んだり、ストリーム(fprintfやその他のstdio.hのものなど)を使用したり、関連するものを使用したりしない場合に役立ちます。1つの例外は、printfとputsに対する部分的なハック的なサポートがあることです。コンパイラは、システムコールの使用法(これは静的です)に完全なファイルシステムが必要ないことを検出した場合、これを自動的に設定します。ファイルシステムのサポートが必要な場合は、FORCE_FILESYSTEMを使用してください。

デフォルト値:true

FORCE_FILESYSTEM

静的に使用されていないように見える場合でも、完全なファイルシステムのサポートを含めるようにします。たとえば、Cコードでファイルを使用していなくても、ファイルを使用するJSを含めている場合は、これが必要になる場合があります。

デフォルト値:false

NODERAWFS

NODERAWFSファイルシステムバックエンドのサポートを有効にします。これは、FS.mount()を実行する必要なしに、通常のファイルシステムアクセスをすべて直接Node.js操作に置き換えるため、特別なバックエンドです。このバックエンドはNode.jsでのみ機能します。初期作業ディレクトリは、VFSルートディレクトリではなく、process.cwd()と同じになります。このモードでは、Node.jsを使用してOS上の実際のローカルファイルシステムに直接アクセスするため、コードは必ずしもOS間で移植可能であるとは限りません。Node.jsプログラムが移植可能な範囲で移植可能になります。つまり、基盤となるOSがアクセス許可やエラーなどを処理する方法の違いが顕著になる可能性があります。

デフォルト値:false

NODE_CODE_CACHING

これにより、コンパイルされたwasmモジュールが$WASM_BINARY_NAME.$V8_VERSION.cachedという名前のファイルに保存され、後続の実行時にロードされます。これにより、nodeのv8からコンパイルされたwasmコードがキャッシュされ、後続の実行時のコンパイルが不要になり、起動が大幅に速くなります。nodeで使用されるV8のバージョンはキャッシュ名に含まれているため、別のバージョンからキャッシュされたコードをロードしようとすることはありません。これは静かに失敗します(正常にロードされているように見えますが、実際には再コンパイルされます)。

  • 確実に機能することがわかっているバージョンはnode 12.9.1のみです。これは回帰しているため、https://github.com/nodejs/node/issues/18265#issuecomment-622971547を参照してください。

  • 前述したように、.cachedファイルのデフォルトの場所は、wasmバイナリと同じ場所です。それが読み取り専用ディレクトリにある場合は、別の場所に配置する必要がある場合があります。そのためにlocateFile()フックを使用できます。

デフォルト値:false

EXPORTED_FUNCTIONS

明示的にエクスポートされるシンボル。これらのシンボルは、LLVMのデッドコード削除を通じて保持され、クロージャコンパイラの実行後(「Module」上)でも、生成されたコードの外部からアクセスできるようになります。ここにリストされているネイティブシンボルには、_プレフィックスが必要です。

コマンドラインでこの設定が指定されていない場合、デフォルトでは、_main関数が暗黙的にエクスポートされます。STANDALONE_WASMモードでは、デフォルトのエクスポートは__startです(または、–no-entryが指定されている場合は__initialize)。

JSライブラリシンボルも、このリストに追加できます(先頭の$なし)。

デフォルト値: []

EXPORT_ALL

trueの場合、JSに存在するすべてのシンボルをModuleオブジェクトにエクスポートします。これは、どのシンボルが存在するかには影響しません。DCEを防止したり、リンクに何かを含めたりすることはありません。JSファイルに最終的に含まれるすべてのXに対して、Module['X'] = X;を実行するだけです。これは、動的リンクなどのために、JSライブラリ関数をModuleにエクスポートする場合に役立ちます。

デフォルト値:false

EXPORT_KEEPALIVE

trueの場合、JSに存在するシンボルをModuleオブジェクトにエクスポートします。Module['X'] = X;を実行するだけです。

デフォルト値:true

RETAIN_COMPILER_SETTINGS

これらの設定の値を記憶し、getCompilerSetting および emscripten_get_compiler_setting を通してアクセスできるようにします。何が保持されているかを確認するには、生成されたコードの compilerSettings を探してください。

デフォルト値:false

DEFAULT_LIBRARY_FUNCS_TO_INCLUDE

デフォルトで含める JS ライブラリ要素 (JS で実装された C 関数)。JS コンパイラで必ず含めたいものがある場合は、ここに追加してください。たとえば、C から emscripten_* C API 呼び出しを使用していないが、JS から呼び出したい場合は、ここに追加します。これは関数だけでなく、任意の JS ライブラリ要素のためのものであるため、名前は少し誤解を招く可能性があることに注意してください。たとえば、"$Browser" をこのリストに追加することで、Browser オブジェクトを含めることができます。

JS ライブラリシンボルを含めてエクスポートする場合は、DEFAULT_LIBRARY_FUNCS_TO_INCLUDE に追加することなく、EXPORTED_FUNCTIONS に追加するだけで十分です。

デフォルト値: []

INCLUDE_FULL_LIBRARY

生成されたコードで使用される関数と DEFAULT_LIBRARY_FUNCS_TO_INCLUDE の合計の代わりに、すべての JS ライブラリ関数を含めます。これは、メインモジュールで使用されていないランタイムライブラリ関数を利用するモジュールを動的にロード (つまり dlopen) する場合に必要です。これは js ライブラリにのみ適用され、C には適用されないことに注意してください。必要なすべての C ライブラリを含めるには、メインファイルが必要です。たとえば、モジュールが malloc または new を使用する場合は、モジュールで使用するために、メインファイルでもそれらを使用する必要があります。

デフォルト値:false

RELOCATABLE

1 に設定すると、LLVM バックエンドから再配置可能なコードを出力します。グローバル変数と関数ポインタの両方がすべてオフセット (それぞれ gb と fp) されます。SIDE_MODULE または MAIN_MODULE に対して自動的に設定されます。

注記

リンクとコンパイルの両方で適用可能

デフォルト値:false

MAIN_MODULE

メインモジュールとは、ランタイム時にサイドモジュールにリンクできるようにコンパイルされたファイルです。

  • 1: 通常のメインモジュール。

  • 2: DCE されたメインモジュール。通常、デッドコードを削除します。サイドモジュールがメインモジュールから何かを必要とする場合は、それが存続するようにする必要があります。

注記

リンクとコンパイルの両方で適用可能

デフォルト値:0

SIDE_MODULE

MAIN_MODULE に対応します (モード 1 および 2 もサポートしています)。

注記

リンクとコンパイルの両方で適用可能

デフォルト値:0

RUNTIME_LINKED_LIBS

非推奨です。代わりに、コマンドラインで共有ライブラリを直接リストしてください。

注記

この設定は非推奨です

デフォルト値: []

BUILD_AS_WORKER

1 に設定すると、これはワーカーライブラリであり、ワーカーで実行される特別な種類のライブラリです。emscripten.h を参照してください。

デフォルト値:false

PROXY_TO_WORKER

1 に設定すると、プロジェクトをワーカーで実行される js ファイルにビルドし、そこへの入出力をプロキシする html ファイルを生成します。

デフォルト値:false

PROXY_TO_WORKER_FILENAME

設定されている場合、メインスレッドがロードするスクリプトファイル名。プロジェクトが emscripten で生成されたメインスクリプトをすぐに実行せず、事前にいくつかのセットアップを行う場合に便利です。

デフォルト値: ''

PROXY_TO_PTHREAD

1 に設定すると、pthread_create() を呼び出して pthread でアプリケーションの main() を実行する、実際の main() との間にある小さなスタブ main() にコンパイルされます。これは、アプリケーションが希望すれば手動でも実行できます。このオプションは便宜上提供されています。

main() が実行される pthread は、スタックサイズがメインスレッドが通常持つサイズと同じであるという点が 1 つ異なるだけで、他のすべての点で通常の pthread です。つまり、STACK_SIZE です。これにより、main() が常に同じ量のスタックを取得して、PROXY_TO_PTHREAD モードと非 PROXY_TO_PTHREAD モードを簡単に切り替えることができます。

OFFSCREENCANVAS_SUPPORT が有効になっている場合、存在する場合は Module['canvas'] をプロキシします。これは、このブラウザのメインスレッドがそのスレッドで発生する唯一の pthread_create 呼び出しを行うため、そこからキャンバスを転送する唯一のチャンスであるため、発生する必要があります。

デフォルト値:false

LINKABLE

1 に設定すると、このファイルは、共有ライブラリとして、または共有ライブラリを呼び出すメインファイルとして、他のファイルとリンクできます。それを有効にするために、すべてのシンボルを内部化して未使用のものを削除することはありません。つまり、リンク先の別のモジュールで使用される可能性のある未使用の関数とグローバル変数は削除しません。

MAIN_MODULE と SIDE_MODULE はどちらもこれを意味するため、通常、これを明示的に設定する必要はありません。MAIN_MODULE と SIDE_MODULE モード 2 はこれを設定しないため、それらに対して通常の DCE を実行し、その場合はエクスポートを使用して関連するものを自分で存続させる必要があることに注意してください。

デフォルト値:false

STRICT

Emscripten の「厳密な」ビルドモード: 非推奨のビルドオプションのサポートを削除します。環境変数 EMCC_STRICT=1 を設定するか、-sSTRICT を渡して、コードベースが前方互換性のある方法で適切にビルドされることをテストします。これにより有効になる変更

  • C 定義 EMSCRIPTEN は定義されていません (__EMSCRIPTEN__ は常に定義されており、使用するのが正しいものです)。

  • STRICT_JS が有効になっています。

  • IGNORE_MISSING_MAIN が無効になっています。

  • AUTO_JS_LIBRARIES が無効になっています。

  • AUTO_NATIVE_LIBRARIES が無効になっています。

  • DEFAULT_TO_CXX が無効になっています。

  • USE_GLFW はデフォルトで 2 ではなく 0 に設定されています。

  • ALLOW_UNIMPLEMENTED_SYSCALLS が無効になっています。

  • INCOMING_MODULE_JS_API はデフォルトで空に設定されています。

注記

リンクとコンパイルの両方で適用可能

デフォルト値:false

IGNORE_MISSING_MAIN

main シンボルがある場合とない場合の両方でプログラムをリンクできるようにします。これを無効にした場合は、main シンボルを提供するか、--no-entry または _main を含まない EXPORTED_FUNCTIONS リストを渡して明示的にオプトアウトする必要があります。

デフォルト値:true

STRICT_JS

生成された JS に "use strict;" を追加します。

デフォルト値:false

WARN_ON_UNDEFINED_SYMBOLS

1 に設定すると、library_*.js ファイルで解決されていない未定義のシンボルについて警告します。大規模なプロジェクトでは、実際に呼び出されないことがわかっている場合 (既存のビルドシステムを混乱させたくない場合)、すべてを実装しないのが一般的であり、関数は後で、たとえば –pre-js で実装される可能性があるため、警告が煩わしい場合は、-s WARN_ON_UNDEFINED_SYMBOLS=0 を指定してビルドし、警告を無効にすることができます。ERROR_ON_UNDEFINED_SYMBOLS も参照してください。EXPORTED_FUNCTIONS にリストされている未定義のシンボルも報告されます。

デフォルト値:true

ERROR_ON_UNDEFINED_SYMBOLS

1 に設定すると、未定義のシンボルに対してリンク時のエラーが発生します (WARN_ON_UNDEFINED_SYMBOLS を参照)。リンク時に未定義のシンボルを許可するには、これを 0 に設定します。この場合、未定義の関数が呼び出されると、ランタイムエラーが発生します。EXPORTED_FUNCTIONS にリストされている未定義のシンボルも報告されます。

デフォルト値:true

SMALL_XHR_CHUNKS

Web Worker でのバイナリ同期 XHR に小さいチャンクサイズを使用します。テストに使用されます。runner.py および library.js の test_chunked_synchronous_xhr を参照してください。

デフォルト値:false

HEADLESS

1 の場合、シェルでブラウザプログラム (たとえば、SDL を使用) を実行できるように、「偽の」ブラウザ環境を試すシムコードが含まれます。明らかに何もレンダリングされませんが、実際のレンダリングが問題ではない場合に、ベンチマークやデバッグに役立ちます。シムコードは非常に部分的です。ブラウザ全体を偽造するのは困難です。この動作に対する期待を低くしてください。

デフォルト値:false

DETERMINISTIC

1 の場合、Date.now()、Math.random などを強制的に決定論的な結果を返すようにします。これにより、マシンや環境全体で実行を決定論的にしようともします。たとえば、ブラウザの言語設定に基づいて何かを変えることはしません (これは、異なるブラウザ、またはブラウザとノードで異なる結果を得ることができることを意味します)。デバッグ目的でビルドを比較するのに適しています (それ以外の目的には適していません)。

デフォルト値:false

MODULARIZE

デフォルトでは、すべてのコードをそのまま出力 .js ファイルに出力します。つまり、Web ページのスクリプトタグでそれをロードすると、グローバルスコープが使用されます。MODULARIZE を設定すると、代わりに、プロミスを返す関数でラップされたコードが出力されます。プロミスは、コンパイル済みコードを実行しても安全な場合にモジュールインスタンスで解決されます。これは onRuntimeInitialized コールバックに似ています。MODULARIZE を使用している場合、onRuntimeInitialized コールバックを使用する必要はありません。

(WASM_ASYNC_COMPILATION がオフの場合、つまりコンパイルが同期の場合、プロミスを返すのは意味がないため、代わりに、すぐに使用できるモジュールオブジェクト自体が返されます。)

関数のデフォルト名は Module ですが、EXPORT_NAME オプションを使用して変更できます。ファクトリ関数には、たとえば createModule のように、より一般的な名前に変更することをお勧めします。

ファクトリ関数は次のように使用します

const module = await EXPORT_NAME();

または

let module;
EXPORT_NAME().then(instance => {
  module = instance;
});

ファクトリー関数は、モジュールインスタンスのデフォルト値を持つオブジェクトを1つパラメータとして受け取ります。

const module = await EXPORT_NAME({ option: value, ... });

括弧に注意してください - モジュールをインスタンス化するために、EXPORT_NAMEを呼び出しています。これにより、モジュールの複数のインスタンスを作成できます。

MODULARIZEモードでは、デフォルト値のためにグローバルなModuleオブジェクトを探すことはないことに注意してください。デフォルト値はファクトリー関数のパラメータとして渡す必要があります。

MINIMAL_RUNTIMEモードで提供されるデフォルトの.htmlシェルファイルは、ページ上でアプリケーションを実行するために、シングルトンインスタンスを自動的に作成します。(これは、前述のPromise APIを使用せずに実行するため、emccに.html出力を生成するように指示した場合、Promiseのコードは.jsファイルにも出力されないことに注意してください。)従来のランタイムモードで提供されるデフォルトの.htmlシェルファイルは、MODULARIZE=0モードとのみ互換性があるため、従来のランタイムでビルドする場合は、MODULARIZE=1でビルドするときに、インスタンス化を実行する独自のhtmlシェルファイルを提供する必要があります。(詳細については、https://github.com/emscripten-core/emscripten/issues/7950を参照してください)

–pre-jsまたは–post-jsファイルを追加すると、それらは最適化のために、他の生成されたコードとともにファクトリー関数内に含まれます。

ファクトリー関数を含む、生成されたコードの外側にコードを含めたい場合は、–extern-pre-jsまたは–extern-post-jsを使用できます。–pre-jsと–post-jsは、非MODULARIZEモードではそれを行う可能性がありますが、それらの意図された使用法は、コードの残りの部分で最適化されるコードを追加することであり、より良いデッドコード除去と最小化を可能にします。

デフォルト値:false

EXPORT_ES6

UMDエクスポートではなく、ES6モジュールエクスポートを使用してエクスポートします。ES6エクスポートではMODULARIZEを有効にする必要があり、まだ設定されていない場合は暗黙的に有効になります。

出力サフィックスが「mjs」に設定されている場合、これは暗黙的に有効になります。

デフォルト値:false

USE_ES6_IMPORT_META

ES6モジュールの相対インポート機能「import.meta.url」を使用して、WASMモジュールパスを自動検出します。古いブラウザ/ツールチェーンではサポートされない場合があります。Node.jsがターゲット(-sENVIRONMENT = * node *)の場合、この設定は無効にできません。

デフォルト値:true

EXPORT_NAME

標準化されたモジュールローディングシステムがない環境(ブラウザやSMシェルなど)のために、モジュールをエクスポートするグローバル変数。

デフォルト値:'Module'

DYNAMIC_EXECUTION

0に設定すると、eval()とnew Function()を出力しません。これにより、一部の機能が無効になります(使用しようとするとランタイムエラーが発生します)が、動的なコード実行を許可しない場所(Chromeパッケージアプリ、特権付きFirefoxアプリなど)で出力されたコードを受け入れられるようにします。特権付きまたは認定された実行環境をターゲットとするEmscriptenアプリケーションを開発する際に、このフラグを渡します。詳細については、Firefoxのコンテンツセキュリティポリシー(CSP)のWebページを参照してください:https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Content-Security-Policy/script-src、特に「unsafe-eval」および「wasm-unsafe-eval」ポリシーを参照してください。

このフラグが設定されている場合、次の機能(リンカーフラグ)は使用できません。

  • RELOCATABLE:関数loadDynamicLibraryはeval()を必要とします。

また、一部の機能は、必要な場合に遅いコードパスにフォールバックする場合があります。Embind:高速化のためにeval()を使用して関数をJITコンパイルします。

さらに、DYNAMIC_EXECUTION=0が設定されている場合、次のEmscriptenランタイム関数は使用できず、それらを呼び出そうとすると例外がスローされます。

  • emscripten_run_script(),

  • emscripten_run_script_int(),

  • emscripten_run_script_string(),

  • dlopen(),

  • 関数ccall()およびcwrap()は引き続き使用できますが、それらは事前にModuleオブジェクトでエクスポートされた関数のみを呼び出すことができるように制限されています。

-sDYNAMIC_EXECUTION=2が設定されている場合、eval()の呼び出しの試みは、例外をスローするのではなく、警告に降格されます。

デフォルト値:1

BOOTSTRAPPING_STRUCT_INFO

構造体情報ブートストラップフェーズを生成中かどうか

デフォルト値:false

EMSCRIPTEN_TRACING

emscriptenトレースAPIへのいくつかの呼び出しを追加します

注記

リンクとコンパイルの両方で適用可能

デフォルト値:false

USE_GLFW

リンクされているGLFWのバージョンを指定します。GLFWライブラリにリンクしている場合にのみ関連します。有効なオプションは、GLFW2の場合は2、GLFW3の場合は3です。

デフォルト値:0

WASM

WebAssemblyにコードをコンパイルするかどうか。これを0に設定すると、wasmの代わりにJSにコンパイルされます。

WebAssemblyとJavaScriptの両方を同時にターゲットにするには、-sWASM=2を指定します。このビルドモードでは、a.wasmとa.wasm.jsの2つのファイルが生成され、実行時にWebAssemblyファイルがブラウザ/シェルでサポートされている場合にロードされます。それ以外の場合は、.wasm.jsフォールバックが使用されます。

WASM=2が有効になっていて、ブラウザがWebAssemblyモジュールのコンパイルに失敗した場合、ページはWasm2JSモードでリロードされます。

デフォルト値:1

STANDALONE_WASM

STANDALONE_WASMは、JavaScriptなしで実行できるwasmファイルを生成することを示します。このファイルでは、可能な限り標準のAPI(wasiなど)を使用してそれを実現します。

このオプションでは、wasmを単独で使用できることは保証されません。非JSの代替手段がないAPIを使用している場合は、それらを使用します(たとえば、これを書いている時点でのOpenGL)。これにより、どのAPIが不足しているかを確認したり、カスタムwasi埋め込み用にコンパイルする場合は、それらを埋め込みに追加したりできます。

このフラグを使用してもJSを生成する場合がありますが、JSはWebまたはNode.jsでwasmを実行するための便利な方法にすぎず、そのJSなしで(繰り返しになりますが、非JSの代替手段がないAPIを使用しない限り)wasmerやwasmtimeのようなwasmランタイムでwasmを単独で実行できます。

このオプションがなくても、wasiなどのシステムコールを可能な限り使用しようとすることに注意してください。このオプションが変更するのは、JSサイズとのトレードオフを意味する場合でも、それを行うことです。たとえば、このオプションを設定すると、Memoryをインポートしません。これは、JSがwasmがロードされる前にそれを使用し始めることができるため、JSには便利ですが、wasiやその他のwasmのみの環境では、wasm自体でメモリを作成することが期待されます。そうすると、JSの最適化がいくつか妨げられる可能性があるため、このフラグの背後でのみ実行します。

このフラグが設定されている場合、wasmはi64を直接処理できるwasm VMで実行することを目的としているため、JSインターフェイスを合法化しません。それを合法化した場合、wasm VMはAPIを認識しません。ただし、これは、i64でJS APIを使用すると、生成されたオプションのJSが実行されないことを意味します。WASM_BIGINTオプションを使用すると、i64にBigIntを使用することでその問題を回避できます。つまり、JSを合法化する必要はありません(ただし、これには十分新しいJS VMが必要です)。

スタンドアロンビルドでは、デフォルトでmainエントリポイントが必要です。代わりにライブラリ(リアクターとも呼ばれる)をビルドする場合は、--no-entryを渡すことができます。

デフォルト値:false

BINARYEN_IGNORE_IMPLICIT_TRAPS

binaryenで最適化する際に、暗黙的なトラップを無視するかどうか。暗黙的なトラップは、範囲外のロードや、0による除算/剰余などで発生するトラップです。このオプションを設定すると、オプティマイザはロードがトラップできず、したがって副作用がまったくないと想定します。これは、一般的には安全ではありません。条件付きで安全なロードがある可能性があります。ただし、ロードに副作用がないと仮定すると、無条件に実行される可能性があります。そのため、このオプションは一般的に大規模で複雑なプロジェクトでは役に立ちませんが、小さくて単純なコードベースでは、コードサイズを少し小さくするのに役立つ場合があります。

デフォルト値:false

BINARYEN_EXTRA_PASSES

binaryenオプティマイザで実行する追加のパスのカンマ区切りリスト。これを設定しても、デフォルトのパスはオーバーライド/置き換えられません。パスリストの末尾に追加されます。

デフォルト値:""

WASM_ASYNC_COMPILATION

wasmを非同期にコンパイルするかどうか。これはより効率的で、メインスレッドをブロックしません。現在、Chromeで実行するには、最小のモジュールを除くすべてでこれが必要です。

(このオプションは以前はBINARYEN_ASYNC_COMPILATIONと呼ばれていました)

デフォルト値:true

DYNCALLS

1に設定すると、dynCall()およびdynCall_sig() APIが呼び出し元で利用可能になります。

デフォルト値:false

WASM_BIGINT

JavaScript BigIntとのWebAssembly統合。有効にすると、wasm VMはi64が使用される場所でBigIntを使用するため、i64をi32のペアに合法化する必要がなくなります。WASM_BIGINTが存在する場合、BigIntをサポートする最小バージョンにデフォルトの最小サポートブラウザバージョンが増加します。

デフォルト値:false

EMIT_PRODUCERS_SECTION

WebAssemblyは、コンパイラとツールが自分自身を注釈できる「プロデューサーセクション」を定義しており、LLVMはデフォルトでこれをエミットします。Emscriptenはコードサイズを増やすため、また、一部のユーザーはプライバシーまたはセキュリティ上の理由から、ツールに関する情報をビルドに含めたくない場合があるため、それを削除してないようにします。詳細については、https://github.com/WebAssembly/tool-conventions/issues/93を参照してください。

デフォルト値:false

EMIT_EMSCRIPTEN_LICENSE

JS出力にemscriptenライセンス情報を出力します。

デフォルト値:false

LEGALIZE_JS_FFI

i64をi32に自動的に降格し、f32をf64に昇格させるために、それらをラップすることによってJS FFIインターフェイス(インポート/エクスポート)を合法化するかどうか。これはJavaScriptとインターフェースするために必要です。非Web/非JS埋め込みの場合、これを0に設定するのが望ましい場合があります。

注記

この設定は非推奨です

デフォルト値:true

USE_SDL

リンクされているSDLのバージョンを指定します。デフォルトの1は1.3で、これはJSで実装されています。2はemscripten-portsでのSDL Cコードのポートです。AUTO_JS_LIBRARIESが0に設定されている場合、これはデフォルトで0になり、SDLはリンクされません。ポートを使用するための別の構文:--use-port=sdl2

注記

リンクとコンパイルの両方で適用可能

デフォルト値:0

USE_SDL_GFX

リンクされているSDL_gfxのバージョンを指定します。USE_SDLと一致する必要があります

注記

リンクとコンパイルの両方で適用可能

デフォルト値:0

USE_SDL_IMAGE

リンクされているSDL_imageのバージョンを指定します。USE_SDLと一致する必要があります

注記

リンクとコンパイルの両方で適用可能

デフォルト値:1

USE_SDL_TTF

リンクされているSDL_ttfのバージョンを指定します。USE_SDLと一致する必要があります

注記

リンクとコンパイルの両方で適用可能

デフォルト値:1

USE_SDL_NET

リンクされているSDL_netのバージョンを指定します。USE_SDLと一致する必要があります

注記

リンクとコンパイルの両方で適用可能

デフォルト値:1

USE_ICU

1 = emscripten-portsからicuを使用します。代替構文:--use-port=icu

注記

リンクとコンパイルの両方で適用可能

デフォルト値:false

USE_ZLIB

1 = emscripten-portsからzlibを使用します。代替構文:--use-port=zlib

注記

リンクとコンパイルの両方で適用可能

デフォルト値:false

USE_BZIP2

1 = emscripten-portsからbzip2を使用します。代替構文:--use-port=bzip2

注記

リンクとコンパイルの両方で適用可能

デフォルト値:false

USE_GIFLIB

1 = emscripten-portsからgiflibを使用します。代替構文:--use-port=giflib

注記

リンクとコンパイルの両方で適用可能

デフォルト値:false

USE_LIBJPEG

1 = emscripten-portsからlibjpegを使用します。代替構文:--use-port=libjpeg

注記

リンクとコンパイルの両方で適用可能

デフォルト値:false

USE_LIBPNG

1 = emscripten-portsからlibpngを使用します。代替構文:--use-port=libpng

注記

リンクとコンパイルの両方で適用可能

デフォルト値:false

USE_REGAL

1 = emscripten-ports から Regal を使用します。代替構文: –use-port=regal

注記

リンクとコンパイルの両方で適用可能

デフォルト値:false

USE_BOOST_HEADERS

1 = emscripten-ports から Boost ヘッダーを使用します。代替構文: –use-port=boost_headers

注記

リンクとコンパイルの両方で適用可能

デフォルト値:false

USE_BULLET

1 = emscripten-ports から bullet を使用します。代替構文: –use-port=bullet

注記

リンクとコンパイルの両方で適用可能

デフォルト値:false

USE_VORBIS

1 = emscripten-ports から vorbis を使用します。代替構文: –use-port=vorbis

注記

リンクとコンパイルの両方で適用可能

デフォルト値:false

USE_OGG

1 = emscripten-ports から ogg を使用します。代替構文: –use-port=ogg

注記

リンクとコンパイルの両方で適用可能

デフォルト値:false

USE_MPG123

1 = emscripten-ports から mpg123 を使用します。代替構文: –use-port=mpg123

注記

リンクとコンパイルの両方で適用可能

デフォルト値:false

USE_FREETYPE

1 = emscripten-ports から freetype を使用します。代替構文: –use-port=freetype

注記

リンクとコンパイルの両方で適用可能

デフォルト値:false

USE_SDL_MIXER

リンク先の SDL_mixer のバージョンを指定します。USE_SDL と一致する必要はありませんが、一致させることをお勧めします。

注記

リンクとコンパイルの両方で適用可能

デフォルト値:1

USE_HARFBUZZ

1 = harfbuzz upstream から harfbuzz を使用します。代替構文: –use-port=harfbuzz

注記

リンクとコンパイルの両方で適用可能

デフォルト値:false

USE_COCOS2D

3 = emscripten-ports から cocos2d v3 を使用します。代替構文: –use-port=cocos2d

注記

リンクとコンパイルの両方で適用可能

デフォルト値:0

USE_MODPLUG

1 = emscripten-ports から libmodplug を使用します。代替構文: –use-port=libmodplug

注記

リンクとコンパイルの両方で適用可能

デフォルト値:false

SDL2_IMAGE_FORMATS

SDL2_image でサポートする形式。有効な値: bmp, gif, lbm, pcx, png, pnm, tga, xcf, xpm, xv

デフォルト値: []

SDL2_MIXER_FORMATS

SDL2_mixer でサポートする形式。有効な値: ogg, mp3, mod, mid

デフォルト値: ["ogg"]

USE_SQLITE3

1 = emscripten-ports から sqlite3 を使用します。代替構文: –use-port=sqlite3

注記

リンクとコンパイルの両方で適用可能

デフォルト値:false

SHARED_MEMORY

1 の場合、共有 Wasm メモリをコンパイル対象にします。[コンパイル+リンク] - コンパイル時のユーザーコードとリンク時のシステムライブラリに影響します。

デフォルト値:false

WASM_WORKERS

1 の場合、Wasm Workers のサポートを有効にします。Wasm Workers を使用すると、アプリケーションは Wasm SharedArrayBuffer + Atomics API の上に構築された軽量な Web 固有の API を使用してスレッドを作成できます。有効にすると、Wasm Worker JS コンテキストをブートストラップするための新しいビルド出力ファイル a.ww.js が生成されます。2 の場合、Wasm Workers のサポートを有効にしますが、個別の a.ww.js ファイルをサイドで使用しません。これにより、ビルドのデプロイが簡素化されますが、生成されたビルドが csp-eval に準拠しなくなるという欠点があります。[コンパイル+リンク] - コンパイル時のユーザーコードとリンク時のシステムライブラリに影響します。

デフォルト値:0

AUDIO_WORKLET

true の場合、Wasm Web Audio AudioWorklets をターゲットにすることを有効にします。サイト/source/docs/api_reference/wasm_audio_worklets.rst の完全なドキュメントを参照してください。

デフォルト値:0

WEBAUDIO_DEBUG

true の場合、Web Audio バックエンドの詳細なデバッグを有効にします。

デフォルト値:0

PTHREAD_POOL_SIZE

Web ブラウザでは、メインブラウザスレッドが JS/Wasm コードを実行している間は Worker を作成できませんが、Worker の初期化を発生させるには、メインスレッドが定期的にブラウザのイベントループに処理を返す必要があります。これは、pthread_create() がメインブラウザスレッドから呼び出されたときに本質的に非同期操作であり、スレッドを実際に開始するには、メインスレッドが JS イベントループに繰り返し処理を返す必要があることを意味します。アプリケーションが新しいスレッドを同期的に作成できる必要がある場合は、-sPTHREAD_POOL_SIZE=x を指定して pthread プールを事前作成できます。この場合、指定された数の Worker がアプリケーションの開始前にプールにプリロードされ、その数のスレッドが同期的に作成できるようになります。この設定は文字列であり、JS コードに出力される(追加の引用符なしで直接)ため、'5' に設定すると、プールで 5 つの Worker が使用されるようになります。この設定が文字列であることの利点は、'navigator.hardwareConcurrency' のようなものに設定できること(ブラウザが報告するコア数を使用します。これは、コア数と同じ数のスレッドプールに必要な数の Worker を正確に取得する方法です)。[リンク] - リンク時の生成された JS ランタイムコードに影響します

デフォルト値:0

PTHREAD_POOL_SIZE_STRICT

通常、アプリケーションはプールが空の場合でも新しいスレッドを作成できます。アプリケーションが pthread_join またはその他のブロッキングプリミティブを介してスレッドをブロックしようとする前に JS イベントループにブレイクアウトすると、追加の Worker が作成され、スレッドコールバックが実行されます。ただし、イベントループにブレイクアウトするには、コードを Web に適応させるためのカスタム変更が必要であり、既製のアプリでは機能しないものです。変更を加えないこれらのアプリは、デッドロックになる可能性が最も高くなります。この設定により、デッドロックのリスクを冒す代わりに、少なくとも C / C++ 側から正常に処理できるランタイム EAGAIN エラーが発生するようになります。値

  • 0 - スレッドプールの枯渇に関する警告を無効にする

  • 1 - スレッドプールの枯渇に関する警告を有効にする (デフォルト)

  • 2 - スレッドプールの枯渇を重大なエラーにする

デフォルト値:1

PTHREAD_POOL_DELAY_LOAD

アプリケーションがスレッドを同期的に作成する機能を必要としないが、Worker のプールをプリウォーミングすることによって初期スレッドの起動時間を機会的に高速化したい場合は、-sPTHREAD_POOL_SIZE=x でプールのサイズを指定できますが、-sPTHREAD_POOL_DELAY_LOAD も指定します。これにより、ランタイムは起動時に Worker プールのロードが完了するのを待機しなくなります。代わりに、ランタイムはすぐに起動し、Worker プールはバックグラウンドで並行して非同期的にスピンアップされます。これにより、pthread_create() の呼び出しが実際にスレッドを開始するまでの時間を短縮できますが、メインアプリケーションの起動速度が実際に低下することはありません。PTHREAD_POOL_DELAY_LOAD=0 (デフォルト) の場合、ランタイムは main() を実行する前にプールの起動を待機します。作成されたスレッドを同期的に待機する必要がある場合 (pthread_join などを介して)、そうする前に Module.pthreadPoolReady プロミスを待機する必要があります。そうしないと、デッドロックが発生する可能性が高くなります。[リンク] - リンク時の生成された JS ランタイムコードに影響します

デフォルト値:false

DEFAULT_PTHREAD_STACK_SIZE

新しく作成された pthread に使用するデフォルトのスタックサイズ。設定されていない場合、これはデフォルトで STACK_SIZE (デフォルトで 64k) になります。pthread_attr_setstacksize() を使用して実行時に設定することもできます。wasm 制御フロー スタックは、このスタックとは別であることに注意してください。このスタックには、アドレスが取得された関数ローカル変数、または wasm コード内のローカル変数として収まるには大きすぎるものなど、特定の関数ローカル変数のみが含まれます。

デフォルト値:0

PTHREADS_PROFILING

–threadprofiler でビルドする場合は True

デフォルト値:false

ALLOW_BLOCKING_ON_MAIN_THREAD

メインスレッドで pthread_join または pthread_cond_wait を呼び出すのは危険です。そうすると Web でデッドロックが発生する可能性があるためです (また、ビジーウェイトを使用するためコストがかかります)。https://emscripten.dokyumento.jp/docs/porting/pthreads.html#blocking-on-the-main-browser-thread を参照してください。将来的にはデフォルトで 0 に設定される可能性があります。今のところ、これはコンソールで警告するだけです。

デフォルト値:true

PTHREADS_DEBUG

true の場合、pthread 関連の問題を診断するためのデバッグトレースを追加します。

デフォルト値:false

EVAL_CTORS

これは、コンパイル時にコードを評価しようとします。主なユースケースは、main() の前に実行されるグローバル ctor 関数を評価することですが、main() 自体またはその一部も評価できます。このようにコードを評価すると、実行時の作業を回避できます。実行の結果をメモリやグローバルなどに適用し、wasm を「スナップショット」してから、ロード時にそこから実行するだけです。

インポートの呼び出しなど、コンパイル時に評価できないものが見つかると、これは停止します。このオプションを使用して実行すると、何が評価され、どこで停止したかを示すログが表示されます。

この最適化により、コードサイズが縮小または増加する可能性があります。たとえば、少量のコードでメモリ内で多くの変更が生成される場合、全体的なサイズが増加する可能性があります。

LLVM の GlobalOpt は、ほぼこの操作を行います。LLVM IR がそのロジックで評価するには複雑すぎない単純なケースではそうですが、libc++ iostream ctor などには十分な能力がありません。LLVM IR レベルでは実行するのが難しいだけです。LLVM IR は複雑であり、ますます複雑になっているため、これには GlobalOpt が完全なインタープリターと、LLVM IR グローバルオブジェクトに書き戻す方法が必要になります。しかし、wasm レベルでは、すべてが単純な低レベルに下げられており、バイトを配列に書き込むだけでよいため、これは簡単に実行できます。LLVM のもう 1 つの問題は、さらにコードをリンクしないことを認識していないため、優先順位が最も低い ctor のみを最適化しようとします (ダイナミックリンクが有効になっているかどうかを明示的に知っている間)。

値 2 に設定すると、ctor の評価中に受信される入力がないという、いくつかの「安全でない」仮定も行われます。つまり、main() への引数を無視し、環境変数が読み取り可能ではないと仮定します。これにより、より多くのプログラムを最適化できますが、プログラムがこれらの機能に依存していないことを確認する必要があります。argc の値をチェックするだけでも問題が発生する可能性があります。

デフォルト値:0

TEXTDECODER

有効な場合、文字列マーシャリングに JavaScript TextDecoder API を使用します。デフォルトで有効になっている場合は、これを 0 に設定して無効にします。2 に設定した場合、TextDecoder が存在し使用可能であると仮定し、TextDecoder が存在しない場合にフォールバックするための JS コードを出力しません。シングルスレッドの -Oz ビルドモードでは、TEXTDECODER はコードサイズを節約するためにデフォルトで値 == 2 になります。

デフォルト値:1

EMBIND_STD_STRING_IS_UTF8

Embind 固有: 有効にした場合、std::string バインディングで UTF-8 エンコードされたデータを想定します。バイナリデータ転送をサポートするには、これを無効にします。

デフォルト値:true

EMBIND_AOT

Embind 固有: 有効にすると、Embind の JavaScript インボーカ関数をコンパイル時に生成し、JS 出力ファイルに含めます。DYNAMIC_EXECUTION=0 と組み合わせて使用すると、エクスポートされたバインディングは DYNAMIC_EXECUTION=1 モードと同じくらい高速になりますが、eval() は必要ありません。ただし、バインディングが多い場合、JS 出力サイズが大きくなる可能性があります。

デフォルト値:false

OFFSCREENCANVAS_SUPPORT

1 に設定すると、canvas を pthread に転送したり、WebGL コンテキストを canvas 内に作成したり、GL コンテキストの明示的なスワップ制御を有効にしたりするサポートが有効になります。これには、OffscreenCanvas 仕様に対するブラウザのサポートが必要です。

デフォルト値:false

OFFSCREENCANVASES_TO_PTHREAD

PROXY_TO_PTHREAD を OFFSCREENCANVAS_SUPPORT と共に使用している場合は、プログラムの起動時に pthread にプロキシする canvas の CSS ID セレクタのカンマ区切りリストをここに指定します (例: '#canvas1, #canvas2')。

デフォルト値: “#canvas”

OFFSCREEN_FRAMEBUFFER

1 に設定すると、WebGL コンテキストがオフスクリーンレンダーターゲットにレンダリングするサポートが有効になり、イベントコールバックを終了するとレンダリングされたコンテンツを画面に表示するために自動的に「フリップ」を実行する WebGL の暗黙的なスワップ動作を回避します。Emscripten GL コンテキストでオフスクリーンフレームバッファが有効になっている場合、単一のフレームを複数のイベントコールバックから合成でき、レンダリングされたコンテンツを画面に表示するためにスワップ関数 emscripten_webgl_commit_frame() が明示的に呼び出されます。

オフスクリーンキャンバス機能は、明示的な GL フレームスワップのサポートも有効にします。また、-sOFFSCREEN_FRAMEBUFFER 機能を使用すると、ブラウザでオフスクリーンキャンバスのサポートがない場合でも、パフォーマンスとレイテンシーが多少犠牲になる代わりに、複数スレッドでの WebGL へのアクセスをポリフィルできます。オフスクリーンキャンバスとオフスクリーンフレームバッファのサポートは同時に有効にすることができ、利用可能な場合はオフスクリーンキャンバスを利用し、それ以外の場合はオフスクリーンフレームバッファにフォールバックすることができます。

デフォルト値:false

FETCH_SUPPORT_INDEXEDDB

ゼロ以外の場合、Fetch API は IndexedDB へのバックアップをサポートします。0 の場合、IndexedDB は使用されません。ターゲットアプリケーションで IndexedDB のサポートが不要な場合は、数 k バイトを節約するために 0 に設定します。

デフォルト値:true

FETCH_DEBUG

ゼロ以外の場合、library_fetch.js にデバッグ情報が出力されます。

デフォルト値:false

FETCH

ゼロ以外の場合、emscripten_fetch API を有効にします。

デフォルト値:false

WASMFS

注意 [WIP]: 実験的な機能です。ご自身の責任で使用してください。これは最終的に現在の JS ファイルシステムの実装を置き換えます。1 に設定すると、新しいファイルシステムの実装を使用します。

注記

これは実験的な設定です

デフォルト値:false

SINGLE_FILE

1 に設定すると、すべてのサブリソースが base64 文字列リテラルとして出力ファイルに埋め込まれます。埋め込まれたサブリソースには、wasm、asm.js、静的メモリ初期化コードなどが含まれる可能性があります (ただし、これらに限定されません)。

このオプションに依存するコードを使用する場合、コンテンツセキュリティポリシーを更新する必要がある場合があります。具体的には、asm.js を埋め込むには、script-src ディレクティブで 'unsafe-inline' を許可する必要があり、Worker を使用するには、child-src ディレクティブで blob: を許可する必要があります。コンテンツセキュリティポリシーを使用していない場合、または CSP ヘッダーに script-src または child-src のいずれも含まれていない場合は、この警告を無視しても安全です。

デフォルト値:false

AUTO_JS_LIBRARIES

1 に設定すると、すべての JS ライブラリがリンク時に自動的に利用可能になります。これは STRICT モード (または MINIMAL_RUNTIME) では 0 に設定されます。つまり、library_foo.js のライブラリ関数にアクセスするには、リンク時に -lfoo.js を明示的に指定する必要があります。

デフォルト値:true

AUTO_NATIVE_LIBRARIES

AUTO_JS_LIBRARIES と同様ですが、libgl、libal、libhtml5 などのネイティブライブラリ用です。これを無効にする場合は、-lhtml5 などを明示的に追加する必要があり、さらに最初に embuilder を使用してライブラリをビルドする必要があります。

デフォルト値:true

MIN_FIREFOX_VERSION

ターゲットとする Firefox の最も古いメジャーバージョンを指定します。つまり、MIN_FIREFOX_VERSION >= のすべての Firefox バージョンで動作することが望まれます。MIN_FIREFOX_VERSION=majorVersion を渡して、majorVersion より古い Firefox バージョンのサポートを削除します。Firefox 79 は 2020-07-28 にリリースされました。MAX_INT (0x7FFFFFFF、または -1) は、ターゲットがサポートされていないことを指定します。サポートされている最小値は、2014-12-01 にリリースされた 34 です。

デフォルト値: 79

MIN_SAFARI_VERSION

ターゲットとするデスクトップ版 Safari の最も古いバージョンを指定します。バージョンは MMmmVV でエンコードされます (例: 70101 は Safari 7.1.1 を示します)。Safari 14.1.0 は 2021 年 4 月 26 日にリリースされ、macOS 11.0 Big Sur および iOS 14.5 にバンドルされました。前のデフォルトである Safari 12.0.0 は、2018 年 9 月 17 日にリリースされ、macOS 10.14.0 Mojave にバンドルされました。注意: Emscripten は iOS 9.3.5 以前 (つまり、iPhone 4s、iPad 2、iPad 3、iPad Mini 1、Pod Touch 5 以前) で動作するコードを生成できません。詳細については、https://github.com/emscripten-core/emscripten/pull/7191 を参照してください。MAX_INT (0x7FFFFFFF、または -1) は、ターゲットがサポートされていないことを指定します。サポートされている最小値は、2015 年にリリースされた 90000 です。

デフォルト値: 140100

MIN_CHROME_VERSION

Chrome の最も古いバージョンを指定します。例: Chrome 57 以前のサポートを削除するには、-sMIN_CHROME_VERSION=58 を渡します。この設定は、Chrome とバージョン番号を共有する最新の Chromium ベースの Edge にも適用されます。Chrome 85 は 2020-08-25 にリリースされました。MAX_INT (0x7FFFFFFF、または -1) は、ターゲットがサポートされていないことを指定します。サポートされている最小値は、2014-01-04 にリリースされた 32 です。

デフォルト値: 85

MIN_NODE_VERSION

生成されたコードのターゲットとする最小の Node バージョンを指定します。これは、emscripten コンパイラの実行に必要な最小バージョンとは異なります。このバージョンは、現在の Ubuntu TLS 20.04 (Focal) に対応しています。バージョンは MMmmVV でエンコードされます (例: 181401 は Node 18.14.01 を示します)。サポートされている最小値は 2020-02-05 にリリースされた 101900 です。

デフォルト値: 160000

SUPPORT_ERRNO

JS ライブラリコードから errno を設定することをサポートするかどうか。MINIMAL_RUNTIME ビルドでは、このオプションはデフォルトで 0 になります。

注記

この設定は非推奨です

デフォルト値:true

MINIMAL_RUNTIME

true の場合、POSIX 機能、Module、preRun/preInit など、Emscripten 組み込みの XHR ロード、または library_browser.js を使用しない、最小サイズのランタイムを使用します。可能な限り最小のコードサイズをターゲットにするには、この設定を有効にします。さらに多くのコードサイズ最適化を有効にするには、MINIMAL_RUNTIME=2 を設定します。これらのオプションはかなりハッキーで、Closure やビルドシステムの他の部分の制限を回避するため、生成されたすべてのプログラムで動作するとは限りません (ただし、非常に小さいプログラムには役立ちます)。

デフォルトでは、Module オブジェクトにはシンボルはエクスポートされません。保持されたシンボルをエクスポートするには、-sEXPORT_KEEPALIVE=1 を使用してください。

デフォルト値:0

MINIMAL_RUNTIME_STREAMING_WASM_COMPILATION

1 に設定すると、MINIMAL_RUNTIME はストリーミング WebAssembly コンパイルを利用します。この場合、WebAssembly モジュールはダウンロード中に既にコンパイルされます。これが機能するためには、Web サーバーが HTTP 応答ヘッダー「Content-Type: application/wasm」を使用して .wasm ファイルを適切に提供する必要があります。この HTTP ヘッダーが存在しない場合、例: Firefox 73 はエラーメッセージ TypeError: Response has unsupported MIME type で失敗し、Chrome 78 はエラーメッセージ Uncaught (in promise) TypeError: Failed to execute ‘compile’ on ‘WebAssembly’: Incorrect response MIME type. Expected ‘application/wasm’ で失敗します。0 (デフォルト) に設定すると、ストリーミング WebAssembly コンパイルが無効になり、WebAssembly モジュールは最初に完全にダウンロードされ、その後にのみコンパイルが開始されることを意味します。大規模な .wasm モジュールと本番環境では、起動速度を速めるために、これを 1 に設定する必要があります。ただし、この設定はサーバー側の設定が必要であり、非常に小さなページでは目に見える違いがないため、デフォルトで無効になっています (また、コードサイズに約 100 バイトの影響があります)。

デフォルト値:false

MINIMAL_RUNTIME_STREAMING_WASM_INSTANTIATION

1 に設定すると、MINIMAL_RUNTIME はストリーミング WebAssembly インスタンス化を利用します。この場合、WebAssembly モジュールはダウンロード中に既にコンパイル+インスタンス化されます。MINIMAL_RUNTIME_STREAMING_WASM_COMPILATION と同じ制限/要件が適用されます。MINIMAL_RUNTIME_STREAMING_WASM_COMPILATION と MINIMAL_RUNTIME_STREAMING_WASM_INSTANTIATION を同時にアクティブにすることはできません。これら 2 つのどちらが高速かは、wasm モジュールのサイズ、JS ランタイムファイルのサイズ、ダウンロードするプリロードデータファイルのサイズ、および対象のブラウザによって異なります。

デフォルト値:false

SUPPORT_LONGJMP

「emscripten」または「wasm」に設定すると、コンパイラは setjmp() および longjmp() をサポートします。0 に設定すると、これらの API は使用できません。C++ 例外を使用しているが、setjmp()+longjmp() API が不要な場合は、例外をキャッチする際のコードサイズとパフォーマンスを少し節約するために、これを 0 に設定できます。

「emscripten」: (デフォルト) JavaScript を使用した Emscripten setjmp/longjmp 処理。「wasm」: Wasm EH 命令を使用した setjmp/longjmp 処理 (実験的)

  • 0: setjmp/longjmp 処理なし

  • 1: デフォルトの setjmp/longjmp/handling (例外のモードによって異なります)。「-fwasm-exception」が使用されている場合は「wasm」、それ以外の場合は「emscripten」。

[コンパイル+リンク] - コンパイル時には、コード生成時に longjmp サポートに必要な変換を有効にし、リンク時にはライブラリサポートをリンクインできるようにします。

デフォルト値:true

DISABLE_DEPRECATED_FIND_EVENT_TARGET_BEHAVIOR

1 に設定すると、古い非推奨の HTML5 API イベントターゲットのルックアップ動作が無効になります。有効にすると、「Module.canvas」オブジェクト、魔法の「null」デフォルト処理はなく、DOM 要素の「target」パラメータは DOM ID を参照するのではなく、CSS セレクタを参照するようになります。

デフォルト値:true

HTML5_SUPPORT_DEFERRING_USER_SENSITIVE_REQUESTS

フルスクリーンモードへの移行やポインターロックなどの特定のブラウザ DOM API 操作では、マウスのクリックやキーボードの押下などのユーザーが開始したイベント内からリクエストが開始される必要があります。この種のプログラム構造に従うようにアプリケーションをリファクタリングするのは難しい場合があります。そのため、HTML5_SUPPORT_DEFERRING_USER_SENSITIVE_REQUESTS は、適切なイベントコールバックが生成されるまでリクエストを遅延させることで、この透過的なエミュレーションを可能にします。アプリケーションで遅延呼び出しのサポートが必要ない場合は、コードサイズを節約するために、これを 0 に設定して、遅延のサポートを無効にします。

デフォルト値:true

MINIFY_HTML

生成された .html ファイルを html-minifier を通して実行するかどうかを指定します。html-minifier によって実行される最適化パスのセットは、デバッグおよび最適化レベルによって異なります。-g2 以上では、最小化は実行されません。-g1 では、最小化は実行されますが、空白は保持されます。最小化には、少なくとも -O1 または -Os を使用する必要があります。HTML の最小化を完全に無効にする場合は、-sMINIFY_HTML=0 を渡して明示的に選択します。

デフォルト値:true

MAYBE_WASM2JS

wasm2js を使用する可能性があるかどうか。これは通常は wasm にコンパイルされますが、wasm に対して後で wasm2js を実行できるようにし、通常の wasm コードと wasm2js コードのどちらを実行するかを選択できます。その方法の詳細については、test_maybe_wasm2js テストを参照してください。このオプションは、デバッグやバイセクションに役立ちます。

デフォルト値:false

ASAN_SHADOW_SIZE

このオプションはもう使用されていません。適切なシャドウメモリサイズは、INITIAL_MEMORY と MAXIMUM_MEMORY から計算されるようになりました。将来のリリースで削除されます。

デフォルト値:-1

USE_OFFSET_CONVERTER

オフセットコンバーターを使用するかどうか。これは、スタックトレースで wasm バイナリへの 16 進数モジュールオフセットを提供しない古いバージョンの v8 (<7.7) や、関数境界を越えてソースマップエントリを使用しないようにするために必要です。

デフォルト値:false

LOAD_SOURCE_MAP

ランタイム時に WASM ソースマップをロードするかどうか。これは、サニタイザー付きで -gsource-map を使用すると自動的に有効になります。

デフォルト値:false

DEFAULT_TO_CXX

emc++ ではなく emcc として実行された場合でも、デフォルトで C++ モードにするかどうか。これが無効になっている場合、C++ プログラムをリンクするには em++ が必要になります。これを無効にすると、gcc/g++ および clang/clang++ の動作と一致します。

デフォルト値:true

PRINTF_LONG_DOUBLE

LLVM の wasm32 は long double = float128 ですが、デフォルトでは完全な精度で印刷することはサポートしていません。代わりに、64 ビット double として印刷し、libc のコードサイズを節約します。このオプションをオンにすると、完全な long double 印刷精度を備えた libc を取得できます。

デフォルト値:false

SEPARATE_DWARF_URL

これを設定すると、-gseparate-dwarf モードで DWARF ファイルを参照する wasm に出力されるパスに影響します。これにより、デバッグファイルをカスタムロケーションでホストできます。

デフォルト値: ''

ABORT_ON_WASM_EXCEPTIONS

エクスポートされた WebAssembly 関数を呼び出すときに発生する未処理の例外でアボートします。これにより、未処理の例外(たとえば、境界外のメモリアクセス)が発生した場合に OS がプロセスを終了し、それ以上のコードが実行できなくなるネイティブプログラムのようにプログラムが動作します。これにより、エクスポートされたすべての関数が、スローされた例外をキャッチし、例外が発生したときに abort() を呼び出すようにインストルメントされます。プログラムがアボートすると、プログラムが破損している可能性のある状態でのコードへの呼び出しを防ぐために、エクスポートされた関数呼び出しはすべて「プログラムはすでにアボートしました」という例外で失敗します。これにより、最適化されたビルドでコードサイズがわずかに固定量増加し、追加のインストルメントされた関数の間接参照のためにわずかなオーバーヘッドが発生します。Emscripten で、未処理の例外を数バイトの追加コストで適切に処理する場合は、これを有効にします。main 関数内で発生する例外は、別のメカニズムですでに処理されています。

デフォルト値:false

PURE_WASI

可能な限り多くの WASI API を使用するバイナリをビルドし、それらの API 用の追加の JS サポートライブラリを含めます。これにより、emscripten はより WASI に準拠したバイナリを生成でき、他の SDK (たとえば wasi-sdk) でビルドされた WASI バイナリを処理して実行することもできます。この設定は試験的であり、変更または削除される可能性があります。STANDALONE_WASM を暗黙的に示します。

注記

これは実験的な設定です

デフォルト値:false

IMPORTED_MEMORY

WebAssembly.Memory オブジェクトを wasm モジュールの外部で定義する場合は 1 に設定します。デフォルトでは、wasm モジュールがメモリを定義し、それを JavaScript にエクスポートします。次の設定を使用すると、JavaScript でメモリを定義できることに依存しているため、この設定が有効になります: - -pthread - RELOCATABLE - ASYNCIFY_LAZY_LOAD_CODE - WASM2JS (WASM=0)

デフォルト値:false

SPLIT_MODULE

分割された wasm モジュールをロードするコードを生成します。このオプションは、出力として 2 つの wasm ファイルを自動的に生成します。1 つは .orig サフィックス付き、もう 1 つはサフィックスなしです。実行時にデフォルトファイル (サフィックスなし) は、後で wasm-split (binaryen ツール) にフィードできるインストルメンテーションデータを生成します。これに加えて、生成された JS コードには、分割モジュールをロードするヘルプ関数が含まれています。

デフォルト値:false

AUTOLOAD_DYLIBS

MAIN_MODULE ビルドの場合、メインモジュールをロードする前に、起動時に動的ライブラリの依存関係を自動的にロードします。

デフォルト値:true

ALLOW_UNIMPLEMENTED_SYSCALLS

最終出力に、実装されていない JS システムコールを含めます。これにより、これらのシステムコールにランタイムで依存するプログラムをコンパイルできます。ただし、これらのシステムコールはランタイムで失敗 (または何も行わない) します。

デフォルト値:true

TRUSTED_TYPES

Worker(…) および importScripts(…) の呼び出しを Trusted Types と互換性を持たせます。Trusted Types は、DOM シンク API の使用を制限することにより、DOM XSS を軽減するように設計された Web プラットフォーム機能です。https://w3c.github.io/webappsec-trusted-types/ を参照してください。

デフォルト値:false

POLYFILL

古いブラウザをターゲットにすると、emscripten は出力にポリフィルを含めることが必要になる場合があります。他のメカニズムを使用して自分でポリフィルを処理する場合は、-sNO_POLYFILL または -sPOLYFILL=0 を渡すことで、emscripten がこれらを生成するのを防ぐことができます。デフォルトのブラウザターゲットでは、emscripten はポリフィルを必要としないため、この設定は古いブラウザを明示的にターゲットにしている場合にのみ必要です。

デフォルト値:true

RUNTIME_DEBUG

true の場合、コアランタイム関数にトレースを追加します。この設定は、次のいずれかのデバッグ設定が有効になっている場合にデフォルトで有効になります: - PTHREADS_DEBUG - DYLINK_DEBUG - LIBRARY_DEBUG - GL_DEBUG - OPENAL_DEBUG - EXCEPTION_DEBUG - SYSCALL_DEBUG - WEBSOCKET_DEBUG - SOCKET_DEBUG - FETCH_DEBUG

デフォルト値:false

LEGACY_RUNTIME

以前はデフォルトのランタイムの一部であった JS ライブラリシンボルを含めます。これがなければ、このようなシンボルは DEFAULT_LIBRARY_FUNCS_TO_INCLUDE に追加するか、別の JS ライブラリシンボルの依存関係を介して利用できるようになります。

デフォルト値:false

SIGNATURE_CONVERSIONS

ポインタ引数を取るか返すシグネチャ変換でラップするユーザー定義関数。MEMORY64=1 ビルドのみに影響します。詳細については、emscripten.py の create_pointer_conversion_wrappers を参照してください。ポインタ以外の引数には _ を、ポインタ/i53 引数には p を、オプションのポインタ/i53 値には P を使用します。使用例 -sSIGNATURE_CONVERSIONS=someFunction:_p,anotherFunction:p

デフォルト値: []