Skip to content
77 changes: 42 additions & 35 deletions mesonbuild/build.py
Original file line number Diff line number Diff line change
Expand Up @@ -71,6 +71,7 @@ class BuildTargetKeywordArguments(TypedDict, total=False):

build_by_default: bool
build_rpath: str
build_subdir: T.Optional[str]
c_pch: T.Optional[T.Tuple[str, T.Optional[str]]]
cpp_pch: T.Optional[T.Tuple[str, T.Optional[str]]]
d_debug: T.List[T.Union[str, int]]
Expand Down Expand Up @@ -219,7 +220,7 @@ def _process_install_tag(install_tag: T.Optional[T.List[T.Optional[str]]],


@lru_cache(maxsize=None)
def get_target_macos_dylib_install_name(ld) -> str:
def get_target_macos_dylib_install_name(ld: SharedLibrary) -> str:
name = ['@rpath/', ld.prefix, ld.name]
if ld.soversion is not None:
name.append('.' + ld.soversion)
Expand Down Expand Up @@ -353,15 +354,15 @@ def __init__(self, environment: Environment):
self.data: T.List[Data] = []
self.symlinks: T.List[SymlinkData] = []
self.static_linker: PerMachine[StaticLinker] = PerMachine(None, None)
self.subprojects = {}
self.subprojects: T.Dict[SubProject, str] = {}
self.subproject_dir = ''
self.install_scripts: T.List['ExecutableSerialisation'] = []
self.postconf_scripts: T.List['ExecutableSerialisation'] = []
self.dist_scripts: T.List['ExecutableSerialisation'] = []
self.install_dirs: T.List[InstallDir] = []
self.dep_manifest_name: T.Optional[str] = None
self.dep_manifest: T.Dict[str, DepManifest] = {}
self.stdlibs = PerMachine({}, {})
self.stdlibs: PerMachine[T.Dict[str, dependencies.Dependency]] = PerMachine({}, {})
self.test_setups: T.Dict[str, TestSetup] = {}
self.test_setup_default_name = None
self.find_overrides: T.Dict[str, T.Union['OverrideExecutable', programs.ExternalProgram, programs.OverrideProgram]] = {}
Expand All @@ -385,7 +386,7 @@ def def_files(self) -> T.List[str]:
return self._def_files

@def_files.setter
def def_files(self, value: T.List[str]):
def def_files(self, value: T.List[str]) -> None:
if self._def_files is not None:
raise MesonBugException('build.def_files already set')
self._def_files = value
Expand Down Expand Up @@ -421,10 +422,10 @@ def ensure_static_linker(self, compiler: Compiler) -> None:
if self.static_linker[compiler.for_machine] is None and compiler.needs_static_linker():
self.static_linker[compiler.for_machine] = detect_static_linker(self.environment, compiler)

def get_project(self) -> T.Dict[str, str]:
def get_project(self) -> str:
return self.projects['']

def get_subproject_dir(self):
def get_subproject_dir(self) -> str:
return self.subproject_dir

def get_targets(self) -> 'T.OrderedDict[str, T.Union[CustomTarget, BuildTarget]]':
Expand Down Expand Up @@ -740,18 +741,12 @@ def construct_id_from_path(subdir: str, name: str, type_suffix: str) -> str:

@lazy_property
def id(self) -> str:
name = self.name
if getattr(self, 'name_suffix_set', False):
name += '.' + self.suffix
return self.construct_id_from_path(
self.builddir, name, self.type_suffix())
self.builddir, self.name, self.type_suffix())

def get_id(self) -> str:
return self.id

def get_override(self, name: str) -> T.Optional[str]:
return self.raw_overrides.get(name, None)

def is_linkable_target(self) -> bool:
return False

