extract_all_objects(): Recursively extract objects

Fixes #3401
pull/3404/head
Xavier Claessens 7 years ago
parent b0e4d4047b
commit 60aaee55d4
  1. 10
      mesonbuild/backend/backends.py
  2. 10
      mesonbuild/build.py
  3. 6
      test cases/common/88 extract all/meson.build

@ -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

@ -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()

@ -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)

Loading…
Cancel
Save