diff options
author | Jussi Pakkanen <jpakkane@gmail.com> | 2014-07-30 15:49:01 +0300 |
---|---|---|
committer | Jussi Pakkanen <jpakkane@gmail.com> | 2014-07-30 15:49:01 +0300 |
commit | 6af7f92ab3a4d3fd70efa93b377d88056b9cbf02 (patch) | |
tree | 5b9286c8e64cd027bef4948ceed260d12d31e81b | |
parent | 735bacb050b7bb0da3d8e9459bb68bdb815357a7 (diff) | |
download | meson-6af7f92ab3a4d3fd70efa93b377d88056b9cbf02.zip meson-6af7f92ab3a4d3fd70efa93b377d88056b9cbf02.tar.gz meson-6af7f92ab3a4d3fd70efa93b377d88056b9cbf02.tar.bz2 |
Handle C# resource files.
-rw-r--r-- | build.py | 10 | ||||
-rw-r--r-- | ninjabackend.py | 26 | ||||
-rw-r--r-- | test cases/csharp/3 resource/TestRes.resx | 31 | ||||
-rw-r--r-- | test cases/csharp/3 resource/meson.build | 6 | ||||
-rw-r--r-- | test cases/csharp/3 resource/resprog.cs | 13 |
5 files changed, 85 insertions, 1 deletions
@@ -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 @@ +<?xml version="1.0" encoding="utf-8"?> +<root> + <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata"> + <xsd:element name="root" msdata:IsDataSet="true"> + <xsd:complexType> + <xsd:choice maxOccurs="unbounded"> + <xsd:element name="data"> + <xsd:complexType> + <xsd:sequence> + <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" /> + <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" /> + </xsd:sequence> + <xsd:attribute name="name" type="xsd:string" msdata:Ordinal="1" /> + <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" /> + <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" /> + </xsd:complexType> + </xsd:element> + <xsd:element name="resheader"> + <xsd:complexType> + <xsd:sequence> + <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" /> + </xsd:sequence> + <xsd:attribute name="name" type="xsd:string" use="required" /> + </xsd:complexType> + </xsd:element> + </xsd:choice> + </xsd:complexType> + </xsd:element> + </xsd:schema> +<resheader name="resmimetype"><value>text/microsoft-resx</value></resheader><resheader name="version"><value>1.3</value></resheader><resheader name="reader"><value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value></resheader><resheader name="writer"><value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value></resheader><data name="message"><value>Hello from resources!</value></data> + </root>
\ 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 { + } +} |