diff options
-rw-r--r-- | docs/markdown/Reference-manual.md | 11 | ||||
-rw-r--r-- | docs/markdown/snippets/build-target-found.md | 16 | ||||
-rw-r--r-- | mesonbuild/interpreter/interpreterobjects.py | 25 | ||||
-rw-r--r-- | mesonbuild/interpreterbase/baseobjects.py | 2 | ||||
-rw-r--r-- | test cases/common/182 find override/meson.build | 10 | ||||
-rw-r--r-- | test cases/common/182 find override/otherdir/meson.build | 4 |
6 files changed, 59 insertions, 9 deletions
diff --git a/docs/markdown/Reference-manual.md b/docs/markdown/Reference-manual.md index fec4e74..aedfda1 100644 --- a/docs/markdown/Reference-manual.md +++ b/docs/markdown/Reference-manual.md @@ -2561,6 +2561,12 @@ module](#shared_module). this and will also allow Meson to setup inter-target dependencies correctly. Please file a bug if that doesn't work for you. +- `path()` *(since 0.59.0)* **(deprecated)**: does the exact same + as `full_path()`. **NOTE:** This function is solely kept for compatebility + with [`external program`](#external-program-object) objects. It will be + removed once the, also deprecated, corresponding `path()` function in the + `external program` object is removed. + - `private_dir_include()`: returns a opaque value that works like `include_directories` but points to the private directory of this target, usually only needed if an another target needs to access @@ -2568,6 +2574,11 @@ module](#shared_module). - `name()` *(since 0.54.0)*: returns the target name. +- `found()` *(since 0.59.0)*: Always returns `true`. This function is meant + to make executables objects feature compatible with + [`external program`](#external-program-object) objects. This simplifies + use-cases where an executable is used instead of an external program. + ### `configuration` data object diff --git a/docs/markdown/snippets/build-target-found.md b/docs/markdown/snippets/build-target-found.md new file mode 100644 index 0000000..60c5083 --- /dev/null +++ b/docs/markdown/snippets/build-target-found.md @@ -0,0 +1,16 @@ +## New `build target` methods + +The [`build target` object](Reference-manual.md#build-target-object) now supports +the following two functions, to ensure feature compatebility with +[`external program` objects](Reference-manual.html#external-program-object): + +- `found()`: Always returns `true`. This function is meant + to make executables objects feature compatible with + `external program` objects. This simplifies + use-cases where an executable is used instead of an external program. + +- `path()`: **(deprecated)** does the exact same as `full_path()`. + **NOTE:** This function is solely kept for compatebility + with `external program` objects. It will be + removed once the, also deprecated, corresponding `path()` function in the + `external program` object is removed. diff --git a/mesonbuild/interpreter/interpreterobjects.py b/mesonbuild/interpreter/interpreterobjects.py index 7c4e75e..744f69c 100644 --- a/mesonbuild/interpreter/interpreterobjects.py +++ b/mesonbuild/interpreter/interpreterobjects.py @@ -582,19 +582,14 @@ class ExternalProgramHolder(ObjectHolder[ExternalProgram]): return self._full_path() def _full_path(self) -> str: - exe = self.held_object - # TODO: How is this case even possible? Why can this hold a build.Executable? - if isinstance(exe, build.Executable): - assert self.interpreter.backend is not None - return self.interpreter.backend.get_target_filename_abs(exe) if not self.found(): raise InterpreterException('Unable to get the path of a not-found external program') - path = exe.get_path() + path = self.held_object.get_path() assert path is not None - return exe.get_path() + return path def found(self) -> bool: - return isinstance(self.held_object, build.Executable) or self.held_object.found() + return self.held_object.found() class ExternalLibraryHolder(ObjectHolder[ExternalLibrary]): def __init__(self, el: ExternalLibrary, interpreter: 'Interpreter'): @@ -790,6 +785,8 @@ class BuildTargetHolder(ObjectHolder[_BuildTarget]): 'get_id': self.get_id_method, 'outdir': self.outdir_method, 'full_path': self.full_path_method, + 'path': self.path_method, + 'found': self.found_method, 'private_dir_include': self.private_dir_include_method, }) @@ -810,6 +807,12 @@ class BuildTargetHolder(ObjectHolder[_BuildTarget]): @noPosargs @noKwargs + @FeatureNew('BuildTarget.found', '0.59.0') + def found_method(self, args: T.List[TYPE_var], kwargs: TYPE_kwargs) -> bool: + return True + + @noPosargs + @noKwargs def private_dir_include_method(self, args: T.List[TYPE_var], kwargs: TYPE_kwargs) -> build.IncludeDirs: return build.IncludeDirs('', [], False, [self.interpreter.backend.get_target_private_dir(self._target_object)]) @@ -820,6 +823,12 @@ class BuildTargetHolder(ObjectHolder[_BuildTarget]): @noPosargs @noKwargs + @FeatureDeprecated('BuildTarget.path', '0.55.0', 'Use BuildTarget.full_path instead') + def path_method(self, args: T.List[TYPE_var], kwargs: TYPE_kwargs) -> str: + return self.interpreter.backend.get_target_filename_abs(self._target_object) + + @noPosargs + @noKwargs def outdir_method(self, args: T.List[TYPE_var], kwargs: TYPE_kwargs) -> str: return self.interpreter.backend.get_target_dir(self._target_object) diff --git a/mesonbuild/interpreterbase/baseobjects.py b/mesonbuild/interpreterbase/baseobjects.py index d910e51..d82aad2 100644 --- a/mesonbuild/interpreterbase/baseobjects.py +++ b/mesonbuild/interpreterbase/baseobjects.py @@ -58,7 +58,7 @@ class InterpreterObject: if not getattr(method, 'no-args-flattening', False): args = flatten(args) return method(args, kwargs) - raise InvalidCode('Unknown method "%s" in object.' % method_name) + raise InvalidCode(f'Unknown method "{method_name}" in object {self} of type {type(self).__name__}.') class MesonInterpreterObject(InterpreterObject): ''' All non-elementary objects and non-object-holders should be derived from this ''' diff --git a/test cases/common/182 find override/meson.build b/test cases/common/182 find override/meson.build index b277459..8dcbac7 100644 --- a/test cases/common/182 find override/meson.build +++ b/test cases/common/182 find override/meson.build @@ -1,8 +1,10 @@ project('find program override', 'c') gencodegen = find_program('gencodegen', required : false) +six_prog = find_program('six_meson_exe', required : false) assert(not gencodegen.found(), 'gencodegen is an internal program, should not be found') +assert(not six_prog.found(), 'six_meson_exe is an internal program, should not be found') # Test the check-if-found-else-override workflow if not gencodegen.found() @@ -13,3 +15,11 @@ subdir('otherdir') tool = find_program('sometool') assert(tool.found()) +assert(tool.full_path() != '') +assert(tool.full_path() == tool.path()) + +# six_meson_exe is an overritten project executable +six_prog = find_program('six_meson_exe') +assert(six_prog.found()) +assert(six_prog.full_path() != '') +assert(six_prog.full_path() == six_prog.path()) diff --git a/test cases/common/182 find override/otherdir/meson.build b/test cases/common/182 find override/otherdir/meson.build index 5cefc88..7deff40 100644 --- a/test cases/common/182 find override/otherdir/meson.build +++ b/test cases/common/182 find override/otherdir/meson.build @@ -10,6 +10,10 @@ e = executable('six', 'main.c', src) test('six', e) +# Override stuff with an executables +meson.override_find_program('six_meson_exe', e) + + # The same again, but this time with a program that was generated # with configure_file. |