Files
shooter-demo/tools/emscripten/gen-asm.bat
2025-11-28 18:11:30 +08:00

140 lines
3.7 KiB
Batchfile
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

@echo off
setlocal enabledelayedexpansion
echo ========================================
echo WASM to asm.js 转换器
echo ========================================
echo.
:: 检查参数
if "%~1"=="" (
echo 错误: 缺少 WASM 文件路径参数
echo.
echo 用法: gen-asm.bat ^<wasm文件路径^> ^<输出路径^>
echo.
echo 示例:
echo gen-asm.bat pinball.wasm output/pinball-asm.js
echo gen-asm.bat ../target/wasm32-unknown-unknown/release/pinball_physics.wasm ../client-cocos/assets/wasm/pinball-asm.js
echo.
goto :error
)
if "%~2"=="" (
echo 错误: 缺少输出路径参数
echo.
echo 用法: gen-asm.bat ^<wasm文件路径^> ^<输出路径^>
echo.
goto :error
)
set WASM_FILE=%~1
set OUTPUT_FILE=%~2
set SCRIPT_DIR=%~dp0
:: 转换为绝对路径
for %%i in ("%WASM_FILE%") do set WASM_FILE_ABS=%%~fi
for %%i in ("%OUTPUT_FILE%") do set OUTPUT_FILE_ABS=%%~fi
for %%i in ("%OUTPUT_FILE_ABS%") do set OUTPUT_DIR=%%~dpi
:: 检查输入文件是否存在
if not exist "%WASM_FILE_ABS%" (
echo 错误: WASM 文件不存在: %WASM_FILE_ABS%
goto :error
)
:: 创建输出目录(如果不存在)
if not exist "%OUTPUT_DIR%" (
echo 创建输出目录: %OUTPUT_DIR%
mkdir "%OUTPUT_DIR%"
)
echo 输入文件: %WASM_FILE_ABS%
echo 输出文件: %OUTPUT_FILE_ABS%
echo.
:: 检查 Emscripten 环境
call emcc --version >nul 2>&1
if %errorlevel% neq 0 (
echo Emscripten 环境未设置,尝试自动设置...
if exist "%SCRIPT_DIR%emsdk\emsdk_env.bat" (
echo 运行 Emscripten 环境设置...
call "%SCRIPT_DIR%emsdk\emsdk_env.bat"
call emcc --version >nul 2>&1
if %errorlevel% neq 0 (
echo 错误: 无法设置 Emscripten 环境
echo 请先运行 install.bat 安装 Emscripten或手动运行 setup-env.bat
goto :error
)
) else (
echo 错误: 未找到 Emscripten 安装
echo 请先运行 install.bat 安装 Emscripten
goto :error
)
)
echo Emscripten 版本信息:
call emcc --version | findstr "emcc"
echo.
echo 开始转换 WASM 到 asm.js...
:: 使用 emcc 将 WASM 转换为 asm.js
:: 关键参数说明:
:: -s WASM=0 : 禁用 WebAssembly生成 asm.js
:: -s LEGACY_VM_SUPPORT=1 : 支持较老的 JavaScript 引擎
:: -s ALLOW_MEMORY_GROWTH=1 : 允许内存增长
:: -s NO_EXIT_RUNTIME=1 : 不退出运行时
:: -s EXPORTED_FUNCTIONS=["_main"] : 导出函数(根据需要调整)
:: -s MODULARIZE=1 : 生成模块化代码
:: -s EXPORT_NAME="Module" : 导出模块名
:: -O3 : 最高优化级别
call emcc "%WASM_FILE_ABS%" ^
-s WASM=0 ^
-s LEGACY_VM_SUPPORT=1 ^
-s ALLOW_MEMORY_GROWTH=1 ^
-s NO_EXIT_RUNTIME=1 ^
-s MODULARIZE=1 ^
-s EXPORT_NAME="PinballModule" ^
-s EXPORTED_RUNTIME_METHODS="['ccall','cwrap']" ^
-O3 ^
--closure 0 ^
-o "%OUTPUT_FILE_ABS%"
if %errorlevel% neq 0 (
echo 错误: 转换失败
goto :error
)
echo.
echo ========================================
echo 转换成功!
echo ========================================
echo.
echo 输出文件: %OUTPUT_FILE_ABS%
:: 显示文件大小
for %%A in ("%OUTPUT_FILE_ABS%") do (
set file_size=%%~zA
set /a size_kb=!file_size!/1024
echo 文件大小: !size_kb! KB
)
echo.
echo 使用方法:
echo 在 HTML 中引入生成的 JS 文件,然后使用:
echo PinballModule().then(function(Module) {
echo // 使用 Module.ccall 调用导出的函数
echo var result = Module.ccall('function_name', 'number', ['number'], [42]);
echo });
echo.
goto :end
:error
echo.
echo 转换失败!
exit /b 1
:end
pause