Using node-gyp (Experimental)
目前 node-gyp 仅适用于Linux,并且不支持在交叉编译时链接静态库。已经有 PR 试图让 node-gyp 正常工作。
如果你在 Windows 或 macOS 上遇到问题,请查看上面的 PR 了解上游变更细节以及查看 emnapi-node-gyp-test 了解示例用法。
- 变量
Arch: node-gyp configure --arch=<wasm32 | wasm64>
ts
// node-gyp configure -- -Dvariable_name=value
declare var OS: 'emscripten' | 'wasi' | 'unknown' | ''
/**
* Enable async work and threadsafe-functions
* @default 0
*/
declare var wasm_threads: 0 | 1
/** @default 1048576 */
declare var stack_size: number
/** @default 16777216 */
declare var initial_memory: number
/** @default 2147483648 */
declare var max_memory: number
/** @default path.join(path.dirname(commonGypiPath,'./dist/library_napi.js')) */
declare var emnapi_js_library: string
/** @default 0 */
declare var emnapi_manual_linking: 0 | 1
// node-gyp configure -- -Dvariable_name=value
declare var OS: 'emscripten' | 'wasi' | 'unknown' | ''
/**
* Enable async work and threadsafe-functions
* @default 0
*/
declare var wasm_threads: 0 | 1
/** @default 1048576 */
declare var stack_size: number
/** @default 16777216 */
declare var initial_memory: number
/** @default 2147483648 */
declare var max_memory: number
/** @default path.join(path.dirname(commonGypiPath,'./dist/library_napi.js')) */
declare var emnapi_js_library: string
/** @default 0 */
declare var emnapi_manual_linking: 0 | 1
- 创建
binding.gyp
py
{
"targets": [
{
"target_name": "hello",
"sources": [
"hello.c"
],
"conditions": [
["OS == 'emscripten'", {
"product_extension": "js", # required
# Windows and Linux
"cflags": [],
"cflags_c": [],
"cflags_cc": [],
"ldflags": [],
# macOS uses following config
'xcode_settings': {
"WARNING_CFLAGS": [], # cflags
"OTHER_CFLAGS": [], # cflags_c
"OTHER_CPLUSPLUSFLAGS": [], # cflags_cc
"OTHER_LDFLAGS": [] # ldflags
}
}],
["OS == 'wasi'", {
# ...
}],
["OS == 'unknown' or OS == ''", {
# ...
}]
]
}
]
}
{
"targets": [
{
"target_name": "hello",
"sources": [
"hello.c"
],
"conditions": [
["OS == 'emscripten'", {
"product_extension": "js", # required
# Windows and Linux
"cflags": [],
"cflags_c": [],
"cflags_cc": [],
"ldflags": [],
# macOS uses following config
'xcode_settings': {
"WARNING_CFLAGS": [], # cflags
"OTHER_CFLAGS": [], # cflags_c
"OTHER_CPLUSPLUSFLAGS": [], # cflags_cc
"OTHER_LDFLAGS": [] # ldflags
}
}],
["OS == 'wasi'", {
# ...
}],
["OS == 'unknown' or OS == ''", {
# ...
}]
]
}
]
}
- 添加以下环境变量
bash
# Linux or macOS
export GYP_CROSSCOMPILE=1
# emscripten
export AR_target="$EMSDK/upstream/emscripten/emar"
export CC_target="$EMSDK/upstream/emscripten/emcc"
export CXX_target="$EMSDK/upstream/emscripten/em++"
# wasi-sdk
export AR_target="$WASI_SDK_PATH/bin/ar"
export CC_target="$WASI_SDK_PATH/bin/clang"
export CXX_target="$WASI_SDK_PATH/bin/clang++"
# Linux or macOS
export GYP_CROSSCOMPILE=1
# emscripten
export AR_target="$EMSDK/upstream/emscripten/emar"
export CC_target="$EMSDK/upstream/emscripten/emcc"
export CXX_target="$EMSDK/upstream/emscripten/em++"
# wasi-sdk
export AR_target="$WASI_SDK_PATH/bin/ar"
export CC_target="$WASI_SDK_PATH/bin/clang"
export CXX_target="$WASI_SDK_PATH/bin/clang++"
bat
@REM Windows
set GYP_CROSSCOMPILE=1
@REM emscripten
call set AR_target=%%EMSDK:\=/%%/upstream/emscripten/emar.bat
call set CC_target=%%EMSDK:\=/%%/upstream/emscripten/emcc.bat
call set CXX_target=%%EMSDK:\=/%%/upstream/emscripten/em++.bat
@REM wasi-sdk
call set AR_target=%%WASI_SDK_PATH:\=/%%/bin/ar.exe
call set CC_target=%%WASI_SDK_PATH:\=/%%/bin/clang.exe
call set CXX_target=%%WASI_SDK_PATH:\=/%%/bin/clang++.exe
@REM Windows
set GYP_CROSSCOMPILE=1
@REM emscripten
call set AR_target=%%EMSDK:\=/%%/upstream/emscripten/emar.bat
call set CC_target=%%EMSDK:\=/%%/upstream/emscripten/emcc.bat
call set CXX_target=%%EMSDK:\=/%%/upstream/emscripten/em++.bat
@REM wasi-sdk
call set AR_target=%%WASI_SDK_PATH:\=/%%/bin/ar.exe
call set CC_target=%%WASI_SDK_PATH:\=/%%/bin/clang.exe
call set CXX_target=%%WASI_SDK_PATH:\=/%%/bin/clang++.exe
- 构建
bash
# Linux or macOS
# emscripten
emmake node-gyp rebuild \
--arch=wasm32 \
--nodedir=./node_modules/emnapi \
-- -f make-linux -DOS=emscripten # -Dwasm_threads=1
# wasi
node-gyp rebuild \
--arch=wasm32 \
--nodedir=./node_modules/emnapi \
-- -f make-linux -DOS=wasi # -Dwasm_threads=1
# bare wasm32
node-gyp rebuild \
--arch=wasm32 \
--nodedir=./node_modules/emnapi \
-- -f make-linux -DOS=unknown # -Dwasm_threads=1
# Linux or macOS
# emscripten
emmake node-gyp rebuild \
--arch=wasm32 \
--nodedir=./node_modules/emnapi \
-- -f make-linux -DOS=emscripten # -Dwasm_threads=1
# wasi
node-gyp rebuild \
--arch=wasm32 \
--nodedir=./node_modules/emnapi \
-- -f make-linux -DOS=wasi # -Dwasm_threads=1
# bare wasm32
node-gyp rebuild \
--arch=wasm32 \
--nodedir=./node_modules/emnapi \
-- -f make-linux -DOS=unknown # -Dwasm_threads=1
bat
@REM Use make generator on Windows
@REM Run the bat file in POSIX-like environment (e.g. Cygwin)
@REM emscripten
call npx.cmd node-gyp configure --arch=wasm32 --nodedir=./node_modules/emnapi -- -f make-linux -DOS=emscripten
call emmake.bat make -C %~dp0build
@REM wasi
call npx.cmd node-gyp configure --arch=wasm32 --nodedir=./node_modules/emnapi -- -f make-linux -DOS=wasi
make -C %~dp0build
@REM bare wasm32
call npx.cmd node-gyp configure --arch=wasm32 --nodedir=./node_modules/emnapi -- -f make-linux -DOS=unknown
make -C %~dp0build
@REM Use make generator on Windows
@REM Run the bat file in POSIX-like environment (e.g. Cygwin)
@REM emscripten
call npx.cmd node-gyp configure --arch=wasm32 --nodedir=./node_modules/emnapi -- -f make-linux -DOS=emscripten
call emmake.bat make -C %~dp0build
@REM wasi
call npx.cmd node-gyp configure --arch=wasm32 --nodedir=./node_modules/emnapi -- -f make-linux -DOS=wasi
make -C %~dp0build
@REM bare wasm32
call npx.cmd node-gyp configure --arch=wasm32 --nodedir=./node_modules/emnapi -- -f make-linux -DOS=unknown
make -C %~dp0build