summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEli Schwartz <eschwartz93@gmail.com>2024-07-29 01:51:20 -0400
committerEli Schwartz <eschwartz93@gmail.com>2024-07-30 14:13:11 -0400
commit433c13c5c4e72e5d04d6955b790c548bf7e2ad24 (patch)
tree257ec2ee177204d1c71e9d1f9f56fa2e8b22bfb4
parent2daf5f7c9d825e9c130be9bf4c6234edf30859d9 (diff)
downloadmeson-433c13c5c4e72e5d04d6955b790c548bf7e2ad24.tar.gz
various low-hanging typing fruit
ninjabackend.py goes down from 322 type errors to 253, mainly by marking functions as returning None.
-rw-r--r--mesonbuild/backend/ninjabackend.py112
1 files changed, 57 insertions, 55 deletions
diff --git a/mesonbuild/backend/ninjabackend.py b/mesonbuild/backend/ninjabackend.py
index 65f6ea195..b43b8bbe4 100644
--- a/mesonbuild/backend/ninjabackend.py
+++ b/mesonbuild/backend/ninjabackend.py
@@ -45,6 +45,7 @@ if T.TYPE_CHECKING:
from ..linkers.linkers import DynamicLinker, StaticLinker
from ..compilers.cs import CsCompiler
from ..compilers.fortran import FortranCompiler
+ from ..mesonlib import FileOrString
CommandArgOrStr = T.List[T.Union['NinjaCommandArg', str]]
RUST_EDITIONS = Literal['2015', '2018', '2021']
@@ -333,7 +334,7 @@ class NinjaBuildElement:
else:
self.deps.add(dep)
- def add_orderdep(self, dep):
+ def add_orderdep(self, dep) -> None:
if isinstance(dep, list):
self.orderdeps.update(dep)
else:
@@ -351,7 +352,7 @@ class NinjaBuildElement:
if name == 'DEPFILE':
self.elems.append((name + '_UNQUOTED', elems))
- def _should_use_rspfile(self):
+ def _should_use_rspfile(self) -> bool:
# 'phony' is a rule built-in to ninja
if self.rulename == 'phony':
return False
@@ -366,14 +367,14 @@ class NinjaBuildElement:
outfilenames,
self.elems) >= rsp_threshold
- def count_rule_references(self):
+ def count_rule_references(self) -> None:
if self.rulename != 'phony':
if self._should_use_rspfile():
self.rule.rsprefcount += 1
else:
self.rule.refcount += 1
- def write(self, outfile):
+ def write(self, outfile: T.TextIO) -> None:
if self.output_errors:
raise MesonException(self.output_errors)
ins = ' '.join([ninja_quote(i, True) for i in self.infilenames])
@@ -432,7 +433,7 @@ class NinjaBuildElement:
outfile.write(line)
outfile.write('\n')
- def check_outputs(self):
+ def check_outputs(self) -> None:
for n in self.outfilenames:
if n in self.all_outputs:
self.output_errors = f'Multiple producers for Ninja target "{n}". Please rename your targets.'
@@ -713,7 +714,7 @@ class NinjaBackend(backends.Backend):
f, indent=4)
# http://clang.llvm.org/docs/JSONCompilationDatabase.html
- def generate_compdb(self):
+ def generate_compdb(self) -> None:
rules = []
# TODO: Rather than an explicit list here, rules could be marked in the
# rule store as being wanted in compdb
@@ -735,10 +736,10 @@ class NinjaBackend(backends.Backend):
# Get all generated headers. Any source file might need them so
# we need to add an order dependency to them.
- def get_generated_headers(self, target):
+ def get_generated_headers(self, target: build.BuildTarget) -> T.List[FileOrString]:
if hasattr(target, 'cached_generated_headers'):
return target.cached_generated_headers
- header_deps = []
+ header_deps: T.List[FileOrString] = []
# XXX: Why don't we add deps to CustomTarget headers here?
for genlist in target.get_generated_sources():
if isinstance(genlist, (build.CustomTarget, build.CustomTargetIndex)):
@@ -798,7 +799,7 @@ class NinjaBackend(backends.Backend):
return True
def create_target_source_introspection(self, target: build.Target, comp: compilers.Compiler, parameters, sources, generated_sources,
- unity_sources: T.Optional[T.List[mesonlib.FileOrString]] = None):
+ unity_sources: T.Optional[T.List[FileOrString]] = None) -> None:
'''
Adds the source file introspection information for a language of a target
@@ -837,7 +838,7 @@ class NinjaBackend(backends.Backend):
}
tgt[id_hash] = src_block
- def compute_path(file: mesonlib.FileOrString) -> str:
+ def compute_path(file: FileOrString) -> str:
""" Make source files absolute """
if isinstance(file, File):
return file.absolute_path(self.source_dir, self.build_dir)
@@ -848,7 +849,7 @@ class NinjaBackend(backends.Backend):
if unity_sources:
src_block['unity_sources'].extend(compute_path(x) for x in unity_sources)
- def create_target_linker_introspection(self, target: build.Target, linker: T.Union[Compiler, StaticLinker], parameters):
+ def create_target_linker_introspection(self, target: build.Target, linker: T.Union[Compiler, StaticLinker], parameters) -> None:
tid = target.get_id()
tgt = self.introspection_data[tid]
lnk_hash = tuple(parameters)
@@ -868,7 +869,7 @@ class NinjaBackend(backends.Backend):
}
tgt[lnk_hash] = lnk_block
- def generate_target(self, target):
+ def generate_target(self, target) -> None:
if isinstance(target, build.BuildTarget):
os.makedirs(self.get_target_private_dir_abs(target), exist_ok=True)
if isinstance(target, build.CustomTarget):
@@ -1108,7 +1109,7 @@ class NinjaBackend(backends.Backend):
compiled_sources: T.List[str],
source2object: T.Dict[str, str],
generated_source_files: T.List[mesonlib.File],
- object_deps: T.List['mesonlib.FileOrString']) -> None:
+ object_deps: T.List[FileOrString]) -> None:
if not self.should_use_dyndeps_for_target(target):
return
self._uses_dyndeps = True
@@ -1152,12 +1153,12 @@ class NinjaBackend(backends.Backend):
elif ext.lower() in compilers.lang_suffixes['fortran']:
yield source, 'fortran'
- def process_target_dependencies(self, target):
+ def process_target_dependencies(self, target) -> None:
for t in target.get_dependencies():
if t.get_id() not in self.processed_targets:
self.generate_target(t)
- def custom_target_generator_inputs(self, target):
+ def custom_target_generator_inputs(self, target) -> None:
for s in target.sources:
if isinstance(s, build.GeneratedList):
self.generate_genlist_for_target(s, target)
@@ -1173,7 +1174,7 @@ class NinjaBackend(backends.Backend):
deps.append(os.path.join(self.get_target_dir(i), output))
return deps
- def generate_custom_target(self, target: build.CustomTarget):
+ def generate_custom_target(self, target: build.CustomTarget) -> None:
self.custom_target_generator_inputs(target)
(srcs, ofilenames, cmd) = self.eval_custom_target_command(target)
deps = self.unwrap_dep_list(target)
@@ -1215,14 +1216,14 @@ class NinjaBackend(backends.Backend):
self.add_build(elem)
self.processed_targets.add(target.get_id())
- def build_run_target_name(self, target):
+ def build_run_target_name(self, target) -> str:
if target.subproject != '':
subproject_prefix = f'{target.subproject}@@'
else:
subproject_prefix = ''
return f'{subproject_prefix}{target.name}'
- def generate_run_target(self, target: build.RunTarget):
+ def generate_run_target(self, target: build.RunTarget) -> None:
target_name = self.build_run_target_name(target)
if not target.command:
# This is an alias target, it has no command, it just depends on
@@ -1245,7 +1246,8 @@ class NinjaBackend(backends.Backend):
self.add_build(elem)
self.processed_targets.add(target.get_id())
- def generate_coverage_command(self, elem: NinjaBuildElement, outputs: T.List[str], gcovr_exe: T.Optional[str], llvm_cov_exe: T.Optional[str]):
+ def generate_coverage_command(self, elem: NinjaBuildElement, outputs: T.List[str],
+ gcovr_exe: T.Optional[str], llvm_cov_exe: T.Optional[str]) -> None:
targets = self.build.get_targets().values()
use_llvm_cov = False
exe_args = []
@@ -1272,14 +1274,14 @@ class NinjaBackend(backends.Backend):
exe_args +
(['--use-llvm-cov'] if use_llvm_cov else []))
- def generate_coverage_rules(self, gcovr_exe: T.Optional[str], gcovr_version: T.Optional[str], llvm_cov_exe: T.Optional[str]):
+ def generate_coverage_rules(self, gcovr_exe: T.Optional[str], gcovr_version: T.Optional[str], llvm_cov_exe: T.Optional[str]) -> None:
e = self.create_phony_target('coverage', 'CUSTOM_COMMAND', 'PHONY')
self.generate_coverage_command(e, [], gcovr_exe, llvm_cov_exe)
e.add_item('description', 'Generates coverage reports')
self.add_build(e)
self.generate_coverage_legacy_rules(gcovr_exe, gcovr_version, llvm_cov_exe)
- def generate_coverage_legacy_rules(self, gcovr_exe: T.Optional[str], gcovr_version: T.Optional[str], llvm_cov_exe: T.Optional[str]):
+ def generate_coverage_legacy_rules(self, gcovr_exe: T.Optional[str], gcovr_version: T.Optional[str], llvm_cov_exe: T.Optional[str]) -> None:
e = self.create_phony_target('coverage-html', 'CUSTOM_COMMAND', 'PHONY')
self.generate_coverage_command(e, ['--html'], gcovr_exe, llvm_cov_exe)
e.add_item('description', 'Generates HTML coverage report')
@@ -1302,7 +1304,7 @@ class NinjaBackend(backends.Backend):
e.add_item('description', 'Generates Sonarqube XML coverage report')
self.add_build(e)
- def generate_install(self):
+ def generate_install(self) -> None:
self.create_install_data_files()
elem = self.create_phony_target('install', 'CUSTOM_COMMAND', 'PHONY')
elem.add_dep('all')
@@ -1311,7 +1313,7 @@ class NinjaBackend(backends.Backend):
elem.add_item('pool', 'console')
self.add_build(elem)
- def generate_tests(self):
+ def generate_tests(self) -> None:
self.serialize_tests()
cmd = self.environment.get_build_command(True) + ['test', '--no-rebuild']
if not self.environment.coredata.get_option(OptionKey('stdsplit')):
@@ -1334,7 +1336,7 @@ class NinjaBackend(backends.Backend):
elem.add_item('pool', 'console')
self.add_build(elem)
- def generate_rules(self):
+ def generate_rules(self) -> None:
self.rules = []
self.ruledict = {}
@@ -1409,7 +1411,7 @@ class NinjaBackend(backends.Backend):
elem = NinjaBuildElement(self.all_outputs, 'PHONY', 'phony', '')
self.add_build(elem)
- def generate_jar_target(self, target: build.Jar):
+ def generate_jar_target(self, target: build.Jar) -> None:
fname = target.get_filename()
outname_rel = os.path.join(self.get_target_dir(target), fname)
src_list = target.get_sources()
@@ -1463,7 +1465,7 @@ class NinjaBackend(backends.Backend):
# Create introspection information
self.create_target_source_introspection(target, compiler, compile_args, src_list, gen_src_list)
- def generate_cs_resource_tasks(self, target):
+ def generate_cs_resource_tasks(self, target) -> T.Tuple[T.List[str], T.List[str]]:
args = []
deps = []
for r in target.resources:
@@ -1484,7 +1486,7 @@ class NinjaBackend(backends.Backend):
args.append(a)
return args, deps
- def generate_cs_target(self, target: build.BuildTarget):
+ def generate_cs_target(self, target: build.BuildTarget) -> None:
fname = target.get_filename()
outname_rel = os.path.join(self.get_target_dir(target), fname)
src_list = target.get_sources()
@@ -1529,7 +1531,7 @@ class NinjaBackend(backends.Backend):
self.generate_generator_list_rules(target)
self.create_target_source_introspection(target, compiler, commands, rel_srcs, generated_rel_srcs)
- def determine_java_compile_args(self, target, compiler):
+ def determine_java_compile_args(self, target, compiler) -> T.List[str]:
args = []
args = self.generate_basic_compiler_args(target, compiler)
args += target.get_java_args()
@@ -1569,13 +1571,13 @@ class NinjaBackend(backends.Backend):
self.add_build(element)
return plain_class_paths
- def generate_java_link(self):
+ def generate_java_link(self) -> None:
rule = 'java_LINKER'
command = ['jar', '$ARGS']
description = 'Creating JAR $out'
self.add_rule(NinjaRule(rule, command, [], description))
- def determine_dep_vapis(self, target):
+ def determine_dep_vapis(self, target) -> T.List[str]:
"""
Peek into the sources of BuildTargets we're linking with, and if any of
them was built with Vala, assume that it also generated a .vapi file of
@@ -1838,7 +1840,7 @@ class NinjaBackend(backends.Backend):
return static_sources, generated_sources, cython_sources
- def _generate_copy_target(self, src: 'mesonlib.FileOrString', output: Path) -> None:
+ def _generate_copy_target(self, src: FileOrString, output: Path) -> None:
"""Create a target to copy a source file from one location to another."""
if isinstance(src, File):
instr = src.absolute_path(self.environment.source_dir, self.environment.build_dir)
@@ -2191,7 +2193,7 @@ class NinjaBackend(backends.Backend):
others.append(i)
return srcs, others
- def generate_swift_target(self, target):
+ def generate_swift_target(self, target) -> None:
module_name = self.target_swift_modulename(target)
swiftc = target.compilers['swift']
abssrc = []
@@ -2296,7 +2298,7 @@ class NinjaBackend(backends.Backend):
options['rspfile_quote_style'] = tool.rsp_file_syntax()
return options
- def generate_static_link_rules(self):
+ def generate_static_link_rules(self) -> None:
num_pools = self.environment.coredata.optstore.get_value('backend_max_links')
if 'java' in self.environment.coredata.compilers.host:
self.generate_java_link()
@@ -2344,7 +2346,7 @@ class NinjaBackend(backends.Backend):
options = self._rsp_options(static_linker)
self.add_rule(NinjaRule(rule, cmdlist, args, description, **options, extra=pool))
- def generate_dynamic_link_rules(self):
+ def generate_dynamic_link_rules(self) -> None:
num_pools = self.environment.coredata.optstore.get_value('backend_max_links')
for for_machine in MachineChoice:
complist = self.environment.coredata.compilers[for_machine]
@@ -2383,7 +2385,7 @@ class NinjaBackend(backends.Backend):
synstat = 'restat = 1'
self.add_rule(NinjaRule(symrule, symcmd, [], syndesc, extra=synstat))
- def generate_java_compile_rule(self, compiler):
+ def generate_java_compile_rule(self, compiler) -> None:
rule = self.compiler_to_rule_name(compiler)
command = compiler.get_exelist() + ['$ARGS', '$in']
description = 'Compiling Java sources for $FOR_JAR'
@@ -2398,7 +2400,7 @@ class NinjaBackend(backends.Backend):
rspable=mesonlib.is_windows(),
rspfile_quote_style=compiler.rsp_file_syntax()))
- def generate_vala_compile_rules(self, compiler):
+ def generate_vala_compile_rules(self, compiler) -> None:
rule = self.compiler_to_rule_name(compiler)
command = compiler.get_exelist() + ['$ARGS', '$in']
description = 'Compiling Vala source $in'
@@ -2419,7 +2421,7 @@ class NinjaBackend(backends.Backend):
depfile=depfile,
extra='restat = 1'))
- def generate_rust_compile_rules(self, compiler):
+ def generate_rust_compile_rules(self, compiler) -> None:
rule = self.compiler_to_rule_name(compiler)
command = compiler.get_exelist() + ['$ARGS', '$in']
description = 'Compiling Rust source $in'
@@ -2428,7 +2430,7 @@ class NinjaBackend(backends.Backend):
self.add_rule(NinjaRule(rule, command, [], description, deps=depstyle,
depfile=depfile))
- def generate_swift_compile_rules(self, compiler):
+ def generate_swift_compile_rules(self, compiler) -> None:
rule = self.compiler_to_rule_name(compiler)
full_exe = self.environment.get_build_command() + [
'--internal',
@@ -2459,7 +2461,7 @@ https://groups.google.com/forum/#!topic/ninja-build/j-2RfBIOd_8
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=47485'''))
self.add_rule(NinjaRule(rule, cmd, [], 'Dep hack', extra='restat = 1'))
- def generate_llvm_ir_compile_rule(self, compiler):
+ def generate_llvm_ir_compile_rule(self, compiler) -> None:
if self.created_llvm_ir_rule[compiler.for_machine]:
return
rule = self.get_compiler_rule_name('llvm_ir', compiler.for_machine)
@@ -2472,7 +2474,7 @@ https://gcc.gnu.org/bugzilla/show_bug.cgi?id=47485'''))
self.add_rule(NinjaRule(rule, command, args, description, **options))
self.created_llvm_ir_rule[compiler.for_machine] = True
- def generate_compile_rule_for(self, langname, compiler):
+ def generate_compile_rule_for(self, langname: str, compiler: Compiler) -> None:
if langname == 'java':
self.generate_java_compile_rule(compiler)
return
@@ -2518,7 +2520,7 @@ https://gcc.gnu.org/bugzilla/show_bug.cgi?id=47485'''))
self.add_rule(NinjaRule(rule, command, args, description, **options,
deps=deps, depfile=depfile))
- def generate_pch_rule_for(self, langname, compiler):
+ def generate_pch_rule_for(self, langname: str, compiler: Compiler) -> None:
if langname not in {'c', 'cpp'}:
return
rule = self.compiler_to_pch_rule_name(compiler)
@@ -2544,7 +2546,7 @@ https://gcc.gnu.org/bugzilla/show_bug.cgi?id=47485'''))
self.add_rule(NinjaRule(rule, command, [], description, deps=deps,
depfile=depfile))
- def generate_scanner_rules(self):
+ def generate_scanner_rules(self) -> None:
rulename = 'depscan'
if rulename in self.ruledict:
# Scanning command is the same for native and cross compilation.
@@ -2556,7 +2558,7 @@ https://gcc.gnu.org/bugzilla/show_bug.cgi?id=47485'''))
rule = NinjaRule(rulename, command, args, description)
self.add_rule(rule)
- def generate_compile_rules(self):
+ def generate_compile_rules(self) -> None:
for for_machine in MachineChoice:
clist = self.environment.coredata.compilers[for_machine]
for langname, compiler in clist.items():
@@ -2567,7 +2569,7 @@ https://gcc.gnu.org/bugzilla/show_bug.cgi?id=47485'''))
for mode in compiler.get_modes():
self.generate_compile_rule_for(langname, mode)
- def generate_generator_list_rules(self, target):
+ def generate_generator_list_rules(self, target) -> None:
# CustomTargets have already written their rules and
# CustomTargetIndexes don't actually get generated, so write rules for
# GeneratedLists here
@@ -2652,7 +2654,7 @@ https://gcc.gnu.org/bugzilla/show_bug.cgi?id=47485'''))
elem.add_item('COMMAND', cmdlist)
self.add_build(elem)
- def scan_fortran_module_outputs(self, target):
+ def scan_fortran_module_outputs(self, target) -> None:
"""
Find all module and submodule made available in a Fortran code file.
"""
@@ -2794,7 +2796,7 @@ https://gcc.gnu.org/bugzilla/show_bug.cgi?id=47485'''))
return linker.get_link_debugfile_args(filename)
return []
- def generate_llvm_ir_compile(self, target, src: mesonlib.FileOrString):
+ def generate_llvm_ir_compile(self, target, src: FileOrString):
base_proxy = target.get_options()
compiler = get_compiler_for_source(target.compilers.values(), src)
commands = compiler.compiler_args()
@@ -2954,9 +2956,9 @@ https://gcc.gnu.org/bugzilla/show_bug.cgi?id=47485'''))
def generate_single_compile(self, target: build.BuildTarget, src,
is_generated: bool = False, header_deps=None,
- order_deps: T.Optional[T.List['mesonlib.FileOrString']] = None,
+ order_deps: T.Optional[T.List[FileOrString]] = None,
extra_args: T.Optional[T.List[str]] = None,
- unity_sources: T.Optional[T.List[mesonlib.FileOrString]] = None,
+ unity_sources: T.Optional[T.List[FileOrString]] = None,
) -> T.Tuple[str, str]:
"""
Compiles C/C++, ObjC/ObjC++, Fortran, and D sources
@@ -3098,7 +3100,7 @@ https://gcc.gnu.org/bugzilla/show_bug.cgi?id=47485'''))
assert isinstance(rel_src, str)
return (rel_obj, rel_src.replace('\\', '/'))
- def add_dependency_scanner_entries_to_element(self, target: build.BuildTarget, compiler, element, src):
+ def add_dependency_scanner_entries_to_element(self, target: build.BuildTarget, compiler, element, src) -> None:
if not self.should_use_dyndeps_for_target(target):
return
if isinstance(target, build.CompileTarget):
@@ -3123,7 +3125,7 @@ https://gcc.gnu.org/bugzilla/show_bug.cgi?id=47485'''))
d = os.path.join(self.get_target_private_dir(target), d)
ninja_element.add_dep(d)
- def has_dir_part(self, fname: mesonlib.FileOrString) -> bool:
+ def has_dir_part(self, fname: FileOrString) -> bool:
# FIXME FIXME: The usage of this is a terrible and unreliable hack
if isinstance(fname, File):
return fname.subdir != ''
@@ -3230,7 +3232,7 @@ https://gcc.gnu.org/bugzilla/show_bug.cgi?id=47485'''))
targetdir = self.get_target_private_dir(target)
return os.path.join(targetdir, target.get_filename() + '.symbols')
- def generate_shsym(self, target):
+ def generate_shsym(self, target) -> None:
target_file = self.get_target_filename(target)
symname = self.get_target_shsym_filename(target)
elem = NinjaBuildElement(self.all_outputs, symname, 'SHSYM', target_file)
@@ -3240,7 +3242,7 @@ https://gcc.gnu.org/bugzilla/show_bug.cgi?id=47485'''))
elem.add_item('CROSS', '--cross-host=' + self.environment.machines[target.for_machine].system)
self.add_build(elem)
- def get_import_filename(self, target):
+ def get_import_filename(self, target) -> str:
return os.path.join(self.get_target_dir(target), target.import_filename)
def get_target_type_link_args(self, target, linker):
@@ -3295,7 +3297,7 @@ https://gcc.gnu.org/bugzilla/show_bug.cgi?id=47485'''))
commands += linker.get_win_subsystem_args(target.win_subsystem)
return commands
- def get_link_whole_args(self, linker, target):
+ def get_link_whole_args(self, linker: DynamicLinker, target):
use_custom = False
if linker.id == 'msvc':
# Expand our object lists manually if we are on pre-Visual Studio 2015 Update 2
@@ -3565,7 +3567,7 @@ https://gcc.gnu.org/bugzilla/show_bug.cgi?id=47485'''))
self.environment.get_build_dir())
return self.get_target_filename(t)
- def generate_shlib_aliases(self, target, outdir):
+ def generate_shlib_aliases(self, target, outdir) -> None:
for alias, to, tag in target.get_aliases():
aliasfile = os.path.join(outdir, alias)
abs_aliasfile = os.path.join(self.environment.get_build_dir(), outdir, alias)
@@ -3605,7 +3607,7 @@ https://gcc.gnu.org/bugzilla/show_bug.cgi?id=47485'''))
gcda_elem.add_item('description', 'Deleting gcda files')
self.add_build(gcda_elem)
- def get_user_option_args(self):
+ def get_user_option_args(self) -> T.List[str]:
cmds = []
for k, v in self.environment.coredata.optstore.items():
if self.environment.coredata.optstore.is_project_option(k):