完善发布asm.js脚本

This commit is contained in:
janing
2025-11-29 01:42:48 +08:00
parent 8c7f70ae9b
commit e8a07c695e
11 changed files with 202 additions and 157 deletions

View File

@@ -21,7 +21,7 @@ export class WasmPhysicsEngine implements IPhysicsEngine {
* @param settings 物理设置 * @param settings 物理设置
* @param wasmFactory WASM工厂函数可选推荐使用 * @param wasmFactory WASM工厂函数可选推荐使用
*/ */
async initialize(settings: PhysicsSettings, wasmFactory?: any): Promise<void> { async initialize(settings: PhysicsSettings ): Promise<void> {
if (this.state === WasmModuleState.LOADED) { if (this.state === WasmModuleState.LOADED) {
return; return;
} }
@@ -29,15 +29,7 @@ export class WasmPhysicsEngine implements IPhysicsEngine {
this.state = WasmModuleState.LOADING; this.state = WasmModuleState.LOADING;
try { try {
if (wasmFactory) { await this.initializeLegacy();
// 使用新的 WasmLoader推荐方式
await this.initializeWithWasmLoader(wasmFactory);
} else {
// 回退到旧的加载方式(保持向后兼容)
console.warn('使用旧的 WASM 加载方式,推荐提供 wasmFactory 参数使用 WasmLoader');
await this.initializeLegacy();
}
this.state = WasmModuleState.LOADED; this.state = WasmModuleState.LOADED;
console.log('WASM Physics Engine initialized successfully'); console.log('WASM Physics Engine initialized successfully');
@@ -102,8 +94,18 @@ export class WasmPhysicsEngine implements IPhysicsEngine {
*/ */
private async initializeLegacy(): Promise<void> { private async initializeLegacy(): Promise<void> {
// 加载 WASM 文件 // 加载 WASM 文件
const wasmPath = 'assets/wasm/pinball_physics.wasm'; const result = await wasmLoader.loadWasmWithAsmFallback(
const wasmResponse = await fetch(wasmPath); wasmFactory, // WASM 工厂函数
asmFactory, // ASM 工厂函数
'pinball_physics.wasm', // WASM 文件名
'pinball_physics.asm.mem', // ASM 内存文件名
'44cacb3c-e901-455d-b3e1-1c38a69718e1', // WASM UUID
'3400003e-dc3c-43c1-8757-3e082429125a', // ASM UUID
'wasmFiles' // Bundle 名称
);
console.log('模块加载成功,使用的是:', result.isWasm ? 'WASM' : 'ASM');
console.log('模块实例:', result.instance);
if (!wasmResponse.ok) { if (!wasmResponse.ok) {
throw new Error(`Failed to fetch WASM file: ${wasmResponse.statusText}`); throw new Error(`Failed to fetch WASM file: ${wasmResponse.statusText}`);

View File

@@ -0,0 +1,9 @@
{
"ver": "4.0.23",
"importer": "typescript",
"imported": true,
"uuid": "c244f34a-30ab-4c13-ad52-9660a71d9cc4",
"files": [],
"subMetas": {},
"userData": {}
}

View File

@@ -0,0 +1,9 @@
{
"ver": "4.0.23",
"importer": "typescript",
"imported": true,
"uuid": "005f083e-a7f9-483a-bc2c-cec96e4098c0",
"files": [],
"subMetas": {},
"userData": {}
}

Binary file not shown.

View File

@@ -0,0 +1,9 @@
{
"ver": "4.0.23",
"importer": "javascript",
"imported": true,
"uuid": "1205a156-e26f-489c-acc2-274040636dfd",
"files": [],
"subMetas": {},
"userData": {}
}

Binary file not shown.

View File

@@ -0,0 +1,12 @@
{
"ver": "1.0.3",
"importer": "buffer",
"imported": true,
"uuid": "b209ab60-b43e-4dda-b9a9-401e28fd8735",
"files": [
".bin",
".json"
],
"subMetas": {},
"userData": {}
}

View File

@@ -2,163 +2,163 @@
setlocal enabledelayedexpansion setlocal enabledelayedexpansion
echo ======================================== echo ========================================
echo Pinball Physics 构建脚本 echo Pinball Physics 构建脚本
echo ======================================== echo ========================================
echo. echo.
:: 设置构建模式,默认为 debug :: 设置构建模式,默认为 debug
set BUILD_MODE=%1 set BUILD_MODE=%1
if "%BUILD_MODE%"=="" set BUILD_MODE=debug if "%BUILD_MODE%"=="" set BUILD_MODE=debug
:: 验证构建模式 :: 验证构建模式
if /i "%BUILD_MODE%" neq "debug" if /i "%BUILD_MODE%" neq "release" ( if /i "%BUILD_MODE%" neq "debug" if /i "%BUILD_MODE%" neq "release" (
echo 错误: 无效的构建模式 "%BUILD_MODE%" echo 错误: 无效的构建模式 "%BUILD_MODE%"
echo 支持的模式: debug ^| release echo 支持的模式: debug ^| release
echo. echo.
echo 用法: build-physics.bat [debug^|release] echo 用法: build-physics.bat [debug^|release]
echo 示例: build-physics.bat release echo 示例: build-physics.bat release
goto :error goto :error
) )
echo 构建模式: %BUILD_MODE% echo 构建模式: %BUILD_MODE%
echo. echo.
:: 设置路径变量 :: 设置路径变量
set SCRIPT_DIR=%~dp0 set SCRIPT_DIR=%~dp0
set PROJECT_ROOT=%SCRIPT_DIR%..\ set PROJECT_ROOT=%SCRIPT_DIR%..\
set PHYSICS_DIR=%PROJECT_ROOT%pinball-physics set PHYSICS_DIR=%PROJECT_ROOT%pinball-physics
set TARGET_DIR=%PHYSICS_DIR%\target\wasm32-unknown-unknown\%BUILD_MODE% set TARGET_DIR=%PHYSICS_DIR%\target\wasm32-unknown-unknown\%BUILD_MODE%
set WASM_SOURCE=%TARGET_DIR%\pinball_physics.wasm set WASM_SOURCE=%TARGET_DIR%\pinball_physics.wasm
set WASM_OUTPUT=%SCRIPT_DIR%assets\wasm\pinball_physics.bin set WASM_OUTPUT=%SCRIPT_DIR%assets\wasm\pinball_physics.bin
set ASM_OUTPUT=%SCRIPT_DIR%assets\wasm\pinball_physics.js set ASM_OUTPUT=%SCRIPT_DIR%assets\wasm\pinball_physics.asm.js
set EMSCRIPTEN_TOOL=%PROJECT_ROOT%tools\emscripten\gen-asm.bat set EMSCRIPTEN_TOOL=%PROJECT_ROOT%tools\emscripten\gen-asm.bat
echo 路径配置: echo 路径配置:
echo 物理引擎目录: %PHYSICS_DIR% echo 物理引擎目录: %PHYSICS_DIR%
echo WASM 源文件: %WASM_SOURCE% echo WASM 源文件: %WASM_SOURCE%
echo WASM 输出: %WASM_OUTPUT% echo WASM 输出: %WASM_OUTPUT%
echo asm.js 输出: %ASM_OUTPUT% echo asm.js 输出: %ASM_OUTPUT%
echo. echo.
:: 检查物理引擎项目是否存在 :: 检查物理引擎项目是否存在
if not exist "%PHYSICS_DIR%\Cargo.toml" ( if not exist "%PHYSICS_DIR%\Cargo.toml" (
echo 错误: 未找到物理引擎项目 echo 错误: 未找到物理引擎项目
echo 路径: %PHYSICS_DIR% echo 路径: %PHYSICS_DIR%
goto :error goto :error
) )
:: 检查 Rust 是否安装 :: 检查 Rust 是否安装
rustc --version >nul 2>&1 rustc --version >nul 2>&1
if %errorlevel% neq 0 ( if %errorlevel% neq 0 (
echo 错误: 未找到 Rust 编译器 echo 错误: 未找到 Rust 编译器
echo 请先安装 Rust: https://rustup.rs/ echo 请先安装 Rust: https://rustup.rs/
goto :error goto :error
) )
:: 检查 wasm32-unknown-unknown 目标是否安装 :: 检查 wasm32-unknown-unknown 目标是否安装
rustup target list --installed | findstr "wasm32-unknown-unknown" >nul 2>&1 rustup target list --installed | findstr "wasm32-unknown-unknown" >nul 2>&1
if %errorlevel% neq 0 ( if %errorlevel% neq 0 (
echo 安装 wasm32-unknown-unknown 目标... echo 安装 wasm32-unknown-unknown 目标...
rustup target add wasm32-unknown-unknown rustup target add wasm32-unknown-unknown
if %errorlevel% neq 0 ( if %errorlevel% neq 0 (
echo 错误: 安装 wasm32-unknown-unknown 目标失败 echo 错误: 安装 wasm32-unknown-unknown 目标失败
goto :error goto :error
) )
) )
:: 创建输出目录 :: 创建输出目录
if not exist "%SCRIPT_DIR%assets\wasm" ( if not exist "%SCRIPT_DIR%assets\wasm" (
echo 创建输出目录: assets\wasm echo 创建输出目录: assets\wasm
mkdir "%SCRIPT_DIR%assets\wasm" mkdir "%SCRIPT_DIR%assets\wasm"
) )
echo ---------------------------------------- echo ----------------------------------------
echo 第1步: 编译物理引擎 (模式: %BUILD_MODE%) echo 第1步: 编译物理引擎 (模式: %BUILD_MODE%)
echo ---------------------------------------- echo ----------------------------------------
echo. echo.
:: 切换到物理引擎目录并编译 :: 切换到物理引擎目录并编译
cd /d "%PHYSICS_DIR%" cd /d "%PHYSICS_DIR%"
if /i "%BUILD_MODE%"=="release" ( if /i "%BUILD_MODE%"=="release" (
echo 执行命令: cargo build --target wasm32-unknown-unknown --release echo 执行命令: cargo build --target wasm32-unknown-unknown --release
cargo build --target wasm32-unknown-unknown --release cargo build --target wasm32-unknown-unknown --release
) else ( ) else (
echo 执行命令: cargo build --target wasm32-unknown-unknown echo 执行命令: cargo build --target wasm32-unknown-unknown
cargo build --target wasm32-unknown-unknown cargo build --target wasm32-unknown-unknown
) )
if %errorlevel% neq 0 ( if %errorlevel% neq 0 (
echo 错误: 物理引擎编译失败 echo 错误: 物理引擎编译失败
goto :error goto :error
) )
:: 检查编译输出是否存在 :: 检查编译输出是否存在
if not exist "%WASM_SOURCE%" ( if not exist "%WASM_SOURCE%" (
echo 错误: 编译输出文件不存在 echo 错误: 编译输出文件不存在
echo 期望位置: %WASM_SOURCE% echo 期望位置: %WASM_SOURCE%
goto :error goto :error
) )
:: 显示编译结果信息 :: 显示编译结果信息
for %%A in ("%WASM_SOURCE%") do ( for %%A in ("%WASM_SOURCE%") do (
set source_size=%%~zA set source_size=%%~zA
set /a size_kb=!source_size!/1024 set /a size_kb=!source_size!/1024
echo 编译成功! 文件大小: !size_kb! KB echo 编译成功! 文件大小: !size_kb! KB
) )
echo. echo.
echo ---------------------------------------- echo ----------------------------------------
echo 第2步: 拷贝 WASM 文件 echo 第2步: 拷贝 WASM 文件
echo ---------------------------------------- echo ----------------------------------------
echo. echo.
:: 拷贝 WASM 文件到客户端资源目录 :: 拷贝 WASM 文件到客户端资源目录
echo 拷贝: %WASM_SOURCE% echo 拷贝: %WASM_SOURCE%
echo 到: %WASM_OUTPUT% echo 到: %WASM_OUTPUT%
copy "%WASM_SOURCE%" "%WASM_OUTPUT%" >nul copy "%WASM_SOURCE%" "%WASM_OUTPUT%" >nul
if %errorlevel% neq 0 ( if %errorlevel% neq 0 (
echo 错误: 拷贝 WASM 文件失败 echo 错误: 拷贝 WASM 文件失败
goto :error goto :error
) )
echo 拷贝成功! echo 拷贝成功!
echo. echo.
echo ---------------------------------------- echo ----------------------------------------
echo 第3步: 生成 asm.js 文件 echo 第3步: 生成 asm.js 文件
echo ---------------------------------------- echo ----------------------------------------
echo. echo.
:: 检查 Emscripten 转换工具是否存在 :: 检查 Emscripten 转换工具是否存在
if not exist "%EMSCRIPTEN_TOOL%" ( if not exist "%EMSCRIPTEN_TOOL%" (
echo 错误: 未找到 Emscripten 转换工具 echo 错误: 未找到 Emscripten 转换工具
echo 路径: %EMSCRIPTEN_TOOL% echo 路径: %EMSCRIPTEN_TOOL%
echo 请先运行: tools\emscripten\install.bat echo 请先运行: tools\emscripten\install.bat
goto :error goto :error
) )
:: 切换回项目根目录 :: 切换回项目根目录
cd /d "%PROJECT_ROOT%" cd /d "%PROJECT_ROOT%"
:: 执行 WASM 到 asm.js 转换 :: 执行 WASM 到 asm.js 转换
echo 执行转换: WASM → asm.js echo 执行转换: WASM → asm.js
echo 命令: %EMSCRIPTEN_TOOL% "%WASM_SOURCE%" "%ASM_OUTPUT%" echo 命令: %EMSCRIPTEN_TOOL% "%WASM_SOURCE%" "%ASM_OUTPUT%"
echo. echo.
call "%EMSCRIPTEN_TOOL%" "%WASM_SOURCE%" "%ASM_OUTPUT%" call "%EMSCRIPTEN_TOOL%" "%WASM_SOURCE%" "%ASM_OUTPUT%"
if %errorlevel% neq 0 ( if %errorlevel% neq 0 (
echo 错误: asm.js 转换失败 echo 错误: asm.js 转换失败
goto :error goto :error
) )
echo. echo.
echo ======================================== echo ========================================
echo 构建完成! echo 构建完成!
echo ======================================== echo ========================================
echo. echo.
echo 输出文件: echo 输出文件:
echo WASM: %WASM_OUTPUT% echo WASM: %WASM_OUTPUT%
if exist "%ASM_OUTPUT%" ( if exist "%ASM_OUTPUT%" (
for %%A in ("%WASM_OUTPUT%") do ( for %%A in ("%WASM_OUTPUT%") do (
@@ -171,20 +171,20 @@ if exist "%ASM_OUTPUT%" (
) )
echo asm.js: %ASM_OUTPUT% echo asm.js: %ASM_OUTPUT%
echo. echo.
echo 文件大小: echo 文件大小:
echo WASM: !wasm_kb! KB echo WASM: !wasm_kb! KB
echo asm.js: !asm_kb! KB echo asm.js: !asm_kb! KB
) )
echo. echo.
echo 构建模式: %BUILD_MODE% echo 构建模式: %BUILD_MODE%
echo 可以在 Cocos Creator 中使用这些文件了! echo 可以在 Cocos Creator 中使用这些文件了!
goto :end goto :end
:error :error
echo. echo.
echo ======================================== echo ========================================
echo 构建失败! echo 构建失败!
echo ======================================== echo ========================================
exit /b 1 exit /b 1

View File

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

View File

@@ -2,102 +2,102 @@
setlocal enabledelayedexpansion setlocal enabledelayedexpansion
echo ======================================== echo ========================================
echo Emscripten 安装脚本 (版本: 3.1.41) echo Emscripten 安装脚本 (版本: 3.1.41)
echo ======================================== echo ========================================
echo. echo.
:: 设置变量 :: 设置变量
set EMSCRIPTEN_VERSION=3.1.41 set EMSCRIPTEN_VERSION=3.1.41
set SCRIPT_DIR=%~dp0 set SCRIPT_DIR=%~dp0
set EMSDK_DIR=%SCRIPT_DIR%emsdk set EMSDK_DIR=%SCRIPT_DIR%emsdk
:: 检查是否已存在 emsdk 目录 :: 检查是否已存在 emsdk 目录
if exist "%EMSDK_DIR%" ( if exist "%EMSDK_DIR%" (
echo 检测到已存在的 emsdk 目录... echo 检测到已存在的 emsdk 目录...
set /p "choice=是否重新安装? (y/n): " set /p "choice=是否重新安装? (y/n): "
if /i "!choice!" neq "y" ( if /i "!choice!" neq "y" (
echo 安装已取消 goto :install
goto :end
) )
echo 删除现有安装... echo 删除现有安装...
rmdir /s /q "%EMSDK_DIR%" rmdir /s /q "%EMSDK_DIR%"
) )
:: 检查 Git 是否可用 :: 检查 Git 是否可用
git --version >nul 2>&1 git --version >nul 2>&1
if %errorlevel% neq 0 ( if %errorlevel% neq 0 (
echo 错误: 未找到 Git请先安装 Git echo 错误: 未找到 Git请先安装 Git
goto :error goto :error
) )
:: 检查 Python 是否可用 :: 检查 Python 是否可用
python --version >nul 2>&1 python --version >nul 2>&1
if %errorlevel% neq 0 ( if %errorlevel% neq 0 (
echo 错误: 未找到 Python请先安装 Python 3.x echo 错误: 未找到 Python请先安装 Python 3.x
goto :error goto :error
) )
echo 开始下载 Emscripten SDK... echo 开始下载 Emscripten SDK...
cd /d "%SCRIPT_DIR%" cd /d "%SCRIPT_DIR%"
git clone https://github.com/emscripten-core/emsdk.git git clone https://github.com/emscripten-core/emsdk.git
if %errorlevel% neq 0 ( if %errorlevel% neq 0 (
echo 错误: 下载 Emscripten SDK 失败 echo 错误: 下载 Emscripten SDK 失败
goto :error goto :error
) )
:install
echo. echo.
echo 进入 emsdk 目录... echo 进入 emsdk 目录...
cd "%EMSDK_DIR%" cd "%EMSDK_DIR%"
echo 安装和激活 Emscripten %EMSCRIPTEN_VERSION%... echo 安装和激活 Emscripten %EMSCRIPTEN_VERSION%...
call emsdk.bat install %EMSCRIPTEN_VERSION% call emsdk.bat install %EMSCRIPTEN_VERSION%
if %errorlevel% neq 0 ( if %errorlevel% neq 0 (
echo 错误: 安装 Emscripten %EMSCRIPTEN_VERSION% 失败 echo 错误: 安装 Emscripten %EMSCRIPTEN_VERSION% 失败
goto :error goto :error
) )
echo. echo.
echo 激活 Emscripten %EMSCRIPTEN_VERSION%... echo 激活 Emscripten %EMSCRIPTEN_VERSION%...
call emsdk.bat activate %EMSCRIPTEN_VERSION% call emsdk.bat activate %EMSCRIPTEN_VERSION%
if %errorlevel% neq 0 ( if %errorlevel% neq 0 (
echo 错误: 激活 Emscripten %EMSCRIPTEN_VERSION% 失败 echo 错误: 激活 Emscripten %EMSCRIPTEN_VERSION% 失败
goto :error goto :error
) )
echo. echo.
echo 设置环境变量... echo 设置环境变量...
call emsdk_env.bat call emsdk_env.bat
echo. echo.
echo 验证安装... echo 验证安装...
call emcc --version call emcc --version
if %errorlevel% neq 0 ( if %errorlevel% neq 0 (
echo 错误: Emscripten 安装验证失败 echo 错误: Emscripten 安装验证失败
goto :error goto :error
) )
echo. echo.
echo ======================================== echo ========================================
echo Emscripten %EMSCRIPTEN_VERSION% 安装成功! echo Emscripten %EMSCRIPTEN_VERSION% 安装成功!
echo ======================================== echo ========================================
echo. echo.
echo 注意事项: echo 注意事项:
echo 1. 每次使用前需要运行 setup-env.bat 来设置环境变量 echo 1. 每次使用前需要运行 setup-env.bat 来设置环境变量
echo 2. 或者手动运行: tools\emscripten\emsdk\emsdk_env.bat echo 2. 或者手动运行: tools\emscripten\emsdk\emsdk_env.bat
echo. echo.
echo 创建快速设置脚本... echo 创建快速设置脚本...
echo @echo off > "%SCRIPT_DIR%setup-env.bat" echo @echo off > "%SCRIPT_DIR%setup-env.bat"
echo echo 设置 Emscripten 环境变量... >> "%SCRIPT_DIR%setup-env.bat" echo echo 设置 Emscripten 环境变量... >> "%SCRIPT_DIR%setup-env.bat"
echo call "%EMSDK_DIR%\emsdk_env.bat" >> "%SCRIPT_DIR%setup-env.bat" echo call "%EMSDK_DIR%\emsdk_env.bat" >> "%SCRIPT_DIR%setup-env.bat"
echo echo Emscripten 环境已设置完成 >> "%SCRIPT_DIR%setup-env.bat" echo echo Emscripten 环境已设置完成 >> "%SCRIPT_DIR%setup-env.bat"
echo setup-env.bat 已创建 echo setup-env.bat 已创建
goto :end goto :end
:error :error
echo. echo.
echo ======================================== echo ========================================
echo 安装失败!请检查错误信息 echo 安装失败!请检查错误信息
echo ======================================== echo ========================================
exit /b 1 exit /b 1