aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPaolo Bonzini <pbonzini@redhat.com>2021-10-07 14:30:59 +0200
committerDylan Baker <dylan@pnwbakers.com>2021-12-06 13:27:12 -0800
commit901f444ea585c3661eb3284098cac4ab64df4ec8 (patch)
tree4acabc044d7e1ea0d42a116fe4e2fab589d183d5
parent18408f82d1ed2f04ef069e8e5836449a9cc5c355 (diff)
downloadmeson-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.md4
-rw-r--r--mesonbuild/build.py33
-rw-r--r--mesonbuild/interpreter/interpreterobjects.py4
-rw-r--r--test cases/common/22 object extraction/create-source.py3
-rw-r--r--test cases/common/22 object extraction/meson.build15
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