aboutsummaryrefslogtreecommitdiff
path: root/mesonbuild/interpreter/mesonmain.py
diff options
context:
space:
mode:
authorXavier Claessens <xavier.claessens@collabora.com>2021-08-04 11:30:27 -0400
committerXavier Claessens <xclaesse@gmail.com>2021-08-23 10:52:18 -0400
commite646130ef1a703a3624cff4ca11f926703a6fcf4 (patch)
treeafc6527bdd1e01de853fa4ecdab66ee2a8baf75b /mesonbuild/interpreter/mesonmain.py
parent0063eb251e836e777b427cbe59b43ab937ac1924 (diff)
downloadmeson-e646130ef1a703a3624cff4ca11f926703a6fcf4.zip
meson-e646130ef1a703a3624cff4ca11f926703a6fcf4.tar.gz
meson-e646130ef1a703a3624cff4ca11f926703a6fcf4.tar.bz2
interpreter: Fix dependency(..., static: true) fallback
It should build the fallback subprject with default_library=static and override the dependency for both static=True and static kwarg not given. Fixes: #8050.
Diffstat (limited to 'mesonbuild/interpreter/mesonmain.py')
-rw-r--r--mesonbuild/interpreter/mesonmain.py58
1 files changed, 48 insertions, 10 deletions
diff --git a/mesonbuild/interpreter/mesonmain.py b/mesonbuild/interpreter/mesonmain.py
index ea16b46..1c850b2 100644
--- a/mesonbuild/interpreter/mesonmain.py
+++ b/mesonbuild/interpreter/mesonmain.py
@@ -14,11 +14,16 @@ from ..interpreterbase import (MesonInterpreterObject, FeatureNew, FeatureDeprec
from .interpreterobjects import (ExecutableHolder, ExternalProgramHolder,
CustomTargetHolder, CustomTargetIndexHolder,
EnvironmentVariablesObject)
+from .type_checking import NATIVE_KW
import typing as T
if T.TYPE_CHECKING:
from .interpreter import Interpreter
+ from typing_extensions import TypedDict
+ class FuncOverrideDependency(TypedDict):
+ native: mesonlib.MachineChoice
+ static: T.Optional[bool]
class MesonMain(MesonInterpreterObject):
def __init__(self, build: 'build.Build', interpreter: 'Interpreter'):
@@ -294,21 +299,54 @@ class MesonMain(MesonInterpreterObject):
raise InterpreterException('Second argument must be an external program or executable.')
self.interpreter.add_find_program_override(name, exe)
+ @typed_kwargs('meson.override_dependency', NATIVE_KW,
+ KwargInfo('static', bool, since='0.60.0'))
+ @typed_pos_args('meson.override_dependency', str, dependencies.Dependency)
@FeatureNew('meson.override_dependency', '0.54.0')
- @permittedKwargs({'native'})
- def override_dependency_method(self, args, kwargs):
- if len(args) != 2:
- raise InterpreterException('Override needs two arguments')
- name = args[0]
- dep = args[1]
- if not isinstance(name, str) or not name:
+ def override_dependency_method(self, args: T.Tuple[str, dependencies.Dependency], kwargs: 'FuncOverrideDependency') -> None:
+ name, dep = args
+ if not name:
raise InterpreterException('First argument must be a string and cannot be empty')
- if not isinstance(dep, dependencies.Dependency):
- raise InterpreterException('Second argument must be a dependency object')
+
+ optkey = OptionKey('default_library', subproject=self.interpreter.subproject)
+ default_library = self.interpreter.coredata.get_option(optkey)
+ assert isinstance(default_library, str), 'for mypy'
+ static = kwargs['static']
+ if static is None:
+ # We don't know if dep represents a static or shared library, could
+ # be a mix of both. We assume it is following default_library
+ # value.
+ self._override_dependency_impl(name, dep, kwargs, static=None)
+ if default_library == 'static':
+ self._override_dependency_impl(name, dep, kwargs, static=True)
+ elif default_library == 'shared':
+ self._override_dependency_impl(name, dep, kwargs, static=False)
+ else:
+ self._override_dependency_impl(name, dep, kwargs, static=True)
+ self._override_dependency_impl(name, dep, kwargs, static=False)
+ else:
+ # dependency('foo') without specifying static kwarg should find this
+ # override regardless of the static value here. But do not raise error
+ # if it has already been overridden, which would happend when overriding
+ # static and shared separately:
+ # meson.override_dependency('foo', shared_dep, static: false)
+ # meson.override_dependency('foo', static_dep, static: true)
+ # In that case dependency('foo') would return the first override.
+ self._override_dependency_impl(name, dep, kwargs, static=None, permissive=True)
+ self._override_dependency_impl(name, dep, kwargs, static=static)
+
+ def _override_dependency_impl(self, name: str, dep: dependencies.Dependency, kwargs: 'FuncOverrideDependency', static: T.Optional[bool], permissive: bool = False) -> None:
+ kwargs = kwargs.copy()
+ if static is None:
+ del kwargs['static']
+ else:
+ kwargs['static'] = static
identifier = dependencies.get_dep_identifier(name, kwargs)
- for_machine = self.interpreter.machine_from_native_kwarg(kwargs)
+ for_machine = kwargs['native']
override = self.build.dependency_overrides[for_machine].get(identifier)
if override:
+ if permissive:
+ return
m = 'Tried to override dependency {!r} which has already been resolved or overridden at {}'
location = mlog.get_error_location_string(override.node.filename, override.node.lineno)
raise InterpreterException(m.format(name, location))