tdesktop/Telegram/build/build.sh

492 lines
17 KiB
Bash
Executable File

set -e
FullExecPath=$PWD
pushd `dirname $0` > /dev/null
FullScriptPath=`pwd`
popd > /dev/null
if [ ! -d "$FullScriptPath/../../../DesktopPrivate" ]; then
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
fi
if [ "$1" == "request_uuid" ]; then
if [ "$2" != "" ]; then
NotarizeRequestId="$2"
fi
fi
Error () {
cd $FullExecPath
echo "$1"
exit 1
}
if [ ! -f "$FullScriptPath/target" ]; then
Error "Build target not found!"
fi
while IFS='' read -r line || [[ -n "$line" ]]; do
BuildTarget="$line"
done < "$FullScriptPath/target"
while IFS='' read -r line || [[ -n "$line" ]]; do
set $line
eval $1="$2"
done < "$FullScriptPath/version"
VersionForPacker="$AppVersion"
if [ "$AlphaVersion" != "0" ]; then
AppVersion="$AlphaVersion"
AppVersionStrFull="${AppVersionStr}_${AlphaVersion}"
AlphaBetaParam="-alpha $AlphaVersion"
AlphaKeyFile="talpha_${AppVersion}_key"
elif [ "$BetaChannel" == "0" ]; then
AppVersionStrFull="$AppVersionStr"
AlphaBetaParam=''
else
AppVersionStrFull="$AppVersionStr.beta"
AlphaBetaParam='-beta'
fi
echo ""
HomePath="$FullScriptPath/.."
if [ "$BuildTarget" == "linux" ]; then
echo "Building version $AppVersionStrFull for Linux 64bit.."
UpdateFile="tlinuxupd$AppVersion"
SetupFile="tsetup.$AppVersionStrFull.tar.xz"
ProjectPath="$HomePath/../out"
ReleasePath="$ProjectPath/Release"
BinaryName="Telegram"
elif [ "$BuildTarget" == "mac" ]; then
echo "Building version $AppVersionStrFull for macOS 10.12+.."
if [ "$AC_USERNAME" == "" ]; then
Error "AC_USERNAME not found!"
fi
UpdateFile="tmacupd$AppVersion"
SetupFile="tsetup.$AppVersionStrFull.dmg"
ProjectPath="$HomePath/../out"
ReleasePath="$ProjectPath/Release"
BinaryName="Telegram"
elif [ "$BuildTarget" == "macstore" ]; then
if [ "$AlphaVersion" != "0" ]; then
Error "Can't build macstore alpha version!"
fi
echo "Building version $AppVersionStrFull for Mac App Store.."
ProjectPath="$HomePath/../out"
ReleasePath="$ProjectPath/Release"
BinaryName="Telegram Lite"
else
Error "Invalid target!"
fi
if [ "$AlphaVersion" != "0" ]; then
if [ -d "$ReleasePath/deploy/$AppVersionStrMajor/$AppVersionStrFull" ]; then
Error "Deploy folder for version $AppVersionStrFull already exists!"
fi
else
if [ -d "$ReleasePath/deploy/$AppVersionStrMajor/$AppVersionStr.alpha" ]; then
Error "Deploy folder for version $AppVersionStr.alpha already exists!"
fi
if [ -d "$ReleasePath/deploy/$AppVersionStrMajor/$AppVersionStr.beta" ]; then
Error "Deploy folder for version $AppVersionStr.beta already exists!"
fi
if [ -d "$ReleasePath/deploy/$AppVersionStrMajor/$AppVersionStr" ]; then
Error "Deploy folder for version $AppVersionStr already exists!"
fi
if [ -f "$ReleasePath/$UpdateFile" ]; then
Error "Update file for version $AppVersion already exists!"
fi
fi
DeployPath="$ReleasePath/deploy/$AppVersionStrMajor/$AppVersionStrFull"
if [ "$BuildTarget" == "linux" ]; then
DropboxSymbolsPath="/media/psf/Dropbox/Telegram/symbols"
if [ ! -d "$DropboxSymbolsPath" ]; then
Error "Dropbox path not found!"
fi
BackupPath="/media/psf/backup/tdesktop/$AppVersionStrMajor/$AppVersionStrFull/t$BuildTarget"
if [ ! -d "/media/psf/backup/tdesktop" ]; then
Error "Backup folder not found!"
fi
./build/docker/centos_env/run.sh /usr/src/tdesktop/Telegram/build/docker/build.sh
echo "Copying from docker result folder."
cp "$ReleasePath/root/$BinaryName" "$ReleasePath/$BinaryName"
cp "$ReleasePath/root/Updater" "$ReleasePath/Updater"
cp "$ReleasePath/root/Packer" "$ReleasePath/Packer"
echo "Dumping debug symbols.."
"$ReleasePath/dump_syms" "$ReleasePath/$BinaryName" > "$ReleasePath/$BinaryName.sym"
echo "Done!"
echo "Stripping the executable.."
strip -s "$ReleasePath/$BinaryName"
echo "Done!"
echo "Preparing version $AppVersionStrFull, executing Packer.."
cd "$ReleasePath"
"./Packer" -path "$BinaryName" -path Updater -version $VersionForPacker $AlphaBetaParam
echo "Packer done!"
if [ "$AlphaVersion" != "0" ]; then
if [ ! -f "$ReleasePath/$AlphaKeyFile" ]; then
Error "Alpha version key file not found!"
fi
while IFS='' read -r line || [[ -n "$line" ]]; do
AlphaSignature="$line"
done < "$ReleasePath/$AlphaKeyFile"
UpdateFile="${UpdateFile}_${AlphaSignature}"
SetupFile="talpha${AlphaVersion}_${AlphaSignature}.tar.xz"
fi
SymbolsHash=`head -n 1 "$ReleasePath/$BinaryName.sym" | awk -F " " 'END {print $4}'`
echo "Copying $BinaryName.sym to $DropboxSymbolsPath/$BinaryName/$SymbolsHash"
mkdir -p "$DropboxSymbolsPath/$BinaryName/$SymbolsHash"
cp "$ReleasePath/$BinaryName.sym" "$DropboxSymbolsPath/$BinaryName/$SymbolsHash/"
echo "Done!"
if [ ! -d "$ReleasePath/deploy" ]; then
mkdir "$ReleasePath/deploy"
fi
if [ ! -d "$ReleasePath/deploy/$AppVersionStrMajor" ]; then
mkdir "$ReleasePath/deploy/$AppVersionStrMajor"
fi
echo "Copying $BinaryName, Updater and $UpdateFile to deploy/$AppVersionStrMajor/$AppVersionStrFull..";
mkdir "$DeployPath"
mkdir "$DeployPath/$BinaryName"
mv "$ReleasePath/$BinaryName" "$DeployPath/$BinaryName/"
mv "$ReleasePath/Updater" "$DeployPath/$BinaryName/"
mv "$ReleasePath/$UpdateFile" "$DeployPath/"
if [ "$AlphaVersion" != "0" ]; then
mv "$ReleasePath/$AlphaKeyFile" "$DeployPath/"
fi
cd "$DeployPath"
tar -cJvf "$SetupFile" "$BinaryName/"
mkdir -p $BackupPath
cp "$SetupFile" "$BackupPath/"
cp "$UpdateFile" "$BackupPath/"
if [ "$AlphaVersion" != "0" ]; then
cp -v "$AlphaKeyFile" "$BackupPath/"
fi
fi
if [ "$BuildTarget" == "mac" ] || [ "$BuildTarget" == "macstore" ]; then
DropboxSymbolsPath="$HOME/Dropbox/Telegram/symbols"
if [ ! -d "$DropboxSymbolsPath" ]; then
Error "Dropbox path not found!"
fi
BackupPath="$HOME/Projects/backup/tdesktop/$AppVersionStrMajor/$AppVersionStrFull"
if [ ! -d "$HOME/Projects/backup/tdesktop" ]; then
Error "Backup path not found!"
fi
if [ "$NotarizeRequestId" == "" ]; then
if [ -f "$ReleasePath/$BinaryName.app/Contents/Info.plist" ]; then
rm "$ReleasePath/$BinaryName.app/Contents/Info.plist"
fi
if [ -f "$ProjectPath/Telegram/CMakeFiles/Telegram.dir/Info.plist" ]; then
rm "$ProjectPath/Telegram/CMakeFiles/Telegram.dir/Info.plist"
fi
rm -rf "$ReleasePath/$BinaryName.app/Contents/_CodeSignature"
./configure.sh
cd $ProjectPath
cmake --build . --config Release --target Telegram
cd $ReleasePath
if [ ! -d "$ReleasePath/$BinaryName.app" ]; then
Error "$BinaryName.app not found!"
fi
if [ ! -d "$ReleasePath/$BinaryName.app.dSYM" ]; then
Error "$BinaryName.app.dSYM not found!"
fi
if [ "$BuildTarget" == "mac" ]; then
if [ ! -f "$ReleasePath/$BinaryName.app/Contents/Frameworks/Updater" ]; then
Error "Updater not found!"
fi
if [ ! -f "$ReleasePath/$BinaryName.app/Contents/Helpers/crashpad_handler" ]; then
Error "crashpad_handler not found!"
fi
fi
if [ "$BuildTarget" == "macstore" ]; then
if [ ! -d "$ReleasePath/$BinaryName.app/Contents/Frameworks/Breakpad.framework" ]; then
Error "Breakpad.framework not found!"
fi
fi
echo "Dumping debug symbols.."
"$HomePath/../../Libraries/breakpad/src/tools/mac/dump_syms/build/Release/dump_syms" "$ReleasePath/$BinaryName.app.dSYM" > "$ReleasePath/$BinaryName.sym" 2>/dev/null
echo "Done!"
echo "Stripping the executable.."
strip "$ReleasePath/$BinaryName.app/Contents/MacOS/$BinaryName"
echo "Done!"
echo "Signing the application.."
if [ "$BuildTarget" == "mac" ]; then
codesign --force --deep --timestamp --options runtime --sign "Developer ID Application: John Preston" "$ReleasePath/$BinaryName.app" --entitlements "$HomePath/Telegram/Telegram.entitlements"
elif [ "$BuildTarget" == "macstore" ]; then
codesign --force --deep --sign "3rd Party Mac Developer Application: Telegram FZ-LLC (C67CF9S4VU)" "$ReleasePath/$BinaryName.app" --entitlements "$HomePath/Telegram/Telegram Lite.entitlements"
echo "Making an installer.."
productbuild --sign "3rd Party Mac Developer Installer: Telegram FZ-LLC (C67CF9S4VU)" --component "$ReleasePath/$BinaryName.app" /Applications "$ReleasePath/$BinaryName.pkg"
fi
echo "Done!"
AppUUID=`dwarfdump -u "$ReleasePath/$BinaryName.app/Contents/MacOS/$BinaryName" | awk -F " " '{print $2}'`
DsymUUID=`dwarfdump -u "$ReleasePath/$BinaryName.app.dSYM" | awk -F " " '{print $2}'`
if [ "$AppUUID" != "$DsymUUID" ]; then
Error "UUID of binary '$AppUUID' and dSYM '$DsymUUID' differ!"
fi
if [ ! -f "$ReleasePath/$BinaryName.app/Contents/Resources/Icon.icns" ]; then
Error "Icon.icns not found in Resources!"
fi
if [ ! -f "$ReleasePath/$BinaryName.app/Contents/MacOS/$BinaryName" ]; then
Error "$BinaryName not found in MacOS!"
fi
if [ ! -d "$ReleasePath/$BinaryName.app/Contents/_CodeSignature" ]; then
Error "$BinaryName signature not found!"
fi
if [ "$BuildTarget" == "mac" ]; then
if [ ! -f "$ReleasePath/$BinaryName.app/Contents/Frameworks/Updater" ]; then
Error "Updater not found in Frameworks!"
fi
elif [ "$BuildTarget" == "macstore" ]; then
if [ ! -f "$ReleasePath/$BinaryName.pkg" ]; then
Error "$BinaryName.pkg not found!"
fi
fi
SymbolsHash=`head -n 1 "$ReleasePath/$BinaryName.sym" | awk -F " " 'END {print $4}'`
echo "Copying $BinaryName.sym to $DropboxSymbolsPath/$BinaryName/$SymbolsHash"
mkdir -p "$DropboxSymbolsPath/$BinaryName/$SymbolsHash"
cp "$ReleasePath/$BinaryName.sym" "$DropboxSymbolsPath/$BinaryName/$SymbolsHash/"
echo "Done!"
fi
if [ "$BuildTarget" == "mac" ]; then
cd "$ReleasePath"
if [ "$NotarizeRequestId" == "" ]; then
if [ "$AlphaVersion" == "0" ]; then
cp -f tsetup_template.dmg tsetup.temp.dmg
TempDiskPath=`hdiutil attach -nobrowse -noautoopenrw -readwrite tsetup.temp.dmg | awk -F "\t" 'END {print $3}'`
cp -R "./$BinaryName.app" "$TempDiskPath/"
bless --folder "$TempDiskPath/" --openfolder "$TempDiskPath/"
hdiutil detach "$TempDiskPath"
hdiutil convert tsetup.temp.dmg -format UDZO -imagekey zlib-level=9 -ov -o "$SetupFile"
rm tsetup.temp.dmg
fi
fi
if [ "$AlphaVersion" != "0" ]; then
"./Packer" -path "$BinaryName.app" -target "$BuildTarget" -version $VersionForPacker $AlphaBetaParam -alphakey
if [ ! -f "$ReleasePath/$AlphaKeyFile" ]; then
Error "Alpha version key file not found!"
fi
while IFS='' read -r line || [[ -n "$line" ]]; do
AlphaSignature="$line"
done < "$ReleasePath/$AlphaKeyFile"
UpdateFile="${UpdateFile}_${AlphaSignature}"
SetupFile="talpha${AlphaVersion}_${AlphaSignature}.zip"
if [ "$NotarizeRequestId" == "" ]; then
rm -rf "$ReleasePath/AlphaTemp"
mkdir "$ReleasePath/AlphaTemp"
mkdir "$ReleasePath/AlphaTemp/$BinaryName"
cp -r "$ReleasePath/$BinaryName.app" "$ReleasePath/AlphaTemp/$BinaryName/"
cd "$ReleasePath/AlphaTemp"
zip -r "$SetupFile" "$BinaryName"
mv "$SetupFile" "$ReleasePath/"
cd "$ReleasePath"
fi
fi
if [ "$BuildTarget" == "mac" ]; then
if [ "$NotarizeRequestId" == "" ]; then
echo "Beginning notarization process."
set +e
xcrun altool --notarize-app --primary-bundle-id "com.tdesktop.Telegram" --username "$AC_USERNAME" --password "@keychain:AC_PASSWORD" --file "$SetupFile" > request_uuid.txt
set -e
while IFS='' read -r line || [[ -n "$line" ]]; do
Prefix=$(echo $line | cut -d' ' -f 1)
Value=$(echo $line | cut -d' ' -f 3)
if [ "$Prefix" == "RequestUUID" ]; then
RequestUUID=$Value
fi
done < "request_uuid.txt"
if [ "$RequestUUID" == "" ]; then
cat request_uuid.txt
Error "Could not extract Request UUID."
fi
echo "Request UUID: $RequestUUID"
rm request_uuid.txt
else
RequestUUID=$NotarizeRequestId
echo "Continue notarization process with Request UUID: $RequestUUID"
fi
RequestStatus=
LogFile=
while [[ "$RequestStatus" == "" ]]; do
sleep 5
xcrun altool --notarization-info "$RequestUUID" --username "$AC_USERNAME" --password "@keychain:AC_PASSWORD" > request_result.txt
while IFS='' read -r line || [[ -n "$line" ]]; do
Prefix=$(echo $line | cut -d' ' -f 1)
Value=$(echo $line | cut -d' ' -f 2)
if [ "$Prefix" == "LogFileURL:" ]; then
LogFile=$Value
fi
if [ "$Prefix" == "Status:" ]; then
if [ "$Value" == "in" ]; then
echo "In progress..."
else
RequestStatus=$Value
echo "Status: $RequestStatus"
fi
fi
done < "request_result.txt"
done
if [ "$RequestStatus" != "success" ]; then
echo "Notarization problems, response:"
cat request_result.txt
if [ "$LogFile" != "" ]; then
echo "Requesting log: $LogFile"
curl $LogFile
fi
Error "Notarization FAILED."
fi
rm request_result.txt
if [ "$LogFile" != "" ]; then
echo "Requesting log: $LogFile"
curl $LogFile > request_log.txt
fi
xcrun stapler staple "$ReleasePath/$BinaryName.app"
if [ "$AlphaVersion" != "0" ]; then
rm -rf "$ReleasePath/AlphaTemp"
mkdir "$ReleasePath/AlphaTemp"
mkdir "$ReleasePath/AlphaTemp/$BinaryName"
cp -r "$ReleasePath/$BinaryName.app" "$ReleasePath/AlphaTemp/$BinaryName/"
cd "$ReleasePath/AlphaTemp"
zip -r "$SetupFile" "$BinaryName"
mv "$SetupFile" "$ReleasePath/"
cd "$ReleasePath"
echo "Alpha archive re-created."
else
xcrun stapler staple "$ReleasePath/$SetupFile"
fi
fi
"./Packer" -path "$BinaryName.app" -target "$BuildTarget" -version $VersionForPacker $AlphaBetaParam
echo "Packer done!"
fi
if [ ! -d "$ReleasePath/deploy" ]; then
mkdir "$ReleasePath/deploy"
fi
if [ ! -d "$ReleasePath/deploy/$AppVersionStrMajor" ]; then
mkdir "$ReleasePath/deploy/$AppVersionStrMajor"
fi
if [ "$BuildTarget" == "mac" ]; then
echo "Copying $BinaryName.app and $UpdateFile to deploy/$AppVersionStrMajor/$AppVersionStr..";
mkdir "$DeployPath"
mkdir "$DeployPath/$BinaryName"
cp -r "$ReleasePath/$BinaryName.app" "$DeployPath/$BinaryName/"
if [ "$AlphaVersion" != "0" ]; then
mv "$ReleasePath/$AlphaKeyFile" "$DeployPath/"
fi
mv "$ReleasePath/$BinaryName.app.dSYM" "$DeployPath/"
rm "$ReleasePath/$BinaryName.app/Contents/MacOS/$BinaryName"
rm "$ReleasePath/$BinaryName.app/Contents/Frameworks/Updater"
mv "$ReleasePath/$UpdateFile" "$DeployPath/"
mv "$ReleasePath/$SetupFile" "$DeployPath/"
if [ "$BuildTarget" == "mac" ]; then
mkdir -p "$BackupPath/tmac"
cp "$DeployPath/$UpdateFile" "$BackupPath/tmac/"
cp "$DeployPath/$SetupFile" "$BackupPath/tmac/"
if [ "$AlphaVersion" != "0" ]; then
cp -v "$DeployPath/$AlphaKeyFile" "$BackupPath/tmac/"
fi
fi
elif [ "$BuildTarget" == "macstore" ]; then
echo "Copying $BinaryName.app to deploy/$AppVersionStrMajor/$AppVersionStr..";
mkdir "$DeployPath"
cp -r "$ReleasePath/$BinaryName.app" "$DeployPath/"
mv "$ReleasePath/$BinaryName.pkg" "$DeployPath/"
mv "$ReleasePath/$BinaryName.app.dSYM" "$DeployPath/"
rm "$ReleasePath/$BinaryName.app/Contents/MacOS/$BinaryName"
fi
fi
echo "Version $AppVersionStrFull is ready!";
echo -en "\007";
sleep 1;
echo -en "\007";
sleep 1;
echo -en "\007";
if [ "$BuildTarget" == "mac" ]; then
if [ -f "$ReleasePath/request_log.txt" ]; then
DisplayingLog=
while IFS='' read -r line || [[ -n "$line" ]]; do
if [ "$DisplayingLog" == "1" ]; then
echo $line
else
Prefix=$(echo $line | cut -d' ' -f 1)
Value=$(echo $line | cut -d' ' -f 2)
if [ "$Prefix" == '"issues":' ]; then
if [ "$Value" != "null" ]; then
echo "NB! Notarization log issues:"
echo $line
DisplayingLog=1
else
DisplayingLog=0
fi
fi
fi
done < "$ReleasePath/request_log.txt"
if [ "$DisplayingLog" != "0" ] && [ "$DisplayingLog" != "1" ]; then
echo "NB! Notarization issues not found:"
cat "$ReleasePath/request_log.txt"
else
rm "$ReleasePath/request_log.txt"
fi
else
echo "NB! Notarization log not found :("
fi
fi