Expand Down Expand Up @@ -800,7 +795,7 @@ def __init__(
self.link_whole_targets: T.List[StaticTargetTypes] = []
self.depend_files: T.List[File] = []
self.link_depends: T.List[T.Union[File, BuildTargetTypes]] = []
self.added_deps = set()
self.added_deps: T.Set[dependencies.Dependency] = set()
self.name_prefix_set = False
self.name_suffix_set = False
self.filename = 'no_name'
Expand Down Expand Up @@ -861,6 +856,14 @@ def __init__(
self.validate_install()
self.check_module_linking()

@lazy_property
def id(self) -> str:
name = self.name
if self.name_suffix_set:
name += '.' + self.suffix
return self.construct_id_from_path(
self.builddir, name, self.type_suffix())

def _set_vala_args(self, kwargs: BuildTargetKeywordArguments) -> None:
if self.uses_vala():
self.vala_header = kwargs.get('vala_header') or self.name + '.h'
Expand Down Expand Up @@ -899,14 +902,14 @@ def post_init(self) -> None:
self.outputs.append(self.vala_gir)
self.install_tag.append('devel')

def __repr__(self):
def __repr__(self) -> str:
repr_str = "<{0} {1}: {2}>"
return repr_str.format(self.__class__.__name__, self.get_id(), self.filename)

def __str__(self):
def __str__(self) -> str:
return f"{self.name}"

def validate_install(self):
def validate_install(self) -> None:
if self.for_machine is MachineChoice.BUILD and self.install:
if self.environment.is_cross_build():
raise InvalidArguments('Tried to install a target for the build machine in a cross build.')
Expand All @@ -928,7 +931,7 @@ def check_unknown_kwargs_int(self, kwargs: BuildTargetKeywordArguments, known_kw
if len(unknowns) > 0:
mlog.warning('Unknown keyword argument(s) in target {}: {}.'.format(self.name, ', '.join(unknowns)))

def process_objectlist(self, objects):
def process_objectlist(self, objects: T.List[ObjectTypes]) -> None:
assert isinstance(objects, list)
deprecated_non_objects = []
for s in objects:
Expand Down Expand Up @@ -1101,18 +1104,19 @@ def process_compilers(self) -> T.List[str]:
# because this object is currently being constructed so it is not
# yet placed in the data store. Grab it directly from override strings
# instead.
value = self.get_override('cython_language')
key = OptionKey('cython_language', machine=self.for_machine)
value = self.get_override(key)
if value is None:
key = OptionKey('cython_language', machine=self.for_machine)
value = self.environment.coredata.optstore.get_value_for(key)
assert isinstance(value, str), 'for mypy'
try:
self.compilers[value] = self.all_compilers[value]
except KeyError:
missing_languages.append(value)

return missing_languages

def validate_sources(self):
def validate_sources(self) -> None:
if len(self.compilers) > 1 and any(lang in self.compilers for lang in ['cs', 'java']):
langs = ', '.join(self.compilers.keys())
raise InvalidArguments(f'Cannot mix those languages into a target: {langs}')
Expand Down Expand Up @@ -1259,6 +1263,9 @@ def get_custom_install_dir(self) -> T.List[T.Union[str, Literal[False]]]:
def get_custom_install_mode(self) -> T.Optional['FileMode']:
return self.install_mode

def get_override(self, name: OptionKey) -> T.Optional[str]:
return self.raw_overrides.get(name, None)

def process_kwargs(self, kwargs: BuildTargetKeywordArguments) -> None:
self.original_kwargs = kwargs

Expand Down Expand Up @@ -1664,7 +1671,7 @@ def get_using_msvc(self) -> bool:
# Mixing many languages with MSVC is not supported yet so ignore stdlibs.
return compiler and compiler.get_linker_id() in {'link', 'lld-link', 'xilink', 'optlink'}

def check_module_linking(self):
def check_module_linking(self) -> None:
'''
Warn if shared modules are linked with target: (link_with) #2865
'''
Expand Down Expand Up @@ -2151,11 +2158,11 @@ def post_init(self) -> None:
def get_default_install_dir(self) -> T.Union[T.Tuple[str, str], T.Tuple[None, None]]:
return self.environment.get_bindir(), '{bindir}'

def description(self):
def description(self) -> str:
'''Human friendly description of the executable'''
return self.name

def type_suffix(self):
def type_suffix(self) -> str:
return "@exe"

def get_import_filename(self) -> T.Optional[str]:
Expand Down Expand Up @@ -2298,7 +2305,7 @@ def get_link_deps_mapping(self, prefix: str) -> T.Mapping[str, str]:
def get_default_install_dir(self) -> T.Union[T.Tuple[str, str], T.Tuple[None, None]]:
return self.environment.get_static_lib_dir(), '{libdir_static}'

def type_suffix(self):
def type_suffix(self) -> str:
return "@rlib" if self.uses_rust_abi() else "@sta"

def is_linkable_target(self) -> bool:
Expand Down Expand Up @@ -2543,7 +2550,7 @@ def determine_naming_info(self) -> T.Tuple[str, str, str, str, bool]:
filename_tpl = '{0.prefix}{0.name}.{0.suffix}'
return (prefix, suffix, filename_tpl, import_filename_tpl, create_debug_file)

def determine_filenames(self):
def determine_filenames(self) -> None:
"""
See https://github.com/mesonbuild/meson/pull/417 for details.

Expand Down Expand Up @@ -2653,7 +2660,7 @@ def get_aliases(self) -> T.List[T.Tuple[str, str, str]]:
aliases.append((self.basic_filename_tpl.format(self), ltversion_filename, tag))
return aliases

def type_suffix(self):
def type_suffix(self) -> str:
return "@sha"

def is_linkable_target(self) -> bool:
Expand Down Expand Up @@ -2926,7 +2933,7 @@ def get_transitive_build_target_deps(self) -> T.Set[T.Union[BuildTarget, 'Custom
bdeps.update(d.get_transitive_build_target_deps())
return bdeps

def get_dependencies(self):
def get_dependencies(self) -> T.List[T.Union[CustomTarget, coredata.BuildTarget]]:
return self.dependencies

def should_install(self) -> bool:
Expand Down Expand Up @@ -2998,7 +3005,7 @@ def get_link_deps_mapping(self, prefix: str) -> T.Mapping[str, str]:
def get_link_dep_subdirs(self) -> T.AbstractSet[str]:
return OrderedSet()

def get_all_link_deps(self):
def get_all_link_deps(self) -> ImmutableListProtocol[BuildTargetTypes]:
return []

def is_internal(self) -> bool:
Expand All @@ -3012,7 +3019,7 @@ def is_internal(self) -> bool:
def extract_all_objects(self) -> T.List[T.Union[str, 'ExtractedObjects']]:
return self.get_outputs()

def type_suffix(self):
def type_suffix(self) -> str:
return "@cus"

def __getitem__(self, index: int) -> 'CustomTargetIndex':
Expand Down Expand Up @@ -3149,7 +3156,7 @@ def __init__(self, name: str, dependencies: T.Sequence[Target],
subdir: str, subproject: str, environment: Environment):
super().__init__(name, [], dependencies, subdir, subproject, environment)

def __repr__(self):
def __repr__(self) -> str:
repr_str = "<{0} {1}>"
return repr_str.format(self.__class__.__name__, self.get_id())

Expand Down Expand Up @@ -3185,17 +3192,17 @@ def get_main_class(self) -> str:
def type_suffix(self) -> str:
return "@jar"

def get_java_args(self):
def get_java_args(self) -> T.List[str]:
return self.java_args

def get_java_resources(self) -> T.Optional[StructuredSources]:
return self.java_resources

def validate_install(self):
def validate_install(self) -> None:
# All jar targets are installable.
pass

def is_linkable_target(self):
def is_linkable_target(self) -> bool:
return True

def get_classpath_args(self) -> T.List[str]:
Expand Down Expand Up @@ -3258,7 +3265,7 @@ def get_filename(self) -> str:
def get_id(self) -> str:
return self.target.get_id()

def get_all_link_deps(self):
def get_all_link_deps(self) -> ImmutableListProtocol[BuildTargetTypes]:
return self.target.get_all_link_deps()

def get_link_deps_mapping(self, prefix: str) -> T.Mapping[str, str]:
Expand Down
2 changes: 1 addition & 1 deletion mesonbuild/coredata.py
Original file line number Diff line number Diff line change
Expand Up @@ -354,7 +354,7 @@ def get_option_for_target(self, target: 'BuildTarget', key: T.Union[str, OptionK
if self.is_cross_build():
newkey = newkey.evolve(machine=target.for_machine)
option_object, value = self.optstore.get_option_and_value_for(newkey)
override = target.get_override(newkey.name)
override = target.get_override(newkey)
if override is not None:
return option_object.validate_value(override)
return value
Expand Down
20 changes: 10 additions & 10 deletions mesonbuild/interpreter/interpreter.py
Original file line number Diff line number Diff line change
Expand Up @@ -1825,7 +1825,7 @@ def _exe_to_shlib_kwargs(self, kwargs: kwtypes.Executable) -> kwtypes.SharedLibr

@permittedKwargs(build.known_exe_kwargs)
@typed_pos_args('executable', str, varargs=SOURCES_VARARGS)
@typed_kwargs('executable', *EXECUTABLE_KWS, allow_unknown=True)
@typed_kwargs('executable', *EXECUTABLE_KWS)
def func_executable(self, node: mparser.BaseNode,
args: T.Tuple[str, SourcesVarargsType],
kwargs: kwtypes.Executable) -> T.Union[build.Executable, build.SharedLibrary]:
Expand All @@ -1839,15 +1839,15 @@ def func_executable(self, node: mparser.BaseNode,

@permittedKwargs(build.known_stlib_kwargs)
@typed_pos_args('static_library', str, varargs=SOURCES_VARARGS)
@typed_kwargs('static_library', *STATIC_LIB_KWS, allow_unknown=True)
@typed_kwargs('static_library', *STATIC_LIB_KWS)
def func_static_lib(self, node: mparser.BaseNode,
args: T.Tuple[str, SourcesVarargsType],
kwargs: kwtypes.StaticLibrary) -> build.StaticLibrary:
return self.build_target(node, args, kwargs, build.StaticLibrary)

@permittedKwargs(build.known_shlib_kwargs)
@typed_pos_args('shared_library', str, varargs=SOURCES_VARARGS)
@typed_kwargs('shared_library', *SHARED_LIB_KWS, allow_unknown=True)
@typed_kwargs('shared_library', *SHARED_LIB_KWS)
def func_shared_lib(self, node: mparser.BaseNode,
args: T.Tuple[str, SourcesVarargsType],
kwargs: kwtypes.SharedLibrary) -> build.SharedLibrary:
Expand All @@ -1857,7 +1857,7 @@ def func_shared_lib(self, node: mparser.BaseNode,

@permittedKwargs(known_library_kwargs)
@typed_pos_args('both_libraries', str, varargs=SOURCES_VARARGS)
@typed_kwargs('both_libraries', *LIBRARY_KWS, allow_unknown=True)
@typed_kwargs('both_libraries', *LIBRARY_KWS)
@noSecondLevelHolderResolving
def func_both_lib(self, node: mparser.BaseNode,
args: T.Tuple[str, SourcesVarargsType],
Expand All @@ -1867,15 +1867,15 @@ def func_both_lib(self, node: mparser.BaseNode,
@FeatureNew('shared_module', '0.37.0')
@permittedKwargs(build.known_shmod_kwargs)
@typed_pos_args('shared_module', str, varargs=SOURCES_VARARGS)
@typed_kwargs('shared_module', *SHARED_MOD_KWS, allow_unknown=True)
@typed_kwargs('shared_module', *SHARED_MOD_KWS)
def func_shared_module(self, node: mparser.BaseNode,
args: T.Tuple[str, SourcesVarargsType],
kwargs: kwtypes.SharedModule) -> build.SharedModule:
return self.build_target(node, args, kwargs, build.SharedModule)

@permittedKwargs(known_library_kwargs)
@typed_pos_args('library', str, varargs=SOURCES_VARARGS)
@typed_kwargs('library', *LIBRARY_KWS, allow_unknown=True)
@typed_kwargs('library', *LIBRARY_KWS)
@noSecondLevelHolderResolving
def func_library(self, node: mparser.BaseNode,
args: T.Tuple[str, SourcesVarargsType],
Expand All @@ -1884,7 +1884,7 @@ def func_library(self, node: mparser.BaseNode,

@permittedKwargs(build.known_jar_kwargs)
@typed_pos_args('jar', str, varargs=(str, mesonlib.File, build.CustomTarget, build.CustomTargetIndex, build.GeneratedList, build.ExtractedObjects, build.BuildTarget))
@typed_kwargs('jar', *JAR_KWS, allow_unknown=True)
@typed_kwargs('jar', *JAR_KWS)
def func_jar(self, node: mparser.BaseNode,
args: T.Tuple[str, T.List[T.Union[str, mesonlib.File, build.GeneratedTypes]]],
kwargs: kwtypes.Jar) -> build.Jar:
Expand All @@ -1893,7 +1893,7 @@ def func_jar(self, node: mparser.BaseNode,
@FeatureNewKwargs('build_target', '0.40.0', ['link_whole', 'override_options'])
@permittedKwargs(known_build_target_kwargs)
@typed_pos_args('build_target', str, varargs=SOURCES_VARARGS)
@typed_kwargs('build_target', *BUILD_TARGET_KWS, allow_unknown=True)
@typed_kwargs('build_target', *BUILD_TARGET_KWS)
def func_build_target(self, node: mparser.BaseNode,
args: T.Tuple[str, SourcesVarargsType],
kwargs: kwtypes.BuildTarget
Expand Down Expand Up @@ -3398,11 +3398,11 @@ def build_target(self, node: mparser.BaseNode, args: T.Tuple[str, SourcesVarargs

@T.overload
def build_target(self, node: mparser.BaseNode, args: T.Tuple[str, SourcesVarargsType],
kwargs: kwtypes.SharedLibrary, targetclass: T.Type[build.SharedLibrary]) -> build.SharedLibrary: ...
kwargs: kwtypes.SharedModule, targetclass: T.Type[build.SharedModule]) -> build.SharedModule: ...

@T.overload
def build_target(self, node: mparser.BaseNode, args: T.Tuple[str, SourcesVarargsType],
kwargs: kwtypes.SharedModule, targetclass: T.Type[build.SharedModule]) -> build.SharedModule: ...
kwargs: kwtypes.SharedLibrary, targetclass: T.Type[build.SharedLibrary]) -> build.SharedLibrary: ...

@T.overload
def build_target(self, node: mparser.BaseNode, args: T.Tuple[str, SourcesVarargsType],
Expand Down
1 change: 1 addition & 0 deletions mesonbuild/interpreter/kwargs.py
Original file line number Diff line number Diff line change
Expand Up @@ -376,6 +376,7 @@ class _BuildTarget(_BaseBuildTarget):
swift_interoperability_mode: Literal['c', 'cpp']
swift_module_name: str
sources: SourcesVarargsType
link_args: T.List[str]
c_pch: T.List[str]
cpp_pch: T.List[str]
c_args: T.List[str]
Expand Down
Loading
Loading