[windows] make compile_resources use custom targets instead of generators
This commit is contained in:
parent
81100f0695
commit
ef7cb9f280
|
@ -67,11 +67,16 @@ class WindowsModule(ExtensionModule):
|
|||
suffix = 'o'
|
||||
if not rescomp.found():
|
||||
raise MesonException('Could not find Windows resource compiler %s.' % ' '.join(rescomp.get_command()))
|
||||
res_kwargs = {'output': '@BASENAME@.' + suffix,
|
||||
'arguments': res_args}
|
||||
res_gen = build.Generator([rescomp], res_kwargs)
|
||||
res_output = res_gen.process_files('Windows resource', args, state)
|
||||
return ModuleReturnValue(res_output, [res_output])
|
||||
|
||||
res_kwargs = {
|
||||
'output': '@BASENAME@.' + suffix,
|
||||
'input': args,
|
||||
'command': [rescomp] + res_args,
|
||||
}
|
||||
|
||||
res_target = build.CustomTarget('Windows resource', state.subdir, state.subproject, res_kwargs)
|
||||
|
||||
return ModuleReturnValue(res_target, [res_target])
|
||||
|
||||
def initialize():
|
||||
return WindowsModule()
|
||||
|
|
|
@ -0,0 +1 @@
|
|||
inc = include_directories('resource')
|
|
@ -0,0 +1 @@
|
|||
#define ICON_ID 1
|
|
@ -0,0 +1,69 @@
|
|||
project('winmain', 'c')
|
||||
|
||||
# MinGW windres has a bug due to which it doesn't parse args with space properly:
|
||||
# https://github.com/mesonbuild/meson/pull/1346
|
||||
# https://sourceware.org/bugzilla/show_bug.cgi?id=4933
|
||||
if meson.get_compiler('c').get_id() == 'gcc' and host_machine.system() == 'windows'
|
||||
# Construct build_to_src and skip this test if it has spaces
|
||||
# because then the -I flag to windres will also have spaces
|
||||
# and we know the test will fail
|
||||
src_parts = meson.source_root().split('/')
|
||||
build_parts = meson.build_root().split('/')
|
||||
|
||||
# Get the common path (which might just be '/' or 'C:/')
|
||||
common = []
|
||||
done = false
|
||||
count = 0
|
||||
if src_parts.length() > build_parts.length()
|
||||
parts = build_parts
|
||||
other = src_parts
|
||||
else
|
||||
parts = src_parts
|
||||
other = build_parts
|
||||
endif
|
||||
foreach part : parts
|
||||
if not done and part == other.get(count)
|
||||
common += [part]
|
||||
else
|
||||
done = true
|
||||
endif
|
||||
count += 1
|
||||
endforeach
|
||||
|
||||
# Create path components to go down from the build root to the common path
|
||||
count = 0
|
||||
rel = build_parts
|
||||
foreach build : build_parts
|
||||
if count < build_parts.length() - common.length()
|
||||
rel += ['..']
|
||||
endif
|
||||
count += 1
|
||||
endforeach
|
||||
|
||||
# Create path components to go up from the common path to the build root
|
||||
count = 0
|
||||
foreach src : src_parts
|
||||
if count >= common.length()
|
||||
rel += [src]
|
||||
endif
|
||||
count += 1
|
||||
endforeach
|
||||
|
||||
build_to_src = '/'.join(rel)
|
||||
|
||||
if build_to_src.contains(' ')
|
||||
message('build_to_src is: ' + build_to_src)
|
||||
error('MESON_SKIP_TEST build_to_src has spaces')
|
||||
endif
|
||||
# Welcome to the end of this conditional.
|
||||
# We hope you never have to implement something like this.
|
||||
endif
|
||||
|
||||
subdir('inc')
|
||||
subdir('res')
|
||||
|
||||
exe = executable('prog', 'prog.c',
|
||||
res,
|
||||
gui_app : true)
|
||||
|
||||
test('winmain', exe)
|
|
@ -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;
|
||||
}
|
|
@ -0,0 +1,6 @@
|
|||
#!/usr/bin/env python3
|
||||
|
||||
import sys
|
||||
|
||||
with open(sys.argv[1], 'r') as infile, open(sys.argv[2], 'w') as outfile:
|
||||
outfile.write(infile.read().format(icon=sys.argv[3]))
|
|
@ -0,0 +1,13 @@
|
|||
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)
|
|
@ -0,0 +1,4 @@
|
|||
#include<windows.h>
|
||||
#include"resource.h"
|
||||
|
||||
ICON_ID ICON "{icon}"
|
Binary file not shown.
After Width: | Height: | Size: 9.4 KiB |
Loading…
Reference in New Issue