aboutsummaryrefslogtreecommitdiff
path: root/mesonbuild/modules/gnome.py
diff options
context:
space:
mode:
Diffstat (limited to 'mesonbuild/modules/gnome.py')
-rw-r--r--mesonbuild/modules/gnome.py158
1 files changed, 14 insertions, 144 deletions
diff --git a/mesonbuild/modules/gnome.py b/mesonbuild/modules/gnome.py
index 8833a21..2d16956 100644
--- a/mesonbuild/modules/gnome.py
+++ b/mesonbuild/modules/gnome.py
@@ -16,8 +16,6 @@
functionality such as gobject-introspection, gresources and gtk-doc'''
import os
-import re
-import sys
import copy
import shlex
import subprocess
@@ -27,7 +25,7 @@ from .. import mlog
from .. import mesonlib
from .. import compilers
from .. import interpreter
-from . import GResourceTarget, GResourceHeaderTarget, GResourceObjectTarget, GirTarget, TypelibTarget, VapiTarget
+from . import GResourceTarget, GResourceHeaderTarget, GirTarget, TypelibTarget, VapiTarget
from . import get_include_args
from . import ExtensionModule
from . import ModuleReturnValue
@@ -44,8 +42,6 @@ from ..interpreterbase import noKwargs, permittedKwargs, FeatureNew, FeatureNewK
# https://bugzilla.gnome.org/show_bug.cgi?id=774368
gresource_dep_needed_version = '>= 2.51.1'
-gresource_ld_binary_needed_version = '>= 2.60'
-
native_glib_version = None
girwarning_printed = False
gdbuswarning_printed = False
@@ -170,10 +166,7 @@ class GnomeModule(ExtensionModule):
cmd += ['--sourcedir', source_dir]
if 'c_name' in kwargs:
- c_name = kwargs.pop('c_name')
- cmd += ['--c-name', c_name]
- else:
- c_name = None
+ cmd += ['--c-name', kwargs.pop('c_name')]
export = kwargs.pop('export', False)
if not export:
cmd += ['--internal']
@@ -182,23 +175,13 @@ class GnomeModule(ExtensionModule):
cmd += mesonlib.stringlistify(kwargs.pop('extra_args', []))
- gresource_ld_binary = False
- if mesonlib.is_linux() and mesonlib.version_compare(glib_version, gresource_ld_binary_needed_version) and not state.environment.is_cross_build():
- ld_obj = self.interpreter.find_program_impl('ld', required=False)
- if ld_obj.found():
- gresource_ld_binary = True
-
gresource = kwargs.pop('gresource_bundle', False)
-
if gresource:
- g_output = args[0] + '.gresource'
- g_name = args[0] + '_gresource'
- elif gresource_ld_binary:
- g_output = args[0] + '_ld_binary.gresource'
- g_name = args[0] + '_ld_binary_gresource'
-
- output = args[0] + '.c'
- name = args[0] + '_c'
+ output = args[0] + '.gresource'
+ name = args[0] + '_gresource'
+ else:
+ output = args[0] + '.c'
+ name = args[0] + '_c'
if kwargs.get('install', False) and not gresource:
raise MesonException('The install kwarg only applies to gresource bundles, see install_header')
@@ -212,42 +195,19 @@ class GnomeModule(ExtensionModule):
kwargs['input'] = args[1]
kwargs['output'] = output
kwargs['depends'] = depends
- if gresource or gresource_ld_binary:
- g_kwargs = copy.deepcopy(kwargs)
- g_kwargs['input'] = args[1]
- g_kwargs['output'] = g_output
- g_kwargs['depends'] = depends
if not mesonlib.version_compare(glib_version, gresource_dep_needed_version):
# This will eventually go out of sync if dependencies are added
kwargs['depend_files'] = depend_files
- if gresource_ld_binary:
- kwargs['command'] = copy.copy(cmd) + ['--external-data']
- else:
- kwargs['command'] = cmd
- if gresource or gresource_ld_binary:
- # This will eventually go out of sync if dependencies are added
- g_kwargs['depend_files'] = depend_files
- g_kwargs['command'] = cmd
+ kwargs['command'] = cmd
else:
depfile = kwargs['output'] + '.d'
- if gresource_ld_binary:
- depfile2 = kwargs['output'] + '.2.d'
- kwargs['depfile'] = depfile2
- kwargs['command'] = copy.copy(cmd) + ['--external-data', '--dependency-file', '@DEPFILE@']
- else:
- kwargs['depfile'] = depfile
- kwargs['command'] = copy.copy(cmd) + ['--dependency-file', '@DEPFILE@']
- if gresource or gresource_ld_binary:
- g_kwargs['depfile'] = depfile
- g_kwargs['command'] = copy.copy(cmd) + ['--dependency-file', '@DEPFILE@']
-
- if gresource or gresource_ld_binary:
- target_g = GResourceTarget(g_name, state.subdir, state.subproject, g_kwargs)
- if gresource: # Only one target for .gresource files
- return ModuleReturnValue(target_g, [target_g])
-
+ kwargs['depfile'] = depfile
+ kwargs['command'] = copy.copy(cmd) + ['--dependency-file', '@DEPFILE@']
target_c = GResourceTarget(name, state.subdir, state.subproject, kwargs)
+ if gresource: # Only one target for .gresource files
+ return ModuleReturnValue(target_c, [target_c])
+
h_kwargs = {
'command': cmd,
'input': args[1],
@@ -262,99 +222,9 @@ class GnomeModule(ExtensionModule):
h_kwargs['install_dir'] = kwargs.get('install_dir',
state.environment.coredata.get_builtin_option('includedir'))
target_h = GResourceHeaderTarget(args[0] + '_h', state.subdir, state.subproject, h_kwargs)
-
- if gresource_ld_binary:
- return self._create_gresource_ld_binary_targets(args, state, ifile, ld_obj, c_name, target_g, g_output, target_c, target_h)
- else:
- rv = [target_c, target_h]
-
+ rv = [target_c, target_h]
return ModuleReturnValue(rv, rv)
- def _create_gresource_ld_binary_targets(self, args, state, ifile, ld_obj, c_name, target_g, g_output, target_c, target_h):
- if c_name is None:
- # Create proper c identifier from filename in the way glib-compile-resources does
- c_name = os.path.basename(ifile).partition('.')[0]
- c_name = c_name.replace('-', '_')
- c_name = re.sub(r'^([^(_a-zA-Z)])+', '', c_name)
- c_name = re.sub(r'([^(_a-zA-Z0-9)])', '', c_name)
-
- c_name_no_underscores = re.sub(r'^_+', '', c_name)
-
- ld = ld_obj.get_command()
- objcopy_object = self.interpreter.find_program_impl('objcopy', required=False)
- if objcopy_object.found():
- objcopy = objcopy_object.get_command()
- else:
- objcopy = None
-
- o_kwargs = {
- 'command': [ld, '-r', '-b', 'binary', '@INPUT@', '-o', '@OUTPUT@'],
- 'input': target_g,
- 'output': args[0] + '1.o'
- }
-
- target_o = GResourceObjectTarget(args[0] + '1_o', state.subdir, state.subproject, o_kwargs)
-
- builddir = os.path.join(state.environment.get_build_dir(), state.subdir)
- linkerscript_name = args[0] + '_map.ld'
- linkerscript_path = os.path.join(builddir, linkerscript_name)
- linkerscript_file = open(linkerscript_path, 'w')
-
- # Create symbol name the way bfd does
- binary_name = os.path.join(state.subdir, g_output)
- encoding = sys.getfilesystemencoding()
- symbol_name = re.sub(rb'([^(_a-zA-Z0-9)])', b'_', binary_name.encode(encoding)).decode(encoding)
-
- linkerscript_string = '''SECTIONS
-{{
- .gresource.{} : ALIGN(8)
- {{
- {}_resource_data = _binary_{}_start;
- }}
- .data :
- {{
- *(.data)
- }}
-}}'''.format(c_name_no_underscores, c_name, symbol_name)
-
- linkerscript_file.write(linkerscript_string)
-
- o2_kwargs = {
- 'command': [ld, '-r', '-T', os.path.join(state.subdir, linkerscript_name), '@INPUT@', '-o', '@OUTPUT@'],
- 'input': target_o,
- 'output': args[0] + '2.o',
- }
- target_o2 = GResourceObjectTarget(args[0] + '2_o', state.subdir, state.subproject, o2_kwargs)
-
- if objcopy is not None:
- objcopy_cmd = [objcopy, '--set-section-flags', '.gresource.' + c_name + '=readonly,alloc,load,data']
- objcopy_cmd += ['-N', '_binary_' + symbol_name + '_start']
- objcopy_cmd += ['-N', '_binary_' + symbol_name + '_end']
- objcopy_cmd += ['-N', '_binary_' + symbol_name + '_size']
- objcopy_cmd += ['@INPUT@', '@OUTPUT@']
-
- o3_kwargs = {
- 'command': objcopy_cmd,
- 'input': target_o2,
- 'output': args[0] + '3.o'
- }
-
- target_o3 = GResourceObjectTarget(args[0] + '3_o', state.subdir, state.subproject, o3_kwargs)
-
- rv1 = [target_c, target_h, target_o3]
- if target_g.get_id() not in self.interpreter.build.targets:
- rv2 = rv1 + [target_g, target_o, target_o2]
- else:
- rv2 = rv1 + [target_o, target_o2]
- else:
- rv1 = [target_c, target_h, target_o2]
- if target_g.get_id() not in self.interpreter.build.targets:
- rv2 = rv1 + [target_g, target_o]
- else:
- rv2 = rv1 + [target_o]
-
- return ModuleReturnValue(rv1, rv2)
-
def _get_gresource_dependencies(self, state, input_file, source_dirs, dependencies):
cmd = ['glib-compile-resources',