Ninja Multi-Config の利用
これまでは -gsourc-map など、主にデバッグ向けのビルド・オプションを行ってきた。
ここでは、ジェネレータを Ninja から Ninja Multi-Config に変更しデバッグとリリースで異なるオプションによるビルドができるようにしてみる。
以下は 前回 の記事で使用した CMakePresets.json CMakeLists.txt を Ninja Multi-Config 向けに変更したファイルと、その変更点。
CMakePresets.json
- 構成オプションが
inheritsにより親(wasm-config) と子(wasm-config-debug, wasm-config-release) に分割された - 親は
hidden:trueとして画面上は非表示にする - CMAKE_BUILD_TYPE:Debug が
CMAKE_CONFIGURATION_TYPESとなり、選択肢のリストになった - 上記の代わりにビルド・オプションの
configurationでDebugとReleaseを指定する
{
"version": 5,
"cmakeMinimumRequired": {
"major": 3,
"minor": 20,
"patch": 0
},
"configurePresets": [
{
"name": "wasm-config",
"hidden": true,
"generator": "Ninja Multi-Config",
"binaryDir": "${sourceDir}/build",
"cacheVariables": {
"CMAKE_CXX_STANDARD": "17",
"CMAKE_CXX_STANDARD_REQUIRED": "ON",
"CMAKE_CXX_EXTENSIONS": "OFF",
"CMAKE_TOOLCHAIN_FILE": "$env{EMSDK}/upstream/emscripten/cmake/Modules/Platform/Emscripten.cmake",
"CMAKE_EXPORT_COMPILE_COMMANDS": "ON",
"CMAKE_CONFIGURATION_TYPES": "Debug;Release"
}
},
{
"name": "wasm-config-debug",
"inherits": "wasm-config",
"cacheVariables": {
}
},
{
"name": "wasm-config-release",
"inherits": "wasm-config",
"cacheVariables": {
}
}
],
"buildPresets": [
{
"name": "wasm-build-debug",
"configurePreset": "wasm-config-debug",
"verbose": true,
"configuration": "Debug"
},
{
"name": "wasm-build-release",
"configurePreset": "wasm-config-release",
"verbose": true,
"configuration": "Release"
}
]
}
CMakeLists.txt
- デバッグ時にのみ有効となるオプションは、ジェネレータ式(CONFIG:Debug) により指定している
- EXPORT_NAME が不要となるため、どちらも同じオプションになっている
cmake_minimum_required(VERSION 3.20)
project(09_modularize_es6 LANGUAGES CXX)
add_executable(09_modularize_es6 main.cpp)
target_link_options(09_modularize_es6 PRIVATE
$<$<CONFIG:Debug>:-gsource-map -sASSERTIONS=1 -sSAFE_HEAP=1>
"-sEXPORT_ES6=1"
)
add_executable(09_modularize_es6_alias main.cpp)
target_link_options(09_modularize_es6_alias PRIVATE
$<$<CONFIG:Debug>:-gsource-map -sASSERTIONS=1 -sSAFE_HEAP=1>
"-sEXPORT_ES6=1"
)
新しい構成によりリビルド
ファイルへの変更を反映すると構成オプションの選択肢が増えていることが確認できる。
再構成してリビルドする。
この変更を行うとグルーコードなどが生成されるディレクトリが変更となる。
以前は build に作成されていたものが、build\Debug と build\Release になるので、index.html も変更が必要。
index.html
import from のパスを build/ から build/Debug/ に変更
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="utf-8"/>
<script type="module">
import DefaultModule from './build/Debug/09_modularize_es6.js';
import AliasModule from './build/Debug/09_modularize_es6_alias.js';
document.addEventListener('DOMContentLoaded', function()
{
let v = 0;
DefaultModule({arguments: ['Default']}).then(mod =>
{
v = mod._increment(v);
console.log(`return=${v}`);
});
AliasModule({arguments: ['Alias']}).then(mod =>
{
v = mod._increment(v);
console.log(`return=${v}`);
});
});
</script>
</head>
<body>
</body>
</html>
構成をリリース(wasm-config-release) に変更しビルドすると、build\Release には *.wasm.map が 出力されないことで、ジェネレータ式が有効に作用していることが確認できる。
build\Debug
C:\wasm\project\09-modularize-es6>dir build\Debug\
ドライブ C のボリューム ラベルは OS です
ボリューム シリアル番号は E886-5372 です
C:\wasm\project\09-modularize-es6\build\Debug のディレクトリ
2025/10/11 11:13 <DIR> .
2025/10/11 11:15 <DIR> ..
2025/10/11 11:13 58,523 09_modularize_es6.js
2025/10/11 11:13 116,238 09_modularize_es6.wasm
2025/10/11 11:13 13,323 09_modularize_es6.wasm.map
2025/10/11 11:13 58,535 09_modularize_es6_alias.js
2025/10/11 11:13 116,250 09_modularize_es6_alias.wasm
2025/10/11 11:13 13,323 09_modularize_es6_alias.wasm.map
6 個のファイル 376,192 バイト
2 個のディレクトリ 624,805,769,216 バイトの空き領域
build\Release
C:\wasm\project\09-modularize-es6>dir build\Release\
ドライブ C のボリューム ラベルは OS です
ボリューム シリアル番号は E886-5372 です
C:\wasm\project\09-modularize-es6\build\Release のディレクトリ
2025/10/11 11:15 <DIR> .
2025/10/11 11:15 <DIR> ..
2025/10/11 11:15 10,437 09_modularize_es6.js
2025/10/11 11:15 6,812 09_modularize_es6.wasm
2025/10/11 11:15 10,449 09_modularize_es6_alias.js
2025/10/11 11:15 6,812 09_modularize_es6_alias.wasm
4 個のファイル 34,510 バイト
2 個のディレクトリ 624,803,889,152 バイトの空き領域
次回 はグルーコードの内部で行われているコンパイルとインスタンス化を分離して考えてみる。

