release: restore ZUPT and harden source-only 5.2.2
This commit is contained in:
parent
74e393ba3e
commit
ff99770bd0
205 changed files with 19627 additions and 13215 deletions
|
|
@ -1,92 +1,102 @@
|
|||
@echo off
|
||||
REM ══════════════════════════════════════════════════
|
||||
REM Zupt GUI — Windows Build Script
|
||||
REM Creates: ZuptGUI-2.1.6-Setup.exe
|
||||
REM
|
||||
REM Prerequisites:
|
||||
REM 1. Python 3.9+ (python.org)
|
||||
REM 2. NSIS 3.x (nsis.sourceforge.io)
|
||||
REM 3. zupt.exe (compiled zupt CLI binary for Windows)
|
||||
REM
|
||||
REM Usage:
|
||||
REM cd packaging\windows
|
||||
REM build-windows.bat
|
||||
REM ══════════════════════════════════════════════════
|
||||
setlocal
|
||||
rem SPDX-License-Identifier: AGPL-3.0-or-later
|
||||
rem Build the ZUPT GUI installer without downloading dependencies.
|
||||
rem
|
||||
rem Prerequisites must already be installed: Python 3.9+, PySide6, PyInstaller,
|
||||
rem Inno Setup 6, and a source-built/tested zupt.exe. The CLI path can be
|
||||
rem selected with ZUPT_CLI_EXE. Final output goes to ZUPT_DIST_DIR,
|
||||
rem which defaults to a directory below %%TEMP%% (outside the Git checkout).
|
||||
rem ZUPT_WINDOWS_RUNTIME_NOTICES_DIR is mandatory and must contain the
|
||||
rem license/notices for the exact Python, PyInstaller, Qt and PySide/PyQt
|
||||
rem runtime files embedded by this local build.
|
||||
|
||||
echo.
|
||||
echo Zupt GUI — Windows Build
|
||||
echo ════════════════════════
|
||||
echo.
|
||||
setlocal EnableExtensions
|
||||
for %%I in ("%~dp0\..\..\..") do set "REPO_ROOT=%%~fI"
|
||||
set "VERSION=%~1"
|
||||
if not defined VERSION set "VERSION=5.2.2"
|
||||
if not defined ZUPT_DIST_DIR set "ZUPT_DIST_DIR=%TEMP%\zupt-release"
|
||||
if not defined ZUPT_CLI_EXE set "ZUPT_CLI_EXE=%REPO_ROOT%\zupt.exe"
|
||||
set "WORK=%TEMP%\zupt-gui-build-%RANDOM%-%RANDOM%"
|
||||
set "RC=1"
|
||||
|
||||
REM ── Step 1: Install Python deps ──
|
||||
echo [1/4] Installing dependencies...
|
||||
pip install PySide6 pyinstaller --quiet --upgrade
|
||||
if errorlevel 1 (
|
||||
echo ERROR: pip install failed. Is Python in PATH?
|
||||
pause
|
||||
exit /b 1
|
||||
where pyinstaller >nul 2>nul || (
|
||||
echo ERROR: PyInstaller is required and is not downloaded by this script.>&2
|
||||
goto :cleanup
|
||||
)
|
||||
where ISCC.exe >nul 2>nul || (
|
||||
echo ERROR: Inno Setup 6 ISCC.exe is required.>&2
|
||||
goto :cleanup
|
||||
)
|
||||
if not exist "%ZUPT_CLI_EXE%" (
|
||||
echo ERROR: source-built CLI not found: %ZUPT_CLI_EXE%>&2
|
||||
goto :cleanup
|
||||
)
|
||||
if not defined ZUPT_WINDOWS_RUNTIME_NOTICES_DIR (
|
||||
echo ERROR: set ZUPT_WINDOWS_RUNTIME_NOTICES_DIR for the exact bundled runtime.>&2
|
||||
goto :cleanup
|
||||
)
|
||||
if not exist "%ZUPT_WINDOWS_RUNTIME_NOTICES_DIR%\MANIFEST.txt" (
|
||||
echo ERROR: runtime notice directory must contain MANIFEST.txt.>&2
|
||||
goto :cleanup
|
||||
)
|
||||
for %%I in ("%ZUPT_WINDOWS_RUNTIME_NOTICES_DIR%\MANIFEST.txt") do if %%~zI LEQ 0 (
|
||||
echo ERROR: runtime notice MANIFEST.txt must not be empty.>&2
|
||||
goto :cleanup
|
||||
)
|
||||
for %%N in (PYTHON-NOTICE.txt PYINSTALLER-NOTICE.txt QT-NOTICE.txt) do (
|
||||
if not exist "%ZUPT_WINDOWS_RUNTIME_NOTICES_DIR%\%%N" (
|
||||
echo ERROR: runtime notice directory is missing %%N.>&2
|
||||
goto :cleanup
|
||||
)
|
||||
for %%I in ("%ZUPT_WINDOWS_RUNTIME_NOTICES_DIR%\%%N") do if %%~zI LEQ 0 (
|
||||
echo ERROR: runtime notice %%N must not be empty.>&2
|
||||
goto :cleanup
|
||||
)
|
||||
)
|
||||
set "QT_BINDING_NOTICE_FOUND="
|
||||
for %%N in (PYSIDE6-NOTICE.txt PYQT6-NOTICE.txt) do if exist "%ZUPT_WINDOWS_RUNTIME_NOTICES_DIR%\%%N" (
|
||||
for %%I in ("%ZUPT_WINDOWS_RUNTIME_NOTICES_DIR%\%%N") do if %%~zI GTR 0 set "QT_BINDING_NOTICE_FOUND=1"
|
||||
)
|
||||
if not defined QT_BINDING_NOTICE_FOUND (
|
||||
echo ERROR: runtime notices need non-empty PYSIDE6-NOTICE.txt or PYQT6-NOTICE.txt.>&2
|
||||
goto :cleanup
|
||||
)
|
||||
|
||||
REM ── Step 2: Build .exe with PyInstaller ──
|
||||
echo [2/4] Building ZuptGUI.exe...
|
||||
if exist dist rmdir /s /q dist
|
||||
if exist build rmdir /s /q build
|
||||
mkdir "%WORK%" || goto :cleanup
|
||||
if not exist "%ZUPT_DIST_DIR%" mkdir "%ZUPT_DIST_DIR%" || goto :cleanup
|
||||
|
||||
pyinstaller --onefile --windowed ^
|
||||
--name "ZuptGUI" ^
|
||||
--icon "..\..\assets\zupt.ico" ^
|
||||
--add-data "..\..\assets\zupt.ico;assets" ^
|
||||
--add-data "..\..\assets\zupt.png;assets" ^
|
||||
"..\..\src\zupt_gui.py"
|
||||
|
||||
if not exist "dist\ZuptGUI.exe" (
|
||||
echo ERROR: PyInstaller build failed.
|
||||
pause
|
||||
exit /b 1
|
||||
"%ZUPT_CLI_EXE%" version >"%WORK%\cli-version.txt" 2>&1 || goto :cleanup
|
||||
findstr /b /c:"zupt %VERSION%" "%WORK%\cli-version.txt" >nul || (
|
||||
echo ERROR: CLI version does not match %VERSION%.>&2
|
||||
goto :cleanup
|
||||
)
|
||||
echo Built: dist\ZuptGUI.exe
|
||||
"%ZUPT_CLI_EXE%" help >nul 2>&1 || goto :cleanup
|
||||
|
||||
REM ── Step 3: Check for zupt.exe ──
|
||||
echo [3/4] Checking for zupt.exe...
|
||||
if not exist "zupt.exe" (
|
||||
echo.
|
||||
echo WARNING: zupt.exe not found in this directory.
|
||||
echo The installer needs zupt.exe to bundle the CLI tool.
|
||||
echo Options:
|
||||
echo a) Copy zupt.exe here and re-run this script
|
||||
echo b) Build zupt from source with MSYS2/MinGW:
|
||||
echo pacman -S mingw-w64-x86_64-gcc make
|
||||
echo cd zupt-2.1.6 ^&^& make
|
||||
echo cp zupt.exe packaging/windows/
|
||||
echo.
|
||||
)
|
||||
pyinstaller --noconfirm --clean --onefile --windowed ^
|
||||
--name zupt-gui ^
|
||||
--icon "%REPO_ROOT%\gui\assets\zupt.ico" ^
|
||||
--add-data "%REPO_ROOT%\gui\assets\zupt.ico;assets" ^
|
||||
--add-data "%REPO_ROOT%\gui\assets\zupt-icon.png;assets" ^
|
||||
--distpath "%WORK%\dist" ^
|
||||
--workpath "%WORK%\build" ^
|
||||
--specpath "%WORK%" ^
|
||||
"%REPO_ROOT%\gui\src\zupt_gui.py" || goto :cleanup
|
||||
|
||||
REM ── Step 4: Build NSIS installer ──
|
||||
echo [4/4] Building installer...
|
||||
where makensis >nul 2>&1
|
||||
if errorlevel 1 (
|
||||
echo.
|
||||
echo NSIS not found. Install from: https://nsis.sourceforge.io
|
||||
echo Then run: makensis zupt-installer.nsi
|
||||
echo.
|
||||
echo Standalone exe ready at: dist\ZuptGUI.exe
|
||||
pause
|
||||
exit /b 0
|
||||
)
|
||||
set "GUI_EXE=%WORK%\dist\zupt-gui.exe"
|
||||
if not exist "%GUI_EXE%" goto :cleanup
|
||||
set "ZUPT_BIN=%ZUPT_CLI_EXE%"
|
||||
"%GUI_EXE%" --version >"%WORK%\gui-version.txt" 2>&1 || goto :cleanup
|
||||
findstr /b /c:"zupt-gui %VERSION%" "%WORK%\gui-version.txt" >nul || goto :cleanup
|
||||
|
||||
makensis zupt-installer.nsi
|
||||
if errorlevel 1 (
|
||||
echo ERROR: NSIS build failed.
|
||||
pause
|
||||
exit /b 1
|
||||
)
|
||||
ISCC.exe "/DAppVersion=%VERSION%" "/DGuiExecutable=%GUI_EXE%" ^
|
||||
"/DCliExecutable=%ZUPT_CLI_EXE%" "/DBuildOutputDir=%ZUPT_DIST_DIR%" ^
|
||||
"/DRuntimeNoticesDir=%ZUPT_WINDOWS_RUNTIME_NOTICES_DIR%" ^
|
||||
"%REPO_ROOT%\packaging\windows\zupt-gui.iss" || goto :cleanup
|
||||
|
||||
echo.
|
||||
echo ════════════════════════════════════════════
|
||||
echo Build complete!
|
||||
echo Standalone: dist\ZuptGUI.exe
|
||||
echo Installer: ZuptGUI-2.1.6-Setup.exe
|
||||
echo ════════════════════════════════════════════
|
||||
echo.
|
||||
pause
|
||||
if not exist "%ZUPT_DIST_DIR%\ZUPT-Setup-%VERSION%.exe" goto :cleanup
|
||||
echo PASS: built %ZUPT_DIST_DIR%\ZUPT-Setup-%VERSION%.exe
|
||||
set "RC=0"
|
||||
|
||||
:cleanup
|
||||
if exist "%WORK%" rmdir /s /q "%WORK%"
|
||||
endlocal & exit /b %RC%
|
||||
|
|
|
|||
Loading…
Reference in a new issue