aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEli Schwartz <eschwartz@archlinux.org>2023-06-12 01:03:01 -0400
committerEli Schwartz <eschwartz@archlinux.org>2023-06-20 16:24:46 -0400
commitd0cbda99a3932f2a66c40ba1e1cfe6332e6b68bb (patch)
tree7a0393025018dbe19d6c05d085e93d0bda91ea86
parentf38c653a75492a8ec1fd95b1aa148aea13689ec3 (diff)
downloadmeson-d0cbda99a3932f2a66c40ba1e1cfe6332e6b68bb.zip
meson-d0cbda99a3932f2a66c40ba1e1cfe6332e6b68bb.tar.gz
meson-d0cbda99a3932f2a66c40ba1e1cfe6332e6b68bb.tar.bz2
backends/vs: add sundry type annotations
We went from 192 mypy errors down to 144.
-rw-r--r--mesonbuild/backend/vs2010backend.py53
1 files changed, 28 insertions, 25 deletions
diff --git a/mesonbuild/backend/vs2010backend.py b/mesonbuild/backend/vs2010backend.py
index 310b1bc..de6d8d7 100644
--- a/mesonbuild/backend/vs2010backend.py
+++ b/mesonbuild/backend/vs2010backend.py
@@ -34,8 +34,10 @@ from ..mesonlib import (
from ..environment import Environment, build_filename
if T.TYPE_CHECKING:
+ from ..arglist import CompilerArgs
from ..interpreter import Interpreter
+ Project = T.Tuple[str, Path, str, MachineChoice]
def autodetect_vs_version(build: T.Optional[build.Build], interpreter: T.Optional[Interpreter]) -> backends.Backend:
vs_version = os.getenv('VisualStudioVersion', None)
@@ -72,7 +74,7 @@ def autodetect_vs_version(build: T.Optional[build.Build], interpreter: T.Optiona
'Please specify the exact backend to use.'.format(vs_version, vs_install_dir))
-def split_o_flags_args(args):
+def split_o_flags_args(args: T.List[str]) -> T.List[str]:
"""
Splits any /O args and returns them. Does not take care of flags overriding
previous ones. Skips non-O flag arguments.
@@ -94,7 +96,7 @@ def split_o_flags_args(args):
return o_flags
-def generate_guid_from_path(path, path_type):
+def generate_guid_from_path(path, path_type) -> str:
return str(uuid.uuid5(uuid.NAMESPACE_URL, 'meson-vs-' + path_type + ':' + str(path))).upper()
def detect_microsoft_gdk(platform: str) -> bool:
@@ -188,7 +190,7 @@ class Vs2010Backend(backends.Backend):
self.generate_genlist_for_target(genlist, target, parent_node, generator_output_files, custom_target_include_dirs, custom_target_output_files)
return generator_output_files, custom_target_output_files, custom_target_include_dirs
- def generate(self):
+ def generate(self) -> None:
target_machine = self.interpreter.builtin['target_machine'].cpu_family_method(None, None)
if target_machine in {'64', 'x86_64'}:
# amd64 or x86_64
@@ -350,7 +352,7 @@ class Vs2010Backend(backends.Backend):
ret.update(all_deps)
return ret
- def generate_solution_dirs(self, ofile, parents):
+ def generate_solution_dirs(self, ofile: str, parents: T.Sequence[Path]) -> None:
prj_templ = 'Project("{%s}") = "%s", "%s", "{%s}"\n'
iterpaths = reversed(parents)
# Skip first path
@@ -370,7 +372,7 @@ class Vs2010Backend(backends.Backend):
ofile.write(prj_line)
ofile.write('EndProject\n')
- def generate_solution(self, sln_filename, projlist):
+ def generate_solution(self, sln_filename: str, projlist: T.List[Project]) -> None:
default_projlist = self.get_build_by_default_targets()
default_projlist.update(self.get_testlike_targets())
sln_filename_tmp = sln_filename + '~'
@@ -472,9 +474,9 @@ class Vs2010Backend(backends.Backend):
ofile.write('EndGlobal\n')
replace_if_different(sln_filename, sln_filename_tmp)
- def generate_projects(self):
+ def generate_projects(self) -> T.List[Project]:
startup_project = self.environment.coredata.options[OptionKey('backend_startup_project')].value
- projlist = []
+ projlist: T.List[Project] = []
startup_idx = 0
for (i, (name, target)) in enumerate(self.build.targets.items()):
if startup_project and startup_project == target.get_basename():
@@ -530,7 +532,7 @@ class Vs2010Backend(backends.Backend):
def quote_arguments(self, arr):
return ['"%s"' % i for i in arr]
- def add_project_reference(self, root, include, projid, link_outputs=False):
+ def add_project_reference(self, root: ET.Element, include: str, projid: str, link_outputs: bool = False) -> None:
ig = ET.SubElement(root, 'ItemGroup')
pref = ET.SubElement(ig, 'ProjectReference', Include=include)
ET.SubElement(pref, 'Project').text = '{%s}' % projid
@@ -540,7 +542,7 @@ class Vs2010Backend(backends.Backend):
# objects and .lib files manually.
ET.SubElement(pref, 'LinkLibraryDependencies').text = 'false'
- def add_target_deps(self, root, target):
+ def add_target_deps(self, root: ET.Element, target):
target_dict = {target.get_id(): target}
for dep in self.get_target_deps(target_dict).values():
if dep.get_id() in self.handled_target_deps[target.get_id()]:
@@ -551,7 +553,7 @@ class Vs2010Backend(backends.Backend):
tid = self.environment.coredata.target_guids[dep.get_id()]
self.add_project_reference(root, vcxproj, tid)
- def create_basic_project_filters(self):
+ def create_basic_project_filters(self) -> ET.Element:
root = ET.Element('Project', {'ToolsVersion': '4.0',
'xmlns': 'http://schemas.microsoft.com/developer/msbuild/2003'})
return root
@@ -561,7 +563,7 @@ class Vs2010Backend(backends.Backend):
guid,
conftype='Utility',
target_ext=None,
- target_platform=None):
+ target_platform=None) -> T.Tuple[ET.Element, ET.Element]:
root = ET.Element('Project', {'DefaultTargets': "Build",
'ToolsVersion': '4.0',
'xmlns': 'http://schemas.microsoft.com/developer/msbuild/2003'})
@@ -625,7 +627,7 @@ class Vs2010Backend(backends.Backend):
return (root, type_config)
- def gen_run_target_vcxproj(self, target, ofname, guid):
+ def gen_run_target_vcxproj(self, target: build.RunTarget, ofname: str, guid: str) -> None:
(root, type_config) = self.create_basic_project(target.name,
temp_dir=target.get_id(),
guid=guid)
@@ -655,7 +657,7 @@ class Vs2010Backend(backends.Backend):
self.add_target_deps(root, target)
self._prettyprint_vcxproj_xml(ET.ElementTree(root), ofname)
- def gen_custom_target_vcxproj(self, target, ofname, guid):
+ def gen_custom_target_vcxproj(self, target: build.CustomTarget, ofname: str, guid: str) -> None:
if target.for_machine is MachineChoice.BUILD:
platform = self.build_platform
else:
@@ -695,7 +697,7 @@ class Vs2010Backend(backends.Backend):
self.add_target_deps(root, target)
self._prettyprint_vcxproj_xml(ET.ElementTree(root), ofname)
- def gen_compile_target_vcxproj(self, target, ofname, guid):
+ def gen_compile_target_vcxproj(self, target: build.CompileTarget, ofname: str, guid: str) -> None:
if target.for_machine is MachineChoice.BUILD:
platform = self.build_platform
else:
@@ -805,7 +807,7 @@ class Vs2010Backend(backends.Backend):
return
@staticmethod
- def escape_preprocessor_define(define):
+ def escape_preprocessor_define(define: str) -> str:
# See: https://msdn.microsoft.com/en-us/library/bb383819.aspx
table = str.maketrans({'%': '%25', '$': '%24', '@': '%40',
"'": '%27', ';': '%3B', '?': '%3F', '*': '%2A',
@@ -816,7 +818,7 @@ class Vs2010Backend(backends.Backend):
return define.translate(table)
@staticmethod
- def escape_additional_option(option):
+ def escape_additional_option(option: str) -> str:
# See: https://msdn.microsoft.com/en-us/library/bb383819.aspx
table = str.maketrans({'%': '%25', '$': '%24', '@': '%40',
"'": '%27', ';': '%3B', '?': '%3F', '*': '%2A', ' ': '%20'})
@@ -907,7 +909,7 @@ class Vs2010Backend(backends.Backend):
return c
raise MesonException('Could not find a C or C++ compiler. MSVC can only build C/C++ projects.')
- def _prettyprint_vcxproj_xml(self, tree, ofname):
+ def _prettyprint_vcxproj_xml(self, tree: ET.ElementTree, ofname: str) -> None:
ofname_tmp = ofname + '~'
tree.write(ofname_tmp, encoding='utf-8', xml_declaration=True)
@@ -917,7 +919,7 @@ class Vs2010Backend(backends.Backend):
of.write(doc.toprettyxml())
replace_if_different(ofname, ofname_tmp)
- def gen_vcxproj(self, target, ofname, guid):
+ def gen_vcxproj(self, target: build.BuildTarget, ofname: str, guid: str) -> None:
mlog.debug(f'Generating vcxproj {target.name}.')
subsystem = 'Windows'
self.handled_target_deps[target.get_id()] = []
@@ -1066,7 +1068,7 @@ class Vs2010Backend(backends.Backend):
#
# file_args is also later split out into defines and include_dirs in
# case someone passed those in there
- file_args = {l: c.compiler_args() for l, c in target.compilers.items()}
+ file_args: T.Dict[str, CompilerArgs] = {l: c.compiler_args() for l, c in target.compilers.items()}
file_defines = {l: [] for l in target.compilers}
file_inc_dirs = {l: [] for l in target.compilers}
# The order in which these compile args are added must match
@@ -1203,7 +1205,7 @@ class Vs2010Backend(backends.Backend):
ET.SubElement(clconf, 'PreprocessorDefinitions').text = ';'.join(target_defines)
ET.SubElement(clconf, 'FunctionLevelLinking').text = 'true'
# Warning level
- warning_level = target.get_option(OptionKey('warning_level'))
+ warning_level = T.cast('str', target.get_option(OptionKey('warning_level')))
ET.SubElement(clconf, 'WarningLevel').text = 'Level' + str(1 + int(warning_level))
if target.get_option(OptionKey('werror')):
ET.SubElement(clconf, 'TreatWarningAsError').text = 'true'
@@ -1598,7 +1600,8 @@ class Vs2010Backend(backends.Backend):
self.add_regen_dependency(root)
self._prettyprint_vcxproj_xml(ET.ElementTree(root), ofname)
- def add_custom_build(self, node, rulename, command, deps=None, outputs=None, msg=None, verify_files=True):
+ def add_custom_build(self, node: ET.Element, rulename: str, command: str, deps: T.Optional[T.List[str]] = None,
+ outputs: T.Optional[T.List[str]] = None, msg: T.Optional[str] = None, verify_files: bool = True) -> None:
igroup = ET.SubElement(node, 'ItemGroup')
rulefile = os.path.join(self.environment.get_scratch_dir(), rulename + '.rule')
if not os.path.exists(rulefile):
@@ -1628,20 +1631,20 @@ class Vs2010Backend(backends.Backend):
ET.SubElement(custombuild, 'AdditionalInputs').text = ';'.join(deps)
@staticmethod
- def nonexistent_file(prefix):
+ def nonexistent_file(prefix: str) -> str:
i = 0
file = prefix
while os.path.exists(file):
file = '%s%d' % (prefix, i)
return file
- def generate_debug_information(self, link):
+ def generate_debug_information(self, link: ET.Element) -> None:
# valid values for vs2015 is 'false', 'true', 'DebugFastLink'
ET.SubElement(link, 'GenerateDebugInformation').text = 'true'
- def add_regen_dependency(self, root):
+ def add_regen_dependency(self, root: ET.Element) -> None:
regen_vcxproj = os.path.join(self.environment.get_build_dir(), 'REGEN.vcxproj')
self.add_project_reference(root, regen_vcxproj, self.environment.coredata.regen_guid)
- def generate_lang_standard_info(self, file_args, clconf):
+ def generate_lang_standard_info(self, file_args: T.Dict[str, CompilerArgs], clconf: ET.Element) -> None:
pass