Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Fix extract_all_objects for custom targets with VS backend #8211

Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 7 additions & 0 deletions mesonbuild/backend/vs2010backend.py
Original file line number Diff line number Diff line change
Expand Up @@ -1280,6 +1280,13 @@ def path_normalize_add(path, lis):
self.add_additional_options(lang, inc_cl, file_args)
self.add_preprocessor_defines(lang, inc_cl, file_defines)
self.add_include_dirs(lang, inc_cl, file_inc_dirs)
# Transform filename relative to src dir instead of relative to vcxproj so that the filenames
# for extract_all_objects match ninja backend
file_abs = os.path.abspath(f"{self.source_dir}\\{target.subdir}\\{s}")
file_rel_to_src_dir = os.path.relpath(file_abs, self.source_dir)
dirpart, fnamepart = os.path.split(file_rel_to_src_dir)
file = File(True, dirpart, fnamepart)
ET.SubElement(inc_cl, 'ObjectFileName').text = "$(IntDir)" + self.object_filename_from_source(target, file)
for lang in pch_sources:
impl = pch_sources[lang][1]
if impl and path_normalize_add(impl, previous_sources):
Expand Down
6 changes: 6 additions & 0 deletions test cases/common/235 extract all custom/copy.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
#!/usr/bin/env python3

import sys
import shutil

shutil.copyfile(sys.argv[1], sys.argv[2])
4 changes: 4 additions & 0 deletions test cases/common/235 extract all custom/custom1.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
int func_custom1(void)
{
return 0;
}
4 changes: 4 additions & 0 deletions test cases/common/235 extract all custom/gen1.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
int func_gen1(void)
{
return 0;
}
25 changes: 25 additions & 0 deletions test cases/common/235 extract all custom/main.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
int func_custom1(void);
int func_custom2(void);
int func_custom3(void);
int func_custom4(void);
int func_gen1(void);
int func_gen2(void);
int func_gen3(void);
int func_gen4(void);
int func_gen5(void);
int func_gen6(void);

int main(void)
{
func_custom1();
func_custom2();
func_custom3();
func_custom4();
func_gen1();
func_gen2();
func_gen3();
func_gen4();
func_gen5();
func_gen6();
return 0;
}
42 changes: 42 additions & 0 deletions test cases/common/235 extract all custom/meson.build
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
project('extract all custom', 'c')
fs = import('fs')

copy = find_program('copy.py')
gen = generator(copy,
output : 'gen_@PLAINNAME@',
arguments: ['@INPUT@', '@OUTPUT@'])
src_gen = gen.process('gen1.c', 'sub/gen2.c')

i = 0
src_custom = []
foreach f : ['custom1.c', 'sub/custom2.c']
i += 1
src_custom += [custom_target('custom' + i.to_string(),
input : f,
output : 'gen_' + fs.name(f),
command : [copy, '@INPUT@', '@OUTPUT@'])
]
endforeach

s1 = subproject('s1')
sub_a = s1.get_variable('sub_a')
sub_b = s1.get_variable('sub_b')
subsub_a = s1.get_variable('s2').get_variable('subsub_a')

# Use objects from subproject and subsubproject
a = static_library('a',
sources : [src_gen, src_custom],
objects : [sub_a.extract_all_objects(), subsub_a.extract_all_objects()]
)
e1= executable('e1',
sources: ['main.c'],
link_with : a
)

# link with lib that uses objects from subproject of subproject
e2 = executable('e2',
sources : ['main.c', src_gen, src_custom],
link_with : [sub_b]
)
test('test_e1', e1)
test('test_e2', e2)
4 changes: 4 additions & 0 deletions test cases/common/235 extract all custom/sub/custom2.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
int func_custom2(void)
{
return 0;
}
4 changes: 4 additions & 0 deletions test cases/common/235 extract all custom/sub/gen2.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
int func_gen2(void)
{
return 0;
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
int func_custom3(void)
{
return 0;
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
int func_gen3(void)
{
return 0;
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
project('subproj', 'c')

fs = import('fs')
copy = find_program('../../copy.py')

i = 2
src_custom = []
foreach f : ['custom3.c', 'sub/custom4.c']
i += 1
src_custom += [custom_target('custom' + i.to_string(),
input : f,
output : 'gen_' + fs.name(f),
command : [copy, '@INPUT@', '@OUTPUT@'])
]
endforeach

gen = generator(copy,
output : 'gen_@PLAINNAME@',
arguments: ['@INPUT@', '@OUTPUT@'])
src_gen = gen.process('gen3.c', 'sub/gen4.c')

s2 = subproject('s2')
subsub_a = s2.get_variable('subsub_a')

sub_a = static_library('sub_a', sources : [src_custom, src_gen])
sub_b = static_library('sub_b', objects : [sub_a.extract_all_objects(), subsub_a.extract_all_objects()])
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
int func_custom4(void)
{
return 0;
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
int func_gen4(void)
{
return 0;
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
int func_gen5(void)
{
return 0;
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
project('subproj', 'c')

fs = import('fs')
copy = find_program('../../../../copy.py')

gen = generator(copy,
output : 'gen_@PLAINNAME@',
arguments: ['@INPUT@', '@OUTPUT@'])
src_gen = gen.process('gen5.c', 'sub/gen6.c')

subsub_a = static_library('subsub_a', sources : [src_gen])
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
int func_gen6(void)
{
return 0;
}