From 6af7f92ab3a4d3fd70efa93b377d88056b9cbf02 Mon Sep 17 00:00:00 2001 From: Jussi Pakkanen Date: Wed, 30 Jul 2014 15:49:01 +0300 Subject: Handle C# resource files. --- build.py | 10 ++++++++++ ninjabackend.py | 26 +++++++++++++++++++++++++- test cases/csharp/3 resource/TestRes.resx | 31 +++++++++++++++++++++++++++++++ test cases/csharp/3 resource/meson.build | 6 ++++++ test cases/csharp/3 resource/resprog.cs | 13 +++++++++++++ 5 files changed, 85 insertions(+), 1 deletion(-) create mode 100644 test cases/csharp/3 resource/TestRes.resx create mode 100644 test cases/csharp/3 resource/meson.build create mode 100644 test cases/csharp/3 resource/resprog.cs diff --git a/build.py b/build.py index daa2777..16696a8 100644 --- a/build.py +++ b/build.py @@ -308,6 +308,16 @@ class BuildTarget(): self.install_rpath = kwargs.get('install_rpath', '') if not isinstance(self.install_rpath, str): raise InvalidArguments('Install_rpath is not a string.') + resources = kwargs.get('resources', []) + if not isinstance(resources, list): + resources = [resources] + for r in resources: + if not isinstance(r, str): + raise InvalidArguments('Resource argument is not a string.') + trial = os.path.join(environment.get_source_dir(), self.subdir, r) + if not os.path.isfile(trial): + raise InvalidArguments('Tried to add non-existing resource %s.' % r) + self.resources = resources def get_subdir(self): return self.subdir diff --git a/ninjabackend.py b/ninjabackend.py index 547a8ae..b165ef5 100644 --- a/ninjabackend.py +++ b/ninjabackend.py @@ -441,6 +441,27 @@ class NinjaBackend(backends.Backend): elem.add_item('ARGS', commands) elem.write(outfile) + def generate_cs_resource_tasks(self, target, outfile): + args = [] + deps = [] + for r in target.resources: + rel_sourcefile = os.path.join(self.build_to_src, target.subdir, r) + if r.endswith('.resources'): + a = '-resource:' + rel_sourcefile + elif r.endswith('.txt') or r.endswith('.resx'): + ofilebase = os.path.splitext(os.path.basename(r))[0] + '.resources' + ofilename = os.path.join(self.get_target_dir(target), target.get_basename() + '.dir', ofilebase) + elem = NinjaBuildElement(ofilename, "CUSTOM_COMMAND", rel_sourcefile) + elem.add_item('COMMAND', ['resgen', rel_sourcefile, ofilename]) + elem.add_item('DESC', 'Compiling resource %s.' % rel_sourcefile) + elem.write(outfile) + deps.append(ofilename) + a = '-resource:' + ofilename + else: + raise InvalidArguments('Unknown resource file %s.' % r) + args.append(a) + return (args, deps) + def generate_cs_target(self, target, outfile): buildtype = self.environment.coredata.buildtype fname = target.get_filename() @@ -450,6 +471,7 @@ class NinjaBackend(backends.Backend): compiler = self.get_compiler_for_source(src_list[0]) assert(compiler.get_language() == 'cs') rel_srcs = [os.path.join(self.build_to_src, s) for s in src_list] + deps = [] commands = target.extra_args.get('cs', []) commands += compiler.get_buildtype_args(buildtype) if isinstance(target, build.Executable): @@ -458,8 +480,10 @@ class NinjaBackend(backends.Backend): commands.append('-target:library') else: raise MesonException('Unknown C# target type.') + (resource_args, resource_deps) = self.generate_cs_resource_tasks(target, outfile) + commands += resource_args + deps += resource_deps commands += compiler.get_output_args(outname_rel) - deps = [] for l in target.link_targets: commands += compiler.get_link_args(l.get_filename()) deps.append(l.get_filename()) diff --git a/test cases/csharp/3 resource/TestRes.resx b/test cases/csharp/3 resource/TestRes.resx new file mode 100644 index 0000000..c85f85c --- /dev/null +++ b/test cases/csharp/3 resource/TestRes.resx @@ -0,0 +1,31 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +text/microsoft-resx1.3System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089Hello from resources! + \ No newline at end of file diff --git a/test cases/csharp/3 resource/meson.build b/test cases/csharp/3 resource/meson.build new file mode 100644 index 0000000..25b273d --- /dev/null +++ b/test cases/csharp/3 resource/meson.build @@ -0,0 +1,6 @@ +project('C# resource', 'cs') + +e = executable('resprog', 'resprog.cs', +resources : 'TestRes.resx') + +test('restest', e) diff --git a/test cases/csharp/3 resource/resprog.cs b/test cases/csharp/3 resource/resprog.cs new file mode 100644 index 0000000..177201c --- /dev/null +++ b/test cases/csharp/3 resource/resprog.cs @@ -0,0 +1,13 @@ +using System; +using System.Resources; + +public class Prog { + + static public void Main () { + ResourceManager res = new ResourceManager(typeof(TestRes)); + Console.WriteLine(res.GetString("message")); + } + + internal class TestRes { + } +} -- cgit v1.1