From f8bd1c5ff26bbb6b88dedcb400a33841201bf4eb Mon Sep 17 00:00:00 2001 From: Andrei Alexeyev <0x416b617269@gmail.com> Date: Fri, 22 Dec 2017 20:16:56 +0200 Subject: [PATCH] windows.compile_resources: fix compiling multiple resources within one project --- mesonbuild/modules/windows.py | 40 +++++++++++++++---- .../inc/meson.build | 1 - .../inc/resource/resource.h | 1 - .../meson.build | 11 ++--- .../res/meson.build | 23 ++++++----- .../res/myres.rc.in | 3 +- .../res/myres_static.rc | 3 ++ 7 files changed, 57 insertions(+), 25 deletions(-) delete mode 100644 test cases/windows/13 resources with custom targets/inc/meson.build delete mode 100644 test cases/windows/13 resources with custom targets/inc/resource/resource.h create mode 100644 test cases/windows/13 resources with custom targets/res/myres_static.rc diff --git a/mesonbuild/modules/windows.py b/mesonbuild/modules/windows.py index 22bf49b2a..dc6e9d8bc 100644 --- a/mesonbuild/modules/windows.py +++ b/mesonbuild/modules/windows.py @@ -68,15 +68,41 @@ class WindowsModule(ExtensionModule): if not rescomp.found(): raise MesonException('Could not find Windows resource compiler %s.' % ' '.join(rescomp.get_command())) - res_kwargs = { - 'output': '@BASENAME@.' + suffix, - 'input': args, - 'command': [rescomp] + res_args, - } + res_targets = [] - res_target = build.CustomTarget('Windows resource', state.subdir, state.subproject, res_kwargs) + def add_target(src): + if isinstance(src, list): + for subsrc in src: + add_target(subsrc) + return - return ModuleReturnValue(res_target, [res_target]) + if hasattr(src, 'held_object'): + src = src.held_object + + res_kwargs = { + 'output': '@BASENAME@.' + suffix, + 'input': [src], + 'command': [rescomp] + res_args, + } + + if isinstance(src, (str, mesonlib.File)): + name = 'file {!r}'.format(str(src)) + elif isinstance(src, build.CustomTarget): + if len(src.get_outputs()) > 1: + raise MesonException('windows.compile_resources does not accept custom targets with more than 1 output.') + + name = 'target {!r}'.format(src.get_id()) + else: + raise MesonException('Unexpected source type {!r}. windows.compile_resources accepts only strings, files, custom targets, and lists thereof.'.format(src)) + + # Path separators are not allowed in target names + name = name.replace('/', '_').replace('\\', '_') + + res_targets.append(build.CustomTarget('Windows resource for ' + name, state.subdir, state.subproject, res_kwargs)) + + add_target(args) + + return ModuleReturnValue(res_targets, [res_targets]) def initialize(): return WindowsModule() diff --git a/test cases/windows/13 resources with custom targets/inc/meson.build b/test cases/windows/13 resources with custom targets/inc/meson.build deleted file mode 100644 index b8b511a98..000000000 --- a/test cases/windows/13 resources with custom targets/inc/meson.build +++ /dev/null @@ -1 +0,0 @@ -inc = include_directories('resource') diff --git a/test cases/windows/13 resources with custom targets/inc/resource/resource.h b/test cases/windows/13 resources with custom targets/inc/resource/resource.h deleted file mode 100644 index dbdd5094d..000000000 --- a/test cases/windows/13 resources with custom targets/inc/resource/resource.h +++ /dev/null @@ -1 +0,0 @@ -#define ICON_ID 1 diff --git a/test cases/windows/13 resources with custom targets/meson.build b/test cases/windows/13 resources with custom targets/meson.build index ddb7d6e8a..b1e2b091b 100644 --- a/test cases/windows/13 resources with custom targets/meson.build +++ b/test cases/windows/13 resources with custom targets/meson.build @@ -59,11 +59,12 @@ if meson.get_compiler('c').get_id() == 'gcc' and host_machine.system() == 'windo # We hope you never have to implement something like this. endif -subdir('inc') subdir('res') -exe = executable('prog', 'prog.c', - res, - gui_app : true) +foreach id : [0, 1, 2] + exe = executable('prog_@0@'.format(id), 'prog.c', + res[id], + gui_app : true) -test('winmain', exe) + test('winmain_@0@'.format(id), exe) +endforeach diff --git a/test cases/windows/13 resources with custom targets/res/meson.build b/test cases/windows/13 resources with custom targets/res/meson.build index 266e3800e..c15bd92d2 100644 --- a/test cases/windows/13 resources with custom targets/res/meson.build +++ b/test cases/windows/13 resources with custom targets/res/meson.build @@ -2,12 +2,17 @@ win = import('windows') rc_writer = find_program('./gen-res.py') -rc_target = custom_target('RC source file', - input : 'myres.rc.in', - output : 'myres.rc', - command : [rc_writer, '@INPUT@', '@OUTPUT@', files('sample.ico')], - install : false, - build_always : true) - -res = win.compile_resources(rc_target, - include_directories : inc) +rc_sources = [] + +foreach id : [1, 2] + rc_sources += custom_target('RC source file @0@'.format(id), + input : 'myres.rc.in', + output : 'myres_@0@.rc'.format(id), + command : [rc_writer, '@INPUT@', '@OUTPUT@', files('sample.ico')], + install : false, + build_always : true) +endforeach + +rc_sources += files('myres_static.rc') + +res = win.compile_resources(rc_sources) diff --git a/test cases/windows/13 resources with custom targets/res/myres.rc.in b/test cases/windows/13 resources with custom targets/res/myres.rc.in index 9bb045dbe..6899bc8f3 100644 --- a/test cases/windows/13 resources with custom targets/res/myres.rc.in +++ b/test cases/windows/13 resources with custom targets/res/myres.rc.in @@ -1,4 +1,3 @@ #include -#include"resource.h" -ICON_ID ICON "{icon}" +1 ICON "{icon}" diff --git a/test cases/windows/13 resources with custom targets/res/myres_static.rc b/test cases/windows/13 resources with custom targets/res/myres_static.rc new file mode 100644 index 000000000..12838aee2 --- /dev/null +++ b/test cases/windows/13 resources with custom targets/res/myres_static.rc @@ -0,0 +1,3 @@ +#include + +1 ICON "sample.ico"