summaryrefslogtreecommitdiff
path: root/mesonbuild/modules
diff options
context:
space:
mode:
Diffstat (limited to 'mesonbuild/modules')
-rw-r--r--mesonbuild/modules/__init__.py7
-rw-r--r--mesonbuild/modules/_qt.py36
-rw-r--r--mesonbuild/modules/dlang.py7
-rw-r--r--mesonbuild/modules/gnome.py22
-rw-r--r--mesonbuild/modules/i18n.py2
-rw-r--r--mesonbuild/modules/icestorm.py2
-rw-r--r--mesonbuild/modules/python.py6
-rw-r--r--mesonbuild/modules/rust.py14
-rw-r--r--mesonbuild/modules/wayland.py5
9 files changed, 47 insertions, 54 deletions
diff --git a/mesonbuild/modules/__init__.py b/mesonbuild/modules/__init__.py
index 5f088e9ed..87892e6d7 100644
--- a/mesonbuild/modules/__init__.py
+++ b/mesonbuild/modules/__init__.py
@@ -18,6 +18,7 @@ if T.TYPE_CHECKING:
from ..interpreter import Interpreter
from ..interpreter.interpreter import ProgramVersionFunc
from ..interpreterbase import TYPE_var, TYPE_kwargs
+ from ..programs import OverrideProgram
from ..dependencies import Dependency
from ..options import ElementaryOptionValues
@@ -74,14 +75,14 @@ class ModuleState:
required: bool = True,
version_func: T.Optional[ProgramVersionFunc] = None,
wanted: T.Union[str, T.List[str]] = '', silent: bool = False,
- for_machine: MachineChoice = MachineChoice.HOST) -> T.Union[ExternalProgram, build.LocalProgram]:
+ for_machine: MachineChoice = MachineChoice.HOST) -> T.Union[ExternalProgram, build.OverrideExecutable, OverrideProgram]:
if not isinstance(prog, list):
prog = [prog]
return self._interpreter.find_program_impl(prog, required=required, version_func=version_func,
wanted=wanted, silent=silent, for_machine=for_machine)
def find_tool(self, name: str, depname: str, varname: str, required: bool = True,
- wanted: T.Optional[str] = None) -> T.Union[ExternalProgram, build.LocalProgram]:
+ wanted: T.Optional[str] = None) -> T.Union[build.OverrideExecutable, ExternalProgram, 'OverrideProgram']:
# Look in overrides in case it's built as subproject
progobj = self._interpreter.program_from_overrides([name], [])
if progobj is not None:
@@ -117,7 +118,7 @@ class ModuleState:
# implementations of meson functions anyway.
return self._interpreter.func_dependency(self.current_node, [depname], kwargs) # type: ignore
- def test(self, args: T.Tuple[str, T.Union[build.Executable, build.Jar, ExternalProgram, build.LocalProgram, mesonlib.File]],
+ def test(self, args: T.Tuple[str, T.Union[build.Executable, build.Jar, 'ExternalProgram', mesonlib.File]],
workdir: T.Optional[str] = None,
env: T.Union[T.List[str], T.Dict[str, str], str] = None,
depends: T.List[T.Union[build.CustomTarget, build.BuildTarget]] = None) -> None:
diff --git a/mesonbuild/modules/_qt.py b/mesonbuild/modules/_qt.py
index 0f6d2ecb2..675c174a7 100644
--- a/mesonbuild/modules/_qt.py
+++ b/mesonbuild/modules/_qt.py
@@ -208,7 +208,7 @@ class QtBaseModule(ExtensionModule):
self.qt_version = qt_version
# It is important that this list does not change order as the order of
# the returned ExternalPrograms will change as well
- self.tools: T.Dict[str, T.Union[ExternalProgram, build.LocalProgram]] = {
+ self.tools: T.Dict[str, T.Union[ExternalProgram, build.Executable]] = {
tool: NonExistingExternalProgram(tool) for tool in self._set_of_qt_tools
}
self.methods.update({
@@ -250,7 +250,7 @@ class QtBaseModule(ExtensionModule):
arg = ['-v']
# Ensure that the version of qt and each tool are the same
- def get_version(p: T.Union[ExternalProgram, build.LocalProgram]) -> str:
+ def get_version(p: T.Union[ExternalProgram, build.Executable]) -> str:
_, out, err = Popen_safe(p.get_command() + arg)
if name == 'lrelease' or not qt_dep.version.startswith('4'):
care = out
@@ -445,17 +445,12 @@ class QtBaseModule(ExtensionModule):
for s in sources:
qrc_deps.extend(self._parse_qrc_deps(state, s))
- cmd: T.List[T.Union[ExternalProgram, build.LocalProgram, str]]
- cmd = [self.tools['rcc'], '-name', name, '-o', '@OUTPUT@']
- cmd.extend(extra_args)
- cmd.append('@INPUT@')
- cmd.extend(DEPFILE_ARGS)
res_target = build.CustomTarget(
name,
state.subdir,
state.subproject,
state.environment,
- cmd,
+ self.tools['rcc'].get_command() + ['-name', name, '-o', '@OUTPUT@'] + extra_args + ['@INPUT@'] + DEPFILE_ARGS,
sources,
[f'{name}.cpp'],
depend_files=qrc_deps,
@@ -471,16 +466,12 @@ class QtBaseModule(ExtensionModule):
else:
basename = os.path.basename(rcc_file.fname)
name = f'qt{self.qt_version}-{basename.replace(".", "_")}'
- cmd = [self.tools['rcc'], '-name', '@BASENAME@', '-o', '@OUTPUT@']
- cmd.extend(extra_args)
- cmd.append('@INPUT@')
- cmd.extend(DEPFILE_ARGS)
res_target = build.CustomTarget(
name,
state.subdir,
state.subproject,
state.environment,
- cmd,
+ self.tools['rcc'].get_command() + ['-name', '@BASENAME@', '-o', '@OUTPUT@'] + extra_args + ['@INPUT@'] + DEPFILE_ARGS,
[rcc_file],
[f'{name}.cpp'],
depend_files=qrc_deps,
@@ -733,7 +724,7 @@ class QtBaseModule(ExtensionModule):
ts = os.path.basename(ts)
else:
outdir = state.subdir
- cmd: T.List[T.Union[ExternalProgram, build.LocalProgram, str]] = [self.tools['lrelease'], '@INPUT@', '-qm', '@OUTPUT@']
+ cmd: T.List[T.Union[ExternalProgram, build.Executable, str]] = [self.tools['lrelease'], '@INPUT@', '-qm', '@OUTPUT@']
lrelease_target = build.CustomTarget(
f'qt{self.qt_version}-compile-{ts}',
outdir,
@@ -873,15 +864,12 @@ class QtBaseModule(ExtensionModule):
input_args.append(f'@INPUT{input_counter}@')
input_counter += 1
- cmd: T.List[T.Union[ExternalProgram, build.LocalProgram, str]]
- cmd = [self.tools['moc'], '--collect-json', '-o', '@OUTPUT@']
- cmd.extend(input_args)
return build.CustomTarget(
f'moc_collect_json_{target_name}',
state.subdir,
state.subproject,
state.environment,
- cmd,
+ self.tools['moc'].get_command() + ['--collect-json', '-o', '@OUTPUT@'] + input_args,
moc_json,
[f'{target_name}_json_collect.json'],
description=f'Collecting json type information for {target_name}',
@@ -920,17 +908,12 @@ class QtBaseModule(ExtensionModule):
ressource_path = os.path.join('/', kwargs['module_prefix'], source_basename)
cachegen_inputs.append(ressource_path)
- cmd: T.List[T.Union[ExternalProgram, build.LocalProgram, str]]
- cmd = [self.tools['qmlcachegen'], '-o', '@OUTPUT@', '--resource-name', f'qmlcache_{target_name}']
- cmd.extend(kwargs['extra_args'])
- cmd.append('--resource=@INPUT@')
- cmd.extend(cachegen_inputs)
cacheloader_target = build.CustomTarget(
f'cacheloader_{target_name}',
state.subdir,
state.subproject,
state.environment,
- cmd,
+ self.tools['qmlcachegen'].get_command() + ['-o', '@OUTPUT@'] + ['--resource-name', f'qmlcache_{target_name}'] + kwargs['extra_args'] + ['--resource=@INPUT@'] + cachegen_inputs,
[kwargs['qml_qrc']],
#output name format matters here
[f'{target_name}_qmlcache_loader.cpp'],
@@ -958,12 +941,11 @@ class QtBaseModule(ExtensionModule):
install_dir: T.List[T.Union[str, Literal[False]]] = [False]
install_tag: T.List[T.Union[str, None]] = [None]
- cmd = [
- self.tools['qmltyperegistrar'],
+ cmd = self.tools['qmltyperegistrar'].get_command() + [
'--import-name', import_name,
'--major-version', major_version,
'--minor-version', minor_version,
- '-o', '@OUTPUT0@'
+ '-o', '@OUTPUT0@',
]
cmd.extend(kwargs['extra_args'])
diff --git a/mesonbuild/modules/dlang.py b/mesonbuild/modules/dlang.py
index 860a62481..35ce86be8 100644
--- a/mesonbuild/modules/dlang.py
+++ b/mesonbuild/modules/dlang.py
@@ -12,7 +12,7 @@ import typing as T
from . import ExtensionModule, ModuleInfo
from .. import mlog
-from ..build import InvalidArguments, LocalProgram
+from ..build import InvalidArguments
from ..dependencies import Dependency
from ..dependencies.dub import DubDependency
from ..interpreterbase import typed_pos_args
@@ -22,11 +22,12 @@ if T.TYPE_CHECKING:
from typing_extensions import Literal, TypeAlias
from . import ModuleState
+ from ..build import OverrideExecutable
from ..interpreter.interpreter import Interpreter
from ..interpreterbase.baseobjects import TYPE_kwargs
- from ..programs import ExternalProgram
+ from ..programs import ExternalProgram, OverrideProgram
- _AnyProgram: TypeAlias = T.Union[ExternalProgram, LocalProgram]
+ _AnyProgram: TypeAlias = T.Union[OverrideExecutable, ExternalProgram, OverrideProgram]
_JSONTypes: TypeAlias = T.Union[str, int, bool, None, T.List['_JSONTypes'], T.Dict[str, '_JSONTypes']]
diff --git a/mesonbuild/modules/gnome.py b/mesonbuild/modules/gnome.py
index 6219e4ce0..9e525601e 100644
--- a/mesonbuild/modules/gnome.py
+++ b/mesonbuild/modules/gnome.py
@@ -22,7 +22,7 @@ from .. import build
from .. import interpreter
from .. import mesonlib
from .. import mlog
-from ..build import CustomTarget, CustomTargetIndex, Executable, GeneratedList, InvalidArguments, LocalProgram
+from ..build import CustomTarget, CustomTargetIndex, Executable, GeneratedList, InvalidArguments
from ..dependencies import Dependency, InternalDependency
from ..dependencies.pkgconfig import PkgConfigDependency, PkgConfigInterface
from ..interpreter.type_checking import DEPENDS_KW, DEPEND_FILES_KW, ENV_KW, INSTALL_DIR_KW, INSTALL_KW, NoneType, DEPENDENCY_SOURCES_KW, in_set_validator
@@ -33,6 +33,7 @@ from ..mesonlib import (
MachineChoice, MesonException, OrderedSet, Popen_safe, join_args, quote_arg
)
from ..options import OptionKey
+from ..programs import OverrideProgram
from ..scripts.gettext import read_linguas
if T.TYPE_CHECKING:
@@ -197,7 +198,7 @@ if T.TYPE_CHECKING:
vtail: T.Optional[str]
depends: T.List[T.Union[BuildTarget, CustomTarget, CustomTargetIndex]]
- ToolType: TypeAlias = T.Union[ExternalProgram, LocalProgram]
+ ToolType: TypeAlias = T.Union[Executable, ExternalProgram, OverrideProgram]
# Differs from the CustomTarget version in that it straight defaults to True
@@ -788,7 +789,8 @@ class GnomeModule(ExtensionModule):
if self.devenv is not None:
b.devenv.append(self.devenv)
- def _get_gir_dep(self, state: 'ModuleState') -> T.Tuple[Dependency, ToolType, ToolType]:
+ def _get_gir_dep(self, state: 'ModuleState') -> T.Tuple[Dependency, T.Union[Executable, 'ExternalProgram', 'OverrideProgram'],
+ T.Union[Executable, 'ExternalProgram', 'OverrideProgram']]:
if not self.gir_dep:
self.gir_dep = state.dependency('gobject-introspection-1.0')
self.giscanner = self._find_tool(state, 'g-ir-scanner')
@@ -808,7 +810,7 @@ class GnomeModule(ExtensionModule):
@functools.lru_cache(maxsize=None)
def _gir_has_option(self, option: str) -> bool:
exe = self.giscanner
- if isinstance(exe, LocalProgram):
+ if isinstance(exe, (Executable, OverrideProgram)):
# Handle overridden g-ir-scanner
assert option in {'--extra-library', '--sources-top-dirs'}
return True
@@ -969,7 +971,7 @@ class GnomeModule(ExtensionModule):
self,
state: 'ModuleState',
girfile: str,
- scan_command: T.Sequence[T.Union['FileOrString', Executable, ToolType]],
+ scan_command: T.Sequence[T.Union['FileOrString', Executable, ExternalProgram, OverrideProgram]],
generated_files: T.Sequence[T.Union[str, mesonlib.File, build.GeneratedTypes]],
depends: T.Sequence[T.Union['FileOrString', build.BuildTarget, 'build.GeneratedTypes', build.StructuredSources]],
env_flags: T.Sequence[str],
@@ -1018,7 +1020,7 @@ class GnomeModule(ExtensionModule):
@staticmethod
def _make_typelib_target(state: 'ModuleState', typelib_output: str,
- typelib_cmd: T.Sequence[T.Union[str, CustomTarget, ToolType]],
+ typelib_cmd: T.Sequence[T.Union[str, Executable, ExternalProgram, CustomTarget]],
generated_files: T.Sequence[T.Union[str, mesonlib.File, build.GeneratedTypes]],
kwargs: T.Dict[str, T.Any]) -> TypelibTarget:
install = kwargs['install_typelib']
@@ -1192,7 +1194,7 @@ class GnomeModule(ExtensionModule):
gir_inc_dirs: T.List[str] = []
- scan_command: T.List[T.Union[str, ToolType, Executable]] = [giscanner]
+ scan_command: T.List[T.Union[str, Executable, 'ExternalProgram', 'OverrideProgram']] = [giscanner]
scan_command += ['--quiet']
scan_command += ['--no-libtool']
scan_command += ['--namespace=' + ns, '--nsversion=' + nsversion]
@@ -1345,7 +1347,7 @@ class GnomeModule(ExtensionModule):
pot_file = os.path.join('@SOURCE_ROOT@', state.subdir, 'C', project_id + '.pot')
pot_sources = [os.path.join('@SOURCE_ROOT@', state.subdir, 'C', s) for s in sources]
- pot_args: T.List[T.Union[ToolType, str]] = [itstool, '-o', pot_file]
+ pot_args: T.List[T.Union[ExternalProgram, Executable, OverrideProgram, str]] = [itstool, '-o', pot_file]
pot_args.extend(pot_sources)
pottarget = build.RunTarget(f'help-{project_id}-pot', pot_args, [],
os.path.join(state.subdir, 'C'), state.subproject,
@@ -1377,7 +1379,7 @@ class GnomeModule(ExtensionModule):
targets.append(l_data)
po_file = l + '.po'
- po_args: T.List[T.Union[ToolType, str]] = [
+ po_args: T.List[T.Union[ExternalProgram, Executable, OverrideProgram, str]] = [
msgmerge, '-q', '-o',
os.path.join('@SOURCE_ROOT@', l_subdir, po_file),
os.path.join('@SOURCE_ROOT@', l_subdir, po_file), pot_file]
@@ -2240,7 +2242,7 @@ class GnomeModule(ExtensionModule):
build_dir = os.path.join(state.environment.get_build_dir(), state.subdir)
source_dir = os.path.join(state.environment.get_source_dir(), state.subdir)
pkg_cmd, vapi_depends, vapi_packages, vapi_includes, packages = self._extract_vapi_packages(state, kwargs['packages'])
- cmd: T.List[T.Union[ToolType, str]]
+ cmd: T.List[T.Union[ExternalProgram, Executable, OverrideProgram, str]]
cmd = [state.find_program('vapigen'), '--quiet', f'--library={library}', f'--directory={build_dir}']
cmd.extend([f'--vapidir={d}' for d in kwargs['vapi_dirs']])
cmd.extend([f'--metadatadir={d}' for d in kwargs['metadata_dirs']])
diff --git a/mesonbuild/modules/i18n.py b/mesonbuild/modules/i18n.py
index 06e891714..2d8d04d3e 100644
--- a/mesonbuild/modules/i18n.py
+++ b/mesonbuild/modules/i18n.py
@@ -259,7 +259,7 @@ class I18nModule(ExtensionModule):
'itstool_join': self.itstool_join,
'xgettext': self.xgettext,
})
- self.tools: T.Dict[str, T.Optional[T.Union[ExternalProgram, build.LocalProgram]]] = {
+ self.tools: T.Dict[str, T.Optional[T.Union[ExternalProgram, build.Executable]]] = {
'itstool': None,
'msgfmt': None,
'msginit': None,
diff --git a/mesonbuild/modules/icestorm.py b/mesonbuild/modules/icestorm.py
index 86af78d8b..18bf0e202 100644
--- a/mesonbuild/modules/icestorm.py
+++ b/mesonbuild/modules/icestorm.py
@@ -29,7 +29,7 @@ class IceStormModule(ExtensionModule):
def __init__(self, interpreter: Interpreter) -> None:
super().__init__(interpreter)
- self.tools: T.Dict[str, T.Union[ExternalProgram, build.LocalProgram]] = {}
+ self.tools: T.Dict[str, T.Union[ExternalProgram, build.Executable]] = {}
self.methods.update({
'project': self.project,
})
diff --git a/mesonbuild/modules/python.py b/mesonbuild/modules/python.py
index c637e5f5e..6f5a63a0b 100644
--- a/mesonbuild/modules/python.py
+++ b/mesonbuild/modules/python.py
@@ -15,7 +15,7 @@ from ..dependencies import NotFoundDependency
from ..dependencies.detect import get_dep_identifier, find_external_dependency
from ..dependencies.python import BasicPythonExternalProgram, python_factory, _PythonDependencyBase
from ..interpreter import extract_required_kwarg, permitted_dependency_kwargs, primitives as P_OBJ
-from ..interpreter.interpreterobjects import BaseProgramHolder
+from ..interpreter.interpreterobjects import _ExternalProgramHolder
from ..interpreter.type_checking import NoneType, DEPENDENCY_KWS, PRESERVE_PATH_KW, SHARED_MOD_KWS
from ..interpreterbase import (
noPosargs, noKwargs, permittedKwargs, ContainerTypeInfo,
@@ -109,9 +109,9 @@ _SUBDIR_KW = KwargInfo('subdir', str, default='')
_LIMITED_API_KW = KwargInfo('limited_api', str, default='', since='1.3.0')
_DEFAULTABLE_SUBDIR_KW = KwargInfo('subdir', (str, NoneType))
-class PythonInstallation(BaseProgramHolder['PythonExternalProgram']):
+class PythonInstallation(_ExternalProgramHolder['PythonExternalProgram']):
def __init__(self, python: 'PythonExternalProgram', interpreter: 'Interpreter'):
- BaseProgramHolder.__init__(self, python, interpreter)
+ _ExternalProgramHolder.__init__(self, python, interpreter)
info = python.info
prefix = self.interpreter.environment.coredata.optstore.get_value_for(OptionKey('prefix'))
assert isinstance(prefix, str), 'for mypy'
diff --git a/mesonbuild/modules/rust.py b/mesonbuild/modules/rust.py
index 73094f571..89c20230b 100644
--- a/mesonbuild/modules/rust.py
+++ b/mesonbuild/modules/rust.py
@@ -13,7 +13,7 @@ from mesonbuild.interpreterbase.decorators import FeatureNew
from . import ExtensionModule, ModuleReturnValue, ModuleInfo
from .. import mesonlib, mlog
from ..build import (BothLibraries, BuildTarget, CustomTargetIndex, Executable, ExtractedObjects, GeneratedList,
- CustomTarget, InvalidArguments, Jar, LocalProgram, StructuredSources, SharedLibrary, StaticLibrary)
+ CustomTarget, InvalidArguments, Jar, StructuredSources, SharedLibrary, StaticLibrary)
from ..compilers.compilers import are_asserts_disabled_for_subproject, lang_suffixes
from ..interpreter.type_checking import (
DEPENDENCIES_KW, LINK_WITH_KW, LINK_WHOLE_KW, SHARED_LIB_KWS, TEST_KWS, TEST_KWS_NO_ARGS,
@@ -33,6 +33,7 @@ if T.TYPE_CHECKING:
from ..interpreter import kwargs as _kwargs
from ..interpreter.interpreter import SourceInputs, SourceOutputs
from ..interpreter.interpreterobjects import Test
+ from ..programs import OverrideProgram
from ..interpreter.type_checking import SourcesVarargsType
from typing_extensions import TypedDict, Literal
@@ -90,7 +91,7 @@ class RustModule(ExtensionModule):
def __init__(self, interpreter: Interpreter) -> None:
super().__init__(interpreter)
- self._bindgen_bin: T.Optional[T.Union[ExternalProgram, LocalProgram]] = None
+ self._bindgen_bin: T.Optional[T.Union[ExternalProgram, Executable, OverrideProgram]] = None
if 'rust' in interpreter.compilers.host:
rustc = T.cast('RustCompiler', interpreter.compilers.host['rust'])
self._bindgen_rust_target = 'nightly' if rustc.is_nightly else rustc.version
@@ -374,7 +375,10 @@ class RustModule(ExtensionModule):
if self._bindgen_bin is None:
self._bindgen_bin = state.find_program('bindgen', wanted=kwargs['bindgen_version'])
if self._bindgen_rust_target is not None:
- _, _, err = mesonlib.Popen_safe(self._bindgen_bin.get_command() + ['--rust-target', self._bindgen_rust_target])
+ # ExternalCommand.command's type is bonkers
+ _, _, err = mesonlib.Popen_safe(
+ T.cast('T.List[str]', self._bindgen_bin.get_command()) +
+ ['--rust-target', self._bindgen_rust_target])
# < 0.71: Sometimes this is "invalid Rust target" and
# sometimes "invalid # rust target"
# >= 0.71: error: invalid value '...' for '--rust-target <RUST_TARGET>': "..." is not a valid Rust target, accepted values are of the form ...
@@ -382,7 +386,9 @@ class RustModule(ExtensionModule):
if 'Got an invalid' in err or 'is not a valid Rust target' in err:
self._bindgen_rust_target = None
- self._bindgen_set_std = mesonlib.version_compare(self._bindgen_bin.get_version(), '>= 0.71')
+ # TODO: Executable needs to learn about get_version
+ if isinstance(self._bindgen_bin, ExternalProgram):
+ self._bindgen_set_std = mesonlib.version_compare(self._bindgen_bin.get_version(), '>= 0.71')
name: str
if isinstance(header, File):
diff --git a/mesonbuild/modules/wayland.py b/mesonbuild/modules/wayland.py
index 675a6d974..94c6f819d 100644
--- a/mesonbuild/modules/wayland.py
+++ b/mesonbuild/modules/wayland.py
@@ -6,7 +6,7 @@ import os
import typing as T
from . import ExtensionModule, ModuleReturnValue, ModuleInfo
-from ..build import CustomTarget, LocalProgram
+from ..build import CustomTarget
from ..interpreter.type_checking import NoneType, in_set_validator
from ..interpreterbase import typed_pos_args, typed_kwargs, KwargInfo, FeatureNew
from ..mesonlib import File, MesonException
@@ -15,6 +15,7 @@ if T.TYPE_CHECKING:
from typing_extensions import Literal, TypedDict
from . import ModuleState
+ from ..build import Executable
from ..dependencies import Dependency
from ..interpreter import Interpreter
from ..programs import ExternalProgram
@@ -41,7 +42,7 @@ class WaylandModule(ExtensionModule):
self.protocols_dep: T.Optional[Dependency] = None
self.pkgdatadir: T.Optional[str] = None
- self.scanner_bin: T.Optional[T.Union[ExternalProgram, LocalProgram]] = None
+ self.scanner_bin: T.Optional[T.Union[ExternalProgram, Executable]] = None
self.methods.update({
'scan_xml': self.scan_xml,