From b4f04a67de3dd13027be523d1c14e6e7485a9af5 Mon Sep 17 00:00:00 2001 From: Ninja-Koala Date: Wed, 19 Sep 2018 18:41:51 +0200 Subject: gnome.compile_resources: Add ld binary method Instead of generating a c file that gets compiled, directly create object file with ld. See https://gitlab.gnome.org/GNOME/glib/issues/1489 --- mesonbuild/modules/__init__.py | 4 ++ mesonbuild/modules/gnome.py | 140 ++++++++++++++++++++++++++++++++++++----- 2 files changed, 130 insertions(+), 14 deletions(-) (limited to 'mesonbuild/modules') diff --git a/mesonbuild/modules/__init__.py b/mesonbuild/modules/__init__.py index 6b6aa8b..2df4d7c 100644 --- a/mesonbuild/modules/__init__.py +++ b/mesonbuild/modules/__init__.py @@ -58,6 +58,10 @@ class GResourceHeaderTarget(build.CustomTarget): def __init__(self, name, subdir, subproject, kwargs): super().__init__(name, subdir, subproject, kwargs) +class GResourceObjectTarget(build.CustomTarget): + def __init__(self, name, subdir, subproject, kwargs): + super().__init__(name, subdir, subproject, kwargs) + class GirTarget(build.CustomTarget): def __init__(self, name, subdir, subproject, kwargs): super().__init__(name, subdir, subproject, kwargs) diff --git a/mesonbuild/modules/gnome.py b/mesonbuild/modules/gnome.py index 871cd48..09e8a53 100644 --- a/mesonbuild/modules/gnome.py +++ b/mesonbuild/modules/gnome.py @@ -25,7 +25,7 @@ from .. import mlog from .. import mesonlib from .. import compilers from .. import interpreter -from . import GResourceTarget, GResourceHeaderTarget, GirTarget, TypelibTarget, VapiTarget +from . import GResourceTarget, GResourceHeaderTarget, GResourceObjectTarget, GirTarget, TypelibTarget, VapiTarget from . import get_include_args from . import ExtensionModule from . import ModuleReturnValue @@ -40,6 +40,8 @@ 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 @@ -164,7 +166,11 @@ class GnomeModule(ExtensionModule): cmd += ['--sourcedir', source_dir] if 'c_name' in kwargs: - cmd += ['--c-name', kwargs.pop('c_name')] + c_name = kwargs.pop('c_name') + cmd += ['--c-name', c_name] + else: + c_name = os.path.basename(ifile).partition('.')[0] + c_name_no_underscores = c_name.replace('_', '') export = kwargs.pop('export', False) if not export: cmd += ['--internal'] @@ -173,13 +179,25 @@ 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): + ld_obj = self.interpreter.find_program_impl('ld', required=False) + if ld_obj.found(): + gresource_ld_binary = True + 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 + gresource = kwargs.pop('gresource_bundle', False) - if gresource: - output = args[0] + '.gresource' - name = args[0] + '_gresource' - else: - output = args[0] + '.c' - name = args[0] + '_c' + if gresource or gresource_ld_binary: + g_output = args[0] + '.gresource' + g_name = args[0] + '_gresource' + + 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') @@ -193,18 +211,42 @@ 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 - kwargs['command'] = cmd + 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 else: depfile = kwargs['output'] + '.d' kwargs['depfile'] = depfile - kwargs['command'] = copy.copy(cmd) + ['--dependency-file', '@DEPFILE@'] - target_c = GResourceTarget(name, state.subdir, state.subproject, kwargs) + if gresource_ld_binary: + kwargs['command'] = copy.copy(cmd) + ["--external-data", '--dependency-file', '@DEPFILE@'] + else: + 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 + if target_g.get_id() not in self.interpreter.build.targets: + return ModuleReturnValue(target_g, [target_g]) + else: + return ModuleReturnValue(target_g, []) - if gresource: # Only one target for .gresource files - return ModuleReturnValue(target_c, [target_c]) + target_c = GResourceTarget(name, state.subdir, state.subproject, kwargs) h_kwargs = { 'command': cmd, @@ -220,7 +262,77 @@ 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) - rv = [target_c, target_h] + + if gresource_ld_binary: + o_kwargs = { + 'command': [ld, '-r', '-b', 'binary', '@INPUT@', '-o', '@OUTPUT@'], + 'input': target_g, + 'output': args[0] + '.o' + } + + target_o = GResourceObjectTarget(args[0] + '_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') + + binary_name = os.path.join(state.subdir, g_output) + symbol_name = ''.join([ c if c.isalnum() else '_' for c in binary_name ]) + + linkerscript_string = 'SECTIONS\n' + linkerscript_string += '{\n' + linkerscript_string += ' .gresource.' + c_name_no_underscores + ' : ALIGN(8)\n' + linkerscript_string += ' {\n' + linkerscript_string += ' ' + c_name + '_resource_data = _binary_' + symbol_name + '_start;\n' + linkerscript_string += ' }\n' + linkerscript_string += ' .data :\n' + linkerscript_string += ' {\n' + linkerscript_string += ' *(.data)\n' + linkerscript_string += ' }\n' + linkerscript_string += '}' + + 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 != 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) + + else: + rv = [target_c, target_h] + return ModuleReturnValue(rv, rv) def _get_gresource_dependencies(self, state, input_file, source_dirs, dependencies): -- cgit v1.1 From 27edd112e220e2483c69687cfc107bd250f3a257 Mon Sep 17 00:00:00 2001 From: Ninja-Koala Date: Wed, 19 Sep 2018 19:33:36 +0200 Subject: Fix code formatting --- mesonbuild/modules/gnome.py | 30 +++++++++++++++--------------- 1 file changed, 15 insertions(+), 15 deletions(-) (limited to 'mesonbuild/modules') diff --git a/mesonbuild/modules/gnome.py b/mesonbuild/modules/gnome.py index 09e8a53..50b077c 100644 --- a/mesonbuild/modules/gnome.py +++ b/mesonbuild/modules/gnome.py @@ -187,9 +187,9 @@ class GnomeModule(ExtensionModule): ld = ld_obj.get_command() objcopy_object = self.interpreter.find_program_impl('objcopy', required=False) if objcopy_object.found(): - objcopy = objcopy_object.get_command() + objcopy = objcopy_object.get_command() else: - objcopy = None + objcopy = None gresource = kwargs.pop('gresource_bundle', False) if gresource or gresource_ld_binary: @@ -242,9 +242,9 @@ class GnomeModule(ExtensionModule): target_g = GResourceTarget(g_name, state.subdir, state.subproject, g_kwargs) if gresource: # Only one target for .gresource files if target_g.get_id() not in self.interpreter.build.targets: - return ModuleReturnValue(target_g, [target_g]) + return ModuleReturnValue(target_g, [target_g]) else: - return ModuleReturnValue(target_g, []) + return ModuleReturnValue(target_g, []) target_c = GResourceTarget(name, state.subdir, state.subproject, kwargs) @@ -278,9 +278,9 @@ class GnomeModule(ExtensionModule): linkerscript_file = open(linkerscript_path, 'w') binary_name = os.path.join(state.subdir, g_output) - symbol_name = ''.join([ c if c.isalnum() else '_' for c in binary_name ]) + symbol_name = ''.join([c if c.isalnum() else '_' for c in binary_name]) - linkerscript_string = 'SECTIONS\n' + linkerscript_string = 'SECTIONS\n' linkerscript_string += '{\n' linkerscript_string += ' .gresource.' + c_name_no_underscores + ' : ALIGN(8)\n' linkerscript_string += ' {\n' @@ -301,32 +301,32 @@ class GnomeModule(ExtensionModule): } target_o2 = GResourceObjectTarget(args[0] + '2_o', state.subdir, state.subproject, o2_kwargs) - if objcopy != None: + 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@'] + objcopy_cmd += ['@INPUT@', '@OUTPUT@'] o3_kwargs = { - 'command': objcopy_cmd, - 'input': target_o2, - 'output': args[0] + '3.o' + '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] + rv2 = rv1 + [target_g, target_o, target_o2] else: - rv2 = rv1 + [target_o, target_o2] + 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] + rv2 = rv1 + [target_g, target_o] else: - rv2 = rv1 + [target_o] + rv2 = rv1 + [target_o] return ModuleReturnValue(rv1, rv2) -- cgit v1.1 From a6f09b9754760ee7a36695b6252d80f254360c7a Mon Sep 17 00:00:00 2001 From: Ninja-Koala Date: Thu, 20 Sep 2018 21:13:58 +0200 Subject: Remove dependency file from c target --- mesonbuild/modules/gnome.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) (limited to 'mesonbuild/modules') diff --git a/mesonbuild/modules/gnome.py b/mesonbuild/modules/gnome.py index 50b077c..c495c85 100644 --- a/mesonbuild/modules/gnome.py +++ b/mesonbuild/modules/gnome.py @@ -220,7 +220,7 @@ class GnomeModule(ExtensionModule): # 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"] + kwargs['command'] = copy.copy(cmd) + ['--external-data'] else: kwargs['command'] = cmd if gresource or gresource_ld_binary: @@ -229,10 +229,10 @@ class GnomeModule(ExtensionModule): g_kwargs['command'] = cmd else: depfile = kwargs['output'] + '.d' - kwargs['depfile'] = depfile if gresource_ld_binary: - kwargs['command'] = copy.copy(cmd) + ["--external-data", '--dependency-file', '@DEPFILE@'] + kwargs['command'] = copy.copy(cmd) + ['--external-data'] else: + kwargs['depfile'] = depfile kwargs['command'] = copy.copy(cmd) + ['--dependency-file', '@DEPFILE@'] if gresource or gresource_ld_binary: g_kwargs['depfile'] = depfile -- cgit v1.1 From 1f14a58d3b9b5781f79e7e7f3954beaf4f4b95e9 Mon Sep 17 00:00:00 2001 From: Ninja-Koala Date: Thu, 20 Sep 2018 22:31:06 +0200 Subject: Add second dependency file for c target --- mesonbuild/modules/gnome.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) (limited to 'mesonbuild/modules') diff --git a/mesonbuild/modules/gnome.py b/mesonbuild/modules/gnome.py index c495c85..07dd614 100644 --- a/mesonbuild/modules/gnome.py +++ b/mesonbuild/modules/gnome.py @@ -230,7 +230,9 @@ class GnomeModule(ExtensionModule): else: depfile = kwargs['output'] + '.d' if gresource_ld_binary: - kwargs['command'] = copy.copy(cmd) + ['--external-data'] + 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@'] -- cgit v1.1 From 6026a35446148266ae73daf98911ab434057fd88 Mon Sep 17 00:00:00 2001 From: Ninja-Koala Date: Wed, 3 Oct 2018 18:49:25 +0200 Subject: Handle minus sign correctly --- mesonbuild/modules/gnome.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) (limited to 'mesonbuild/modules') diff --git a/mesonbuild/modules/gnome.py b/mesonbuild/modules/gnome.py index 07dd614..5640105 100644 --- a/mesonbuild/modules/gnome.py +++ b/mesonbuild/modules/gnome.py @@ -40,7 +40,7 @@ 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' +gresource_ld_binary_needed_version = '>= 2.59' native_glib_version = None girwarning_printed = False @@ -170,6 +170,7 @@ class GnomeModule(ExtensionModule): cmd += ['--c-name', c_name] else: c_name = os.path.basename(ifile).partition('.')[0] + c_name = c_name.replace('-', '_') c_name_no_underscores = c_name.replace('_', '') export = kwargs.pop('export', False) if not export: -- cgit v1.1 From b6a6076596e38c52a82bfc84a0e7cb63b93b0cca Mon Sep 17 00:00:00 2001 From: Ninja-Koala Date: Sat, 2 Feb 2019 19:07:06 +0100 Subject: Disable for cross builds --- mesonbuild/modules/gnome.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'mesonbuild/modules') diff --git a/mesonbuild/modules/gnome.py b/mesonbuild/modules/gnome.py index 5640105..45cffd8 100644 --- a/mesonbuild/modules/gnome.py +++ b/mesonbuild/modules/gnome.py @@ -181,7 +181,7 @@ 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): + 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 -- cgit v1.1 From 83d78d7b6efb96a2a6d85dbe985dca820b243dbd Mon Sep 17 00:00:00 2001 From: Ninja-Koala Date: Sat, 2 Feb 2019 19:45:48 +0100 Subject: Move target generation in new function --- mesonbuild/modules/gnome.py | 125 +++++++++++++++++++++++--------------------- 1 file changed, 64 insertions(+), 61 deletions(-) (limited to 'mesonbuild/modules') diff --git a/mesonbuild/modules/gnome.py b/mesonbuild/modules/gnome.py index 45cffd8..0b360fa 100644 --- a/mesonbuild/modules/gnome.py +++ b/mesonbuild/modules/gnome.py @@ -267,76 +267,79 @@ class GnomeModule(ExtensionModule): target_h = GResourceHeaderTarget(args[0] + '_h', state.subdir, state.subproject, h_kwargs) if gresource_ld_binary: - o_kwargs = { - 'command': [ld, '-r', '-b', 'binary', '@INPUT@', '-o', '@OUTPUT@'], - 'input': target_g, - 'output': args[0] + '.o' - } + return self._create_gresource_ld_binary_targets(ld, target_g, args, state, g_output, c_name_no_underscores, c_name, objcopy, target_c, target_h) + else: + rv = [target_c, target_h] - target_o = GResourceObjectTarget(args[0] + '_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') - - binary_name = os.path.join(state.subdir, g_output) - symbol_name = ''.join([c if c.isalnum() else '_' for c in binary_name]) - - linkerscript_string = 'SECTIONS\n' - linkerscript_string += '{\n' - linkerscript_string += ' .gresource.' + c_name_no_underscores + ' : ALIGN(8)\n' - linkerscript_string += ' {\n' - linkerscript_string += ' ' + c_name + '_resource_data = _binary_' + symbol_name + '_start;\n' - linkerscript_string += ' }\n' - linkerscript_string += ' .data :\n' - linkerscript_string += ' {\n' - linkerscript_string += ' *(.data)\n' - linkerscript_string += ' }\n' - linkerscript_string += '}' - - 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) + return ModuleReturnValue(rv, rv) - 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@'] + def _create_gresource_ld_binary_targets(self, ld, target_g, args, state, g_output, c_name_no_underscores, c_name, objcopy, target_c, target_h): - o3_kwargs = { - 'command': objcopy_cmd, - 'input': target_o2, - 'output': args[0] + '3.o' - } + o_kwargs = { + 'command': [ld, '-r', '-b', 'binary', '@INPUT@', '-o', '@OUTPUT@'], + 'input': target_g, + 'output': args[0] + '.o' + } - target_o3 = GResourceObjectTarget(args[0] + '3_o', state.subdir, state.subproject, o3_kwargs) + target_o = GResourceObjectTarget(args[0] + '_o', state.subdir, state.subproject, o_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] + 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') + + binary_name = os.path.join(state.subdir, g_output) + symbol_name = ''.join([c if c.isalnum() else '_' for c in binary_name]) + + linkerscript_string = 'SECTIONS\n' + linkerscript_string += '{\n' + linkerscript_string += ' .gresource.' + c_name_no_underscores + ' : ALIGN(8)\n' + linkerscript_string += ' {\n' + linkerscript_string += ' ' + c_name + '_resource_data = _binary_' + symbol_name + '_start;\n' + linkerscript_string += ' }\n' + linkerscript_string += ' .data :\n' + linkerscript_string += ' {\n' + linkerscript_string += ' *(.data)\n' + linkerscript_string += ' }\n' + linkerscript_string += '}' + + 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' + } - return ModuleReturnValue(rv1, rv2) + 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: - rv = [target_c, target_h] + 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(rv, rv) + return ModuleReturnValue(rv1, rv2) def _get_gresource_dependencies(self, state, input_file, source_dirs, dependencies): -- cgit v1.1 From 34191ec018816ac68fc6366fb5b884da3eddd8ec Mon Sep 17 00:00:00 2001 From: Ninja-Koala Date: Sat, 2 Feb 2019 19:46:32 +0100 Subject: Use triple quote string for linkerscript --- mesonbuild/modules/gnome.py | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) (limited to 'mesonbuild/modules') diff --git a/mesonbuild/modules/gnome.py b/mesonbuild/modules/gnome.py index 0b360fa..8bc9f43 100644 --- a/mesonbuild/modules/gnome.py +++ b/mesonbuild/modules/gnome.py @@ -291,17 +291,17 @@ class GnomeModule(ExtensionModule): binary_name = os.path.join(state.subdir, g_output) symbol_name = ''.join([c if c.isalnum() else '_' for c in binary_name]) - linkerscript_string = 'SECTIONS\n' - linkerscript_string += '{\n' - linkerscript_string += ' .gresource.' + c_name_no_underscores + ' : ALIGN(8)\n' - linkerscript_string += ' {\n' - linkerscript_string += ' ' + c_name + '_resource_data = _binary_' + symbol_name + '_start;\n' - linkerscript_string += ' }\n' - linkerscript_string += ' .data :\n' - linkerscript_string += ' {\n' - linkerscript_string += ' *(.data)\n' - linkerscript_string += ' }\n' - linkerscript_string += '}' + 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) -- cgit v1.1 From b0832c8747fa3ebb8e2d6ffac2a44bc623499bbf Mon Sep 17 00:00:00 2001 From: Ninja-Koala Date: Sat, 2 Feb 2019 23:02:33 +0100 Subject: Move some additional functionality into the new function --- mesonbuild/modules/gnome.py | 21 +++++++++++---------- 1 file changed, 11 insertions(+), 10 deletions(-) (limited to 'mesonbuild/modules') diff --git a/mesonbuild/modules/gnome.py b/mesonbuild/modules/gnome.py index 8bc9f43..2fa03b7 100644 --- a/mesonbuild/modules/gnome.py +++ b/mesonbuild/modules/gnome.py @@ -170,8 +170,6 @@ class GnomeModule(ExtensionModule): cmd += ['--c-name', c_name] else: c_name = os.path.basename(ifile).partition('.')[0] - c_name = c_name.replace('-', '_') - c_name_no_underscores = c_name.replace('_', '') export = kwargs.pop('export', False) if not export: cmd += ['--internal'] @@ -185,12 +183,6 @@ class GnomeModule(ExtensionModule): ld_obj = self.interpreter.find_program_impl('ld', required=False) if ld_obj.found(): gresource_ld_binary = True - 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 gresource = kwargs.pop('gresource_bundle', False) if gresource or gresource_ld_binary: @@ -267,13 +259,22 @@ class GnomeModule(ExtensionModule): target_h = GResourceHeaderTarget(args[0] + '_h', state.subdir, state.subproject, h_kwargs) if gresource_ld_binary: - return self._create_gresource_ld_binary_targets(ld, target_g, args, state, g_output, c_name_no_underscores, c_name, objcopy, target_c, target_h) + return self._create_gresource_ld_binary_targets(args, state, ld_obj, c_name, target_g, g_output, target_c, target_h) else: rv = [target_c, target_h] return ModuleReturnValue(rv, rv) - def _create_gresource_ld_binary_targets(self, ld, target_g, args, state, g_output, c_name_no_underscores, c_name, objcopy, target_c, target_h): + def _create_gresource_ld_binary_targets(self, args, state, ld_obj, c_name, target_g, g_output, target_c, target_h): + c_name = c_name.replace('-', '_') + c_name_no_underscores = c_name.replace('_', '') + + 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@'], -- cgit v1.1 From 06018950329eaffb92c67d31f6477a02c53855e7 Mon Sep 17 00:00:00 2001 From: Ninja-Koala Date: Sun, 3 Feb 2019 11:49:40 +0100 Subject: More robust name generation --- mesonbuild/modules/gnome.py | 26 ++++++++++++++++++-------- 1 file changed, 18 insertions(+), 8 deletions(-) (limited to 'mesonbuild/modules') diff --git a/mesonbuild/modules/gnome.py b/mesonbuild/modules/gnome.py index 2fa03b7..a02825c 100644 --- a/mesonbuild/modules/gnome.py +++ b/mesonbuild/modules/gnome.py @@ -16,6 +16,8 @@ functionality such as gobject-introspection, gresources and gtk-doc''' import os +import re +import sys import copy import shlex import subprocess @@ -169,7 +171,7 @@ class GnomeModule(ExtensionModule): c_name = kwargs.pop('c_name') cmd += ['--c-name', c_name] else: - c_name = os.path.basename(ifile).partition('.')[0] + c_name = None export = kwargs.pop('export', False) if not export: cmd += ['--internal'] @@ -259,15 +261,21 @@ class GnomeModule(ExtensionModule): 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, ld_obj, c_name, target_g, g_output, target_c, target_h) + 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] return ModuleReturnValue(rv, rv) - def _create_gresource_ld_binary_targets(self, args, state, ld_obj, c_name, target_g, g_output, target_c, target_h): - c_name = c_name.replace('-', '_') - c_name_no_underscores = c_name.replace('_', '') + 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) @@ -279,18 +287,20 @@ class GnomeModule(ExtensionModule): o_kwargs = { 'command': [ld, '-r', '-b', 'binary', '@INPUT@', '-o', '@OUTPUT@'], 'input': target_g, - 'output': args[0] + '.o' + 'output': args[0] + '1.o' } - target_o = GResourceObjectTarget(args[0] + '_o', state.subdir, state.subproject, o_kwargs) + 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) - symbol_name = ''.join([c if c.isalnum() else '_' for c in binary_name]) + encoding = sys.getfilesystemencoding() + symbol_name = re.sub(rb'([^(_a-zA-Z0-9)])', b'_', binary_name.encode(encoding)).decode(encoding) linkerscript_string = '''SECTIONS {{ -- cgit v1.1 From 4775dd48a61aeb29d540ae599fbbb02827f9453b Mon Sep 17 00:00:00 2001 From: Ninja-Koala Date: Sun, 3 Feb 2019 13:14:36 +0100 Subject: Fix required version --- mesonbuild/modules/gnome.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'mesonbuild/modules') diff --git a/mesonbuild/modules/gnome.py b/mesonbuild/modules/gnome.py index a02825c..36f89b0 100644 --- a/mesonbuild/modules/gnome.py +++ b/mesonbuild/modules/gnome.py @@ -42,7 +42,7 @@ 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.59' +gresource_ld_binary_needed_version = '>= 2.60' native_glib_version = None girwarning_printed = False -- cgit v1.1