diff options
author | Jussi Pakkanen <jpakkane@gmail.com> | 2018-04-20 00:58:08 +0300 |
---|---|---|
committer | GitHub <noreply@github.com> | 2018-04-20 00:58:08 +0300 |
commit | 2b3562cc3ad6ac4e98de2c866fbacb009c2fcc69 (patch) | |
tree | 355e149fa3d839ba2fcff0c8edadb01fe6b694eb /mesonbuild/backend | |
parent | 11ebe0bfee31eeacec3d06d95dbc420079d67696 (diff) | |
parent | 9a82b0136a6b9cd9d2000342a0506b7c8bf4897d (diff) | |
download | meson-2b3562cc3ad6ac4e98de2c866fbacb009c2fcc69.zip meson-2b3562cc3ad6ac4e98de2c866fbacb009c2fcc69.tar.gz meson-2b3562cc3ad6ac4e98de2c866fbacb009c2fcc69.tar.bz2 |
Merge pull request #3404 from xclaesse/extract-recursive
extract_all_objects(): Recursively extract objects
Diffstat (limited to 'mesonbuild/backend')
-rw-r--r-- | mesonbuild/backend/backends.py | 64 | ||||
-rw-r--r-- | mesonbuild/backend/ninjabackend.py | 2 | ||||
-rw-r--r-- | mesonbuild/backend/vs2010backend.py | 2 |
3 files changed, 37 insertions, 31 deletions
diff --git a/mesonbuild/backend/backends.py b/mesonbuild/backend/backends.py index 8f75dac..5a401fe 100644 --- a/mesonbuild/backend/backends.py +++ b/mesonbuild/backend/backends.py @@ -206,6 +206,8 @@ class Backend: return os.path.join(self.get_target_private_dir(target), src) def get_unity_source_file(self, target, suffix): + # There is a potential conflict here, but it is unlikely that + # anyone both enables unity builds and has a file called foo-unity.cpp. osrc = target.name + '-unity.' + suffix return mesonlib.File.from_built_file(self.get_target_private_dir(target), osrc) @@ -239,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) @@ -248,7 +253,9 @@ 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.determine_ext_objs(target, obj, proj_dir_to_build_root) + if obj.recursive: + 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.') return obj_list @@ -361,15 +368,11 @@ class Backend: result += [rp] return result - def object_filename_from_source(self, target, source, is_unity): + def object_filename_from_source(self, target, source): assert isinstance(source, mesonlib.File) build_dir = self.environment.get_build_dir() rel_src = source.rel_to_builddir(self.build_to_src) - if (not self.environment.is_source(rel_src) or - self.environment.is_header(rel_src)) and not is_unity: - return None - # foo.vala files compile down to foo.c and then foo.c.o, not foo.vala.o if rel_src.endswith(('.vala', '.gs')): # See description in generate_vala_compile for this logic. @@ -379,8 +382,6 @@ class Backend: rel_src = os.path.relpath(rel_src, self.get_target_private_dir(target)) else: rel_src = os.path.basename(rel_src) - if is_unity: - return 'meson-generated_' + rel_src[:-5] + '.c.' + self.environment.get_object_suffix() # A meson- prefixed directory is reserved; hopefully no-one creates a file name with such a weird prefix. source = 'meson-generated_' + rel_src[:-5] + '.c' elif source.is_built: @@ -398,24 +399,10 @@ class Backend: os.path.join(self.environment.get_source_dir(), target.get_subdir())) return source.replace('/', '_').replace('\\', '_') + '.' + self.environment.get_object_suffix() - def determine_ext_objs(self, target, extobj, proj_dir_to_build_root): + def determine_ext_objs(self, extobj, proj_dir_to_build_root): result = [] - targetdir = self.get_target_private_dir(extobj.target) - # With unity builds, there's just one object that contains all the - # sources, and we only support extracting all the objects in this mode, - # so just return that. - if self.is_unity(target): - comp = get_compiler_for_source(extobj.target.compilers.values(), - extobj.srclist[0]) - # There is a potential conflict here, but it is unlikely that - # anyone both enables unity builds and has a file called foo-unity.cpp. - osrc = self.get_unity_source_file(extobj.target, - comp.get_default_suffix()) - objname = self.object_filename_from_source(extobj.target, osrc, True) - objname = objname.replace('/', '_').replace('\\', '_') - objpath = os.path.join(proj_dir_to_build_root, targetdir, objname) - return [objpath] + # Merge sources and generated sources sources = list(extobj.srclist) for gensrc in extobj.genlist: for s in gensrc.get_outputs(): @@ -423,11 +410,30 @@ class Backend: dirpart, fnamepart = os.path.split(path) sources.append(File(True, dirpart, fnamepart)) + # 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 + # sources, and we only support extracting all the objects in this mode, + # so just return that. + if self.is_unity(extobj.target): + compsrcs = classify_unity_sources(extobj.target.compilers.values(), sources) + sources = [] + for comp in compsrcs.keys(): + osrc = self.get_unity_source_file(extobj.target, + comp.get_default_suffix()) + sources.append(osrc) + for osrc in sources: - objname = self.object_filename_from_source(extobj.target, osrc, False) - if objname: - objpath = os.path.join(proj_dir_to_build_root, targetdir, objname) - result.append(objpath) + objname = self.object_filename_from_source(extobj.target, osrc) + objpath = os.path.join(proj_dir_to_build_root, targetdir, objname) + result.append(objpath) return result diff --git a/mesonbuild/backend/ninjabackend.py b/mesonbuild/backend/ninjabackend.py index 52a9cbf..d423832 100644 --- a/mesonbuild/backend/ninjabackend.py +++ b/mesonbuild/backend/ninjabackend.py @@ -2206,7 +2206,7 @@ rule FORTRAN_DEP_HACK raise AssertionError('BUG: broken generated source file handling for {!r}'.format(src)) else: raise InvalidArguments('Invalid source type: {!r}'.format(src)) - obj_basename = self.object_filename_from_source(target, src, self.is_unity(target)) + obj_basename = self.object_filename_from_source(target, src) rel_obj = os.path.join(self.get_target_private_dir(target), obj_basename) dep_file = compiler.depfile_for_object(rel_obj) diff --git a/mesonbuild/backend/vs2010backend.py b/mesonbuild/backend/vs2010backend.py index 22383dc..952f90c 100644 --- a/mesonbuild/backend/vs2010backend.py +++ b/mesonbuild/backend/vs2010backend.py @@ -1026,7 +1026,7 @@ class Vs2010Backend(backends.Backend): self.add_additional_options(lang, inc_cl, file_args) self.add_preprocessor_defines(lang, inc_cl, file_defines) self.add_include_dirs(lang, inc_cl, file_inc_dirs) - ET.SubElement(inc_cl, 'ObjectFileName').text = "$(IntDir)" + self.object_filename_from_source(target, s, False) + ET.SubElement(inc_cl, 'ObjectFileName').text = "$(IntDir)" + self.object_filename_from_source(target, s) for s in gen_src: inc_cl = ET.SubElement(inc_src, 'CLCompile', Include=s) lang = Vs2010Backend.lang_from_source_file(s) |