setup: Make gsettings always work regardless of install dir (bz #1267377)

Most of this is lifted from 'meld'. The bits are

- compile gsettings schemas at setup.py install time
- add options to disable that, and use them in the RPM
- always pass GSETTINGS_SCHEMA_DIR so gsettings loading always works
  regardless of the install dir

https://bugzilla.redhat.com/show_bug.cgi?id=1267377
This commit is contained in:
Cole Robinson 2015-11-02 16:19:31 -05:00
parent 293a1d1509
commit fe722b99cb
5 changed files with 55 additions and 15 deletions

View File

@ -4,6 +4,7 @@ include MANIFEST.in
include setup.py include setup.py
include virt-* include virt-*
recursive-include data * recursive-include data *
exclude data/gschemas.compiled
recursive-include man * recursive-include man *
recursive-include po * recursive-include po *
recursive-include tests * recursive-include tests *

View File

@ -5,14 +5,16 @@ import glob
import fnmatch import fnmatch
import os import os
import sys import sys
import time
import unittest import unittest
import distutils import distutils
import distutils.command.build import distutils.command.build
import distutils.command.install import distutils.command.install
import distutils.command.install_data
import distutils.command.install_egg_info import distutils.command.install_egg_info
import distutils.command.sdist import distutils.command.sdist
import distutils.dist
import distutils.log
import distutils.sysconfig import distutils.sysconfig
sysprefix = distutils.sysconfig.get_config_var("prefix") sysprefix = distutils.sysconfig.get_config_var("prefix")
@ -237,15 +239,25 @@ class my_install(distutils.command.install.install):
(self.prefix, CLIConfig.prefix)) (self.prefix, CLIConfig.prefix))
sys.exit(1) sys.exit(1)
if self.prefix != "/usr":
print ("WARNING: GSettings may not find your schema if it's\n"
"not in /usr/share. You may need to manually play with\n"
"GSETTINGS_SCHEMA_DIR and glib-compile-schemas.\n\n")
time.sleep(2)
distutils.command.install.install.finalize_options(self) distutils.command.install.install.finalize_options(self)
class my_install_data(distutils.command.install_data.install_data):
def run(self):
distutils.command.install_data.install_data.run(self)
if not self.distribution.no_update_icon_cache:
distutils.log.info("running gtk-update-icon-cache")
icon_path = os.path.join(self.install_dir, "share/icons/hicolor")
self.spawn(["gtk-update-icon-cache", "-q", "-t", icon_path])
if not self.distribution.no_compile_schemas:
distutils.log.info("compiling gsettings schemas")
gschema_install = os.path.join(self.install_dir,
"share/glib-2.0/schemas")
self.spawn(["glib-compile-schemas", gschema_install])
class my_sdist(distutils.command.sdist.sdist): class my_sdist(distutils.command.sdist.sdist):
description = "Update virt-manager.spec; build sdist-tarball." description = "Update virt-manager.spec; build sdist-tarball."
@ -593,6 +605,18 @@ class CheckPylint(distutils.core.Command):
os.system(cmd) os.system(cmd)
class VMMDistribution(distutils.dist.Distribution):
global_options = distutils.dist.Distribution.global_options + [
("no-update-icon-cache", None, "Don't run gtk-update-icon-cache"),
("no-compile-schemas", None, "Don't compile gsettings schemas"),
]
def __init__(self, *args, **kwargs):
self.no_update_icon_cache = False
self.no_compile_schemas = False
distutils.dist.Distribution.__init__(self, *args, **kwargs)
distutils.core.setup( distutils.core.setup(
name="virt-manager", name="virt-manager",
version=CLIConfig.version, version=CLIConfig.version,
@ -645,6 +669,7 @@ distutils.core.setup(
'sdist': my_sdist, 'sdist': my_sdist,
'install': my_install, 'install': my_install,
'install_data': my_install_data,
'install_egg_info': my_egg_info, 'install_egg_info': my_egg_info,
'configure': configure, 'configure': configure,
@ -655,5 +680,7 @@ distutils.core.setup(
'test_ui': TestUI, 'test_ui': TestUI,
'test_urls' : TestURLFetch, 'test_urls' : TestURLFetch,
'test_initrd_inject' : TestInitrdInject, 'test_initrd_inject' : TestInitrdInject,
} },
distclass=VMMDistribution,
) )

