diff options
author | Paolo Bonzini <pbonzini@redhat.com> | 2021-10-07 14:30:59 +0200 |
---|---|---|
committer | Dylan Baker <dylan@pnwbakers.com> | 2021-12-06 13:27:12 -0800 |
commit | 901f444ea585c3661eb3284098cac4ab64df4ec8 (patch) | |
tree | 4acabc044d7e1ea0d42a116fe4e2fab589d183d5 | |
parent | 18408f82d1ed2f04ef069e8e5836449a9cc5c355 (diff) | |
download | meson-901f444ea585c3661eb3284098cac4ab64df4ec8.zip meson-901f444ea585c3661eb3284098cac4ab64df4ec8.tar.gz meson-901f444ea585c3661eb3284098cac4ab64df4ec8.tar.bz2 |
interpreter: allow extract_objects to receive generated sources
Fixes: #8333
-rw-r--r-- | docs/markdown/snippets/extract-more-objects.md | 4 | ||||
-rw-r--r-- | mesonbuild/build.py | 33 | ||||
-rw-r--r-- | mesonbuild/interpreter/interpreterobjects.py | 4 | ||||
-rw-r--r-- | test cases/common/22 object extraction/create-source.py | 3 | ||||
-rw-r--r-- | test cases/common/22 object extraction/meson.build | 15 |
5 files changed, 45 insertions, 14 deletions
diff --git a/docs/markdown/snippets/extract-more-objects.md b/docs/markdown/snippets/extract-more-objects.md new file mode 100644 index 0000000..73a4757 --- /dev/null +++ b/docs/markdown/snippets/extract-more-objects.md @@ -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()``. diff --git a/mesonbuild/build.py b/mesonbuild/build.py index 54735c2..6515f42 100644 --- a/mesonbuild/build.py +++ b/mesonbuild/build.py @@ -987,21 +987,30 @@ class BuildTarget(Target): if t in self.kwargs: self.kwargs[t] = listify(self.kwargs[t], flatten=True) - def extract_objects(self, srclist: T.List['FileOrString']) -> ExtractedObjects: - obj_src: T.List['File'] = [] + def extract_objects(self, srclist: T.List[T.Union['FileOrString', 'GeneratedTypes']]) -> ExtractedObjects: sources_set = set(self.sources) + generated_set = set(self.generated) + + obj_src: T.List['File'] = [] + obj_gen: T.List['GeneratedTypes'] = [] for src in srclist: - if isinstance(src, str): - src = File(False, self.subdir, src) - elif isinstance(src, File): - FeatureNew.single_use('File argument for extract_objects', '0.50.0', self.subproject) + if isinstance(src, (str, File)): + if isinstance(src, str): + src = File(False, self.subdir, src) + else: + FeatureNew.single_use('File argument for extract_objects', '0.50.0', self.subproject) + if src not in sources_set: + raise MesonException(f'Tried to extract unknown source {src}.') + obj_src.append(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 or Files (got {type(src).__name__}).') - # FIXME: It could be a generated source - if src not in sources_set: - raise MesonException(f'Tried to extract unknown source {src}.') - obj_src.append(src) - return ExtractedObjects(self, obj_src) + 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: return ExtractedObjects(self, self.sources, self.generated, self.objects, diff --git a/mesonbuild/interpreter/interpreterobjects.py b/mesonbuild/interpreter/interpreterobjects.py index 6ff4b0f..b341b6b 100644 --- a/mesonbuild/interpreter/interpreterobjects.py +++ b/mesonbuild/interpreter/interpreterobjects.py @@ -828,8 +828,8 @@ class BuildTargetHolder(ObjectHolder[_BuildTarget]): return self.interpreter.backend.get_target_dir(self._target_object) @noKwargs - @typed_pos_args('extract_objects', varargs=(mesonlib.File, str)) - def extract_objects_method(self, args: T.Tuple[T.List[mesonlib.FileOrString]], kwargs: TYPE_nkwargs) -> build.ExtractedObjects: + @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[T.Union[mesonlib.FileOrString, 'build.GeneratedTypes']]], kwargs: TYPE_nkwargs) -> build.ExtractedObjects: return self._target_object.extract_objects(args[0]) @noPosargs diff --git a/test cases/common/22 object extraction/create-source.py b/test cases/common/22 object extraction/create-source.py new file mode 100644 index 0000000..d2e8e8b --- /dev/null +++ b/test cases/common/22 object extraction/create-source.py @@ -0,0 +1,3 @@ +#! /usr/bin/env python3 +import sys +print(f'#include "{sys.argv[1]}"') diff --git a/test cases/common/22 object extraction/meson.build b/test cases/common/22 object extraction/meson.build index 4847fa1..37ac66d 100644 --- a/test cases/common/22 object extraction/meson.build +++ b/test cases/common/22 object extraction/meson.build @@ -20,6 +20,18 @@ else e5 = executable('main5', 'main.c', objects : obj5) 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', input: [obj1, obj2, obj3, obj5, obj6], build_by_default: true, @@ -32,4 +44,7 @@ else test('extraction test 4', e4) test('extraction test 5', e5) test('extraction test 6', e6) + test('extraction test 7', e7) + test('extraction test 8', e8) + test('extraction test 9', e9) endif |