diff options
author | Jussi Pakkanen <jpakkane@gmail.com> | 2015-12-17 02:43:23 +0200 |
---|---|---|
committer | Jussi Pakkanen <jpakkane@gmail.com> | 2015-12-17 02:43:23 +0200 |
commit | 015688f506c50f753abf715ac36b684d7c621cff (patch) | |
tree | aa79b60a0a7cb70bc4dcfbbb2c660a86cc1596ee | |
parent | 79dc1135f1b16045602c3cb9ed7e8cf2f073a8bb (diff) | |
download | meson-015688f506c50f753abf715ac36b684d7c621cff.zip meson-015688f506c50f753abf715ac36b684d7c621cff.tar.gz meson-015688f506c50f753abf715ac36b684d7c621cff.tar.bz2 |
Compile Windows resources. Closes #333.
-rw-r--r-- | compilers.py | 2 | ||||
-rw-r--r-- | modules/windows.py | 47 | ||||
-rw-r--r-- | test cases/windows/5 resources/meson.build | 9 | ||||
-rw-r--r-- | test cases/windows/5 resources/myres.rc | 3 | ||||
-rw-r--r-- | test cases/windows/5 resources/prog.c | 14 | ||||
-rw-r--r-- | test cases/windows/5 resources/sample.ico | bin | 0 -> 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 Binary files differnew file mode 100644 index 0000000..24bd3d9 --- /dev/null +++ b/test cases/windows/5 resources/sample.ico |