interpreter: allow extract_objects to receive generated sources

Fixes: #8333
This commit is contained in:
Paolo Bonzini 2021-10-07 14:30:59 +02:00 committed by Dylan Baker
parent 18408f82d1
commit 901f444ea5
5 changed files with 45 additions and 14 deletions

View File

@ -0,0 +1,4 @@
## ``extract_objects()`` supports generated sources
Custom targets or generated files (returned by ``generator.process()``)
can now be passed to ``extract_objects()``.

View File

@ -987,21 +987,30 @@ class BuildTarget(Target):
if t in self.kwargs: if t in self.kwargs:
self.kwargs[t] = listify(self.kwargs[t], flatten=True) self.kwargs[t] = listify(self.kwargs[t], flatten=True)
def extract_objects(self, srclist: T.List['FileOrString']) -> ExtractedObjects: def extract_objects(self, srclist: T.List[T.Union['FileOrString', 'GeneratedTypes']]) -> ExtractedObjects:
obj_src: T.List['File'] = []
sources_set = set(self.sources) sources_set = set(self.sources)
generated_set = set(self.generated)
obj_src: T.List['File'] = []
obj_gen: T.List['GeneratedTypes'] = []
for src in srclist: for src in srclist:
if isinstance(src, (str, File)):
if isinstance(src, str): if isinstance(src, str):
src = File(False, self.subdir, src) src = File(False, self.subdir, src)
elif isinstance(src, File):
FeatureNew.single_use('File argument for extract_objects', '0.50.0', self.subproject)
else: else:
raise MesonException(f'Object extraction arguments must be strings or Files (got {type(src).__name__}).') FeatureNew.single_use('File argument for extract_objects', '0.50.0', self.subproject)
# FIXME: It could be a generated source
if src not in sources_set: if src not in sources_set:
raise MesonException(f'Tried to extract unknown source {src}.') raise MesonException(f'Tried to extract unknown source {src}.')
obj_src.append(src) obj_src.append(src)
return ExtractedObjects(self, obj_src) elif isinstance(src, (CustomTarget, CustomTargetIndex, GeneratedList)):
FeatureNew.single_use('Generated sources for extract_objects', '0.61.0', self.subproject)
target = src.target if isinstance(src, CustomTargetIndex) else src
if src not in generated_set and target not in generated_set:
raise MesonException(f'Tried to extract unknown source {target.get_basename()}.')
obj_gen.append(src)
else:
raise MesonException(f'Object extraction arguments must be strings, Files or targets (got {type(src).__name__}).')
return ExtractedObjects(self, obj_src, obj_gen)
def extract_all_objects(self, recursive: bool = True) -> ExtractedObjects: def extract_all_objects(self, recursive: bool = True) -> ExtractedObjects:
return ExtractedObjects(self, self.sources, self.generated, self.objects, return ExtractedObjects(self, self.sources, self.generated, self.objects,

View File

@ -828,8 +828,8 @@ class BuildTargetHolder(ObjectHolder[_BuildTarget]):
return self.interpreter.backend.get_target_dir(self._target_object) return self.interpreter.backend.get_target_dir(self._target_object)
@noKwargs @noKwargs
@typed_pos_args('extract_objects', varargs=(mesonlib.File, str)) @typed_pos_args('extract_objects', varargs=(mesonlib.File, str, build.CustomTarget, build.CustomTargetIndex, build.GeneratedList))
def extract_objects_method(self, args: T.Tuple[T.List[mesonlib.FileOrString]], kwargs: TYPE_nkwargs) -> build.ExtractedObjects: def extract_objects_method(self, args: T.Tuple[T.List[T.Union[mesonlib.FileOrString, 'build.GeneratedTypes']]], kwargs: TYPE_nkwargs) -> build.ExtractedObjects:
return self._target_object.extract_objects(args[0]) return self._target_object.extract_objects(args[0])
@noPosargs @noPosargs

View File

@ -0,0 +1,3 @@
#! /usr/bin/env python3
import sys
print(f'#include "{sys.argv[1]}"')

View File

@ -20,6 +20,18 @@ else
e5 = executable('main5', 'main.c', objects : obj5) e5 = executable('main5', 'main.c', objects : obj5)
e6 = executable('main6', 'main.c', objects : obj6) e6 = executable('main6', 'main.c', objects : obj6)
ct_src = custom_target('lib3.c', output: 'lib3.c', capture: true,
command: [find_program('create-source.py'), 'lib.c'])
lib3 = library('somelib3', ct_src)
e7 = executable('main7', 'main.c', objects: lib3.extract_objects(ct_src[0]))
e8 = executable('main8', 'main.c', objects: lib3.extract_objects(ct_src))
gen = generator(find_program('create-source.py'), arguments: ['@INPUT@'],
output: '@BASENAME@4.c', capture: true)
gen_src = gen.process('lib.c')
lib4 = library('somelib4', gen_src)
e9 = executable('main9', 'main.c', objects: lib4.extract_objects(gen_src))
custom_target('custom_target with object inputs', output: 'objs', custom_target('custom_target with object inputs', output: 'objs',
input: [obj1, obj2, obj3, obj5, obj6], input: [obj1, obj2, obj3, obj5, obj6],
build_by_default: true, build_by_default: true,
@ -32,4 +44,7 @@ else
test('extraction test 4', e4) test('extraction test 4', e4)
test('extraction test 5', e5) test('extraction test 5', e5)
test('extraction test 6', e6) test('extraction test 6', e6)
test('extraction test 7', e7)
test('extraction test 8', e8)
test('extraction test 9', e9)
endif endif