diff options
-rw-r--r-- | mesonbuild/backend/ninjabackend.py | 3 | ||||
-rw-r--r-- | mesonbuild/compilers/detect.py | 2 | ||||
-rw-r--r-- | mesonbuild/interpreter/interpreter.py | 4 | ||||
-rw-r--r-- | mesonbuild/interpreter/interpreterobjects.py | 8 | ||||
-rw-r--r-- | mesonbuild/interpreterbase/__init__.py | 4 | ||||
-rw-r--r-- | mesonbuild/interpreterbase/_unholder.py | 4 | ||||
-rw-r--r-- | mesonbuild/interpreterbase/decorators.py | 4 | ||||
-rw-r--r-- | mesonbuild/interpreterbase/interpreterbase.py | 5 | ||||
-rw-r--r-- | mesonbuild/linkers/linkers.py | 4 | ||||
-rw-r--r-- | mesonbuild/modules/unstable_cuda.py | 1 | ||||
-rwxr-xr-x | mesonbuild/msubprojects.py | 8 | ||||
-rw-r--r-- | mesonbuild/wrap/wrap.py | 4 | ||||
-rwxr-xr-x | run_unittests.py | 38 | ||||
-rw-r--r-- | test cases/common/242 set and get variable/meson.build | 6 | ||||
-rw-r--r-- | test cases/common/93 suites/meson.build | 2 |
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']]) |