Skip to content

Commit

Permalink
Fix extract_all_objects for custom targets with VS backend
Browse files Browse the repository at this point in the history
- Changed the object names built from generated sources on VS backend
to match filenames used in ninja backend
  • Loading branch information
vvainola committed Jan 16, 2021
1 parent ea2f34e commit 36baeda
Show file tree
Hide file tree
Showing 16 changed files with 157 additions and 0 deletions.
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
file_abs = os.path.abspath(f"{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;
}

0 comments on commit 36baeda

Please sign in to comment.