interpreter: allow extract_objects to receive generated sources
Fixes: #8333
This commit is contained in:
parent
18408f82d1
commit
901f444ea5
|
@ -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()``.
|
|
@ -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,
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -0,0 +1,3 @@
|
||||||
|
#! /usr/bin/env python3
|
||||||
|
import sys
|
||||||
|
print(f'#include "{sys.argv[1]}"')
|
|
@ -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
|
||||||
|
|
Loading…
Reference in New Issue