summaryrefslogtreecommitdiffstats
path: root/snap/plugins/x-qtbuilder.py
diff options
context:
space:
mode:
Diffstat (limited to 'snap/plugins/x-qtbuilder.py')
-rw-r--r--snap/plugins/x-qtbuilder.py204
1 files changed, 204 insertions, 0 deletions
diff --git a/snap/plugins/x-qtbuilder.py b/snap/plugins/x-qtbuilder.py
new file mode 100644
index 0000000000..860cd448a4
--- /dev/null
+++ b/snap/plugins/x-qtbuilder.py
@@ -0,0 +1,204 @@
+# -*- 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()