summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--mesonbuild/backend/ninjabackend.py35
1 files changed, 18 insertions, 17 deletions
diff --git a/mesonbuild/backend/ninjabackend.py b/mesonbuild/backend/ninjabackend.py
index 2f40ede4a..4e8af9545 100644
--- a/mesonbuild/backend/ninjabackend.py
+++ b/mesonbuild/backend/ninjabackend.py
@@ -2038,18 +2038,24 @@ class NinjaBackend(backends.Backend):
except (KeyError, AttributeError):
pass
- if mesonlib.version_compare(rustc.version, '>= 1.67.0'):
- verbatim = '+verbatim'
- else:
- verbatim = ''
+ has_verbatim = mesonlib.version_compare(rustc.version, '>= 1.67.0')
def _link_library(libname: str, static: bool, bundle: bool = False) -> None:
type_ = 'static' if static else 'dylib'
modifiers = []
+ # Except with -Clink-arg, search is limited to the -L search paths
+ dir_, libname = os.path.split(libname)
+ linkdirs.add(dir_)
if not bundle and static:
modifiers.append('-bundle')
- if verbatim:
- modifiers.append(verbatim)
+ if has_verbatim:
+ modifiers.append('+verbatim')
+ else:
+ # undo the effects of -l without verbatim
+ libname, ext = os.path.splitext(libname)
+ if libname.startswith('lib'):
+ libname = libname[3:]
+
if modifiers:
type_ += ':' + ','.join(modifiers)
args.append(f'-l{type_}={libname}')
@@ -2062,11 +2068,11 @@ class NinjaBackend(backends.Backend):
external_deps = target.external_deps.copy()
target_deps = target.get_dependencies()
for d in target_deps:
- linkdirs.add(d.subdir)
deps.append(self.get_dependency_filename(d))
if isinstance(d, build.StaticLibrary):
external_deps.extend(d.external_deps)
if d.uses_rust_abi():
+ linkdirs.add(d.subdir)
if d not in itertools.chain(target.link_targets, target.link_whole_targets):
# Indirect Rust ABI dependency, we only need its path in linkdirs.
continue
@@ -2094,8 +2100,7 @@ class NinjaBackend(backends.Backend):
link_whole = d in target.link_whole_targets
if isinstance(target, build.StaticLibrary) or (isinstance(target, build.Executable) and rustc.get_crt_static()):
static = isinstance(d, build.StaticLibrary)
- libname = os.path.basename(lib) if verbatim else d.name
- _link_library(libname, static, bundle=link_whole)
+ _link_library(lib, static, bundle=link_whole)
elif link_whole:
link_whole_args = rustc.linker.get_link_whole_for([lib])
args += [f'-Clink-arg={a}' for a in link_whole_args]
@@ -2111,18 +2116,14 @@ class NinjaBackend(backends.Backend):
args.append(a)
continue
elif is_library(a):
- dir_, lib = os.path.split(a)
- linkdirs.add(dir_)
-
if isinstance(target, build.StaticLibrary):
- if not verbatim:
- lib, ext = os.path.splitext(lib)
- if lib.startswith('lib'):
- lib = lib[3:]
static = a.endswith(('.a', '.lib'))
- _link_library(lib, static)
+ _link_library(a, static)
continue
+ dir_, _ = os.path.split(lib)
+ linkdirs.add(dir_)
+
args.append(f'-Clink-arg={a}')
for d in linkdirs: