#!/bin/bash set -e REPO="$PWD" BUILD="$REPO/build" UPSTREAM="$REPO/upstream" EXTERNAL="$REPO/external" CACHE="$HOME/travisCacheDir" QT_PATH="$BUILD/qt" BREAKPAD_PATH="$EXTERNAL/breakpad" [[ ! $MAKE_ARGS ]] && MAKE_ARGS="--quiet -j4" QT_VERSION=5.6.0 run() { # Move files to subdir cd .. mv tdesktop tdesktop2 mkdir tdesktop mv tdesktop2 "$UPSTREAM" mkdir "$BUILD" downloadLibs build check } # install downloadLibs() { travisStartFold "Download libraries" cd "$REPO" mkdir external && cd external git clone https://chromium.googlesource.com/linux-syscall-support git clone https://git.ffmpeg.org/ffmpeg.git git clone https://github.com/xkbcommon/libxkbcommon.git git clone https://github.com/kcat/openal-soft.git } build() { travisStartFold "Build libraries" # libxkbcommon cd "$EXTERNAL/libxkbcommon" ./autogen.sh \ --prefix='/usr/local' make $MAKE_ARGS sudo make install sudo ldconfig # ffmpeg cd "$EXTERNAL/ffmpeg" ./configure \ --prefix='/usr/local' \ --disable-debug \ --disable-programs \ --disable-doc \ --disable-everything \ --enable-gpl \ --enable-version3 \ --enable-libopus \ --enable-decoder=aac \ --enable-decoder=aac_latm \ --enable-decoder=aasc \ --enable-decoder=flac \ --enable-decoder=gif \ --enable-decoder=h264 \ --enable-decoder=h264_vdpau \ --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=mpeg4_vdpau \ --enable-decoder=msmpeg4v2 \ --enable-decoder=msmpeg4v3 \ --enable-decoder=opus \ --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=h264_vaapi \ --enable-hwaccel=h264_vdpau \ --enable-hwaccel=mpeg4_vaapi \ --enable-hwaccel=mpeg4_vdpau \ --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 make $MAKE_ARGS sudo make install sudo ldconfig # openal_soft cd "$EXTERNAL/openal-soft/build" cmake \ -D CMAKE_INSTALL_PREFIX=/usr/local \ -D CMAKE_BUILD_TYPE=Release \ -D LIBTYPE=STATIC \ .. make $MAKE_ARGS sudo make install sudo ldconfig # Qt getCustomQt # Breakpad getBreakpad travisStartFold "Patch tdesktop" # Patch tdesktop sed -i 's/CUSTOM_API_ID//g' "$UPSTREAM/Telegram/Telegram.pro" sed -i 's,LIBS += /usr/local/lib/libxkbcommon.a,,g' "$UPSTREAM/Telegram/Telegram.pro" sed -i 's,#xkbcommon,xkbcommon,g' "$UPSTREAM/Telegram/Telegram.pro" sed -i "s,\..*/Libraries/breakpad/,$BREAKPAD_PATH/,g" "$UPSTREAM/Telegram/Telegram.pro" local options="" if [[ $BUILD_VERSION == *"disable_autoupdate"* ]]; then options+="\nDEFINES += TDESKTOP_DISABLE_AUTOUPDATE" fi if [[ $BUILD_VERSION == *"disable_register_custom_scheme"* ]]; then options+="\nDEFINES += TDESKTOP_DISABLE_REGISTER_CUSTOM_SCHEME" fi if [[ $BUILD_VERSION == *"disable_crash_reports"* ]]; then options+="\nDEFINES += TDESKTOP_DISABLE_CRASH_REPORTS" fi if [[ $BUILD_VERSION == *"disable_network_proxy"* ]]; then options+="\nDEFINES += TDESKTOP_DISABLE_NETWORK_PROXY" fi if [[ $BUILD_VERSION == *"disable_desktop_file_generation"* ]]; then options+="\nDEFINES += TDESKTOP_DISABLE_DESKTOP_FILE_GENERATION" fi if [[ $BUILD_VERSION == *"disable_unity_integration"* ]]; then options+="\nDEFINES += TDESKTOP_DISABLE_UNITY_INTEGRATION" fi info_msg "Build options: ${options}" echo -e "${options}" >> "$UPSTREAM/Telegram/Telegram.pro" travisStartFold "Build tdesktop" buildTelegram travisEndFold } getBreakpad() { travisStartFold "Getting breakpad" local BREAKPAD_CACHE="$CACHE/breakpad" local BREAKPAD_CACHE_FILE="$BREAKPAD_CACHE/.cache.txt" if [ ! -d "$BREAKPAD_CACHE" ]; then mkdir -p "$BREAKPAD_CACHE" fi ln -sf "$BREAKPAD_CACHE" "$BREAKPAD_PATH" if [ -f "$BREAKPAD_CACHE_FILE" ]; then info_msg "Using cached breakpad" makeBreakpadLink else buildBreakpad sudo touch "$BREAKPAD_CACHE_FILE" fi } buildBreakpad() { info_msg "Downloading and building breakpad" cd "$EXTERNAL" git clone https://chromium.googlesource.com/breakpad/breakpad makeBreakpadLink cd "$BREAKPAD_PATH" ./configure make $MAKE_ARGS } makeBreakpadLink() { local LSS_PATH="$BREAKPAD_PATH/src/third_party/lss" ln -s -f "$EXTERNAL/linux-syscall-support" "$LSS_PATH" local LSS_GIT_PATH="$LSS_PATH/.git" if [ -d "$LSS_GIT_PATH" ]; then # Remove git dir to prevent cache changes rm -rf "$LSS_GIT_PATH" fi } getCustomQt() { travisStartFold "Getting patched QT" local QT_CACHE="$CACHE/qtPatched" local QT_CACHE_FILE="$QT_CACHE/.cache.txt" if [ ! -d "$QT_CACHE" ]; then mkdir -p "$QT_CACHE" fi ln -sf "$QT_CACHE" "$QT_PATH" if [ -f "$QT_CACHE_FILE" ]; then info_msg "Using cached patched qt" else buildCustomQt sudo touch "$QT_CACHE_FILE" fi export PATH="$QT_PATH/bin:$PATH" } buildCustomQt() { info_msg "Downloading and building patched qt" cd "$EXTERNAL" echo -e "Clone Qt ${QT_VERSION}\n" git clone git://code.qt.io/qt/qt5.git qt${QT_VERSION} cd qt${QT_VERSION} git checkout "$(echo ${QT_VERSION} | sed -e s/\..$//)" perl init-repository --module-subset=qtbase,qtimageformats git checkout v${QT_VERSION} cd qtbase && git checkout v${QT_VERSION} && cd .. cd qtimageformats && git checkout v${QT_VERSION} && cd .. cd .. cd "$EXTERNAL/qt${QT_VERSION}/qtbase" git apply "$UPSTREAM/Telegram/Patches/qtbase_${QT_VERSION//\./_}.diff" cd .. ./configure -prefix "$QT_PATH" -release -opensource -confirm-license -qt-zlib \ -qt-libpng -qt-libjpeg -qt-freetype -qt-harfbuzz -qt-pcre -qt-xcb \ -qt-xkbcommon-x11 -no-opengl -static -nomake examples -nomake tests \ -dbus-runtime -openssl-linked -no-gstreamer -no-mtdev # <- Not sure about these make $MAKE_ARGS sudo make install } buildTelegram() { info_msg "Build codegen_style" # Build codegen_style mkdir -p "$UPSTREAM/Linux/obj/codegen_style/Debug" cd "$UPSTREAM/Linux/obj/codegen_style/Debug" qmake QT_TDESKTOP_PATH="${QT_PATH}" QT_TDESKTOP_VERSION=${QT_VERSION} CONFIG+=debug "../../../../Telegram/build/qmake/codegen_style/codegen_style.pro" make $MAKE_ARGS info_msg "Build codegen_numbers" # Build codegen_numbers mkdir -p "$UPSTREAM/Linux/obj/codegen_numbers/Debug" cd "$UPSTREAM/Linux/obj/codegen_numbers/Debug" qmake QT_TDESKTOP_PATH="${QT_PATH}" QT_TDESKTOP_VERSION=${QT_VERSION} CONFIG+=debug "../../../../Telegram/build/qmake/codegen_numbers/codegen_numbers.pro" make $MAKE_ARGS info_msg "Build MetaLang" # Build MetaLang mkdir -p "$UPSTREAM/Linux/DebugIntermediateLang" cd "$UPSTREAM/Linux/DebugIntermediateLang" qmake QT_TDESKTOP_PATH="${QT_PATH}" QT_TDESKTOP_VERSION=${QT_VERSION} CONFIG+=debug "../../Telegram/MetaLang.pro" make $MAKE_ARGS info_msg "Build Telegram Desktop" # Build Telegram Desktop mkdir -p "$UPSTREAM/Linux/DebugIntermediate" cd "$UPSTREAM/Linux/DebugIntermediate" ./../codegen/Debug/codegen_style "-I./../../Telegram/Resources" "-I./../../Telegram/SourceFiles" "-o./GeneratedFiles/styles" all_files.style --rebuild ./../codegen/Debug/codegen_numbers "-o./GeneratedFiles" "./../../Telegram/Resources/numbers.txt" ./../DebugLang/MetaLang -lang_in ./../../Telegram/Resources/langs/lang.strings -lang_out ./GeneratedFiles/lang_auto qmake QT_TDESKTOP_PATH="${QT_PATH}" QT_TDESKTOP_VERSION=${QT_VERSION} CONFIG+=debug "../../Telegram/Telegram.pro" make $MAKE_ARGS } check() { local filePath="$UPSTREAM/Linux/Debug/Telegram" if test -f "$filePath"; then success_msg "Build successful done! :)" local size; size=$(stat -c %s "$filePath") success_msg "File size of ${filePath}: ${size} Bytes" else error_msg "Build error, output file does not exist" exit 1 fi } source ./.travis/common.sh run