Fix crash when getting cuda options

We could have an OptionOverrideProxy of an OptionOverrideProxy,
recursively. This fix is a minimal subset of the refactoring I did in
https://github.com/mesonbuild/meson/pull/9394. Instead of faking
UserOption we can just do a shallow copy of one and set a new value on
it.

Fixes: #9448
pull/9482/head
Xavier Claessens 3 years ago committed by Nirbheek Chauhan
parent 654c2d4f21
commit 2fea562eed
  1. 19
      mesonbuild/mesonlib/universal.py
  2. 3
      test cases/cuda/16 multistd/lib.cu
  3. 3
      test cases/cuda/16 multistd/main.cu
  4. 8
      test cases/cuda/16 multistd/meson.build

@ -28,6 +28,7 @@ from tempfile import TemporaryDirectory
import typing as T import typing as T
import uuid import uuid
import textwrap import textwrap
import copy
from mesonbuild import mlog from mesonbuild import mlog
@ -61,7 +62,6 @@ __all__ = [
'OptionKey', 'OptionKey',
'dump_conf_header', 'dump_conf_header',
'OptionOverrideProxy', 'OptionOverrideProxy',
'OptionProxy',
'OptionType', 'OptionType',
'OrderedSet', 'OrderedSet',
'PerMachine', 'PerMachine',
@ -1919,16 +1919,6 @@ def run_once(func: T.Callable[..., _T]) -> T.Callable[..., _T]:
return wrapper return wrapper
class OptionProxy(T.Generic[_T]):
def __init__(self, value: _T, choices: T.Optional[T.List[str]] = None):
self.value = value
self.choices = choices
def set_value(self, v: _T) -> None:
# XXX: should this be an error
self.value = v
class OptionOverrideProxy(collections.abc.MutableMapping): class OptionOverrideProxy(collections.abc.MutableMapping):
'''Mimic an option list but transparently override selected option '''Mimic an option list but transparently override selected option
@ -1944,15 +1934,16 @@ class OptionOverrideProxy(collections.abc.MutableMapping):
for o in options: for o in options:
self.options.update(o) self.options.update(o)
def __getitem__(self, key: 'OptionKey') -> T.Union['UserOption', OptionProxy]: def __getitem__(self, key: 'OptionKey') -> T.Union['UserOption']:
if key in self.options: if key in self.options:
opt = self.options[key] opt = self.options[key]
if key in self.overrides: if key in self.overrides:
return OptionProxy(opt.validate_value(self.overrides[key]), getattr(opt, 'choices', None)) opt = copy.copy(opt)
opt.set_value(self.overrides[key])
return opt return opt
raise KeyError('Option not found', key) raise KeyError('Option not found', key)
def __setitem__(self, key: 'OptionKey', value: T.Union['UserOption', OptionProxy]) -> None: def __setitem__(self, key: 'OptionKey', value: T.Union['UserOption']) -> None:
self.overrides[key] = value.value self.overrides[key] = value.value
def __delitem__(self, key: 'OptionKey') -> None: def __delitem__(self, key: 'OptionKey') -> None:

@ -0,0 +1,3 @@
int do_cuda_stuff() {
return 0;
}

@ -7,6 +7,7 @@ auto cuda_devices(void) {
return result; return result;
} }
int do_cuda_stuff();
int main(void) { int main(void) {
int n = cuda_devices(); int n = cuda_devices();
@ -16,5 +17,5 @@ int main(void) {
} }
std::cout << "Found " << n << "Cuda devices.\n"; std::cout << "Found " << n << "Cuda devices.\n";
return 0; return do_cuda_stuff();
} }

@ -2,6 +2,12 @@ project('C++-CUDA multi-std', 'cpp', 'cuda',
version : '1.0.0', version : '1.0.0',
default_options : ['cpp_std=c++17', 'cuda_std=c++14']) default_options : ['cpp_std=c++17', 'cuda_std=c++14'])
exe = executable('prog', 'main.cu') # Regression test: Passing override_options used to cause a crash.
# See https://github.com/mesonbuild/meson/issues/9448.
libcpp11 = static_library('testcpp11', 'lib.cu',
override_options: ['cpp_std=c++11']
)
exe = executable('prog', 'main.cu', link_with: libcpp11)
# The runtimes leak memory, so ignore it. # The runtimes leak memory, so ignore it.
test('cudatest', exe, env: ['ASAN_OPTIONS=detect_leaks=0']) test('cudatest', exe, env: ['ASAN_OPTIONS=detect_leaks=0'])

Loading…
Cancel
Save