diff options
author | Paolo Bonzini <pbonzini@redhat.com> | 2021-06-22 15:56:34 +0200 |
---|---|---|
committer | Paolo Bonzini <pbonzini@redhat.com> | 2021-06-22 15:56:46 +0200 |
commit | bd75e0398fc66a71ecab297fefe68d0066c38a81 (patch) | |
tree | 89cd30daa8e2a7cbb7d052def4d66e021a26bce9 | |
parent | a656febccf6614008086bf124858826615924df7 (diff) | |
download | meson-bd75e0398fc66a71ecab297fefe68d0066c38a81.zip meson-bd75e0398fc66a71ecab297fefe68d0066c38a81.tar.gz meson-bd75e0398fc66a71ecab297fefe68d0066c38a81.tar.bz2 |
extract_objects: skip headers when building custom_target command line
As seen in the testcase, passing objects to custom_target does not work
if headers are passed extract_objects(), or if extract_all_objects() is used
and the sources include any header files. To fix this, use the code that
already exists for unity build to filter out the nonexistent ".h.o" files.
This already gives for free the handling of genlist, which was mentioned
in a TODO comment.
-rw-r--r-- | mesonbuild/build.py | 10 | ||||
-rw-r--r-- | test cases/common/22 object extraction/header.h | 1 | ||||
-rw-r--r-- | test cases/common/22 object extraction/meson.build | 10 |
3 files changed, 15 insertions, 6 deletions
diff --git a/mesonbuild/build.py b/mesonbuild/build.py index 436a55d..0a792fc 100644 --- a/mesonbuild/build.py +++ b/mesonbuild/build.py @@ -375,7 +375,8 @@ class ExtractedObjects: 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: @@ -386,8 +387,10 @@ class ExtractedObjects: 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): @@ -407,10 +410,9 @@ class ExtractedObjects: '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: 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 407c5e8..fd4af8c 100644 --- a/test cases/common/22 object extraction/meson.build +++ b/test cases/common/22 object extraction/meson.build @@ -4,20 +4,24 @@ 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], + input: [obj1, obj2, obj3, obj5, obj6], build_by_default: true, command: [find_program('check-obj.py'), meson.backend(), '@INPUT@'], capture: true) @@ -26,4 +30,6 @@ else 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 |