aboutsummaryrefslogtreecommitdiff
path: root/mesonbuild/interpreter.py
diff options
context:
space:
mode:
Diffstat (limited to 'mesonbuild/interpreter.py')
-rw-r--r--mesonbuild/interpreter.py58
1 files changed, 36 insertions, 22 deletions
diff --git a/mesonbuild/interpreter.py b/mesonbuild/interpreter.py
index e486ee9..da96eb3 100644
--- a/mesonbuild/interpreter.py
+++ b/mesonbuild/interpreter.py
@@ -27,6 +27,7 @@ import os, sys, subprocess, shutil, uuid, re
from functools import wraps
import importlib
+import copy
run_depr_printed = False
@@ -188,6 +189,7 @@ class EnvironmentVariablesHolder(InterpreterObject):
self.methods.update({'set': self.set_method,
'append': self.append_method,
'prepend' : self.prepend_method,
+ 'copy' : self.copy_method,
})
@stringArgs
@@ -210,6 +212,9 @@ class EnvironmentVariablesHolder(InterpreterObject):
def prepend_method(self, args, kwargs):
self.add_var(self.held_object.prepend, args, kwargs)
+ def copy_method(self, args, kwargs):
+ return copy.deepcopy(self)
+
class ConfigurationDataHolder(InterpreterObject):
def __init__(self):
@@ -278,27 +283,21 @@ class DependencyHolder(InterpreterObject):
InterpreterObject.__init__(self)
self.held_object = dep
self.methods.update({'found' : self.found_method,
+ 'type_name': self.type_name_method,
'version': self.version_method})
+ def type_name_method(self, args, kwargs):
+ return self.held_object.type_name
+
def found_method(self, args, kwargs):
+ if self.held_object.type_name == 'internal':
+ return True
+
return self.held_object.found()
def version_method(self, args, kwargs):
return self.held_object.get_version()
-class InternalDependencyHolder(InterpreterObject):
- def __init__(self, dep):
- InterpreterObject.__init__(self)
- self.held_object = dep
- self.methods.update({'found' : self.found_method,
- 'version': self.version_method,
- })
-
- def found_method(self, args, kwargs):
- return True
-
- def version_method(self, args, kwargs):
- return self.held_object.get_version()
class ExternalProgramHolder(InterpreterObject):
def __init__(self, ep):
@@ -1394,7 +1393,7 @@ class Interpreter():
raise InterpreterException('Dependencies must be external deps')
final_deps.append(d)
dep = dependencies.InternalDependency(version, incs, compile_args, link_args, libs, sources, final_deps)
- return InternalDependencyHolder(dep)
+ return DependencyHolder(dep)
@noKwargs
def func_assert(self, node, args, kwargs):
@@ -1835,11 +1834,23 @@ class Interpreter():
# We need to actually search for this dep
exception = None
dep = None
- try:
- dep = dependencies.find_external_dependency(name, self.environment, kwargs)
- except dependencies.DependencyException as e:
- exception = e
- pass
+ # If the fallback has already been configured (possibly by a higher level project)
+ # try to use it before using the native version
+ if 'fallback' in kwargs:
+ dirname, varname = self.get_subproject_infos(kwargs)
+ if dirname in self.subprojects:
+ try:
+ dep = self.subprojects[dirname].get_variable_method([varname], {})
+ dep = dep.held_object
+ except KeyError:
+ pass
+
+ if not dep:
+ try:
+ dep = dependencies.find_external_dependency(name, self.environment, kwargs)
+ except dependencies.DependencyException as e:
+ exception = e
+ pass
if not dep or not dep.found():
if 'fallback' in kwargs:
@@ -1853,12 +1864,15 @@ class Interpreter():
self.coredata.deps[identifier] = dep
return DependencyHolder(dep)
- def dependency_fallback(self, name, kwargs):
+ def get_subproject_infos(self, kwargs):
fbinfo = kwargs['fallback']
check_stringlist(fbinfo)
if len(fbinfo) != 2:
raise InterpreterException('Fallback info must have exactly two items.')
- dirname, varname = fbinfo
+ return fbinfo
+
+ def dependency_fallback(self, name, kwargs):
+ dirname, varname = self.get_subproject_infos(kwargs)
try:
self.do_subproject(dirname, {})
except:
@@ -1873,7 +1887,7 @@ class Interpreter():
dep = self.subprojects[dirname].get_variable_method([varname], {})
except KeyError:
raise InterpreterException('Fallback variable {!r} in the subproject {!r} does not exist'.format(varname, dirname))
- if not isinstance(dep, (DependencyHolder, InternalDependencyHolder)):
+ if not isinstance(dep, DependencyHolder):
raise InterpreterException('Fallback variable {!r} in the subproject {!r} is not a dependency object.'.format(varname, dirname))
# Check if the version of the declared dependency matches what we want
if 'version' in kwargs: