aboutsummaryrefslogtreecommitdiff
path: root/mesonbuild/modules
diff options
context:
space:
mode:
Diffstat (limited to 'mesonbuild/modules')
-rw-r--r--mesonbuild/modules/__init__.py4
-rw-r--r--mesonbuild/modules/cmake.py5
-rw-r--r--mesonbuild/modules/gnome.py81
-rw-r--r--mesonbuild/modules/hotdoc.py7
-rw-r--r--mesonbuild/modules/pkgconfig.py24
-rw-r--r--mesonbuild/modules/python.py25
-rw-r--r--mesonbuild/modules/rust.py4
7 files changed, 114 insertions, 36 deletions
diff --git a/mesonbuild/modules/__init__.py b/mesonbuild/modules/__init__.py
index 67d1666..87892e6 100644
--- a/mesonbuild/modules/__init__.py
+++ b/mesonbuild/modules/__init__.py
@@ -75,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.Executable, OverrideProgram]:
+ 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['build.Executable', ExternalProgram, 'OverrideProgram']:
+ 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:
diff --git a/mesonbuild/modules/cmake.py b/mesonbuild/modules/cmake.py
index e3154b0..f12cc51 100644
--- a/mesonbuild/modules/cmake.py
+++ b/mesonbuild/modules/cmake.py
@@ -154,10 +154,11 @@ class CMakeSubproject(ModuleObject):
@noKwargs
@typed_pos_args('cmake.subproject.include_directories', str)
- def include_directories(self, state: ModuleState, args: T.Tuple[str], kwargs: TYPE_kwargs) -> build.IncludeDirs:
+ def include_directories(self, state: ModuleState, args: T.Tuple[str], kwargs: TYPE_kwargs) -> T.List[build.IncludeDirs]:
info = self._args_to_info(args[0])
inc = self.get_variable(state, [info['inc']], kwargs)
- assert isinstance(inc, build.IncludeDirs), 'for mypy'
+ assert isinstance(inc, list), 'for mypy'
+ assert isinstance(inc[0], build.IncludeDirs), 'for mypy'
return inc
@noKwargs
diff --git a/mesonbuild/modules/gnome.py b/mesonbuild/modules/gnome.py
index 6764133..9f955ae 100644
--- a/mesonbuild/modules/gnome.py
+++ b/mesonbuild/modules/gnome.py
@@ -137,6 +137,8 @@ if T.TYPE_CHECKING:
install_header: bool
install_dir: T.Optional[str]
docbook: T.Optional[str]
+ rst: T.Optional[str]
+ markdown: T.Optional[str]
autocleanup: Literal['all', 'none', 'objects', 'default']
class GenMarshal(TypedDict):
@@ -957,8 +959,8 @@ class GnomeModule(ExtensionModule):
return gir_filelist_filename
- @staticmethod
def _make_gir_target(
+ self,
state: 'ModuleState',
girfile: str,
scan_command: T.Sequence[T.Union['FileOrString', Executable, ExternalProgram, OverrideProgram]],
@@ -988,6 +990,11 @@ class GnomeModule(ExtensionModule):
run_env.set('CFLAGS', [quote_arg(x) for x in env_flags], ' ')
run_env.merge(kwargs['env'])
+ gir_dep, _, _ = self._get_gir_dep(state)
+
+ # response file supported?
+ rspable = mesonlib.version_compare(gir_dep.get_version(), '>= 1.85.0')
+
return GirTarget(
girfile,
state.subdir,
@@ -1002,6 +1009,7 @@ class GnomeModule(ExtensionModule):
install_dir=[install_dir],
install_tag=['devel'],
env=run_env,
+ rspable=rspable,
)
@staticmethod
@@ -1168,13 +1176,13 @@ class GnomeModule(ExtensionModule):
scan_cflags += list(self._get_scanner_cflags(self._get_external_args_for_langs(state, [lc[0] for lc in langs_compilers])))
scan_internal_ldflags = []
scan_external_ldflags = []
- scan_env_ldflags = []
+ scan_env_ldflags = state.environment.coredata.get_external_link_args(MachineChoice.HOST, 'c')
for cli_flags, env_flags in (self._get_scanner_ldflags(internal_ldflags), self._get_scanner_ldflags(dep_internal_ldflags)):
scan_internal_ldflags += cli_flags
- scan_env_ldflags = env_flags
+ scan_env_ldflags += env_flags
for cli_flags, env_flags in (self._get_scanner_ldflags(external_ldflags), self._get_scanner_ldflags(dep_external_ldflags)):
scan_external_ldflags += cli_flags
- scan_env_ldflags = env_flags
+ scan_env_ldflags += env_flags
girtargets_inc_dirs = self._get_gir_targets_inc_dirs(girtargets)
inc_dirs = kwargs['include_directories']
@@ -1619,6 +1627,8 @@ class GnomeModule(ExtensionModule):
),
KwargInfo('install_header', bool, default=False, since='0.46.0'),
KwargInfo('docbook', (str, NoneType)),
+ KwargInfo('rst', (str, NoneType), since='1.9.0'),
+ KwargInfo('markdown', (str, NoneType), since='1.9.0'),
KwargInfo(
'autocleanup', str, default='default', since='0.47.0',
validator=in_set_validator({'all', 'none', 'objects'})),
@@ -1675,6 +1685,26 @@ class GnomeModule(ExtensionModule):
cmd += ['--generate-docbook', docbook]
+ if kwargs['rst'] is not None:
+ if not mesonlib.version_compare(glib_version, '>= 2.71.1'):
+ mlog.error(f'Glib version ({glib_version}) is too old to '
+ 'support the \'rst\' kwarg, need 2.71.1 or '
+ 'newer')
+
+ rst = kwargs['rst']
+
+ cmd += ['--generate-rst', rst]
+
+ if kwargs['markdown'] is not None:
+ if not mesonlib.version_compare(glib_version, '>= 2.75.2'):
+ mlog.error(f'Glib version ({glib_version}) is too old to '
+ 'support the \'markdown\' kwarg, need 2.75.2 '
+ 'or newer')
+
+ markdown = kwargs['markdown']
+
+ cmd += ['--generate-md', markdown]
+
# https://git.gnome.org/browse/glib/commit/?id=ee09bb704fe9ccb24d92dd86696a0e6bb8f0dc1a
if mesonlib.version_compare(glib_version, '>= 2.51.3'):
cmd += ['--output-directory', '@OUTDIR@', '--generate-c-code', namebase, '@INPUT@']
@@ -1750,6 +1780,48 @@ class GnomeModule(ExtensionModule):
)
targets.append(docbook_custom_target)
+ if kwargs['rst'] is not None:
+ rst = kwargs['rst']
+ # The rst output is always ${rst}-${name_of_xml_file}
+ output = namebase + '-rst'
+ outputs = []
+ for f in xml_files:
+ outputs.append('{}-{}'.format(rst, os.path.basename(str(f))))
+
+ rst_custom_target = CustomTarget(
+ output,
+ state.subdir,
+ state.subproject,
+ state.environment,
+ cmd + ['--output-directory', '@OUTDIR@', '--generate-rst', rst, '@INPUT@'],
+ xml_files,
+ outputs,
+ build_by_default=build_by_default,
+ description='Generating gdbus reStructuredText {}',
+ )
+ targets.append(rst_custom_target)
+
+ if kwargs['markdown'] is not None:
+ markdown = kwargs['markdown']
+ # The markdown output is always ${markdown}-${name_of_xml_file}
+ output = namebase + '-markdown'
+ outputs = []
+ for f in xml_files:
+ outputs.append('{}-{}'.format(markdown, os.path.basename(str(f))))
+
+ markdown_custom_target = CustomTarget(
+ output,
+ state.subdir,
+ state.subproject,
+ state.environment,
+ cmd + ['--output-directory', '@OUTDIR@', '--generate-md', markdown, '@INPUT@'],
+ xml_files,
+ outputs,
+ build_by_default=build_by_default,
+ description='Generating gdbus markdown {}',
+ )
+ targets.append(markdown_custom_target)
+
return ModuleReturnValue(targets, targets)
@typed_pos_args('gnome.mkenums', str)
@@ -1991,6 +2063,7 @@ class GnomeModule(ExtensionModule):
extra_depends=depends,
# https://github.com/mesonbuild/meson/issues/973
absolute_paths=True,
+ rspable=mesonlib.is_windows() or mesonlib.is_cygwin(),
description='Generating GObject enum file {}',
)
diff --git a/mesonbuild/modules/hotdoc.py b/mesonbuild/modules/hotdoc.py
index 5099b41..b66a0bf 100644
--- a/mesonbuild/modules/hotdoc.py
+++ b/mesonbuild/modules/hotdoc.py
@@ -14,7 +14,7 @@ from ..build import CustomTarget, CustomTargetIndex
from ..dependencies import Dependency, InternalDependency
from ..interpreterbase import (
InvalidArguments, noPosargs, noKwargs, typed_kwargs, FeatureDeprecated,
- ContainerTypeInfo, KwargInfo, typed_pos_args
+ ContainerTypeInfo, KwargInfo, typed_pos_args, InterpreterObject
)
from ..interpreter.interpreterobjects import _CustomTargetHolder
from ..interpreter.type_checking import NoneType
@@ -383,12 +383,9 @@ class HotdocTargetBuilder:
class HotdocTargetHolder(_CustomTargetHolder['HotdocTarget']):
- def __init__(self, target: HotdocTarget, interp: Interpreter):
- super().__init__(target, interp)
- self.methods.update({'config_path': self.config_path_method})
-
@noPosargs
@noKwargs
+ @InterpreterObject.method('config_path')
def config_path_method(self, *args: T.Any, **kwargs: T.Any) -> str:
conf = self.held_object.hotdoc_conf.absolute_path(self.interpreter.environment.source_dir,
self.interpreter.environment.build_dir)
diff --git a/mesonbuild/modules/pkgconfig.py b/mesonbuild/modules/pkgconfig.py
index cc0450a..e3f7a97 100644
--- a/mesonbuild/modules/pkgconfig.py
+++ b/mesonbuild/modules/pkgconfig.py
@@ -38,6 +38,7 @@ if T.TYPE_CHECKING:
filebase: T.Optional[str]
description: T.Optional[str]
url: str
+ license: str
subdirs: T.List[str]
conflicts: T.List[str]
dataonly: bool
@@ -441,6 +442,7 @@ class PkgConfigModule(NewExtensionModule):
def _generate_pkgconfig_file(self, state: ModuleState, deps: DependenciesHelper,
subdirs: T.List[str], name: str,
description: str, url: str, version: str,
+ license: str,
pcfile: str, conflicts: T.List[str],
variables: T.List[T.Tuple[str, str]],
unescaped_variables: T.List[T.Tuple[str, str]],
@@ -519,18 +521,20 @@ class PkgConfigModule(NewExtensionModule):
ofile.write(f'{k}={v}\n')
ofile.write('\n')
ofile.write(f'Name: {name}\n')
- if len(description) > 0:
+ if description:
ofile.write(f'Description: {description}\n')
- if len(url) > 0:
+ if url:
ofile.write(f'URL: {url}\n')
+ if license:
+ ofile.write(f'License: {license}\n')
ofile.write(f'Version: {version}\n')
reqs_str = deps.format_reqs(deps.pub_reqs)
- if len(reqs_str) > 0:
+ if reqs_str:
ofile.write(f'Requires: {reqs_str}\n')
reqs_str = deps.format_reqs(deps.priv_reqs)
- if len(reqs_str) > 0:
+ if reqs_str:
ofile.write(f'Requires.private: {reqs_str}\n')
- if len(conflicts) > 0:
+ if conflicts:
ofile.write('Conflicts: {}\n'.format(' '.join(conflicts)))
def generate_libs_flags(libs: T.List[LIBS]) -> T.Iterable[str]:
@@ -571,9 +575,9 @@ class PkgConfigModule(NewExtensionModule):
if isinstance(l, (build.CustomTarget, build.CustomTargetIndex)) or 'cs' not in l.compilers:
yield f'-l{lname}'
- if len(deps.pub_libs) > 0:
+ if deps.pub_libs:
ofile.write('Libs: {}\n'.format(' '.join(generate_libs_flags(deps.pub_libs))))
- if len(deps.priv_libs) > 0:
+ if deps.priv_libs:
ofile.write('Libs.private: {}\n'.format(' '.join(generate_libs_flags(deps.priv_libs))))
cflags: T.List[str] = []
@@ -605,6 +609,7 @@ class PkgConfigModule(NewExtensionModule):
KwargInfo('name', (str, NoneType), validator=lambda x: 'must not be an empty string' if x == '' else None),
KwargInfo('subdirs', ContainerTypeInfo(list, str), default=[], listify=True),
KwargInfo('url', str, default=''),
+ KwargInfo('license', str, default='', since='1.9.0'),
KwargInfo('version', (str, NoneType)),
VARIABLES_KW.evolve(name="unescaped_uninstalled_variables", since='0.59.0'),
VARIABLES_KW.evolve(name="unescaped_variables", since='0.59.0'),
@@ -659,6 +664,7 @@ class PkgConfigModule(NewExtensionModule):
filebase = kwargs['filebase'] if kwargs['filebase'] is not None else name
description = kwargs['description'] if kwargs['description'] is not None else default_description
url = kwargs['url']
+ license = kwargs['license']
conflicts = kwargs['conflicts']
# Prepend the main library to public libraries list. This is required
@@ -713,7 +719,7 @@ class PkgConfigModule(NewExtensionModule):
pkgroot_name = os.path.join('{libdir}', 'pkgconfig')
relocatable = state.get_option('pkgconfig.relocatable')
self._generate_pkgconfig_file(state, deps, subdirs, name, description, url,
- version, pcfile, conflicts, variables,
+ version, license, pcfile, conflicts, variables,
unescaped_variables, False, dataonly,
pkgroot=pkgroot if relocatable else None)
res = build.Data([mesonlib.File(True, state.environment.get_scratch_dir(), pcfile)], pkgroot, pkgroot_name, None, state.subproject, install_tag='devel')
@@ -722,7 +728,7 @@ class PkgConfigModule(NewExtensionModule):
pcfile = filebase + '-uninstalled.pc'
self._generate_pkgconfig_file(state, deps, subdirs, name, description, url,
- version, pcfile, conflicts, variables,
+ version, license, pcfile, conflicts, variables,
unescaped_variables, uninstalled=True, dataonly=dataonly)
# Associate the main library with this generated pc file. If the library
# is used in any subsequent call to the generated, it will generate a
diff --git a/mesonbuild/modules/python.py b/mesonbuild/modules/python.py
index 2a7e685..8d82a33 100644
--- a/mesonbuild/modules/python.py
+++ b/mesonbuild/modules/python.py
@@ -20,7 +20,7 @@ from ..interpreter.type_checking import NoneType, PRESERVE_PATH_KW, SHARED_MOD_K
from ..interpreterbase import (
noPosargs, noKwargs, permittedKwargs, ContainerTypeInfo,
InvalidArguments, typed_pos_args, typed_kwargs, KwargInfo,
- FeatureNew, FeatureNewKwargs, disablerIfNotFound
+ FeatureNew, FeatureNewKwargs, disablerIfNotFound, InterpreterObject
)
from ..mesonlib import MachineChoice
from ..options import OptionKey
@@ -126,23 +126,11 @@ class PythonInstallation(_ExternalProgramHolder['PythonExternalProgram']):
self.platform = info['platform']
self.is_pypy = info['is_pypy']
self.link_libpython = info['link_libpython']
- self.methods.update({
- 'extension_module': self.extension_module_method,
- 'dependency': self.dependency_method,
- 'install_sources': self.install_sources_method,
- 'get_install_dir': self.get_install_dir_method,
- 'language_version': self.language_version_method,
- 'found': self.found_method,
- 'has_path': self.has_path_method,
- 'get_path': self.get_path_method,
- 'has_variable': self.has_variable_method,
- 'get_variable': self.get_variable_method,
- 'path': self.path_method,
- })
@permittedKwargs(mod_kwargs)
@typed_pos_args('python.extension_module', str, varargs=(str, mesonlib.File, CustomTarget, CustomTargetIndex, GeneratedList, StructuredSources, ExtractedObjects, BuildTarget))
@typed_kwargs('python.extension_module', *_MOD_KWARGS, _DEFAULTABLE_SUBDIR_KW, _LIMITED_API_KW, allow_unknown=True)
+ @InterpreterObject.method('extension_module')
def extension_module_method(self, args: T.Tuple[str, T.List[BuildTargetSource]], kwargs: ExtensionModuleKw) -> 'SharedModule':
if 'install_dir' in kwargs:
if kwargs['subdir'] is not None:
@@ -268,6 +256,7 @@ class PythonInstallation(_ExternalProgramHolder['PythonExternalProgram']):
@permittedKwargs(permitted_dependency_kwargs | {'embed'})
@FeatureNewKwargs('python_installation.dependency', '0.53.0', ['embed'])
@noPosargs
+ @InterpreterObject.method('dependency')
def dependency_method(self, args: T.List['TYPE_var'], kwargs: 'TYPE_kwargs') -> 'Dependency':
disabled, required, feature = extract_required_kwarg(kwargs, self.subproject)
if disabled:
@@ -287,6 +276,7 @@ class PythonInstallation(_ExternalProgramHolder['PythonExternalProgram']):
PRESERVE_PATH_KW,
KwargInfo('install_tag', (str, NoneType), since='0.60.0')
)
+ @InterpreterObject.method('install_sources')
def install_sources_method(self, args: T.Tuple[T.List[T.Union[str, mesonlib.File]]],
kwargs: 'PyInstallKw') -> 'Data':
self.held_object.run_bytecompile[self.version] = True
@@ -301,6 +291,7 @@ class PythonInstallation(_ExternalProgramHolder['PythonExternalProgram']):
@noPosargs
@typed_kwargs('python_installation.install_dir', _PURE_KW, _SUBDIR_KW)
+ @InterpreterObject.method('get_install_dir')
def get_install_dir_method(self, args: T.List['TYPE_var'], kwargs: 'PyInstallKw') -> str:
self.held_object.run_bytecompile[self.version] = True
pure = kwargs['pure'] if kwargs['pure'] is not None else self.pure
@@ -318,16 +309,19 @@ class PythonInstallation(_ExternalProgramHolder['PythonExternalProgram']):
@noPosargs
@noKwargs
+ @InterpreterObject.method('language_version')
def language_version_method(self, args: T.List['TYPE_var'], kwargs: 'TYPE_kwargs') -> str:
return self.version
@typed_pos_args('python_installation.has_path', str)
@noKwargs
+ @InterpreterObject.method('has_path')
def has_path_method(self, args: T.Tuple[str], kwargs: 'TYPE_kwargs') -> bool:
return args[0] in self.paths
@typed_pos_args('python_installation.get_path', str, optargs=[object])
@noKwargs
+ @InterpreterObject.method('get_path')
def get_path_method(self, args: T.Tuple[str, T.Optional['TYPE_var']], kwargs: 'TYPE_kwargs') -> 'TYPE_var':
path_name, fallback = args
try:
@@ -339,11 +333,13 @@ class PythonInstallation(_ExternalProgramHolder['PythonExternalProgram']):
@typed_pos_args('python_installation.has_variable', str)
@noKwargs
+ @InterpreterObject.method('has_variable')
def has_variable_method(self, args: T.Tuple[str], kwargs: 'TYPE_kwargs') -> bool:
return args[0] in self.variables
@typed_pos_args('python_installation.get_variable', str, optargs=[object])
@noKwargs
+ @InterpreterObject.method('get_variable')
def get_variable_method(self, args: T.Tuple[str, T.Optional['TYPE_var']], kwargs: 'TYPE_kwargs') -> 'TYPE_var':
var_name, fallback = args
try:
@@ -356,6 +352,7 @@ class PythonInstallation(_ExternalProgramHolder['PythonExternalProgram']):
@noPosargs
@noKwargs
@FeatureNew('Python module path method', '0.50.0')
+ @InterpreterObject.method('path')
def path_method(self, args: T.List['TYPE_var'], kwargs: 'TYPE_kwargs') -> str:
return super().path_method(args, kwargs)
diff --git a/mesonbuild/modules/rust.py b/mesonbuild/modules/rust.py
index f43a0ed..c5f18e8 100644
--- a/mesonbuild/modules/rust.py
+++ b/mesonbuild/modules/rust.py
@@ -242,6 +242,10 @@ class RustModule(ExtensionModule):
def doctest(self, state: ModuleState, args: T.Tuple[str, T.Union[SharedLibrary, StaticLibrary]], kwargs: FuncDoctest) -> ModuleReturnValue:
name, base_target = args
+ if state.environment.is_cross_build() and state.environment.need_exe_wrapper(base_target.for_machine):
+ mlog.notice('skipping Rust doctests due to cross compilation', once=True)
+ return ModuleReturnValue(None, [])
+
# Link the base target's crate into the tests
kwargs['link_with'].append(base_target)
kwargs['depends'].append(base_target)