Choose a folder for the future build, for example /Users/user/TBuild. It will be named BuildPath in the rest of this document. All commands will be launched from Terminal.
Download xz-5.0.5 and unpack to BuildPath/Libraries/xz-5.0.5
Download libiconv-1.15 and unpack to BuildPath/Libraries/libiconv-1.15
Go to BuildPath and run
MACOSX_DEPLOYMENT_TARGET=10.8
ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
brew install automake fdk-aac git lame libass libtool libvorbis libvpx opus sdl shtool texi2html theora wget x264 xvid yasm automake libtool pkg-config
sudo xcode-select -s /Applications/Xcode.app/Contents/Developer
git clone --recursive git@github.com:bettergram/bettergram.git
cd bettergram
git apply Telegram/Patches/libtgvoip.diff
cd ..
cd Libraries
git clone https://github.com/ericniebler/range-v3
cd xz-5.0.5
CFLAGS="-mmacosx-version-min=10.8" LDFLAGS="-mmacosx-version-min=10.8" ./configure
make
sudo make install
cd ..
git clone https://github.com/Kitware/CMake
cd CMake
./bootstrap
make -j4
sudo make install
cd ..
git clone https://github.com/telegramdesktop/zlib.git
cd zlib
CFLAGS="-mmacosx-version-min=10.8" LDFLAGS="-mmacosx-version-min=10.8" ./configure
make -j4
sudo make install
cd ..
git clone https://github.com/openssl/openssl
cd openssl
git checkout OpenSSL_1_0_2-stable
./Configure darwin64-x86_64-cc -static -mmacosx-version-min=10.8
make build_libs -j4
cd ..
git clone https://github.com/xiph/opus
cd opus
git checkout v1.2.1
./autogen.sh
CFLAGS="-mmacosx-version-min=10.8" CPPFLAGS="-mmacosx-version-min=10.8" LDFLAGS="-mmacosx-version-min=10.8" ./configure
make -j4
sudo make install
cd ..
cd libiconv-1.15
CFLAGS="-mmacosx-version-min=10.8" CPPFLAGS="-mmacosx-version-min=10.8" LDFLAGS="-mmacosx-version-min=10.8" ./configure --enable-static
make -j4
sudo make install
cd ..
git clone https://github.com/FFmpeg/FFmpeg.git ffmpeg
cd ffmpeg
git checkout release/3.4
CFLAGS=`freetype-config --cflags`
LDFLAGS=`freetype-config --libs`
PKG_CONFIG_PATH=$PKG_CONFIG_PATH:/usr/local/lib/pkgconfig:/usr/lib/pkgconfig:/usr/X11/lib/pkgconfig
./configure --prefix=/usr/local --disable-programs --disable-doc --disable-everything --enable-protocol=file --enable-libopus --enable-decoder=aac --enable-decoder=aac_latm --enable-decoder=aasc --enable-decoder=flac --enable-decoder=gif --enable-decoder=h264 --enable-decoder=h264_vda --enable-decoder=mp1 --enable-decoder=mp1float --enable-decoder=mp2 --enable-decoder=mp2float --enable-decoder=mp3 --enable-decoder=mp3adu --enable-decoder=mp3adufloat --enable-decoder=mp3float --enable-decoder=mp3on4 --enable-decoder=mp3on4float --enable-decoder=mpeg4 --enable-decoder=msmpeg4v2 --enable-decoder=msmpeg4v3 --enable-decoder=opus --enable-decoder=pcm_alaw --enable-decoder=pcm_alaw_at --enable-decoder=pcm_f32be --enable-decoder=pcm_f32le --enable-decoder=pcm_f64be --enable-decoder=pcm_f64le --enable-decoder=pcm_lxf --enable-decoder=pcm_mulaw --enable-decoder=pcm_mulaw_at --enable-decoder=pcm_s16be --enable-decoder=pcm_s16be_planar --enable-decoder=pcm_s16le --enable-decoder=pcm_s16le_planar --enable-decoder=pcm_s24be --enable-decoder=pcm_s24daud --enable-decoder=pcm_s24le --enable-decoder=pcm_s24le_planar --enable-decoder=pcm_s32be --enable-decoder=pcm_s32le --enable-decoder=pcm_s32le_planar --enable-decoder=pcm_s64be --enable-decoder=pcm_s64le --enable-decoder=pcm_s8 --enable-decoder=pcm_s8_planar --enable-decoder=pcm_u16be --enable-decoder=pcm_u16le --enable-decoder=pcm_u24be --enable-decoder=pcm_u24le --enable-decoder=pcm_u32be --enable-decoder=pcm_u32le --enable-decoder=pcm_u8 --enable-decoder=pcm_zork --enable-decoder=vorbis --enable-decoder=wavpack --enable-decoder=wmalossless --enable-decoder=wmapro --enable-decoder=wmav1 --enable-decoder=wmav2 --enable-decoder=wmavoice --enable-encoder=libopus --enable-hwaccel=mpeg4_videotoolbox --enable-hwaccel=h264_vda --enable-hwaccel=h264_videotoolbox --enable-parser=aac --enable-parser=aac_latm --enable-parser=flac --enable-parser=h264 --enable-parser=mpeg4video --enable-parser=mpegaudio --enable-parser=opus --enable-parser=vorbis --enable-demuxer=aac --enable-demuxer=flac --enable-demuxer=gif --enable-demuxer=h264 --enable-demuxer=mov --enable-demuxer=mp3 --enable-demuxer=ogg --enable-demuxer=wav --enable-muxer=ogg --enable-muxer=opus --extra-cflags="-mmacosx-version-min=10.8" --extra-cxxflags="-mmacosx-version-min=10.8" --extra-ldflags="-mmacosx-version-min=10.8"
make -j4
sudo make install
cd ..
git clone git://repo.or.cz/openal-soft.git
cd openal-soft/build
cmake -D LIBTYPE:STRING=STATIC -D CMAKE_OSX_DEPLOYMENT_TARGET:STRING=10.8 ..
make -j4
sudo make install
cd ../..
git clone https://chromium.googlesource.com/external/gyp
git clone https://chromium.googlesource.com/chromium/tools/depot_tools.git
export PATH="$PWD/depot_tools:$PATH"
cd gyp
git checkout 702ac58e47
git apply ../../bettergram/Telegram/Patches/gyp.diff
./setup.py build
sudo ./setup.py install
cd ..
git clone https://chromium.googlesource.com/crashpad/crashpad.git
cd crashpad
git checkout feb3aa3923
git apply ../../bettergram/Telegram/Patches/crashpad.diff
cd third_party/mini_chromium
git clone https://chromium.googlesource.com/chromium/mini_chromium
cd mini_chromium
git checkout 7c5b0c1ab4
git apply ../../../../../bettergram/Telegram/Patches/mini_chromium.diff
cd ../../gtest
git clone https://chromium.googlesource.com/external/github.com/google/googletest gtest
cd gtest
git checkout d62d6c6556
cd ../../..
build/gyp_crashpad.py -Dmac_deployment_target=10.8
ninja -C out/Debug
ninja -C out/Release
cd ..
git clone git://code.qt.io/qt/qt5.git qt5_6_2
cd qt5_6_2
perl init-repository --module-subset=qtbase,qtimageformats
git checkout v5.6.2
cd qtimageformats && git checkout v5.6.2 && cd ..
cd qtbase && git checkout v5.6.2
git apply ../../../bettergram/Telegram/Patches/qtbase_5_6_2.diff
cd ..
./configure -prefix "/usr/local/tdesktop/Qt-5.6.2" -debug-and-release -force-debug-info -opensource -confirm-license -static -opengl desktop -no-openssl -securetransport -nomake examples -nomake tests -platform macx-clang
make -j4
sudo make install
cd ..
Go to BuildPath/bettergram/Telegram and run
gyp/refresh.sh
Then launch Xcode, open BuildPath/bettergram/Telegram/Telegram.xcodeproj and build for Debug / Release.
To build the Bettergram.dmg file you need the following files:
Bettergram.icns fileBettergramDmg.json
You can build Bettergram.icns from the icon set Telegram/Telegram/Images.xcassets/Icon.iconset by using the command:
$ iconutil -c icns <iconset filename>
You can find the example of the .json file here: node-appdmg. Also use this project to build the Bettergram.dmg file.
Also you can build the signed .app and .dmg files automatically. To do that you need to place the following files to TelegramPrivate directory:
Bettergram.icnsBettergramDmg.jsonmac_certificate_identitymac_development_team
Where mac_certificate_identity contains name of your certificate, for example:
Developer ID Application: Bettergram LLC (XACK216ZA8)
And mac_development_team contains your Team ID, for example:
XACK216ZA8
You can find your Team ID here: Apple Developer Account Membership
After you have placed all the files at the TelegramPrivate directory you should do the following steps:
- Create new file
Telegram/build/targetwith content:macdmg - Call
Telegram/gyp/refresh.shscript - Open
Telegram/Telegram.xcodeprojin XCode Product->Scheme->Edit Scheme...- Select
Runconfiguration - Set up
Build ConfigurationtoReleaseand click toClosebutton Product->CleanProduct->Build For->Running- And wait...
To build the Bettergram.app for Apple App Store you should do the following steps:
- Place
mac_development_teamfile toTelegramPrivatedirectory. See the previous paragraph - Create new file
Telegram/build/targetwith content:macstore - Call
Telegram/gyp/refresh.shscript - Open
Telegram/Telegram.xcodeprojin XCode - Open
Generaltab at the project settings and enableAutomatically manage signingoption - Open
Capabilities->App Sandboxand check theIncomning Connections (Server) - A new file
Bettergram.entitlementsshould be appeared at the project files (left panel) - Open the new file
Bettergram.entitlementsas a source code and paste there content of theTelegram/Telegram Desktop.entitlementsfile Product->Archive- And wait...
To sign the application manually:
$ codesign -v --force --deep -s "Developer ID Application: Bettergram LLC (XACK216ZA8)" Bettergram.app
To verify signing:
$ codesign -dv --verbose=4 my.app
Check that the app binary is sandboxed:
$ codesign -dvvv --entitlements :- executable_path