aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--mesonbuild/backend/backends.py8
-rw-r--r--mesonbuild/build.py13
-rw-r--r--test cases/common/25 object extraction/lib2.c3
-rw-r--r--test cases/common/25 object extraction/meson.build2
4 files changed, 12 insertions, 14 deletions
diff --git a/mesonbuild/backend/backends.py b/mesonbuild/backend/backends.py
index c37ae2a..49b6008 100644
--- a/mesonbuild/backend/backends.py
+++ b/mesonbuild/backend/backends.py
@@ -279,13 +279,9 @@ class Backend():
result = []
targetdir = self.get_target_private_dir(extobj.target)
# With unity builds, there's just one object that contains all the
- # sources, so if we want all the objects, just return that.
+ # sources, and we only support extracting all the objects in this mode,
+ # so just return that.
if self.environment.coredata.get_builtin_option('unity'):
- if not extobj.unity_compatible:
- # This should never happen
- msg = 'BUG: Meson must not allow extracting single objects ' \
- 'in Unity builds'
- raise AssertionError(msg)
comp = get_compiler_for_source(extobj.target.compilers.values(),
extobj.srclist[0])
# The unity object name uses the full absolute path of the source file
diff --git a/mesonbuild/build.py b/mesonbuild/build.py
index 98f05c2..39e215f 100644
--- a/mesonbuild/build.py
+++ b/mesonbuild/build.py
@@ -198,10 +198,11 @@ class ExtractedObjects():
'''
Holds a list of sources for which the objects must be extracted
'''
- def __init__(self, target, srclist):
+ def __init__(self, target, srclist, is_unity):
self.target = target
self.srclist = srclist
- self.check_unity_compatible()
+ if is_unity:
+ self.check_unity_compatible()
def check_unity_compatible(self):
# Figure out if the extracted object list is compatible with a Unity
@@ -211,11 +212,9 @@ class ExtractedObjects():
# from each unified source file.
# If the list of sources for which we want objects is the same as the
# list of sources that go into each unified build, we're good.
- self.unity_compatible = False
srclist_set = set(self.srclist)
# Objects for all the sources are required, so we're compatible
if srclist_set == set(self.target.sources):
- self.unity_compatible = True
return
# Check if the srclist is a subset (of the target's sources) that is
# going to form a unified source file and a single object
@@ -223,7 +222,6 @@ class ExtractedObjects():
self.target.sources)
for srcs in compsrcs.values():
if srclist_set == set(srcs):
- self.unity_compatible = True
return
msg = 'Single object files can not be extracted in Unity builds. ' \
'You can only extract all the object files at once.'
@@ -273,6 +271,7 @@ class BuildTarget():
self.subdir = subdir
self.subproject = subproject # Can not be calculated from subdir as subproject dirname can be changed per project.
self.is_cross = is_cross
+ self.is_unity = environment.coredata.get_builtin_option('unity')
self.environment = environment
self.sources = []
self.compilers = {}
@@ -458,10 +457,10 @@ class BuildTarget():
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, self.is_unity)
def extract_all_objects(self):
- return ExtractedObjects(self, self.sources)
+ return ExtractedObjects(self, self.sources, self.is_unity)
def get_all_link_deps(self):
return self.get_transitive_link_deps()
diff --git a/test cases/common/25 object extraction/lib2.c b/test cases/common/25 object extraction/lib2.c
new file mode 100644
index 0000000..c30dde2
--- /dev/null
+++ b/test cases/common/25 object extraction/lib2.c
@@ -0,0 +1,3 @@
+int retval() {
+ return 43;
+}
diff --git a/test cases/common/25 object extraction/meson.build b/test cases/common/25 object extraction/meson.build
index 7c5ab90..c76b0db 100644
--- a/test cases/common/25 object extraction/meson.build
+++ b/test cases/common/25 object extraction/meson.build
@@ -4,7 +4,7 @@ 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 = shared_library('somelib2', 'lib.c', 'lib2.c')
obj1 = lib1.extract_objects('src/lib.c')
obj2 = lib2.extract_objects(['lib.c'])