@echo off chcp 65001 >nul setlocal cd /d "%~dp0" set "ROOT=%~dp0.." set "TOOLS=%ROOT%\tools" set "ICON=%~dp0app.ico" set "NAME=Changan_X5Plus-Installer" set "SRC=X5plusTool.py" title %NAME% - Build echo ============================================================ echo %NAME% - Cython Build echo ============================================================ echo. set "PY=" where python >nul 2>&1 if not errorlevel 1 ( for /f "delims=" %%i in ('where python') do ( if not defined PY set "PY=%%i" ) ) if not defined PY ( where py >nul 2>&1 if not errorlevel 1 set "PY=py" ) if not defined PY ( if exist "%LOCALAPPDATA%\Microsoft\WindowsApps\python.exe" set "PY=%LOCALAPPDATA%\Microsoft\WindowsApps\python.exe" ) if not defined PY ( echo [ERROR] Python not found pause exit /b 1 ) echo Python: %PY% if not exist "%SRC%" ( echo [ERROR] Source not found: %SRC% pause exit /b 1 ) if not exist "%ICON%" ( echo [ERROR] app.ico not found: %ICON% pause exit /b 1 ) echo [1/6] Installing deps... "%PY%" -m pip install pyinstaller cython pyzipper -q if errorlevel 1 ( "%PY%" -m pip install pyinstaller cython pyzipper -q -i https://pypi.tuna.tsinghua.edu.cn/simple if errorlevel 1 ( echo [ERROR] Dependency installation failed pause exit /b 1 ) ) echo [2/6] Clean... if exist "dist_cy" rmdir /s /q dist_cy 2>nul if exist "build" rmdir /s /q build 2>nul if exist "dist" rmdir /s /q dist 2>nul echo [3/6] Cython compile... mkdir dist_cy 2>nul copy "%SRC%" "dist_cy\_core.py" >nul if errorlevel 1 ( echo [ERROR] Copy source failed pause exit /b 1 ) "%PY%" -c "open('dist_cy/setup_cython.py','w',encoding='utf-8').write('from setuptools import setup\nfrom Cython.Build import cythonize\nsetup(ext_modules=cythonize(\"_core.py\", compiler_directives={\"language_level\":\"3\"}))\n')" if errorlevel 1 ( echo [ERROR] Generate Cython setup failed pause exit /b 1 ) cd dist_cy "%PY%" setup_cython.py build_ext --inplace if errorlevel 1 ( cd .. echo [ERROR] Cython compile failed pause exit /b 1 ) set "PYD=" for %%f in (_core*.pyd) do set "PYD=%%f" if "%PYD%"=="" ( cd .. echo [ERROR] No Cython pyd generated pause exit /b 1 ) echo PYD: %PYD% copy "%PYD%" "_core.pyd" >nul if errorlevel 1 ( cd .. echo [ERROR] Copy Cython pyd failed pause exit /b 1 ) "%PY%" -c "open('launcher.py','w',encoding='utf-8').write('# -*- coding: utf-8 -*-\nfrom _core import main\nmain()\n')" if errorlevel 1 ( cd .. echo [ERROR] Generate launcher failed pause exit /b 1 ) echo [4/6] Copy resources... copy "%TOOLS%\adb.exe" . >nul if errorlevel 1 ( cd .. echo [ERROR] adb.exe not found in %TOOLS% pause exit /b 1 ) copy "%TOOLS%\AdbWinApi.dll" . >nul copy "%TOOLS%\AdbWinUsbApi.dll" . >nul copy "%TOOLS%\7za.exe" . >nul copy "%ICON%" . >nul if errorlevel 1 ( cd .. echo [ERROR] Copy resources failed pause exit /b 1 ) echo [5/6] PyInstaller... "%PY%" -m PyInstaller --onefile --windowed --name="%NAME%" --icon="%ICON%" --add-data "%ICON%;." --add-data "%TOOLS%\adb.exe;." --add-data "%TOOLS%\AdbWinApi.dll;." --add-data "%TOOLS%\AdbWinUsbApi.dll;." --add-data "%TOOLS%\7za.exe;." --add-binary "_core.pyd;." --hidden-import=queue --hidden-import=threading --hidden-import=tkinter --hidden-import=tkinter.simpledialog --hidden-import=zipfile --hidden-import=json --hidden-import=urllib --hidden-import=urllib.parse --collect-all tkinter --uac-admin launcher.py if errorlevel 1 ( cd .. echo [ERROR] PyInstaller failed pause exit /b 1 ) echo [6/6] Cleanup... del /q "_core.py" "_core.c" "_core.pyd" "%PYD%" "launcher.py" "setup_cython.py" 2>nul rmdir /s /q build 2>nul cd .. echo. echo Done. if exist "dist_cy\dist\%NAME%.exe" ( echo Output: dist_cy\dist\%NAME%.exe ) else ( echo [ERROR] Build output not found ) pause