aboutsummaryrefslogtreecommitdiff
path: root/mesonbuild/backend/backends.py
diff options
context:
space:
mode:
authorXavier Claessens <xavier.claessens@collabora.com>2018-04-13 15:21:57 -0400
committerXavier Claessens <xavier.claessens@collabora.com>2018-04-18 14:49:52 -0400
commitb0e4d4047b2f8c9b2056a6f2585fd793f8ba0914 (patch)
treeaf6c280ff67e974a56e529374cdf5a127a3e70be /mesonbuild/backend/backends.py
parent628f9107609d883d4094a183194d1fae0171f719 (diff)
downloadmeson-b0e4d4047b2f8c9b2056a6f2585fd793f8ba0914.zip
meson-b0e4d4047b2f8c9b2056a6f2585fd793f8ba0914.tar.gz
meson-b0e4d4047b2f8c9b2056a6f2585fd793f8ba0914.tar.bz2
Fix using object extracted from a unity build
- determine_ext_objs: What matters is if extobj.target is a unity build, not if the target using those objects is a unity build. - determine_ext_objs: Return one object file per compiler, taking into account generated sources. - object_filename_from_source: No need to special-case unity build, it does the same thing in both code paths. - check_unity_compatible: For each compiler we must extract either none or all its sources, taking into account generated sources.
Diffstat (limited to 'mesonbuild/backend/backends.py')
-rw-r--r--mesonbuild/backend/backends.py53
1 files changed, 25 insertions, 28 deletions
diff --git a/mesonbuild/backend/backends.py b/mesonbuild/backend/backends.py
index 8f75dac..8ecf393 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)
@@ -248,7 +250,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.determine_ext_objs(target, obj, 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 +363,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 +377,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 +394,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 +405,26 @@ 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)]
+
+ 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