tdesktop/Telegram/build/build.bat

387 lines
12 KiB
Batchfile

@echo OFF
setlocal enabledelayedexpansion
set "FullScriptPath=%~dp0"
set "FullExecPath=%cd%"
if not exist "%FullScriptPath%..\..\..\DesktopPrivate" (
echo.
echo This script is for building the production version of Telegram Desktop.
echo.
echo For building custom versions please visit the build instructions page at:
echo https://github.com/telegramdesktop/tdesktop/#build-instructions
exit /b
)
FOR /F "tokens=1* delims= " %%i in (%FullScriptPath%target) do set "BuildTarget=%%i"
if "%BuildTarget%" equ "uwp" (
set "BuildUWP=1"
) else if "%BuildTarget%" equ "uwp64" (
set "BuildUWP=1"
) else (
set "BuildUWP=0"
)
if "%BuildTarget%" equ "win64" (
set "Build64=1"
) else if "%BuildTarget%" equ "uwp64" (
set "Build64=1"
) else (
set "Build64=0"
)
if %Build64% neq 0 (
if "%Platform%" neq "x64" (
echo Bad environment. Make sure to run from 'x64 Native Tools Command Prompt for VS 2019'.
exit /b
) else if "%VSCMD_ARG_HOST_ARCH%" neq "x64" (
echo Bad environment. Make sure to run from 'x64 Native Tools Command Prompt for VS 2019'.
exit /b
) else if "%VSCMD_ARG_TGT_ARCH%" neq "x64" (
echo Bad environment. Make sure to run from 'x64 Native Tools Command Prompt for VS 2019'.
exit /b
)
) else (
if "%Platform%" neq "x86" (
echo Bad environment. Make sure to run from 'x86 Native Tools Command Prompt for VS 2019'.
exit /b
) else if "%VSCMD_ARG_HOST_ARCH%" neq "x86" (
echo Bad environment. Make sure to run from 'x86 Native Tools Command Prompt for VS 2019'.
exit /b
) else if "%VSCMD_ARG_TGT_ARCH%" neq "x86" (
echo Bad environment. Make sure to run from 'x86 Native Tools Command Prompt for VS 2019'.
exit /b
)
)
FOR /F "tokens=1,2* delims= " %%i in (%FullScriptPath%version) do set "%%i=%%j"
set "VersionForPacker=%AppVersion%"
if %AlphaVersion% neq 0 (
set "AppVersion=%AlphaVersion%"
set "AppVersionStrFull=%AppVersionStr%_%AlphaVersion%"
set "AlphaBetaParam=-alpha %AlphaVersion%"
set "AlphaKeyFile=talpha_%AlphaVersion%_key"
) else (
if %BetaChannel% neq 0 (
set "AlphaBetaParam=-beta"
set "AppVersionStrFull=%AppVersionStr%.beta"
) else (
set "AlphaBetaParam="
set "AppVersionStrFull=%AppVersionStr%"
)
)
echo.
if %BuildUWP% neq 0 (
if %Build64% neq 0 (
echo Building version %AppVersionStrFull% for UWP 64 bit..
) else (
echo Building version %AppVersionStrFull% for UWP..
)
) else (
if %Build64% neq 0 (
echo Building version %AppVersionStrFull% for Windows 64 bit..
) else (
echo Building version %AppVersionStrFull% for Windows..
)
)
echo.
set "HomePath=%FullScriptPath%.."
set "ResourcesPath=%HomePath%\Resources"
set "SolutionPath=%HomePath%\..\out"
if %Build64% neq 0 (
set "UpdateFile=tx64upd%AppVersion%"
set "SetupFile=tsetup-x64.%AppVersionStrFull%.exe"
set "PortableFile=tportable-x64.%AppVersionStrFull%.zip"
set "DumpSymsPath=%SolutionPath%\..\..\Libraries\win64\breakpad\src\tools\windows\dump_syms\Release\dump_syms.exe"
) else (
set "UpdateFile=tupdate%AppVersion%"
set "SetupFile=tsetup.%AppVersionStrFull%.exe"
set "PortableFile=tportable.%AppVersionStrFull%.zip"
set "DumpSymsPath=%SolutionPath%\..\..\Libraries\breakpad\src\tools\windows\dump_syms\Release\dump_syms.exe"
)
set "ReleasePath=%SolutionPath%\Release"
set "DeployPath=%ReleasePath%\deploy\%AppVersionStrMajor%\%AppVersionStrFull%"
set "SignPath=%HomePath%\..\..\DesktopPrivate\Sign.bat"
set "BinaryName=Telegram"
set "DropboxSymbolsPath=Y:\Telegram\symbols"
set "DropboxSymbolsPathFallback=%HomePath%\..\..\Dropbox\Telegram\symbols"
set "FinalReleasePath=Z:\Projects\backup\tdesktop"
set "FinalReleasePathFallback=%HomePath%\..\..\Projects\backup\tdesktop"
if not exist %DropboxSymbolsPath% (
if exist %DropboxSymbolsPathFallback% (
set "DropboxSymbolsPath=%DropboxSymbolsPathFallback%"
) else (
echo Dropbox path %DropboxSymbolsPath% not found!
exit /b 1
)
)
if not exist %FinalReleasePath% (
if exist %FinalReleasePathFallback% (
set "FinalReleasePath=%FinalReleasePathFallback%"
) else (
echo Release path %FinalReleasePath% not found!
exit /b 1
)
)
if %BuildUWP% neq 0 (
if exist %ReleasePath%\AppX\ (
echo Result folder out\Release\AppX already exists!
exit /b 1
)
)
if %AlphaVersion% neq 0 (
if exist %DeployPath%\ (
echo Deploy folder for version %AppVersionStr% already exists!
exit /b 1
)
if exist %ReleasePath%\%AlphaKeyFile% (
echo Alpha version key file for version %AppVersion% already exists!
exit /b 1
)
) else (
if exist %ReleasePath%\deploy\%AppVersionStrMajor%\%AppVersionStr%.alpha\ (
echo Deploy folder for version %AppVersionStr%.alpha already exists!
exit /b 1
)
if exist %ReleasePath%\deploy\%AppVersionStrMajor%\%AppVersionStr%.beta\ (
echo Deploy folder for version %AppVersionStr%.beta already exists!
exit /b 1
)
if exist %ReleasePath%\deploy\%AppVersionStrMajor%\%AppVersionStr%\ (
echo Deploy folder for version %AppVersionStr% already exists!
exit /b 1
)
if exist %ReleasePath%\tupdate%AppVersion% (
echo Update file for version %AppVersion% already exists!
exit /b 1
)
)
cd "%HomePath%"
call configure.bat
if %errorlevel% neq 0 goto error
cd "%SolutionPath%"
call cmake --build . --config Release --target Telegram
if %errorlevel% neq 0 goto error
echo.
echo Version %AppVersionStrFull% build successfull. Preparing..
echo.
if not exist "%DumpSymsPath%" (
echo Utility dump_syms not found!
exit /b 1
)
echo Dumping debug symbols..
call "%DumpSymsPath%" "%ReleasePath%\%BinaryName%.pdb" > "%ReleasePath%\%BinaryName%.sym"
echo Done!
set "PATH=%PATH%;C:\Program Files\7-Zip;C:\Program Files (x86)\Inno Setup 5"
cd "%ReleasePath%"
:sign1
call "%SignPath%" "%BinaryName%.exe"
if %errorlevel% neq 0 (
timeout /t 3
goto sign1
)
if %BuildUWP% equ 0 (
:sign2
call "%SignPath%" "Updater.exe"
if %errorlevel% neq 0 (
timeout /t 3
goto sign2
)
if %AlphaVersion% equ 0 (
iscc /dMyAppVersion=%AppVersionStrSmall% /dMyAppVersionZero=%AppVersionStr% /dMyAppVersionFull=%AppVersionStrFull% "/dReleasePath=%ReleasePath%" "/dMyBuildTarget=%BuildTarget%" "%FullScriptPath%setup.iss"
if %errorlevel% neq 0 goto error
if not exist "%SetupFile%" goto error
:sign3
call "%SignPath%" "%SetupFile%"
if %errorlevel% neq 0 (
timeout /t 3
goto sign3
)
)
call Packer.exe -version %VersionForPacker% -path %BinaryName%.exe -path Updater.exe -path "modules\%Platform%\d3d\d3dcompiler_47.dll" -target %BuildTarget% %AlphaBetaParam%
if %errorlevel% neq 0 goto error
if %AlphaVersion% neq 0 (
if not exist "%ReleasePath%\%AlphaKeyFile%" (
echo Alpha version key file not found!
exit /b 1
)
FOR /F "tokens=1* delims= " %%i in (%ReleasePath%\%AlphaKeyFile%) do set "AlphaSignature=%%i"
)
if %errorlevel% neq 0 goto error
if %AlphaVersion% neq 0 (
set "UpdateFile=!UpdateFile!_!AlphaSignature!"
set "PortableFile=talpha!AlphaVersion!_!AlphaSignature!.zip"
)
) else (
:sign2
call "%SignPath%" "StartupTask.exe"
if %errorlevel% neq 0 (
timeout /t 3
goto sign2
)
)
for /f ^"usebackq^ eol^=^
^ delims^=^" %%a in (%ReleasePath%\%BinaryName%.sym) do (
set "SymbolsHashLine=%%a"
goto symbolslinedone
)
:symbolslinedone
FOR /F "tokens=1,2,3,4* delims= " %%i in ("%SymbolsHashLine%") do set "SymbolsHash=%%l"
echo Copying %BinaryName%.sym to %DropboxSymbolsPath%\%BinaryName%.pdb\%SymbolsHash%
if not exist %DropboxSymbolsPath%\%BinaryName%.pdb mkdir %DropboxSymbolsPath%\%BinaryName%.pdb
if not exist %DropboxSymbolsPath%\%BinaryName%.pdb\%SymbolsHash% mkdir %DropboxSymbolsPath%\%BinaryName%.pdb\%SymbolsHash%
move "%ReleasePath%\%BinaryName%.sym" %DropboxSymbolsPath%\%BinaryName%.pdb\%SymbolsHash%\
echo Done!
if %BuildUWP% neq 0 (
cd "%HomePath%"
mkdir "%ReleasePath%\AppX\modules\%Platform%\d3d"
xcopy "Resources\uwp\AppX\*" "%ReleasePath%\AppX\" /E
set "ResourcePath=%ReleasePath%\AppX\AppxManifest.xml"
call :repl "Argument= (ProcessorArchitecture=)"ARCHITECTURE"/ $1"%Platform%"" "Filename=!ResourcePath!" || goto error
makepri new /pr Resources\uwp\AppX\ /cf Resources\uwp\priconfig.xml /mn %ReleasePath%\AppX\AppxManifest.xml /of %ReleasePath%\AppX\resources.pri
if %errorlevel% neq 0 goto error
xcopy "%ReleasePath%\%BinaryName%.exe" "%ReleasePath%\AppX\"
xcopy "%ReleasePath%\StartupTask.exe" "%ReleasePath%\AppX\"
xcopy "%ReleasePath%\modules\%Platform%\d3d\d3dcompiler_47.dll" "%ReleasePath%\AppX\modules\%Platform%\d3d\"
MakeAppx.exe pack /d "%ReleasePath%\AppX" /l /p ..\out\Release\%BinaryName%.%Platform%.appx
if %errorlevel% neq 0 goto error
if not exist "%ReleasePath%\deploy" mkdir "%ReleasePath%\deploy"
if not exist "%ReleasePath%\deploy\%AppVersionStrMajor%" mkdir "%ReleasePath%\deploy\%AppVersionStrMajor%"
mkdir "%DeployPath%"
move "%ReleasePath%\%BinaryName%.pdb" "%DeployPath%\"
move "%ReleasePath%\%BinaryName%.%Platform%.appx" "%DeployPath%\"
move "%ReleasePath%\%BinaryName%.exe" "%DeployPath%\"
if "%AlphaBetaParam%" equ "" (
move "%ReleasePath%\AppX" "%DeployPath%\AppX"
) else (
echo Leaving result in out\Release\AppX_arch for now..
)
) else (
if not exist "%ReleasePath%\deploy" mkdir "%ReleasePath%\deploy"
if not exist "%ReleasePath%\deploy\%AppVersionStrMajor%" mkdir "%ReleasePath%\deploy\%AppVersionStrMajor%"
mkdir "%DeployPath%\%BinaryName%\modules\%Platform%\d3d"
if %errorlevel% neq 0 goto error
move "%ReleasePath%\%BinaryName%.exe" "%DeployPath%\%BinaryName%\"
xcopy "%ReleasePath%\modules\%Platform%\d3d\d3dcompiler_47.dll" "%DeployPath%\%BinaryName%\modules\%Platform%\d3d\"
move "%ReleasePath%\Updater.exe" "%DeployPath%\"
move "%ReleasePath%\%BinaryName%.pdb" "%DeployPath%\"
move "%ReleasePath%\Updater.pdb" "%DeployPath%\"
if %AlphaVersion% equ 0 (
move "%ReleasePath%\%SetupFile%" "%DeployPath%\"
) else (
move "%ReleasePath%\%AlphaKeyFile%" "%DeployPath%\"
)
move "%ReleasePath%\%UpdateFile%" "%DeployPath%\"
if %errorlevel% neq 0 goto error
cd "%DeployPath%"
7z a -mx9 %PortableFile% %BinaryName%\
if %errorlevel% neq 0 goto error
move "%DeployPath%\%BinaryName%\%BinaryName%.exe" "%DeployPath%\"
rmdir "%DeployPath%\%BinaryName%"
if %errorlevel% neq 0 goto error
)
if %Build64% equ 0 (
set "FinalDeployPath=%FinalReleasePath%\%AppVersionStrMajor%\%AppVersionStrFull%\tsetup"
) else (
set "FinalDeployPath=%FinalReleasePath%\%AppVersionStrMajor%\%AppVersionStrFull%\tx64"
)
if %BuildUWP% equ 0 (
echo.
echo Version %AppVersionStrFull% is ready for deploy!
echo.
if not exist "%DeployPath%\%UpdateFile%" goto error
if not exist "%DeployPath%\%PortableFile%" goto error
if %AlphaVersion% equ 0 (
if not exist "%DeployPath%\%SetupFile%" goto error
)
if not exist "%DeployPath%\%BinaryName%.pdb" goto error
if not exist "%DeployPath%\Updater.exe" goto error
if not exist "%DeployPath%\Updater.pdb" goto error
md "%FinalDeployPath%"
xcopy "%DeployPath%\%UpdateFile%" "%FinalDeployPath%\" /Y
xcopy "%DeployPath%\%PortableFile%" "%FinalDeployPath%\" /Y
if %AlphaVersion% equ 0 (
xcopy "%DeployPath%\%SetupFile%" "%FinalDeployPath%\" /Y
) else (
xcopy "%DeployPath%\%AlphaKeyFile%" "%FinalDeployPath%\" /Y
)
)
echo Version %AppVersionStrFull% is ready!
cd "%FullExecPath%"
exit /b
:error
(
set ErrorCode=%errorlevel%
if !ErrorCode! neq 0 (
echo Error !ErrorCode!
) else (
echo Error 666
set ErrorCode=666
)
cd "%FullExecPath%"
exit /b !ErrorCode!
)
:repl
(
set %1
set %2
set "TempFilename=!Filename!__tmp__"
cscript //Nologo "%FullScriptPath%replace.vbs" "Replace" "!Argument!" < "!Filename!" > "!TempFilename!" || goto :repl_finish
xcopy /Y !TempFilename! !Filename! >NUL || goto :repl_finish
goto :repl_finish
)
:repl_finish
(
set ErrorCode=%errorlevel%
if !ErrorCode! neq 0 (
echo Replace error !ErrorCode!
echo While replacing "%Replace%"
echo In file "%Filename%"
)
del %TempFilename%
exit /b !ErrorCode!
)