[jhbuild] Make CMake modules use Ninja instead of Make
- From: Emmanuele Bassi <ebassi src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [jhbuild] Make CMake modules use Ninja instead of Make
- Date: Thu, 16 Feb 2017 22:37:18 +0000 (UTC)
commit cb64ceec94c12a93102ce68ddbac8a9d115a6e24
Author: Emmanuele Bassi <ebassi gnome org>
Date: Thu Feb 16 18:41:31 2017 +0000
Make CMake modules use Ninja instead of Make
Ninja is a replacement for Make; it's faster, simpler, and by default
tries to take advantage of multiple cores and platform-specific
efficient paths.
We use the Ninja generator by default, but we allow using the attribute
'use-ninja' as an escape hatch for the modules that prefer the Make
generator.
https://bugzilla.gnome.org/show_bug.cgi?id=778784
jhbuild/modtypes/cmake.py | 45 ++++++++++++++++++++++++++++++++++++++++-----
1 files changed, 40 insertions(+), 5 deletions(-)
---
diff --git a/jhbuild/modtypes/cmake.py b/jhbuild/modtypes/cmake.py
index f3bef2d..372cb45 100644
--- a/jhbuild/modtypes/cmake.py
+++ b/jhbuild/modtypes/cmake.py
@@ -50,6 +50,17 @@ class CMakeModule(MakeModule, DownloadableModule):
self.skip_install_phase = skip_install_phase
self.force_non_srcdir_builds = False
self.supports_install_destdir = True
+ self.use_ninja = True
+
+ def ensure_ninja_binary(self):
+ for f in ['ninja', 'ninja-build']:
+ if inpath(f, os.environ['PATH'].split(os.pathsep)):
+ self.ninja_binary = f
+ return
+
+ self.use_ninja = False
+
+ raise CommandError(_('%s not found') % 'ninja')
def eval_args(self, args):
args = Package.eval_args(self, args)
@@ -93,6 +104,8 @@ class CMakeModule(MakeModule, DownloadableModule):
raise CommandError(_('%s not found') % 'cmake')
baseargs = '-DCMAKE_INSTALL_PREFIX=%s -DCMAKE_INSTALL_LIBDIR=lib' % prefix
cmakeargs = self.get_cmakeargs()
+ if self.use_ninja:
+ baseargs += ' -G Ninja'
# CMake on Windows generates VS projects or NMake makefiles by default.
# When using MSYS "MSYS Makefiles" is the best guess. "Unix Makefiles"
# and "MinGW Makefiles" could also work (each is a bit different).
@@ -106,20 +119,31 @@ class CMakeModule(MakeModule, DownloadableModule):
def do_clean(self, buildscript):
buildscript.set_action(_('Cleaning'), self)
builddir = self.get_builddir(buildscript)
- self.make(buildscript, 'clean')
+ if self.use_ninja:
+ self.ensure_ninja_binary()
+ buildscript.execute(self.ninja_binary + ' clean', cwd=builddir, extra_env=self.extra_env)
+ else:
+ self.make(buildscript, 'clean')
do_clean.depends = [PHASE_CONFIGURE]
do_clean.error_phases = [PHASE_FORCE_CHECKOUT, PHASE_CONFIGURE]
def do_build(self, buildscript):
buildscript.set_action(_('Building'), self)
builddir = self.get_builddir(buildscript)
- self.make(buildscript)
+ if self.use_ninja:
+ self.ensure_ninja_binary()
+ buildscript.execute(self.ninja_binary, cwd=builddir, extra_env=self.extra_env)
+ else:
+ self.make(buildscript)
do_build.depends = [PHASE_CONFIGURE]
do_build.error_phases = [PHASE_FORCE_CHECKOUT]
def do_dist(self, buildscript):
buildscript.set_action(_('Creating tarball for'), self)
- self.make(buildscript, 'package_source')
+ if not self.use_ninja:
+ self.make(buildscript, 'package_source')
+ else:
+ raise CommandError(_('%s does not support dist') % 'ninja')
do_dist.depends = [PHASE_CONFIGURE]
do_dist.error_phases = [PHASE_FORCE_CHECKOUT, PHASE_CONFIGURE]
@@ -130,13 +154,20 @@ class CMakeModule(MakeModule, DownloadableModule):
buildscript.set_action(_('Installing'), self)
builddir = self.get_builddir(buildscript)
destdir = self.prepare_installroot(buildscript)
- self.make(buildscript, 'install DESTDIR={}'.format(destdir))
+ if self.use_ninja:
+ self.ensure_ninja_binary()
+ extra_env = self.extra_env or {}
+ extra_env['DESTDIR'] = destdir
+ buildscript.execute(self.ninja_binary + ' install', cwd=builddir, extra_env=extra_env)
+ else:
+ self.make(buildscript, 'install DESTDIR={}'.format(destdir))
self.process_install(buildscript, self.get_revision())
do_install.depends = [PHASE_BUILD]
def xml_tag_and_attrs(self):
return 'cmake', [('id', 'name', None),
- ('skip-install', 'skip_install_phase', False)]
+ ('skip-install', 'skip_install_phase', False),
+ ('use-ninja', 'use_ninja', True)]
def parse_cmake(node, config, uri, repositories, default_repo):
@@ -159,6 +190,10 @@ def parse_cmake(node, config, uri, repositories, default_repo):
if node.hasAttribute('force-non-srcdir-builds'):
instance.force_non_srcdir_builds = \
(node.getAttribute('force-non-srcdir-builds') != 'no')
+ if node.hasAttribute('use-ninja'):
+ use_ninja = node.getAttribute('use-ninja')
+ if use_ninja.lower() in ('false', 'no'):
+ instance.use_ninja = False
return instance
register_module_type('cmake', parse_cmake)
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]