aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJussi Pakkanen <jpakkane@gmail.com>2014-07-30 15:49:01 +0300
committerJussi Pakkanen <jpakkane@gmail.com>2014-07-30 15:49:01 +0300
commit6af7f92ab3a4d3fd70efa93b377d88056b9cbf02 (patch)
tree5b9286c8e64cd027bef4948ceed260d12d31e81b
parent735bacb050b7bb0da3d8e9459bb68bdb815357a7 (diff)
downloadmeson-6af7f92ab3a4d3fd70efa93b377d88056b9cbf02.zip
meson-6af7f92ab3a4d3fd70efa93b377d88056b9cbf02.tar.gz
meson-6af7f92ab3a4d3fd70efa93b377d88056b9cbf02.tar.bz2
Handle C# resource files.
-rw-r--r--build.py10
-rw-r--r--ninjabackend.py26
-rw-r--r--test cases/csharp/3 resource/TestRes.resx31
-rw-r--r--test cases/csharp/3 resource/meson.build6
-rw-r--r--test cases/csharp/3 resource/resprog.cs13
5 files changed, 85 insertions, 1 deletions
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 @@
+<?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 {
+ }
+}