aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJussi Pakkanen <jpakkane@gmail.com>2015-12-17 02:43:23 +0200
committerJussi Pakkanen <jpakkane@gmail.com>2015-12-17 02:43:23 +0200
commit015688f506c50f753abf715ac36b684d7c621cff (patch)
treeaa79b60a0a7cb70bc4dcfbbb2c660a86cc1596ee
parent79dc1135f1b16045602c3cb9ed7e8cf2f073a8bb (diff)
downloadmeson-015688f506c50f753abf715ac36b684d7c621cff.zip
meson-015688f506c50f753abf715ac36b684d7c621cff.tar.gz
meson-015688f506c50f753abf715ac36b684d7c621cff.tar.bz2
Compile Windows resources. Closes #333.
-rw-r--r--compilers.py2
-rw-r--r--modules/windows.py47
-rw-r--r--test cases/windows/5 resources/meson.build9
-rw-r--r--test cases/windows/5 resources/myres.rc3
-rw-r--r--test cases/windows/5 resources/prog.c14
-rw-r--r--test cases/windows/5 resources/sample.icobin0 -> 9662 bytes
6 files changed, 74 insertions, 1 deletions
diff --git a/compilers.py b/compilers.py
index 0567764..00b2ecf 100644
--- a/compilers.py
+++ b/compilers.py
@@ -27,7 +27,7 @@ header_suffixes = ['h', 'hh', 'hpp', 'hxx', 'H', 'moc', 'vapi']
cpp_suffixes = ['cc', 'cpp', 'cxx', 'h', 'hh', 'hpp', 'hxx', 'c++']
c_suffixes = ['c']
clike_suffixes = c_suffixes + cpp_suffixes
-obj_suffixes = ['o', 'obj']
+obj_suffixes = ['o', 'obj', 'res']
def is_header(fname):
if hasattr(fname, 'fname'):
diff --git a/modules/windows.py b/modules/windows.py
new file mode 100644
index 0000000..e01b454
--- /dev/null
+++ b/modules/windows.py
@@ -0,0 +1,47 @@
+# Copyright 2015 The Meson development team
+
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+
+# http://www.apache.org/licenses/LICENSE-2.0
+
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+import mesonlib, dependencies, build
+from coredata import MesonException
+import os
+
+class WindowsModule:
+
+ def detect_compiler(self, compilers):
+ for c in compilers:
+ if c.language == 'c' or c.language == 'cpp':
+ return c
+ raise MesonException('Resource compilation requires a C or C++ compiler.')
+
+ def compile_resources(self, state, args, kwargs):
+ comp = self.detect_compiler(state.compilers)
+ extra_args = mesonlib.stringlistify(kwargs.get('args', []))
+ if comp.id == 'msvc':
+ rescomp = dependencies.ExternalProgram('rc', silent=True)
+ res_args = extra_args + ['/nologo', '/fo@OUTPUT@', '@INPUT@']
+ suffix = 'res'
+ else:
+ rescomp = dependencies.ExternalProgram('windres', silent=True)
+ res_args = extra_args + ['@INPUT@', '@OUTPUT@']
+ suffix = 'o'
+ res_files = mesonlib.stringlistify(args)
+ res_kwargs = {'output' : '@BASENAME@.' + suffix,
+ 'arguments': res_args}
+ res_gen = build.Generator([rescomp], res_kwargs)
+ res_output = build.GeneratedList(res_gen)
+ [res_output.add_file(os.path.join(state.subdir, a)) for a in res_files]
+ return res_output
+
+def initialize():
+ return WindowsModule()
diff --git a/test cases/windows/5 resources/meson.build b/test cases/windows/5 resources/meson.build
new file mode 100644
index 0000000..fe75719
--- /dev/null
+++ b/test cases/windows/5 resources/meson.build
@@ -0,0 +1,9 @@
+project('winmain', 'c')
+
+win = import('windows')
+
+exe = executable('prog', 'prog.c',
+ win.compile_resources('myres.rc'),
+ gui_app : true)
+
+test('winmain', exe)
diff --git a/test cases/windows/5 resources/myres.rc b/test cases/windows/5 resources/myres.rc
new file mode 100644
index 0000000..12838ae
--- /dev/null
+++ b/test cases/windows/5 resources/myres.rc
@@ -0,0 +1,3 @@
+#include<windows.h>
+
+1 ICON "sample.ico"
diff --git a/test cases/windows/5 resources/prog.c b/test cases/windows/5 resources/prog.c
new file mode 100644
index 0000000..2c6f153
--- /dev/null
+++ b/test cases/windows/5 resources/prog.c
@@ -0,0 +1,14 @@
+#include<windows.h>
+
+#define MY_ICON 1
+
+int APIENTRY
+WinMain(
+ HINSTANCE hInstance,
+ HINSTANCE hPrevInstance,
+ LPSTR lpszCmdLine,
+ int nCmdShow) {
+ HICON hIcon;
+ hIcon = LoadIcon(NULL, IDI_APPLICATION);
+ return hIcon ? 0 : 1;
+}
diff --git a/test cases/windows/5 resources/sample.ico b/test cases/windows/5 resources/sample.ico
new file mode 100644
index 0000000..24bd3d9
--- /dev/null
+++ b/test cases/windows/5 resources/sample.ico
Binary files differ