diff --git a/.gitignore b/.gitignore index 63873b949..0cc39366d 100644 --- a/.gitignore +++ b/.gitignore @@ -50,6 +50,15 @@ ipch/ project.xcworkspace xcuserdata +parts +prime +stage +*.snap +.snapcraft +/snap/gui/*.png +/snap/gui/*.desktop +/snap/plugins/__pycache__ + /Telegram/*.user.* *.pro.user /Linux/ diff --git a/Telegram/Patches/qtbase_5_6_2.diff b/Telegram/Patches/qtbase_5_6_2.diff index ac7c7c3e2..e6906ff1a 100644 --- a/Telegram/Patches/qtbase_5_6_2.diff +++ b/Telegram/Patches/qtbase_5_6_2.diff @@ -252,6 +252,43 @@ index 41834b21ae..8cdf4ab145 100644 if (value == WSAEADDRNOTAVAIL) { setError(QAbstractSocket::NetworkError, AddressNotAvailableErrorString); socketState = QAbstractSocket::UnconnectedState; +diff --git a/src/platformsupport/dbustray/qdbustrayicon.cpp b/src/platformsupport/dbustray/qdbustrayicon.cpp +index 4d6e707..9bdb0be 100644 +--- a/src/platformsupport/dbustray/qdbustrayicon.cpp ++++ b/src/platformsupport/dbustray/qdbustrayicon.cpp +@@ -58,9 +58,18 @@ QT_BEGIN_NAMESPACE + + Q_LOGGING_CATEGORY(qLcTray, "qt.qpa.tray") + ++static QString cachePath() ++{ ++ QString xdgCache = QString::fromUtf8(getenv("XDG_CACHE_HOME")); ++ if (xdgCache.isEmpty()) { ++ xdgCache = QDir::cleanPath(QDir::homePath() + QStringLiteral("/.cache")); ++ } ++ return xdgCache; ++} ++ + static const QString KDEItemFormat = QStringLiteral("org.kde.StatusNotifierItem-%1-%2"); + static const QString KDEWatcherService = QStringLiteral("org.kde.StatusNotifierWatcher"); +-static const QString TempFileTemplate = QDir::tempPath() + QStringLiteral("/qt-trayicon-XXXXXX.png"); ++static const QString TempFileTemplate = cachePath() + QStringLiteral("/qt-trayicon-XXXXXX.png"); + static const QString XdgNotificationService = QStringLiteral("org.freedesktop.Notifications"); + static const QString XdgNotificationPath = QStringLiteral("/org/freedesktop/Notifications"); + static const QString DefaultAction = QStringLiteral("default"); +@@ -151,6 +160,12 @@ QTemporaryFile *QDBusTrayIcon::tempIcon(const QIcon &icon) + uint pid = session.interface()->servicePid(KDEWatcherService).value(); + QString processName = QLockFilePrivate::processNameByPid(pid); + necessary = processName.endsWith(QStringLiteral("indicator-application-service")); ++ if (!necessary) { ++ QString xdgDesktop = QString::fromUtf8(getenv("XDG_CURRENT_DESKTOP")); ++ QStringList desktops = xdgDesktop.toLower().split(QLatin1Char(':')); ++ necessary = desktops.contains(QStringLiteral("unity")) || ++ desktops.contains(QStringLiteral("ubuntu")); ++ } + necessity_checked = true; + } + if (!necessary) diff --git a/src/platformsupport/fontdatabases/basic/qbasicfontdatabase.cpp b/src/platformsupport/fontdatabases/basic/qbasicfontdatabase.cpp index 728b166b71..1dc64593e1 100644 --- a/src/platformsupport/fontdatabases/basic/qbasicfontdatabase.cpp diff --git a/snap/plugins/x-autotools-subsource.py b/snap/plugins/x-autotools-subsource.py new file mode 100644 index 000000000..330ea0b1b --- /dev/null +++ b/snap/plugins/x-autotools-subsource.py @@ -0,0 +1,66 @@ +# -*- Mode:Python; indent-tabs-mode:nil; tab-width:4 -*- +# +# Author: Marco Trevisan +# Copyright (C) 2017-2018 Canonical Ltd +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License version 3 as +# published by the Free Software Foundation. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . + +import os +import snapcraft + +from snapcraft.internal import sources +from snapcraft.plugins import autotools + +class Dict2Object(object): + def __init__(self, d): + for k, v in d.items(): + setattr(self, k.replace('-', '_'), v) + + +class AutotoolsSubsourcePlugin(autotools.AutotoolsPlugin): + + @classmethod + def schema(cls): + schema = super().schema() + + schema['properties']['sub-sources'] = { + 'type': 'array', + 'minitems': 0, + 'uniqueItems': True, + 'items': { + 'type': 'object', + 'additionalProperties': True, + }, + 'default': [], + } + + return schema + + @classmethod + def get_pull_properties(cls): + return [ + 'sub-sources', + ] + + def pull(self): + super().pull() + + for src in self.options.sub_sources: + [name] = src.keys() + [values] = src.values() + + if 'source' in values: + dest = values['dest'] if 'dest' in values else '' + sources.get(os.path.join(self.sourcedir, dest), + os.path.join(self.build_basedir, dest), + Dict2Object(values)) diff --git a/snap/plugins/x-gyp-cmake.py b/snap/plugins/x-gyp-cmake.py new file mode 100644 index 000000000..94a5ba1a8 --- /dev/null +++ b/snap/plugins/x-gyp-cmake.py @@ -0,0 +1,100 @@ +# -*- Mode:Python; indent-tabs-mode:nil; tab-width:4 -*- +# +# Author: Marco Trevisan +# Copyright (C) 2017-2018 Canonical Ltd +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License version 3 as +# published by the Free Software Foundation. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . + +import os +import snapcraft + +from snapcraft.plugins import cmake + + +class GypCMakePlugin(cmake.CMakePlugin): + """A basic plugin for snapcraft that generates CMake files from gyp""" + + @classmethod + def schema(cls): + schema = super().schema() + + schema['properties']['gyp-file'] = { + 'type': 'string' + } + + schema['properties']['build-type'] = { + 'type': 'string', + 'default': 'Release', + 'enum': ['Debug', 'Release'], + } + + schema['properties']['environment'] = { + 'type': 'array', + 'minitems': 0, + 'uniqueItems': True, + 'items': { + 'type': 'object', + 'minitems': 0, + 'uniqueItems': True, + 'items': { + 'type': 'string', + }, + }, + 'default': [], + } + + schema['required'].append('gyp-file') + + schema['build-properties'].extend([ + 'build-type', + 'gyp-file', + ]) + + return schema + + def __init__(self, name, options, project): + super().__init__(name, options, project) + self.build_packages.extend([ + 'binutils', + 'python', + ]) + self.builddir = os.path.join( + self.build_basedir, 'out', self.options.build_type) + + def build(self): + env = self._build_environment() + gyp_path = os.path.join(self.sourcedir, os.path.dirname(self.options.gyp_file)) + + for environ in self.options.environment: + [env_name] = list(environ) + env[env_name] = str(environ[env_name]) + + if not os.path.exists(os.path.join(self.builddir, 'CMakeLists.txt')): + gyp_command = ['gyp'] + self.options.configflags + ['--format=cmake'] + gyp_command.append('--generator-output={}'.format(self.build_basedir)) + gyp_command.append(os.path.basename(self.options.gyp_file)) + self.run(gyp_command, cwd=gyp_path) + + if not os.path.exists(os.path.join(self.builddir, 'Makefile')): + self.run(['cmake', '.'], env=env) + + self.make(env=env) + + if self.options.artifacts and self.options.build_type == 'Release': + for artifact in self.options.artifacts: + dest = os.path.join(self.installdir, artifact) + if os.path.isfile(dest): + mime_type = self.run_output( + 'file --mime-type -b {}'.format(dest).split()) + if 'application/x-executable' in mime_type: + self.run(['strip', dest]) diff --git a/snap/plugins/x-patched-python.py b/snap/plugins/x-patched-python.py new file mode 100644 index 000000000..0444ac667 --- /dev/null +++ b/snap/plugins/x-patched-python.py @@ -0,0 +1,65 @@ +# -*- Mode:Python; indent-tabs-mode:nil; tab-width:4 -*- +# +# Author: Marco Trevisan +# Copyright (C) 2017-2018 Canonical Ltd +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License version 3 as +# published by the Free Software Foundation. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . + +import os +import snapcraft +import requests + +from snapcraft.plugins import python + +class PatchedPythonPlugin(python.PythonPlugin): + + @classmethod + def schema(cls): + schema = super().schema() + + schema['properties']['patches'] = { + 'type': 'array', + 'minitems': 0, + 'uniqueItems': True, + 'items': { + 'type': 'string', + }, + 'default': [], + } + + schema['pull-properties'].extend([ + 'patches', + ]) + + return schema + + def pull(self): + super().pull() + + for patch in self.options.patches: + patch_name = os.path.basename(patch) + patch_stamp = os.path.join( + self.sourcedir, '.snapcraft-patched-{}'.format(patch_name)) + + if not os.path.exists(patch_stamp): + if os.path.exists(patch): + patch_file = os.path.join(os.getcwd(), patch) + else: + patch_file = os.path.join( + self.sourcedir, 'snapcraft-patch-{}'.format(patch_name)) + with open(patch_file, 'wb') as file: + file.write(requests.get(patch).content) + + patch_cmd = 'git apply -v3 {}'.format(patch_file).split() + self.run(patch_cmd, cwd=self.sourcedir) + open(patch_stamp, 'a').close() diff --git a/snap/plugins/x-qtbuilder.py b/snap/plugins/x-qtbuilder.py new file mode 100644 index 000000000..860cd448a --- /dev/null +++ b/snap/plugins/x-qtbuilder.py @@ -0,0 +1,204 @@ +# -*- Mode:Python; indent-tabs-mode:nil; tab-width:4 -*- +# +# Author: Marco Trevisan +# Copyright (C) 2017-2018 Canonical Ltd +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License version 3 as +# published by the Free Software Foundation. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . + +import os +import shutil +import snapcraft + +from snapcraft.plugins import make + +class QtBuilderPlugin(make.MakePlugin): + + @classmethod + def schema(cls): + schema = super().schema() + + schema['properties']['configflags'] = { + 'type': 'array', + 'minitems': 1, + 'uniqueItems': False, + 'items': { + 'type': 'string', + }, + 'default': [], + } + + schema['properties']['qt-source-git'] = { + 'type': 'string' + } + + schema['properties']['qt-source-depth'] = { + 'type': 'integer', + 'default': 1 + } + + schema['properties']['qt-version'] = { + 'type': 'string' + } + + schema['properties']['qt-patches-base-url'] = { + 'type': 'string' + } + + schema['properties']['qt-patches-path'] = { + 'type': 'string' + } + + schema['properties']['qt-submodules'] = { + 'type': 'array', + 'minitems': 0, + 'uniqueItems': True, + 'items': { + 'type': 'string', + }, + 'default': [], + } + + schema['properties']['qt-extra-plugins'] = { + 'type': 'array', + 'minitems': 0, + 'uniqueItems': True, + 'items': { + 'type': 'object', + 'minitems': 0, + 'uniqueItems': True, + 'items': { + 'type': 'string', + }, + }, + 'default': [], + } + + schema['properties']['environment'] = { + 'type': 'array', + 'minitems': 0, + 'uniqueItems': True, + 'items': { + 'type': 'object', + 'minitems': 0, + 'uniqueItems': True, + 'items': { + 'type': 'string', + }, + }, + 'default': [], + } + + schema['required'].append('qt-source-git') + + schema['build-properties'].append('configflags') + + return schema + + @classmethod + def get_pull_properties(cls): + return [ + 'qt-version', + 'qt-patches-base-url', + 'qt-patches-path', + 'qt-submodules', + 'qt-extra-plugins', + ] + + def __init__(self, name, options, project): + super().__init__(name, options, project) + self.build_packages.extend(['g++', 'patch', 'perl', 'wget']) + self.options.source_depth = self.options.qt_source_depth + + if self.options.qt_version: + if self.options.qt_version[0] == 'v': + self.options.source_branch = self.options.qt_version + self.options.qt_version = self.options.qt_version[1:] + else: + self.options.source_branch = '.'.join( + self.options.qt_version.split('.')[:-1]) + + + def pull(self): + if not os.path.exists(os.path.join(self.sourcedir, '.git')) or \ + not os.path.exists(os.path.join(self.sourcedir, 'init-repository')): + shutil.rmtree(self.sourcedir, ignore_errors=True) + command = 'git clone {} {}'.format( + self.options.qt_source_git, self.sourcedir).split() + if self.options.source_branch: + command.extend(['--branch', str(self.options.source_branch)]) + if self.options.source_depth: + command.extend(['--depth', str(self.options.source_depth)]) + + self.run(command) + + command = 'perl init-repository --branch -f'.split() + if len(self.options.qt_submodules): + command.extend('--module-subset={}'.format( + ','.join(self.options.qt_submodules)).split()) + self.run(command, cwd=self.sourcedir) + + if self.options.qt_version: + self.run("git submodule foreach git checkout v{}".format( + self.options.qt_version).split(), self.sourcedir) + + patch_file_template = '${{name}}{}.diff'.format( + '_' + self.options.qt_version.replace('.', '_') \ + if self.options.qt_version else '') + + if self.options.qt_patches_base_url: + patch_uri_template = '{}/{}'.format( + self.options.qt_patches_base_url, patch_file_template) + + patch_cmd = 'git submodule foreach -q'.split() + \ + ['[ -e {touch_file} ] || ' \ + 'wget -q -O - {patch_uri_template} | patch -p1 && ' \ + 'touch {touch_file}'.format( + patch_uri_template=patch_uri_template, + touch_file='.snapcraft-qt-patched')] + + self.run(patch_cmd, cwd=self.sourcedir) + + if self.options.qt_patches_path: + patch_path_template = os.path.join( + os.getcwd(), self.options.qt_patches_path, patch_file_template) + + patch_cmd = 'git submodule foreach -q'.split() + \ + ['[ -e {patch} ] && git apply -v3 {patch} || true'.format( + patch=patch_path_template)] + + self.run(patch_cmd, cwd=self.sourcedir) + + for extra_plugin in self.options.qt_extra_plugins: + [framework] = list(extra_plugin) + + final_path = os.path.join(self.sourcedir, 'qtbase', 'src', + 'plugins', framework) + + for repo in extra_plugin[framework]: + repo_path = os.path.basename(repo) + if repo_path.endswith('.git'): + repo_path = repo_path[:-4] + + if not os.path.exists(os.path.join(final_path, repo_path)): + command = 'git clone {}'.format(repo).split() + self.run(command, cwd=final_path) + + def build(self): + env = {} + + for environ in self.options.environment: + [env_name] = list(environ) + env[env_name] = str(environ[env_name]) + + self.run(['./configure'] + self.options.configflags, env=env) + super().build() diff --git a/snap/scripts/telegram-launch b/snap/scripts/telegram-launch new file mode 100755 index 000000000..8fe62b1fe --- /dev/null +++ b/snap/scripts/telegram-launch @@ -0,0 +1,24 @@ +#!/bin/bash + +default_downloaddir="$SNAP_USER_DATA/Telegram Desktop" + +if [ -d "$default_downloaddir" ] && [ ! -L "$default_downloaddir" ]; then + dest_downloaddir="$SNAP_USER_COMMON/$(basename "$default_downloaddir")" + if [ -d "$dest_downloaddir" ]; then + mv -v "$default_downloaddir/*" "$dest_downloaddir/" + rmdir "$default_downloaddir" + else + mv -v "$default_downloaddir" "$SNAP_USER_COMMON" + fi + ln -sv "$dest_downloaddir" "$default_downloaddir" +fi + +default_im_module="xim" + +if [ -n "$TELEGRAM_QT_IM_MODULE" ]; then + export QT_IM_MODULE="$TELEGRAM_QT_IM_MODULE" +elif [ -z "$QT_IM_MODULE" ] || [ "$QT_IM_MODULE" == "ibus" ]; then + export QT_IM_MODULE="$default_im_module" +fi + +exec desktop-launch Telegram $* diff --git a/snap/snapcraft.yaml b/snap/snapcraft.yaml new file mode 100644 index 000000000..a651f7056 --- /dev/null +++ b/snap/snapcraft.yaml @@ -0,0 +1,415 @@ +name: telegram-desktop +version: git +adopt-info: telegram +description: | + Telegram is a popular messaging protocol with encryption and security as + its key focus. + + Fast and secure desktop app, perfectly synced with your mobile phone. + +grade: stable +confinement: strict + +version-script: | + set -x + version_file=Telegram/build/version + version=$(sed -n "s/AppVersionStr[ ]\+\(.*\)\+/\1/p" $version_file) + alpha=$(sed -n "s/AlphaChannel[ ]\+\(.*\)\+/\1/p" $version_file) + beta=$(sed -n "s/BetaVersion[ ]\+\(.*\)\+/\1/p" $version_file) + + if [ "$alpha" != "0" ]; then + version="$version-alpha" + elif [ "$beta" != "0" ]; then + version="$version-beta" + fi + + version="${version}$(git describe --tags | sed 's,^v[^-]\+,,')" + + echo $version + +apps: + telegram-desktop: + command: telegram-launch + common-id: org.telegram.desktop + environment: + DISABLE_WAYLAND: 1 + WAYLAND_DISPLAY: no-display + QTCOMPOSE: $SNAP/usr/share/X11/locale + HOME: "$SNAP_USER_COMMON" + plugs: + - desktop + - desktop-legacy + - gsettings + - home + - network + - network-bind + - network-manager + - pulseaudio + - removable-media + - unity7 + +parts: + telegram: + plugin: gyp-cmake + source: . + source-type: git + parse-info: [lib/xdg/telegramdesktop.appdata.xml] + build-packages: + - libappindicator-dev + - libappindicator3-dev + - libexif-dev + - libicu-dev + - liblzma-dev + - libssl-dev + - libunity-dev + - zlib1g-dev + gyp-file: Telegram/gyp/Telegram.gyp + build-type: 'Release' + artifacts: ['Telegram'] + environment: + - CC: gcc-7 + - CXX: g++-7 + organize: + Telegram: bin/Telegram + configflags: + - -Dlinux_path_breakpad=$SNAPCRAFT_STAGE + - -Dlinux_path_range=$SNAPCRAFT_STAGE/range-v3 + - -Dlinux_path_ffmpeg=$SNAPCRAFT_STAGE + - -Dlinux_path_libexif_lib=$SNAPCRAFT_STAGE + - -Dlinux_path_openal=$SNAPCRAFT_STAGE + - -Dlinux_path_opus_include=$SNAPCRAFT_STAGE/include/opus + - -Dlinux_path_qt=$SNAPCRAFT_STAGE + - -Dlinux_path_va=$SNAPCRAFT_STAGE + - -Dlinux_path_vdpau=$SNAPCRAFT_STAGE + - -Dlinux_path_xkbcommon=$SNAPCRAFT_STAGE + - -Dlinux_lib_ssl=-lssl + - -Dlinux_lib_crypto=-lcrypto + - -Dlinux_lib_icu=-licuuc -licutu -licui18n + - -Dbuild_defines=TDESKTOP_DISABLE_AUTOUPDATE, + TDESKTOP_DISABLE_REGISTER_CUSTOM_SCHEME, + TDESKTOP_DISABLE_DESKTOP_FILE_GENERATION + - --depth=. + override-build: | + set -xe + snapcraftctl build + snap_gui=$SNAPCRAFT_STAGE/../snap/gui + mkdir -vp $snap_gui + cp -v lib/xdg/telegramdesktop.desktop $snap_gui + cp -v Telegram/Resources/art/icon512@2x.png $snap_gui/icon.png + sed -i "s|^Icon=.*|Icon=\${SNAP}/meta/gui/icon.png|g" $snap_gui/telegramdesktop.desktop + echo "Keywords=tg;chat;im;messaging;messenger;" >> $snap_gui/telegramdesktop.desktop + after: + - breakpad + - ffmpeg + - gyp + - libva + - openal + - qt + - range-v3 + - gcc7 + + telegram-launcher: + plugin: dump + source: snap/scripts + organize: + telegram-launch: bin/telegram-launch + + desktop-integration: + plugin: nil + stage-packages: + - libappindicator3-1 + - libnotify4 + - libpulse0 + - libunity9 + after: [desktop-gtk3] + stage: [-./usr/share/fonts/**] + + desktop-gtk3: + stage: [-./usr/share/fonts/**] + override-build: | + set -xe + snapcraftctl build + export XDG_DATA_DIRS=$SNAPCRAFT_PART_INSTALL/usr/share + update-mime-database $SNAPCRAFT_PART_INSTALL/usr/share/mime + + for dir in $SNAPCRAFT_PART_INSTALL/usr/share/icons/*/; do + if [ -f $dir/index.theme ]; then + gtk-update-icon-cache-3.0 -q $dir + fi + done + + libva: + source: https://github.com/01org/libva.git + source-depth: 1 + plugin: autotools + build-packages: + - libdrm-dev + - libegl1-mesa-dev + - libgl1-mesa-dev + - libx11-dev + - libxext-dev + - libxfixes-dev + configflags: + - --enable-static + prime: [-./*] + + libvdpau: + source: git://anongit.freedesktop.org/vdpau/libvdpau + source-depth: 1 + plugin: autotools + build-packages: + - libx11-dev + - x11proto-dri2-dev + - libxext-dev + configflags: + - --enable-static + prime: [-./*] + + opus: + source: https://github.com/xiph/opus.git + source-depth: 1 + source-branch: v1.2.1 + plugin: autotools + prime: [-./*] + + ffmpeg: + source: https://github.com/FFmpeg/FFmpeg.git + source-depth: 1 + source-branch: release/3.4 + plugin: autotools + build-packages: + - libass-dev + - libfreetype6-dev + - libgpac-dev + - liblzma-dev + - libsdl1.2-dev + - libtheora-dev + - libtool + - libvorbis-dev + - libxcb1-dev + - libxcb-shm0-dev + - libxcb-xfixes0-dev + - pkg-config + - texi2html + - yasm + - zlib1g-dev + configflags: + - --prefix=/ + - --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 + after: + - libva + - libvdpau + - opus + prime: [-./*] + + openal: + source: https://github.com/kcat/openal-soft.git + source-depth: 1 + source-branch: v1.18 + plugin: cmake + build-packages: + - oss4-dev + - portaudio19-dev + configflags: + - -DCMAKE_BUILD_TYPE=Release + - -DALSOFT_EXAMPLES=OFF + - -DALSOFT_TESTS=OFF + - -DALSOFT_UTILS=OFF + - -DLIBTYPE=STATIC + after: + - ffmpeg + prime: [-./*] + + libxkbcommon: + source: https://github.com/xkbcommon/libxkbcommon.git + source-depth: 1 + plugin: autotools + build-packages: + - xutils-dev + - bison + - python-xcbgen + configflags: + - --disable-x11 + prime: [-./*] + + qt: + plugin: qtbuilder + qt-version: 5.6.2 + qt-source-git: https://code.qt.io/qt/qt5.git + qt-submodules: ['qtbase', 'qtimageformats'] + qt-patches-path: Telegram/Patches + qt-extra-plugins: + - platforminputcontexts: + - https://github.com/telegramdesktop/fcitx.git + - https://github.com/telegramdesktop/hime.git + environment: + - CC: gcc-7 + - CXX: g++-7 + - QMAKE_CC: gcc-7 + - QMAKE_CXX: g++-7 + build-packages: + - libasound2-dev + - libdbusmenu-glib-dev + - libffi-dev + - liblzma-dev + - libpulse-dev + - libssl-dev + - libx11-xcb-dev + - libxcb-icccm4-dev + - libxcb-image0-dev + - libxcb-keysyms1-dev + - libxcb-randr0-dev + - libxcb-render-util0-dev + - libxcb-sync-dev + - libxcb-util0-dev + - libxcb-xfixes0-dev + - libxcb1-dev + - libxrender-dev + configflags: + - -prefix + - $SNAPCRAFT_STAGE + - -release + - -force-debug-info + - -opensource + - -confirm-license + - -qt-zlib + - -qt-libpng + - -qt-libjpeg + - -qt-freetype + - -qt-harfbuzz + - -qt-pcre + - -qt-xcb + - -qt-xkbcommon-x11 + - -no-gstreamer + - -no-gtkstyle + - -no-mirclient + - -no-opengl + - -static + - -dbus-runtime + - -openssl-linked + - -nomake + - examples + - -nomake + - tests + after: + - libxkbcommon + - gcc7 + prime: [-./*] + + breakpad: + plugin: autotools-subsource + source: https://chromium.googlesource.com/breakpad/breakpad + source-type: git + source-commit: bc8fb886 + sub-sources: + - linux-syscall-support: + dest: src/third_party/lss + source: https://chromium.googlesource.com/linux-syscall-support + source-type: git + source-commit: a91633d1 + prime: [-./*] + + range-v3: + source: https://github.com/ericniebler/range-v3.git + source-depth: 1 + plugin: nil + override-build: | + set -x + snapcraftctl build + mkdir $SNAPCRAFT_PART_INSTALL/range-v3 + cp -rv * $SNAPCRAFT_PART_INSTALL/range-v3 + prime: [-./*] + + gyp: + plugin: patched-python + source: https://chromium.googlesource.com/external/gyp + source-type: git + source-commit: 702ac58e47 + python-version: python2 + patches: + - Telegram/Patches/gyp.diff + prime: [-./*] + + # Since this is supposed to be built against ubuntu 16.04, we need to manually + # install gcc7, and this is a workaround to achieve this. + # This part can be safely removed when build.snapcraft.io will allow + # to build against 18.04. + gcc7: + plugin: nil + build-packages: + - libmpc-dev + - libcloog-ppl-dev + override-pull: | + set -x + echo "deb http://ppa.launchpad.net/ubuntu-toolchain-r/test/ubuntu xenial main" | \ + sudo tee /etc/apt/sources.list.d/ubuntu-toolchain-r.list + sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 60C317803A41BA51845E371A1E9377A2BA9EF27F + sudo apt-get update \ + -o Dir::Etc::sourcelist="sources.list.d/ubuntu-toolchain-r.list" \ + -o Dir::Etc::sourceparts="-" -o APT::Get::List-Cleanup="0" + snapcraftctl pull + override-build: | + set -x + snapcraftctl build + sudo apt install gcc-7 g++-7 -o Debug::pkgProblemResolver=yes --no-install-recommends -y + sudo apt-mark auto gcc-7 g++-7 + sudo rm -f /etc/apt/sources.list.d/ubuntu-toolchain-r.list + prime: [-./*]