mirror of
https://github.com/amnezia-vpn/amnezia-client.git
synced 2026-06-21 02:01:03 +07:00
148 lines
4.5 KiB
Batchfile
148 lines
4.5 KiB
Batchfile
|
|
@echo off
|
||
|
|
setlocal EnableDelayedExpansion
|
||
|
|
|
||
|
|
set "PROJECT_DIR=%cd%"
|
||
|
|
set "BUILD_DIR=%PROJECT_DIR%\deploy\build"
|
||
|
|
|
||
|
|
:parse_args
|
||
|
|
if "%~1"=="" goto :done_args
|
||
|
|
if /i "%~1" == "-i" set "ARG_BUILD_INSTALLERS=!ARG_BUILD_INSTALLERS! %~2" & shift
|
||
|
|
if /i "%~1" == "--installer" set "ARG_BUILD_INSTALLERS=!ARG_BUILD_INSTALLERS! %~2" & shift
|
||
|
|
if /i "%~1" == "-arch" set "ARCH=%~2" & shift
|
||
|
|
if /i "%~1" == "--architecture" set "ARCH=%~2" & shift
|
||
|
|
shift
|
||
|
|
goto :parse_args
|
||
|
|
:done_args
|
||
|
|
|
||
|
|
if defined ARG_BUILD_INSTALLERS set "ARG_BUILD_INSTALLERS=%ARG_BUILD_INSTALLERS:all=ifw wix%"
|
||
|
|
|
||
|
|
:: understand toolchain arch (host_target) and Qt prefix path
|
||
|
|
if not defined ARCH set "ARCH=%PROCESSOR_ARCHITECTURE%"
|
||
|
|
if /i "%ARCH%" == "x64" set "ARCH=amd64"
|
||
|
|
if /i "%ARCH%" == "amd64" (
|
||
|
|
if /i "%PROCESSOR_ARCHITECTURE%" == "AMD64" set "_vcvars_arg=amd64"
|
||
|
|
if /i "%PROCESSOR_ARCHITECTURE%" == "x86" set "_vcvars_arg=x86_amd64"
|
||
|
|
set "_qt_postfix_arg=64"
|
||
|
|
)
|
||
|
|
if /i "%ARCH%" == "arm64" (
|
||
|
|
if /i "%PROCESSOR_ARCHITECTURE%" == "AMD64" set "_vcvars_arg=amd64_arm64"
|
||
|
|
if /i "%PROCESSOR_ARCHITECTURE%" == "x86" set "_vcvars_arg=x86_arm64"
|
||
|
|
set "_qt_postfix_arg=arm64"
|
||
|
|
)
|
||
|
|
if not defined _vcvars_arg (
|
||
|
|
echo ERROR: Unsupported architecture "%ARCH%"
|
||
|
|
goto :fail
|
||
|
|
)
|
||
|
|
|
||
|
|
if not defined QT_VERSION set "QT_VERSION=6.*"
|
||
|
|
if not defined QIF_VERSION set "QIF_VERSION=*"
|
||
|
|
|
||
|
|
set "_qt_bases=%USERPROFILE%\Qt C:\Qt"
|
||
|
|
if defined QT_INSTALL_DIR set "_qt_bases=%QT_INSTALL_DIR%\Qt %_qt_bases%"
|
||
|
|
|
||
|
|
:: search over Qt dirs to find framework and tools paths
|
||
|
|
for %%B in (%_qt_bases%) do (
|
||
|
|
if exist "%%~B" (
|
||
|
|
for /d %%D in (%%~B\%QT_VERSION%) do (
|
||
|
|
if not defined _qt_root_path (
|
||
|
|
set "_qt_root_path=%%D"
|
||
|
|
) else (
|
||
|
|
for %%I in (!_qt_root_path!) do call :compare_versions "%%~nxI" "%%~nxD"
|
||
|
|
if errorlevel 1 set "_qt_root_path=%%D"
|
||
|
|
)
|
||
|
|
)
|
||
|
|
|
||
|
|
for /d %%D in (%%~B\Tools\QtInstallerFramework\%QIF_VERSION%) do (
|
||
|
|
if not defined _qif_root_path (
|
||
|
|
set "_qif_root_path=%%D"
|
||
|
|
) else (
|
||
|
|
for %%I in (!_qif_root_path!) do call :compare_versions "%%~nxI" "%%~nxD"
|
||
|
|
if errorlevel 1 set "_qif_root_path=%%D"
|
||
|
|
)
|
||
|
|
)
|
||
|
|
|
||
|
|
if exist "%%~B\Tools\Ninja" set "PATH=%PATH%;%%~B\Tools\Ninja"
|
||
|
|
)
|
||
|
|
)
|
||
|
|
|
||
|
|
if not defined QT_ROOT_PATH set "QT_ROOT_PATH=%_qt_root_path%"
|
||
|
|
if not defined QIF_ROOT_PATH set "QIF_ROOT_PATH=%_qif_root_path%"
|
||
|
|
|
||
|
|
:: use vswhere to find path to vcvarsall.bat
|
||
|
|
if not defined VCINSTALLDIR (
|
||
|
|
if not defined VS_INSTALLER_PATH set "VS_INSTALLER_PATH=%ProgramFiles(x86)%\Microsoft Visual Studio\Installer\vswhere.exe"
|
||
|
|
if exist "%VS_INSTALLER_PATH%" (
|
||
|
|
if defined "%VS_INSTALLATION_VERSION%" (
|
||
|
|
set "_version=-version [%VS_INSTALLATION_VERSION%]"
|
||
|
|
) else (
|
||
|
|
set "_version=-latest"
|
||
|
|
)
|
||
|
|
for /f "usebackq tokens=*" %%I in (
|
||
|
|
`"%VS_INSTALLER_PATH%" -products * %_version% -property resolvedInstallationPath`
|
||
|
|
) do (
|
||
|
|
if not defined VCVARS_PATH set "VCVARS_PATH=%%I\VC\Auxiliary\Build\vcvarsall.bat"
|
||
|
|
)
|
||
|
|
)
|
||
|
|
)
|
||
|
|
|
||
|
|
:: setup MSVC toolchain using vsvarsall.bat
|
||
|
|
if exist "%VCVARS_PATH%" (
|
||
|
|
@echo on
|
||
|
|
call "%VCVARS_PATH%" %_vcvars_arg%
|
||
|
|
@echo off
|
||
|
|
if errorlevel 1 goto :fail
|
||
|
|
)
|
||
|
|
|
||
|
|
:: build project and installers
|
||
|
|
@echo on
|
||
|
|
cmake -S "%PROJECT_DIR%" -B "%BUILD_DIR%" -DCMAKE_BUILD_TYPE=Release "-DCMAKE_PREFIX_PATH=%QT_ROOT_PATH%\msvc2022_%_qt_postfix_arg%" "-DCMAKE_VS_GLOBALS=UseMultiToolTask=true;EnforceProcessCountAcrossBuilds=true" || goto :fail
|
||
|
|
cmake --build "%BUILD_DIR%" --config Release -- /m || goto :fail
|
||
|
|
@echo off
|
||
|
|
for %%I in (%ARG_BUILD_INSTALLERS%) do (
|
||
|
|
if /i "%%I" == "ifw" call :do_ifw
|
||
|
|
if /i "%%I" == "wix" call :do_wix
|
||
|
|
if errorlevel 1 goto :fail
|
||
|
|
)
|
||
|
|
goto :eof
|
||
|
|
|
||
|
|
:: bakes IFW installer
|
||
|
|
:do_ifw
|
||
|
|
@echo on
|
||
|
|
cd "%BUILD_DIR%" && cpack -G IFW -D "QTIFWDIR=%QIF_ROOT_PATH%" || goto :fail
|
||
|
|
@echo off
|
||
|
|
goto :eof
|
||
|
|
|
||
|
|
:: bakes WIX installer
|
||
|
|
:do_wix
|
||
|
|
@echo on
|
||
|
|
cd "%BUILD_DIR%" && cpack -G WIX -D "WIX_BIN_DIR=%WIX_ROOT_PATH%" || goto :fail
|
||
|
|
@echo off
|
||
|
|
goto :eof
|
||
|
|
|
||
|
|
:fail
|
||
|
|
exit /b 1
|
||
|
|
|
||
|
|
:: compares any two versions
|
||
|
|
:compare_versions
|
||
|
|
set "_left=%~1"
|
||
|
|
set "_right=%~2"
|
||
|
|
|
||
|
|
set "_left_temp=%_left%"
|
||
|
|
set "_right_temp=%_right%"
|
||
|
|
|
||
|
|
:seg_loop
|
||
|
|
set "_ls=0"
|
||
|
|
for /f "tokens=1* delims=." %%A in ("%_left_temp%") do (
|
||
|
|
set "_ls=%%A" & set "_left_temp=%%B"
|
||
|
|
)
|
||
|
|
set "_rs=0"
|
||
|
|
for /f "tokens=1* delims=." %%A in ("%_right_temp%") do (
|
||
|
|
set "_rs=%%A" & set "_right_temp=%%B"
|
||
|
|
)
|
||
|
|
|
||
|
|
if %_rs% GTR %_ls% exit /b 1
|
||
|
|
if %_rs% LSS %_ls% exit /b -1
|
||
|
|
if defined _left_temp goto :seg_loop
|
||
|
|
if defined _right_temp goto :seg_loop
|
||
|
|
exit /b 0
|