diff options
-rw-r--r-- | docs/markdown/Reference-manual.md | 19 | ||||
-rw-r--r-- | docs/markdown/snippets/native_property.md | 8 | ||||
-rw-r--r-- | mesonbuild/interpreter.py | 43 | ||||
-rw-r--r-- | test cases/common/192 args flattening/meson.build | 10 | ||||
-rw-r--r-- | test cases/common/228 native prop/meson.build | 10 | ||||
-rw-r--r-- | test cases/common/229 native prop/meson.build | 24 | ||||
-rw-r--r-- | test cases/common/229 native prop/nativefile.ini (renamed from test cases/common/228 native prop/nativefile.ini) | 0 | ||||
-rw-r--r-- | test cases/failing/97 no native prop/meson.build | 3 | ||||
-rw-r--r-- | test cases/failing/99 no native prop/meson.build | 3 |
9 files changed, 81 insertions, 39 deletions
diff --git a/docs/markdown/Reference-manual.md b/docs/markdown/Reference-manual.md index 690ae0b..4e59030 100644 --- a/docs/markdown/Reference-manual.md +++ b/docs/markdown/Reference-manual.md @@ -1773,10 +1773,6 @@ the following methods. refer to files in the current or any other source directory instead of constructing paths manually with `meson.current_source_dir()`. -- `get_cross_property(propname, fallback_value)` returns the given - property from a cross file, the optional second argument is returned - if not cross compiling or the given property is not found. - - `get_compiler(language)` returns [an object describing a compiler](#compiler-object), takes one positional argument which is the language to use. It also accepts one keyword argument, `native` @@ -1786,9 +1782,18 @@ the following methods. returns the "cross" compiler if we're currently cross-compiling and the "native" compiler if we're not. -- `get_native_property(propname, fallback_value)` returns the given - property from a native file, the optional second argument is returned - if the given property is not found. +- `get_cross_property(propname, fallback_value)` + *Consider get_external_property() instead*. Returns the given + property from a cross file, the optional fallback_value is returned + if not cross compiling or the given property is not found. + +- `get_external_property(propname, fallback_value, native: true/false)` + *(added 0.53.0)* returns the given property from a native or cross file. + The optional fallback_value is returned if the given property is not found. + The optional `native: true` forces retrieving a variable from the + native file, even when cross-compiling. + If `native: false` or not specified, variable is retrieved from the + cross-file if cross-compiling, and from the native-file when not cross-compiling. - `has_exe_wrapper()` returns true when doing a cross build if there is a wrapper command that can be used to execute cross built diff --git a/docs/markdown/snippets/native_property.md b/docs/markdown/snippets/native_property.md index 6c49e80..3845fa1 100644 --- a/docs/markdown/snippets/native_property.md +++ b/docs/markdown/snippets/native_property.md @@ -1,6 +1,6 @@ ## Native file properties -As of Meson 0.53.0, the `--native-file foo.txt` can contain: +As of Meson 0.53.0, the `--native-file nativefile.ini` can contain: * binaries * paths @@ -10,7 +10,9 @@ which are defined and used the same way as in cross files. The `properties` are new for Meson 0.53.0, and are read like: ```meson -x = meson.get_native_property('foobar', 'foo') +x = meson.get_external_property('foobar', 'foo') ``` -where `foobar` is the property name, and the optional `foo` is the fallback string value.
\ No newline at end of file +where `foobar` is the property name, and the optional `foo` is the fallback string value. + +For cross-compiled projects, `get_external_property()` reads the cross-file unless `native: true` is specified.
\ No newline at end of file diff --git a/mesonbuild/interpreter.py b/mesonbuild/interpreter.py index 5e58b0e..df23b87 100644 --- a/mesonbuild/interpreter.py +++ b/mesonbuild/interpreter.py @@ -35,8 +35,11 @@ from .modules import ModuleReturnValue from .cmake import CMakeInterpreter from pathlib import Path, PurePath -import os, shutil, uuid -import re, shlex +import os +import shutil +import uuid +import re +import shlex import subprocess import collections from itertools import chain @@ -1845,7 +1848,7 @@ class MesonMain(InterpreterObject): 'version': self.version_method, 'project_name': self.project_name_method, 'get_cross_property': self.get_cross_property_method, - 'get_native_property': self.get_native_property_method, + 'get_external_property': self.get_external_property_method, 'backend': self.backend_method, }) @@ -2018,7 +2021,7 @@ class MesonMain(InterpreterObject): @noArgsFlattening @permittedKwargs({}) - def get_cross_property_method(self, args, kwargs): + def get_cross_property_method(self, args, kwargs) -> str: if len(args) < 1 or len(args) > 2: raise InterpreterException('Must have one or two arguments.') propname = args[0] @@ -2033,21 +2036,33 @@ class MesonMain(InterpreterObject): raise InterpreterException('Unknown cross property: %s.' % propname) @noArgsFlattening - @permittedKwargs({}) - def get_native_property_method(self, args, kwargs): + @permittedKwargs({'native'}) + @FeatureNew('meson.get_external_property', '0.53.0') + def get_external_property_method(self, args: Sequence[str], kwargs: dict) -> str: if len(args) < 1 or len(args) > 2: - raise InterpreterException('Must have one or two arguments.') + raise InterpreterException('Must have one or two positional arguments.') propname = args[0] if not isinstance(propname, str): raise InterpreterException('Property name must be string.') - try: - props = self.interpreter.environment.properties.build - return props[propname] - except Exception: - if len(args) == 2: - return args[1] - raise InterpreterException('Unknown native property: %s.' % propname) + def _get_native() -> str: + try: + props = self.interpreter.environment.properties.build + return props[propname] + except Exception: + if len(args) == 2: + return args[1] + raise InterpreterException('Unknown native property: %s.' % propname) + if 'native' in kwargs: + if kwargs['native']: + return _get_native() + else: + return self.get_cross_property_method(args, {}) + else: # native: not specified + if self.build.environment.is_cross_build(): + return self.get_cross_property_method(args, kwargs) + else: + return _get_native() known_library_kwargs = ( build.known_shlib_kwargs | diff --git a/test cases/common/192 args flattening/meson.build b/test cases/common/192 args flattening/meson.build index 42eb6d5..1dac2f9 100644 --- a/test cases/common/192 args flattening/meson.build +++ b/test cases/common/192 args flattening/meson.build @@ -16,8 +16,14 @@ assert(arr == ['bar', 'baz'], 'configuration_data.get with array fallback is bro arr = meson.get_cross_property('does-not-exist', ['bar', 'baz']) assert(arr == ['bar', 'baz'], 'meson.get_cross_property with array fallback is broken') -arr = meson.get_native_property('does-not-exist', ['bar', 'baz']) -assert(arr == ['bar', 'baz'], 'meson.get_native_property with array fallback is broken') +arr = meson.get_external_property('does-not-exist', ['bar', 'baz']) +assert(arr == ['bar', 'baz'], 'meson.get_external_property with array fallback is broken') + +arr = meson.get_external_property('does-not-exist', ['bar', 'baz'], native: true) +assert(arr == ['bar', 'baz'], 'meson.get_external_property native:true with array fallback is broken') + +arr = meson.get_external_property('does-not-exist', ['bar', 'baz'], native: false) +assert(arr == ['bar', 'baz'], 'meson.get_external_property native:false with array fallback is broken') # Test deprecated behaviour diff --git a/test cases/common/228 native prop/meson.build b/test cases/common/228 native prop/meson.build deleted file mode 100644 index 5cffcad..0000000 --- a/test cases/common/228 native prop/meson.build +++ /dev/null @@ -1,10 +0,0 @@ -project('get native prop') - -x = meson.get_native_property('astring') -assert(x=='mystring', 'did not get native property string. did you use "meson setup --native-file native.txt"') - -x = meson.get_native_property('notexist', 'fallback') -assert(x=='fallback', 'fallback did not work') - -x = meson.get_native_property('anarray') -assert(x==['one', 'two'], 'array did not work')
\ No newline at end of file diff --git a/test cases/common/229 native prop/meson.build b/test cases/common/229 native prop/meson.build new file mode 100644 index 0000000..f752bcc --- /dev/null +++ b/test cases/common/229 native prop/meson.build @@ -0,0 +1,24 @@ +project('get prop') + +x = meson.get_external_property('astring') +assert(x=='mystring', 'did not get native property string. did you use "meson setup --native-file native.txt"') + +x = meson.get_external_property('astring', native: true) +assert(x=='mystring', 'did not get native property with native:true and non-cross build.') + +x = meson.get_external_property('astring', 'fallback', native: false) +assert(x=='mystring', 'did not get get native property with native:false and non-cross build.') + + +x = meson.get_external_property('notexist', 'fallback') +assert(x=='fallback', 'fallback did not work') + +x = meson.get_external_property('notexist', 'fallback', native: true) +assert(x=='fallback', 'fallback native:true did not work') + +x = meson.get_external_property('notexist', 'fallback', native: false) +assert(x=='fallback', 'fallback native:false did not work') + + +x = meson.get_external_property('anarray') +assert(x==['one', 'two'], 'array did not work')
\ No newline at end of file diff --git a/test cases/common/228 native prop/nativefile.ini b/test cases/common/229 native prop/nativefile.ini index 03c1e03..03c1e03 100644 --- a/test cases/common/228 native prop/nativefile.ini +++ b/test cases/common/229 native prop/nativefile.ini diff --git a/test cases/failing/97 no native prop/meson.build b/test cases/failing/97 no native prop/meson.build deleted file mode 100644 index 2b7b46e..0000000 --- a/test cases/failing/97 no native prop/meson.build +++ /dev/null @@ -1,3 +0,0 @@ -project('missing native property') - -message(meson.get_native_property('nonexisting')) diff --git a/test cases/failing/99 no native prop/meson.build b/test cases/failing/99 no native prop/meson.build new file mode 100644 index 0000000..c956754 --- /dev/null +++ b/test cases/failing/99 no native prop/meson.build @@ -0,0 +1,3 @@ +project('missing property') + +message(meson.get_external_property('nonexisting')) |