aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJussi Pakkanen <jpakkane@gmail.com>2021-06-22 20:39:58 +0300
committerGitHub <noreply@github.com>2021-06-22 20:39:58 +0300
commit7588dbc587afd3de931be60472f8919ae17dd396 (patch)
treef545c53c79aa419946a66fabda2b9f9e8d274aed
parenta44c1d18c19b607d443e0ee6247c97a42545c6f4 (diff)
parentbd75e0398fc66a71ecab297fefe68d0066c38a81 (diff)
downloadmeson-7588dbc587afd3de931be60472f8919ae17dd396.zip
meson-7588dbc587afd3de931be60472f8919ae17dd396.tar.gz
meson-7588dbc587afd3de931be60472f8919ae17dd396.tar.bz2
Merge pull request #8900 from bonzini/extract-objects-docs
extract_objects: fixes, tests and documentation for using the result in a custom_target
-rw-r--r--docs/markdown/Reference-manual.md4
-rw-r--r--mesonbuild/build.py10
-rw-r--r--test cases/common/22 object extraction/check-obj.py21
-rw-r--r--test cases/common/22 object extraction/header.h1
-rw-r--r--test cases/common/22 object extraction/meson.build14
5 files changed, 44 insertions, 6 deletions
diff --git a/docs/markdown/Reference-manual.md b/docs/markdown/Reference-manual.md
index aedfda1..de7f9f2 100644
--- a/docs/markdown/Reference-manual.md
+++ b/docs/markdown/Reference-manual.md
@@ -2554,7 +2554,9 @@ module](#shared_module).
object files generated for those source files. This is typically used
to take single object files and link them to unit tests or to compile
some source files with custom flags. To use the object file(s)
- in another build target, use the `objects:` keyword argument.
+ in another build target, use the [`objects:`](#executable) keyword
+ argument or include them in the command line of a
+ [`custom_target`](#custom_target)`.
- `full_path()`: returns a full path pointing to the result target file.
NOTE: In most cases using the object itself will do the same job as
diff --git a/mesonbuild/build.py b/mesonbuild/build.py
index 414a4f8..03f97b2 100644
--- a/mesonbuild/build.py
+++ b/mesonbuild/build.py
@@ -378,7 +378,8 @@ class ExtractedObjects(HoldableObject):
r = '<{0} {1!r}: {2}>'
return r.format(self.__class__.__name__, self.target.name, self.srclist)
- def classify_all_sources(self, sources, generated_sources):
+ @staticmethod
+ def get_sources(sources, generated_sources):
# Merge sources and generated sources
sources = list(sources)
for gensrc in generated_sources:
@@ -389,8 +390,10 @@ class ExtractedObjects(HoldableObject):
sources.append(s)
# Filter out headers and all non-source files
- sources = [s for s in sources if environment.is_source(s) and not environment.is_header(s)]
+ return [s for s in sources if environment.is_source(s) and not environment.is_header(s)]
+ def classify_all_sources(self, sources, generated_sources):
+ sources = self.get_sources(sources, generated_sources)
return classify_unity_sources(self.target.compilers.values(), sources)
def check_unity_compatible(self):
@@ -410,10 +413,9 @@ class ExtractedObjects(HoldableObject):
'the object files for each compiler at once.')
def get_outputs(self, backend):
- # TODO: Consider if we need to handle genlist here
return [
backend.object_filename_from_source(self.target, source)
- for source in self.srclist
+ for source in self.get_sources(self.srclist, self.genlist)
]
class EnvironmentVariables(HoldableObject):
diff --git a/test cases/common/22 object extraction/check-obj.py b/test cases/common/22 object extraction/check-obj.py
new file mode 100644
index 0000000..99c2cc5
--- /dev/null
+++ b/test cases/common/22 object extraction/check-obj.py
@@ -0,0 +1,21 @@
+#! /usr/bin/env python3
+
+import json
+import sys
+import os
+
+cc = None
+output = None
+
+# Only the ninja backend produces compile_commands.json
+if sys.argv[1] == 'ninja':
+ with open('compile_commands.json', 'r') as f:
+ cc = json.load(f)
+ output = set((x['output'] for x in cc))
+
+for obj in sys.argv[2:]:
+ if not os.path.exists(obj):
+ sys.exit(1)
+ if sys.argv[1] == 'ninja' and obj not in output:
+ sys.exit(1)
+ print('Verified', obj)
diff --git a/test cases/common/22 object extraction/header.h b/test cases/common/22 object extraction/header.h
new file mode 100644
index 0000000..50403ce
--- /dev/null
+++ b/test cases/common/22 object extraction/header.h
@@ -0,0 +1 @@
+/* Check that extract_all_objects works with headers. */
diff --git a/test cases/common/22 object extraction/meson.build b/test cases/common/22 object extraction/meson.build
index 18be1db..fd4af8c 100644
--- a/test cases/common/22 object extraction/meson.build
+++ b/test cases/common/22 object extraction/meson.build
@@ -4,20 +4,32 @@ if meson.is_unity()
message('Skipping extraction test because this is a Unity build.')
else
lib1 = shared_library('somelib', 'src/lib.c')
- lib2 = shared_library('somelib2', 'lib.c', 'lib2.c')
+ lib2 = shared_library('somelib2', 'lib.c', 'header.h', 'lib2.c')
obj1 = lib1.extract_objects('src/lib.c')
obj2 = lib2.extract_objects(['lib.c'])
obj3 = lib2.extract_objects(files('lib.c'))
obj4 = lib2.extract_objects(['lib.c', 'lib.c'])
+ obj5 = lib2.extract_objects(['lib.c', 'header.h'])
+ obj6 = lib2.extract_all_objects(recursive: true)
e1 = executable('main1', 'main.c', objects : obj1)
e2 = executable('main2', 'main.c', objects : obj2)
e3 = executable('main3', 'main.c', objects : obj3)
e4 = executable('main4', 'main.c', objects : obj4)
+ e5 = executable('main5', 'main.c', objects : obj5)
+ e6 = executable('main6', 'main.c', objects : obj6)
+
+ custom_target('custom_target with object inputs', output: 'objs',
+ input: [obj1, obj2, obj3, obj5, obj6],
+ build_by_default: true,
+ command: [find_program('check-obj.py'), meson.backend(), '@INPUT@'],
+ capture: true)
test('extraction test 1', e1)
test('extraction test 2', e2)
test('extraction test 3', e3)
test('extraction test 4', e4)
+ test('extraction test 5', e5)
+ test('extraction test 6', e6)
endif