summaryrefslogtreecommitdiff
path: root/mesonbuild/backend/backends.py
diff options
context:
space:
mode:
authorgerioldman <k.gergo49@gmail.com>2024-08-28 02:57:56 +0200
committergerioldman <k.gergo49@gmail.com>2025-01-08 01:52:03 +0100
commitb95e1777ddbf0f8aebb56b84a6011468088c06ec (patch)
treea4b439294301a8cf1a885d6e8fcd597c9bc621c8 /mesonbuild/backend/backends.py
parent62c5db2cb3809e584bd4faef5c0a9d112e36a29c (diff)
downloadmeson-b95e1777ddbf0f8aebb56b84a6011468088c06ec.tar.gz
First draft version of Tasking MIL linking with b_lto and prelinking
Diffstat (limited to 'mesonbuild/backend/backends.py')
-rw-r--r--mesonbuild/backend/backends.py21
1 files changed, 16 insertions, 5 deletions
diff --git a/mesonbuild/backend/backends.py b/mesonbuild/backend/backends.py
index fb912b1d8..18caf7bbe 100644
--- a/mesonbuild/backend/backends.py
+++ b/mesonbuild/backend/backends.py
@@ -24,10 +24,11 @@ from .. import dependencies
from .. import programs
from .. import mesonlib
from .. import mlog
-from ..compilers import LANGUAGES_USING_LDFLAGS, detect
+from ..compilers import LANGUAGES_USING_LDFLAGS, detect, lang_suffixes
from ..mesonlib import (
File, MachineChoice, MesonException, OrderedSet,
- ExecutableSerialisation, classify_unity_sources,
+ ExecutableSerialisation, EnvironmentException,
+ classify_unity_sources, get_compiler_for_source
)
from ..options import OptionKey
@@ -837,7 +838,7 @@ class Backend:
fname = fname.replace(ch, '_')
return hashed + fname
- def object_filename_from_source(self, target: build.BuildTarget, source: 'FileOrString', targetdir: T.Optional[str] = None) -> str:
+ def object_filename_from_source(self, target: build.BuildTarget, compiler: Compiler, source: 'FileOrString', targetdir: T.Optional[str] = None) -> str:
assert isinstance(source, mesonlib.File)
if isinstance(target, build.CompileTarget):
return target.sources_map[source]
@@ -868,7 +869,16 @@ class Backend:
gen_source = os.path.relpath(os.path.join(build_dir, rel_src),
os.path.join(self.environment.get_source_dir(), target.get_subdir()))
machine = self.environment.machines[target.for_machine]
- ret = self.canonicalize_filename(gen_source) + '.' + machine.get_object_suffix()
+ object_suffix = machine.get_object_suffix()
+ # For the TASKING compiler, in case of LTO or prelinking the object suffix has to be .mil
+ if compiler.get_id() == 'tasking':
+ if target.get_option(OptionKey('b_lto')) or (isinstance(target, build.StaticLibrary) and target.prelink):
+ if not source.rsplit('.', 1)[1] in lang_suffixes['c']:
+ if isinstance(target, build.StaticLibrary) and not target.prelink:
+ raise EnvironmentException('Tried using MIL linking for a static library with a assembly file. This can only be done if the static library is prelinked or disable \'b_lto\'.')
+ else:
+ object_suffix = 'mil'
+ ret = self.canonicalize_filename(gen_source) + '.' + object_suffix
if targetdir is not None:
return os.path.join(targetdir, ret)
return ret
@@ -924,7 +934,8 @@ class Backend:
sources.append(_src)
for osrc in sources:
- objname = self.object_filename_from_source(extobj.target, osrc, targetdir)
+ compiler = get_compiler_for_source(extobj.target.compilers.values(), osrc)
+ objname = self.object_filename_from_source(extobj.target, compiler, osrc, targetdir)
objpath = os.path.join(proj_dir_to_build_root, objname)
result.append(objpath)