diff options
author | Xavier Claessens <xavier.claessens@collabora.com> | 2018-04-13 10:33:42 -0400 |
---|---|---|
committer | Xavier Claessens <xavier.claessens@collabora.com> | 2018-04-18 14:54:52 -0400 |
commit | 60aaee55d47e5938662a48d85ba659d8f79c7187 (patch) | |
tree | 801ac502b5a2981080f4eb056117b94c5c458dc0 | |
parent | b0e4d4047b2f8c9b2056a6f2585fd793f8ba0914 (diff) | |
download | meson-60aaee55d47e5938662a48d85ba659d8f79c7187.zip meson-60aaee55d47e5938662a48d85ba659d8f79c7187.tar.gz meson-60aaee55d47e5938662a48d85ba659d8f79c7187.tar.bz2 |
extract_all_objects(): Recursively extract objects
Fixes #3401
-rw-r--r-- | mesonbuild/backend/backends.py | 10 | ||||
-rw-r--r-- | mesonbuild/build.py | 10 | ||||
-rw-r--r-- | test cases/common/88 extract all/meson.build | 6 |
3 files changed, 16 insertions, 10 deletions
diff --git a/mesonbuild/backend/backends.py b/mesonbuild/backend/backends.py index 8ecf393..2cca5e5 100644 --- a/mesonbuild/backend/backends.py +++ b/mesonbuild/backend/backends.py @@ -241,8 +241,11 @@ class Backend: os.path.join('dummyprefixdir', fromdir)) def flatten_object_list(self, target, proj_dir_to_build_root=''): + return self._flatten_object_list(target, target.get_objects(), proj_dir_to_build_root) + + def _flatten_object_list(self, target, objects, proj_dir_to_build_root): obj_list = [] - for obj in target.get_objects(): + for obj in objects: if isinstance(obj, str): o = os.path.join(proj_dir_to_build_root, self.build_to_src, target.get_subdir(), obj) @@ -250,6 +253,7 @@ class Backend: elif isinstance(obj, mesonlib.File): obj_list.append(obj.rel_to_builddir(self.build_to_src)) elif isinstance(obj, build.ExtractedObjects): + obj_list += self._flatten_object_list(obj.target, obj.objlist, proj_dir_to_build_root) obj_list += self.determine_ext_objs(obj, proj_dir_to_build_root) else: raise MesonException('Unknown data type in object list.') @@ -408,6 +412,10 @@ class Backend: # Filter out headers and all non-source files sources = [s for s in sources if self.environment.is_source(s) and not self.environment.is_header(s)] + # extobj could contain only objects and no sources + if not sources: + return result + targetdir = self.get_target_private_dir(extobj.target) # With unity builds, there's just one object that contains all the diff --git a/mesonbuild/build.py b/mesonbuild/build.py index 083cd71..538254c 100644 --- a/mesonbuild/build.py +++ b/mesonbuild/build.py @@ -213,10 +213,11 @@ class ExtractedObjects: ''' Holds a list of sources for which the objects must be extracted ''' - def __init__(self, target, srclist, genlist): + def __init__(self, target, srclist=[], genlist=[], objlist=[]): self.target = target self.srclist = srclist self.genlist = genlist + self.objlist = objlist if self.target.is_unity: self.check_unity_compatible() @@ -644,13 +645,10 @@ class BuildTarget(Target): if src not in self.sources: raise MesonException('Tried to extract unknown source %s.' % src) obj_src.append(src) - return ExtractedObjects(self, obj_src, []) + return ExtractedObjects(self, obj_src) def extract_all_objects(self): - # FIXME: We should add support for transitive extract_objects() - if self.objects: - raise MesonException('Cannot extract objects from a target that itself has extracted objects') - return ExtractedObjects(self, self.sources, self.generated) + return ExtractedObjects(self, self.sources, self.generated, self.objects) def get_all_link_deps(self): return self.get_transitive_link_deps() diff --git a/test cases/common/88 extract all/meson.build b/test cases/common/88 extract all/meson.build index 91a8d5f..a56a3ce 100644 --- a/test cases/common/88 extract all/meson.build +++ b/test cases/common/88 extract all/meson.build @@ -2,8 +2,8 @@ project('extract all', 'c') a = static_library('a', 'one.c', 'two.c') b = static_library('b', 'three.c', 'four.c') -c = static_library('c', - objects : [a.extract_all_objects(), b.extract_all_objects()]) +c = static_library('c', objects : [a.extract_all_objects(), b.extract_all_objects()]) +d = static_library('d', objects : [c.extract_all_objects()]) -e = executable('proggie', 'prog.c', link_with : c) +e = executable('proggie', 'prog.c', link_with : d) test('extall', e) |