aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--mesonbuild/backend/ninjabackend.py3
-rw-r--r--mesonbuild/compilers/detect.py2
-rw-r--r--mesonbuild/interpreter/interpreter.py4
-rw-r--r--mesonbuild/interpreter/interpreterobjects.py8
-rw-r--r--mesonbuild/interpreterbase/__init__.py4
-rw-r--r--mesonbuild/interpreterbase/_unholder.py4
-rw-r--r--mesonbuild/interpreterbase/decorators.py4
-rw-r--r--mesonbuild/interpreterbase/interpreterbase.py5
-rw-r--r--mesonbuild/linkers/linkers.py4
-rw-r--r--mesonbuild/modules/unstable_cuda.py1
-rwxr-xr-xmesonbuild/msubprojects.py8
-rw-r--r--mesonbuild/wrap/wrap.py4
-rwxr-xr-xrun_unittests.py38
-rw-r--r--test cases/common/242 set and get variable/meson.build6
-rw-r--r--test cases/common/93 suites/meson.build2
15 files changed, 75 insertions, 22 deletions
diff --git a/mesonbuild/backend/ninjabackend.py b/mesonbuild/backend/ninjabackend.py
index d6b535b..44e5228 100644
--- a/mesonbuild/backend/ninjabackend.py
+++ b/mesonbuild/backend/ninjabackend.py
@@ -3103,7 +3103,8 @@ https://gcc.gnu.org/bugzilla/show_bug.cgi?id=47485'''))
def get_user_option_args(self):
cmds = []
for (k, v) in self.environment.coredata.options.items():
- cmds.append('-D' + str(k) + '=' + (v.value if isinstance(v.value, str) else str(v.value).lower()))
+ if k.is_project():
+ cmds.append('-D' + str(k) + '=' + (v.value if isinstance(v.value, str) else str(v.value).lower()))
# The order of these arguments must be the same between runs of Meson
# to ensure reproducible output. The order we pass them shouldn't
# affect behavior in any other way.
diff --git a/mesonbuild/compilers/detect.py b/mesonbuild/compilers/detect.py
index 59eac85..a86366a 100644
--- a/mesonbuild/compilers/detect.py
+++ b/mesonbuild/compilers/detect.py
@@ -616,7 +616,7 @@ def _detect_c_or_cpp_compiler(env: 'Environment', lang: str, for_machine: Machin
if 'TMS320C2000 C/C++' in out:
cls = C2000CCompiler if lang == 'c' else C2000CPPCompiler
env.coredata.add_lang_args(cls.language, cls, for_machine, env)
- linker = C2000DynamicLinker(for_machine, version=version)
+ linker = C2000DynamicLinker(compiler, for_machine, version=version)
return cls(
ccache + compiler, version, for_machine, is_cross, info,
exe_wrap, full_version=full_version, linker=linker)
diff --git a/mesonbuild/interpreter/interpreter.py b/mesonbuild/interpreter/interpreter.py
index 9bc7bd5..860fd98 100644
--- a/mesonbuild/interpreter/interpreter.py
+++ b/mesonbuild/interpreter/interpreter.py
@@ -26,7 +26,7 @@ from ..programs import ExternalProgram, NonExistingExternalProgram
from ..dependencies import Dependency
from ..depfile import DepFile
from ..interpreterbase import ContainerTypeInfo, InterpreterBase, KwargInfo, typed_kwargs, typed_pos_args
-from ..interpreterbase import noPosargs, noKwargs, stringArgs, permittedKwargs, noArgsFlattening, noSecondLevelHolderResolving, unholder_return
+from ..interpreterbase import noPosargs, noKwargs, stringArgs, permittedKwargs, noArgsFlattening, noSecondLevelHolderResolving, permissive_unholder_return
from ..interpreterbase import InterpreterException, InvalidArguments, InvalidCode, SubdirDoneRequest
from ..interpreterbase import Disabler, disablerIfNotFound
from ..interpreterbase import FeatureNew, FeatureDeprecated, FeatureNewKwargs, FeatureDeprecatedKwargs
@@ -2741,7 +2741,7 @@ This will become a hard error in the future.''', location=self.current_node)
@noKwargs
@noArgsFlattening
- @unholder_return
+ @permissive_unholder_return
def func_get_variable(self, node, args, kwargs):
if len(args) < 1 or len(args) > 2:
raise InvalidCode('Get_variable takes one or two arguments.')
diff --git a/mesonbuild/interpreter/interpreterobjects.py b/mesonbuild/interpreter/interpreterobjects.py
index 03725b9..ef1aae3 100644
--- a/mesonbuild/interpreter/interpreterobjects.py
+++ b/mesonbuild/interpreter/interpreterobjects.py
@@ -17,8 +17,8 @@ from ..interpreterbase import (
ContainerTypeInfo, KwargInfo,
InterpreterObject, MesonInterpreterObject, ObjectHolder, MutableInterpreterObject,
FeatureCheckBase, FeatureNewKwargs, FeatureNew, FeatureDeprecated,
- typed_pos_args, typed_kwargs, KwargInfo, stringArgs, permittedKwargs,
- noArgsFlattening, noPosargs, noKwargs, unholder_return, TYPE_var, TYPE_kwargs, TYPE_nvar, TYPE_nkwargs,
+ typed_pos_args, typed_kwargs, stringArgs, permittedKwargs,
+ noArgsFlattening, noPosargs, noKwargs, permissive_unholder_return, TYPE_var, TYPE_kwargs, TYPE_nvar, TYPE_nkwargs,
flatten, resolve_second_level_holders, InterpreterException, InvalidArguments, InvalidCode)
from ..dependencies import Dependency, ExternalLibrary, InternalDependency
from ..programs import ExternalProgram
@@ -675,7 +675,7 @@ class Test(MesonInterpreterObject):
priority: int):
super().__init__()
self.name = name
- self.suite = suite
+ self.suite = listify(suite)
self.project_name = project
self.exe = exe
self.depends = depends
@@ -727,7 +727,7 @@ class SubprojectHolder(MesonInterpreterObject):
@noKwargs
@noArgsFlattening
- @unholder_return
+ @permissive_unholder_return
def get_variable_method(self, args: T.List[TYPE_var], kwargs: TYPE_kwargs) -> T.Union[TYPE_var, InterpreterObject]:
if len(args) < 1 or len(args) > 2:
raise InterpreterException('Get_variable takes one or two arguments.')
diff --git a/mesonbuild/interpreterbase/__init__.py b/mesonbuild/interpreterbase/__init__.py
index 298a034..8e45cdb 100644
--- a/mesonbuild/interpreterbase/__init__.py
+++ b/mesonbuild/interpreterbase/__init__.py
@@ -41,7 +41,7 @@ __all__ = [
'stringArgs',
'noArgsFlattening',
'noSecondLevelHolderResolving',
- 'unholder_return',
+ 'permissive_unholder_return',
'disablerIfNotFound',
'permittedKwargs',
'typed_pos_args',
@@ -94,7 +94,7 @@ from .decorators import (
stringArgs,
noArgsFlattening,
noSecondLevelHolderResolving,
- unholder_return,
+ permissive_unholder_return,
disablerIfNotFound,
permittedKwargs,
typed_pos_args,
diff --git a/mesonbuild/interpreterbase/_unholder.py b/mesonbuild/interpreterbase/_unholder.py
index b5663a5..7e95232 100644
--- a/mesonbuild/interpreterbase/_unholder.py
+++ b/mesonbuild/interpreterbase/_unholder.py
@@ -18,7 +18,7 @@ from ..mesonlib import HoldableObject, MesonBugException
import typing as T
-def _unholder(obj: T.Union[TYPE_var, InterpreterObject]) -> TYPE_var:
+def _unholder(obj: T.Union[TYPE_var, InterpreterObject], *, permissive: bool = False) -> TYPE_var:
if isinstance(obj, (int, bool, str)):
return obj
elif isinstance(obj, list):
@@ -30,6 +30,8 @@ def _unholder(obj: T.Union[TYPE_var, InterpreterObject]) -> TYPE_var:
return obj.held_object
elif isinstance(obj, MesonInterpreterObject):
return obj
+ elif isinstance(obj, HoldableObject) and permissive:
+ return obj
elif isinstance(obj, HoldableObject):
raise MesonBugException(f'Argument {obj} of type {type(obj).__name__} is not held by an ObjectHolder.')
elif isinstance(obj, InterpreterObject):
diff --git a/mesonbuild/interpreterbase/decorators.py b/mesonbuild/interpreterbase/decorators.py
index b91e9d5..eabc6d8 100644
--- a/mesonbuild/interpreterbase/decorators.py
+++ b/mesonbuild/interpreterbase/decorators.py
@@ -72,11 +72,11 @@ def noSecondLevelHolderResolving(f: TV_func) -> TV_func:
setattr(f, 'no-second-level-holder-flattening', True) # noqa: B010
return f
-def unholder_return(f: TV_func) -> T.Callable[..., TYPE_var]:
+def permissive_unholder_return(f: TV_func) -> T.Callable[..., TYPE_var]:
@wraps(f)
def wrapped(*wrapped_args: T.Any, **wrapped_kwargs: T.Any) -> T.Any:
res = f(*wrapped_args, **wrapped_kwargs)
- return _unholder(res)
+ return _unholder(res, permissive=True)
return T.cast(T.Callable[..., TYPE_var], wrapped)
def disablerIfNotFound(f: TV_func) -> TV_func:
diff --git a/mesonbuild/interpreterbase/interpreterbase.py b/mesonbuild/interpreterbase/interpreterbase.py
index d66fb9c..91cb7aa 100644
--- a/mesonbuild/interpreterbase/interpreterbase.py
+++ b/mesonbuild/interpreterbase/interpreterbase.py
@@ -268,7 +268,7 @@ class InterpreterBase:
return True
def evaluate_in(self, val1: T.Any, val2: T.Any) -> bool:
- if not isinstance(val1, (str, int, float, ObjectHolder)):
+ if not isinstance(val1, (str, int, float, mesonlib.HoldableObject)):
raise InvalidArguments('lvalue of "in" operator must be a string, integer, float, or object')
if not isinstance(val2, (list, dict)):
raise InvalidArguments('rvalue of "in" operator must be an array or a dict')
@@ -281,6 +281,9 @@ class InterpreterBase:
val2 = self.evaluate_statement(node.right)
if isinstance(val2, Disabler):
return val2
+ # Do not compare the ObjectHolders but the actual held objects
+ val1 = _unholder(val1)
+ val2 = _unholder(val2)
if node.ctype == 'in':
return self.evaluate_in(val1, val2)
elif node.ctype == 'notin':
diff --git a/mesonbuild/linkers/linkers.py b/mesonbuild/linkers/linkers.py
index 6ebdbcb..4457330 100644
--- a/mesonbuild/linkers/linkers.py
+++ b/mesonbuild/linkers/linkers.py
@@ -982,9 +982,9 @@ class C2000DynamicLinker(DynamicLinker):
id = 'cl2000'
- def __init__(self, for_machine: mesonlib.MachineChoice,
+ def __init__(self, exelist: T.List[str], for_machine: mesonlib.MachineChoice,
*, version: str = 'unknown version'):
- super().__init__(['cl2000.exe'], for_machine, '', [],
+ super().__init__(exelist or ['cl2000.exe'], for_machine, '', [],
version=version)
def get_link_whole_for(self, args: T.List[str]) -> T.List[str]:
diff --git a/mesonbuild/modules/unstable_cuda.py b/mesonbuild/modules/unstable_cuda.py
index 25f953a..9e8aa63 100644
--- a/mesonbuild/modules/unstable_cuda.py
+++ b/mesonbuild/modules/unstable_cuda.py
@@ -50,6 +50,7 @@ class CudaModule(NewExtensionModule):
cuda_version = args[0]
driver_version_table = [
+ {'cuda_version': '>=11.4.0', 'windows': '471.11', 'linux': '470.42.01'},
{'cuda_version': '>=11.3.0', 'windows': '465.89', 'linux': '465.19.01'},
{'cuda_version': '>=11.2.2', 'windows': '461.33', 'linux': '460.32.03'},
{'cuda_version': '>=11.2.1', 'windows': '461.09', 'linux': '460.32.03'},
diff --git a/mesonbuild/msubprojects.py b/mesonbuild/msubprojects.py
index 63ea98a..5d1fb72 100755
--- a/mesonbuild/msubprojects.py
+++ b/mesonbuild/msubprojects.py
@@ -386,6 +386,12 @@ class Runner:
if not self.wrap.type:
return True
+ if self.wrap.redirected:
+ redirect_file = Path(self.wrap.original_filename).resolve()
+ if self.options.confirm:
+ redirect_file.unlink()
+ mlog.log(f'Deleting {redirect_file}')
+
if self.wrap.type == 'redirect':
redirect_file = Path(self.wrap.filename).resolve()
if self.options.confirm:
@@ -416,7 +422,7 @@ class Runner:
# parallelized, another thread could have deleted it already.
try:
if not any(packagecache.iterdir()):
- packagecache.rmdir()
+ windows_proof_rmtree(str(packagecache))
except FileNotFoundError:
pass
diff --git a/mesonbuild/wrap/wrap.py b/mesonbuild/wrap/wrap.py
index 4a6583f..6c145ab 100644
--- a/mesonbuild/wrap/wrap.py
+++ b/mesonbuild/wrap/wrap.py
@@ -101,6 +101,8 @@ class PackageDefinition:
self.name = self.basename[:-5] if self.has_wrap else self.basename
self.directory = self.name
self.provided_deps[self.name] = None
+ self.original_filename = fname
+ self.redirected = False
if self.has_wrap:
self.parse_wrap()
self.directory = self.values.get('directory', self.name)
@@ -109,6 +111,7 @@ class PackageDefinition:
if self.type and self.type not in ALL_TYPES:
raise WrapException(f'Unknown wrap type {self.type!r}')
self.filesdir = os.path.join(os.path.dirname(self.filename), 'packagefiles')
+ # What the original file name was before redirection
def parse_wrap(self) -> None:
try:
@@ -137,6 +140,7 @@ class PackageDefinition:
raise WrapException(f'wrap-redirect {fname} filename does not exist')
self.filename = str(fname)
self.parse_wrap()
+ self.redirected = True
return
self.parse_provide_section(config)
diff --git a/run_unittests.py b/run_unittests.py
index 99c56e2..e8f453d 100755
--- a/run_unittests.py
+++ b/run_unittests.py
@@ -10181,7 +10181,20 @@ class SubprojectsCommandTests(BasePlatformTests):
self._git_create_local_repo('sub_git')
self._wrap_create_git('sub_git')
- def deleting(s) -> T.List[str]:
+ sub_file_subprojects_dir = self.subprojects_dir / 'sub_file' / 'subprojects'
+ sub_file_subprojects_dir.mkdir(exist_ok=True, parents=True)
+ real_dir = Path('sub_file') / 'subprojects' / 'real'
+
+ self._wrap_create_file(real_dir, tarball='dummy2.tar.gz')
+
+ with open(str((self.subprojects_dir / 'redirect').with_suffix('.wrap')), 'w', encoding='utf-8') as f:
+ f.write(textwrap.dedent(
+ f'''
+ [wrap-redirect]
+ filename = {real_dir}.wrap
+ '''))
+
+ def deleting(s: str) -> T.List[str]:
ret = []
prefix = 'Deleting '
for l in s.splitlines():
@@ -10190,14 +10203,31 @@ class SubprojectsCommandTests(BasePlatformTests):
return sorted(ret)
out = self._subprojects_cmd(['purge'])
- self.assertEqual(deleting(out), [str(self.subprojects_dir / 'sub_file'), str(self.subprojects_dir / 'sub_git')])
+ self.assertEqual(deleting(out), sorted([
+ str(self.subprojects_dir / 'redirect.wrap'),
+ str(self.subprojects_dir / 'sub_file'),
+ str(self.subprojects_dir / 'sub_git'),
+ ]))
out = self._subprojects_cmd(['purge', '--include-cache'])
- self.assertEqual(deleting(out), [str(self.subprojects_dir / 'packagecache' / 'dummy.tar.gz'), str(self.subprojects_dir / 'sub_file'), str(self.subprojects_dir / 'sub_git')])
+ self.assertEqual(deleting(out), sorted([
+ str(self.subprojects_dir / 'sub_git'),
+ str(self.subprojects_dir / 'redirect.wrap'),
+ str(self.subprojects_dir / 'packagecache' / 'dummy.tar.gz'),
+ str(self.subprojects_dir / 'packagecache' / 'dummy2.tar.gz'),
+ str(self.subprojects_dir / 'sub_file'),
+ ]))
out = self._subprojects_cmd(['purge', '--include-cache', '--confirm'])
- self.assertEqual(deleting(out), [str(self.subprojects_dir / 'packagecache' / 'dummy.tar.gz'), str(self.subprojects_dir / 'sub_file'), str(self.subprojects_dir / 'sub_git')])
+ self.assertEqual(deleting(out), sorted([
+ str(self.subprojects_dir / 'sub_git'),
+ str(self.subprojects_dir / 'redirect.wrap'),
+ str(self.subprojects_dir / 'packagecache' / 'dummy.tar.gz'),
+ str(self.subprojects_dir / 'packagecache' / 'dummy2.tar.gz'),
+ str(self.subprojects_dir / 'sub_file'),
+ ]))
self.assertFalse(Path(self.subprojects_dir / 'packagecache' / 'dummy.tar.gz').exists())
self.assertFalse(Path(self.subprojects_dir / 'sub_file').exists())
self.assertFalse(Path(self.subprojects_dir / 'sub_git').exists())
+ self.assertFalse(Path(self.subprojects_dir / 'redirect.wrap').exists())
def _clang_at_least(compiler: 'Compiler', minver: str, apple_minver: T.Optional[str]) -> bool:
"""
diff --git a/test cases/common/242 set and get variable/meson.build b/test cases/common/242 set and get variable/meson.build
index 6023e88..7c8dcf7 100644
--- a/test cases/common/242 set and get variable/meson.build
+++ b/test cases/common/242 set and get variable/meson.build
@@ -14,6 +14,10 @@ set_variable('var4', files('test2.txt')[0])
assert(var3 == 'test2.txt')
assert(not is_disabler(var4))
+# Test Equality
+assert(var1 == get_variable('var1'))
+assert(var2 == get_variable('var2'))
+
# Test get_variable directly
assert(get_variable('var1') == 'test1.txt')
assert(not is_disabler(get_variable('var2')))
@@ -35,6 +39,8 @@ assert(var7 == 'test2.txt')
assert(not is_disabler(var8))
assert(get_variable('var9') == 'test2.txt')
assert(not is_disabler(get_variable('var0')))
+assert(not is_disabler(get_variable('var0', var8)))
+assert(not is_disabler(get_variable('----', var8)))
# test dict get
dict = {'a': var2}
diff --git a/test cases/common/93 suites/meson.build b/test cases/common/93 suites/meson.build
index 057e059..2346b5b 100644
--- a/test cases/common/93 suites/meson.build
+++ b/test cases/common/93 suites/meson.build
@@ -6,4 +6,4 @@ exe1 = executable('exe1', 'exe1.c')
exe2 = executable('exe2', 'exe2.c')
test('exe1', exe1)
-test('exe2', exe2, suite : ['suite2', 'super-special'])
+test('exe2', exe2, suite : ['suite2', ['super-special']])