View File

@ -141,7 +141,9 @@ python setup.py configure \
%install %install
python setup.py install -O1 --root=%{buildroot} python setup.py \
--no-update-icon-cache --no-compile-schemas \
install -O1 --root=%{buildroot}
%find_lang %{name} %find_lang %{name}
# The conversion script was only added to virt-manager after several # The conversion script was only added to virt-manager after several

View File

@ -31,12 +31,18 @@ RUNNING_CONFIG = None
class SettingsWrapper(object): class SettingsWrapper(object):
def __init__(self, settings_id): """
Wrapper class to simplify interacting with gsettings APIs
"""
def __init__(self, settings_id, schemadir):
self._root = settings_id self._root = settings_id
os.environ["GSETTINGS_SCHEMA_DIR"] = schemadir
self._settings = Gio.Settings.new(self._root) self._settings = Gio.Settings.new(self._root)
self._settingsmap = {"": self._settings} self._settingsmap = {"": self._settings}
self._handler_map = {} self._handler_map = {}
for child in self._settings.list_children(): for child in self._settings.list_children():
childschema = self._root + "." + child childschema = self._root + "." + child
self._settingsmap[child] = Gio.Settings.new(childschema) self._settingsmap[child] = Gio.Settings.new(childschema)
@ -155,7 +161,8 @@ class vmmConfig(object):
self.ui_dir = CLIConfig.ui_dir self.ui_dir = CLIConfig.ui_dir
self.test_first_run = bool(test_first_run) self.test_first_run = bool(test_first_run)
self.conf = SettingsWrapper("org.virt-manager.virt-manager") self.conf = SettingsWrapper("org.virt-manager.virt-manager",
CLIConfig.gsettings_dir)
# We don't create it straight away, since we don't want # We don't create it straight away, since we don't want
# to block the app pending user authorization to access # to block the app pending user authorization to access

View File

@ -63,7 +63,6 @@ def _setup_gsettings_path(schemadir):
raise RuntimeError("You must install glib-compile-schemas to run " raise RuntimeError("You must install glib-compile-schemas to run "
"virt-manager from git.") "virt-manager from git.")
os.environ["GSETTINGS_SCHEMA_DIR"] = schemadir
ret = subprocess.call([exe, "--strict", schemadir]) ret = subprocess.call([exe, "--strict", schemadir])
if ret != 0: if ret != 0:
raise RuntimeError("Failed to compile local gsettings schemas") raise RuntimeError("Failed to compile local gsettings schemas")
@ -92,6 +91,7 @@ class _CLIConfig(object):
self.gettext_dir = None self.gettext_dir = None
self.ui_dir = None self.ui_dir = None
self.icon_dir = None self.icon_dir = None
self.gsettings_dir = None
self.set_paths_by_prefix(_get_param("prefix", "/usr"), self.set_paths_by_prefix(_get_param("prefix", "/usr"),
check_source_dir=True) check_source_dir=True)
@ -100,13 +100,16 @@ class _CLIConfig(object):
self.gettext_dir = os.path.join(prefix, "share", "locale") self.gettext_dir = os.path.join(prefix, "share", "locale")
if _running_from_srcdir and check_source_dir: if _running_from_srcdir and check_source_dir:
self.icon_dir = os.path.join(_srcdir, "data")
self.ui_dir = os.path.join(_srcdir, "ui") self.ui_dir = os.path.join(_srcdir, "ui")
_setup_gsettings_path(self.icon_dir) self.icon_dir = os.path.join(_srcdir, "data")
self.gsettings_dir = self.icon_dir
_setup_gsettings_path(self.gsettings_dir)
else: else:
self.ui_dir = os.path.join(prefix, "share", "virt-manager", "ui")
self.icon_dir = os.path.join(prefix, "share", "virt-manager", self.icon_dir = os.path.join(prefix, "share", "virt-manager",
"icons") "icons")
self.ui_dir = os.path.join(prefix, "share", "virt-manager", "ui") self.gsettings_dir = os.path.join(prefix, "share",
"glib-2.0", "schemas")
CLIConfig = _CLIConfig() CLIConfig = _CLIConfig()