tdesktop/snap/plugins/x-qtbuilder.py

205 lines
6.6 KiB
Python
Raw Normal View History

Snap packaging support (#4505) * qtbuilder: inherit from make plugin instead of autotools * qtbuilder: update to properly support snapcraft 2.23 We don't use the default 'source' property as it will recursively download all the submodules and we don't want that. Implement newer get_pull_properties. * gyp-cmake: only strip in Release mode and if we've a binary * telegram-snap: add first basic snapcraft.yaml to build tdesktop from src We need to build upstream versions of libva, ffmpeg (with opus support), openal, portaudio with custom flags and patched versions of gyp, and Qt. This requires some custom plugins for patching sources, mix repos and new build plugins for qt and gyp+cmake. * plugins: properly support snapcraft 2.23 Implementing get_pull_properties class methods * patches: add qt patch for saving tray icon in .cache TMPDIR overriding isn't needed anymore * snapcraft: add xdg-open support to open URIs * snapcraft: move external libraries to desktop-integration part * snapcraft: set QTCOMPOSE pointing to proper x11-data * desktop-integration: add libpulse0 to enable voice/video recording / playing * qtbuilder: add support for local patches that overrides remote ones * qtbuilder: make qt-version optional This allows to build upstream git version * gyp-cmake: inherit from CMakePlugin reusing artifacts + organize * patched-python: add support for patching using local files * snapcraft.yaml: use distro's portaudio instead of building ours * telegram: disable desktop file generation and custuom scheme registration * snapcraft.yaml: update version to 0.10.20 * .travis.yaml: add support for building using travis * qtbuilder: add g++ as build packages * snapcraft: use distro opus version * snapcraft: lzma for qt and ffmpeg * snapcraft: add libdbusmenu for qt * openal: add oss4-dev as build dependency * travis: test some hacks to speed things up * Move plugins to new dir * QtBuilder: add qt-extra-plugins support To include plugins that are out of the main qt repo * QtBuilder: generate branch based on qtversion * GypCMake: allow to define custom environment variables * snapcraft: set name to 'telegram-desktop' * snapcraft: add 'network-status' interface to Telegram app To automatically reconnect * snapcraft: use prime instead of snap for flitering files * snacpraft: update dependencies and versions to build against git * snapcraft: build with GCC-7 hackish solution * QtBuilder: add environment support * QtBuilder: add qt-extra-plugins to get_pull_properties * snapcraft: set name of the app to telegram-desktop too * snapcraft: build opus from git (v1.2.1) So it does upstream, let's follow them * telegram: apply patch to get proper home path from $HOME * snapcraft: add version-script to generate proper version from upstream * telegram: simplify the start command * snapcraft: get rid of snapd-xdg-open * snapcraft: use gtk3 and unity integration * qt5: build using gcc7 too * telegram-desktop: update desktop file * telegram: add support unity launcher when snapped We should actually fix this inside libunity * gcc7: remove toolchain source.list after install * desktop-integration: add pulse-audio as dependency again * telegram-desktop: define XCURSOR_PATH to get system cursors * gui: move files to snap folder * libtgvoip: don't enable SSE2 in unsupported archs * snapcraft: add -alpha sufix on versions and do not include git for tags * telegram: add patch for building in ARM chips * desktop-integration: include libunity * telegram-desktop: no need to define XCURSOR_PATH anymore, desktop helper will do * snapcraft: compile libunity from upstream to get proper launcher integration Drop custom patch, it's just better to do it here. This means we go back to upstream telegramdesktop desktop-id too. * telegram: get desktop file and icon from telegram part source * snapcraft: improve snap description * gcc7: not needed to add devscripts or equivs Unless we try to build gcc7 here, which well... A bit time consuming. * libunity: use upstream branch (my changes just merged) * ci: remove travis integration, it takes to long b.s.io does it already * telegram: don't do unneeded checks in armhf * telegram: more signed/unsigned char fixes for ARM, ignore errors for now * telegram: add getclock definitions for ARM * telegram: arm support, always use signed chars * telegram: don't need to use signed chars in ARM anymmore As we've fixed all the issues * telegram: replace .desktop file icon with snap one, add keywords * snapcraft: use diversity check on alpha value * telegram: detect Ubuntu desktop adding support for badges and indicators * telegram: unset WAYLAND_DISPLAY to get it running properly * Add a README * telegram: just add network-observe plug * snapcraft: add beta detection * snapcraft: only add network-manager plug, users might connect it We should actually have a connection-observe plug. * patches: add patch to use a customizable working dir in debug * snapcraft: define again QT_IM_MODULE and QTCOMPOSE fix compose key Setting compose to proper paths will allow to get composition key working again in snapped QT apps. * desktop-integration: add indicator-gtk3 and chinese fonts * desktop-integration: don't snap fonts, use desktop interface Fonts are now bind-mounted from host by the desktop interface * patches: apply patches using 3way merge if they fail * patches: update telegram-arm-support to apply cleanly * snapcraft: disable wayland using desktop script env * snapcraft: libunity has been SRU'ed, we can go back to archive version * patches: update arm support patch * breakpad: use upstream versions * telegram, patches: remove upstreamed patches * patches: disable Werror It causes failures in some archs, and we don't care much at this level (for now). * patches: remove libtgvoip msse2 patch * Revert "patches: remove libtgvoip msse2 patch" Not yet in the submodule used by telegram desktop This reverts commit 2e6f4cc619ee591fdd250cb3b2af4f0330d1c4ca. * snapcraft: show bash debugging on version script * desktop-gtk3: update mime database and icon-cache during install This saves some startup time * telegram: add gsettings plug * telegram-launch: use user-common as home and migrate if needed * Import snap folder from telegram-snap repo * patches, qtbase: use indicator icon in unity or ubuntu Patch already applied upstream, remove from snap only * .gitignore: add snap related files * telegram-launch: merge downloaded files folder if found * snap: remove patches not needed for upstream * snap, patch, libtgvoip: sync with upstream * telegram-launch: remove default dir after moving download files * snap: remove libtgvoip patches, we can just update the submodule The actual module update should be managed in a different commit though. * snapcraft: explain why gcc7 part is needed * snapcraft: update summary text * qt: no need to build gstreamer, and reorder configflags * plugins: add copyright informations * telegram: add common-id and parse-info with AppData Use the appstream integration that snapcraft now supports. * openal: use v1.18 branch as upstream does now * qtbuilder: support tags in versions better * qtbuilder: use shutil.rmtree to remove files * telegram: set QT_IM_MODULE only if not set * telegram: add removable-media plug * telegram-launch: ignore ibus as input method And add support for getting it from $TELEGRAM_QT_IM_MODULE env var * snapcraft: use git describe to get revision * snapcraft: use override-* stanzas for scriptlets * snap: exit scriptlets on first error * snap: remove summary, inherit from AppData * lib_export: use includes paths as defined per platform
2018-07-21 14:35:37 +00:00
# -*- Mode:Python; indent-tabs-mode:nil; tab-width:4 -*-
#
# Author: Marco Trevisan <marco@ubuntu.com>
# 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 <http://www.gnu.org/licenses/>.
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()