Unity build reverts to normal for fortran fix

The `determine_ext_objs` function did not take into account that fortran
(and d) does not support unity builds. This caused failures in some
cases.
pull/8226/head
Jonas Lundholm Bertelsen 4 years ago
parent ea34a92632
commit 2636eebd64
  1. 8
      mesonbuild/backend/backends.py
  2. 9
      mesonbuild/backend/ninjabackend.py

@ -45,6 +45,11 @@ if T.TYPE_CHECKING:
InstallType = T.List[T.Tuple[str, str, T.Optional['FileMode']]]
InstallSubdirsType = T.List[T.Tuple[str, str, T.Optional['FileMode'], T.Tuple[T.Set[str], T.Set[str]]]]
# Languages that can mix with C or C++ but don't support unity builds yet
# because the syntax we use for unity builds is specific to C/++/ObjC/++.
# Assembly files cannot be unitified and neither can LLVM IR files
LANGS_CANT_UNITY = ('d', 'fortran')
class TestProtocol(enum.Enum):
EXITCODE = 0
@ -637,6 +642,9 @@ class Backend:
unity_size = self.get_option_for_target(OptionKey('unity_size'), extobj.target)
for comp, srcs in compsrcs.items():
if comp.language in LANGS_CANT_UNITY:
sources += srcs
continue
for i in range(len(srcs) // unity_size + 1):
osrc = self.get_unity_source_file(extobj.target,
comp.get_default_suffix(), i)

@ -626,11 +626,6 @@ int dummy;
srcs[f] = s
return srcs
# Languages that can mix with C or C++ but don't support unity builds yet
# because the syntax we use for unity builds is specific to C/++/ObjC/++.
# Assembly files cannot be unitified and neither can LLVM IR files
langs_cant_unity = ('d', 'fortran')
def get_target_source_can_unity(self, target, source):
if isinstance(source, File):
source = source.fname
@ -638,7 +633,7 @@ int dummy;
self.environment.is_assembly(source):
return False
suffix = os.path.splitext(source)[1][1:].lower()
for lang in self.langs_cant_unity:
for lang in backends.LANGS_CANT_UNITY:
if lang not in target.compilers:
continue
if suffix in target.compilers[lang].file_suffixes:
@ -769,7 +764,7 @@ int dummy;
if is_unity:
# Warn about incompatible sources if a unity build is enabled
langs = set(target.compilers.keys())
langs_cant = langs.intersection(self.langs_cant_unity)
langs_cant = langs.intersection(backends.LANGS_CANT_UNITY)
if langs_cant:
langs_are = langs = ', '.join(langs_cant).upper()
langs_are += ' are' if len(langs_cant) > 1 else ' is'

Loading…
Cancel
Save