diff options
Diffstat (limited to 'mesonbuild/modules/python.py')
-rw-r--r-- | mesonbuild/modules/python.py | 25 |
1 files changed, 15 insertions, 10 deletions
diff --git a/mesonbuild/modules/python.py b/mesonbuild/modules/python.py index 09be102..077505e 100644 --- a/mesonbuild/modules/python.py +++ b/mesonbuild/modules/python.py @@ -12,6 +12,7 @@ # See the License for the specific language governing permissions and # limitations under the License. +from os import name from pathlib import Path import os import json @@ -27,7 +28,7 @@ from ..environment import detect_cpu_family from ..interpreter import ExternalProgramHolder, extract_required_kwarg, permitted_dependency_kwargs from ..interpreterbase import ( noPosargs, noKwargs, permittedKwargs, - InvalidArguments, + InvalidArguments, typed_pos_args, FeatureNew, FeatureNewKwargs, disablerIfNotFound ) from ..mesonlib import MachineChoice, MesonException @@ -525,7 +526,8 @@ class PythonModule(ExtensionModule): @FeatureNewKwargs('python.find_installation', '0.51.0', ['modules']) @disablerIfNotFound @permittedKwargs({'required', 'modules'}) - def find_installation(self, state: 'ModuleState', args: T.List['TYPE_var'], + @typed_pos_args('python.find_installation', optargs=[str]) + def find_installation(self, state: 'ModuleState', args: T.Tuple[T.Optional[str]], kwargs: 'TYPE_kwargs') -> ExternalProgram: feature_check = FeatureNew('Passing "feature" option to find_installation', '0.48.0') disabled, required, feature = extract_required_kwarg(kwargs, state.subproject, feature_check) @@ -533,14 +535,17 @@ class PythonModule(ExtensionModule): found_modules: T.List[str] = [] missing_modules: T.List[str] = [] - if len(args) > 1: - raise InvalidArguments('find_installation takes zero or one positional argument.') - - name_or_path = state.environment.lookup_binary_entry(MachineChoice.HOST, 'python') - if name_or_path is None and args: - name_or_path = args[0] - if not isinstance(name_or_path, str): - raise InvalidArguments('find_installation argument must be a string.') + # FIXME: this code is *full* of sharp corners. It assumes that it's + # going to get a string value (or now a list of lenght 1), of `python2` + # or `python3` which is completely nonsense. On windows the value could + # easily be `['py', '-3']`, or `['py', '-3.7']` to get a very specific + # version of python. On Linux we might want a python that's not in + # $PATH, or that uses a wrapper of some kind. + np: T.List[str] = state.environment.lookup_binary_entry(MachineChoice.HOST, 'python') or [] + fallback = args[0] + if not np and fallback is not None: + np = [fallback] + name_or_path = np[0] if np else None if disabled: mlog.log('Program', name_or_path or 'python', 'found:', mlog.red('NO'), '(disabled by:', mlog.bold(feature), ')') |