dependencies/base: Make the ConfigTool Dependency more flexible

This commit is contained in:
Dylan Baker 2020-01-28 16:23:57 -08:00
parent 9f358ab54a
commit f6e50da49a
2 changed files with 20 additions and 7 deletions

View File

@ -384,19 +384,32 @@ class NotFoundDependency(Dependency):
class ConfigToolDependency(ExternalDependency): class ConfigToolDependency(ExternalDependency):
"""Class representing dependencies found using a config tool.""" """Class representing dependencies found using a config tool.
Takes the following extra keys in kwargs that it uses internally:
:tools List[str]: A list of tool names to use
:version_arg str: The argument to pass to the tool to get it's version
:returncode_value int: The value of the correct returncode
Because some tools are stupid and don't return 0
"""
tools = None tools = None
tool_name = None tool_name = None
version_arg = '--version'
__strip_version = re.compile(r'^[0-9][0-9.]+') __strip_version = re.compile(r'^[0-9][0-9.]+')
def __init__(self, name, environment, kwargs, language: T.Optional[str] = None): def __init__(self, name, environment, kwargs, language: T.Optional[str] = None):
super().__init__('config-tool', environment, kwargs, language=language) super().__init__('config-tool', environment, kwargs, language=language)
self.name = name self.name = name
# You may want to overwrite the class version in some cases
self.tools = listify(kwargs.get('tools', self.tools)) self.tools = listify(kwargs.get('tools', self.tools))
if not self.tool_name:
self.tool_name = self.tools[0]
if 'version_arg' in kwargs:
self.version_arg = kwargs['version_arg']
req_version = kwargs.get('version', None) req_version = kwargs.get('version', None)
tool, version = self.find_config(req_version) tool, version = self.find_config(req_version, kwargs.get('returncode_value', 0))
self.config = tool self.config = tool
self.is_found = self.report_config(version, req_version) self.is_found = self.report_config(version, req_version)
if not self.is_found: if not self.is_found:
@ -415,7 +428,7 @@ class ConfigToolDependency(ExternalDependency):
return m.group(0).rstrip('.') return m.group(0).rstrip('.')
return version return version
def find_config(self, versions=None): def find_config(self, versions=None, returncode: int = 0):
"""Helper method that searches for config tool binaries in PATH and """Helper method that searches for config tool binaries in PATH and
returns the one that best matches the given version requirements. returns the one that best matches the given version requirements.
""" """
@ -444,10 +457,10 @@ class ConfigToolDependency(ExternalDependency):
continue continue
tool = potential_bin.get_command() tool = potential_bin.get_command()
try: try:
p, out = Popen_safe(tool + ['--version'])[:2] p, out = Popen_safe(tool + [self.version_arg])[:2]
except (FileNotFoundError, PermissionError): except (FileNotFoundError, PermissionError):
continue continue
if p.returncode != 0: if p.returncode != returncode:
continue continue
out = self._sanitize_version(out.strip()) out = self._sanitize_version(out.strip())

View File

@ -79,13 +79,13 @@ class GnuStepDependency(ConfigToolDependency):
['--gui-libs' if 'gui' in self.modules else '--base-libs'], ['--gui-libs' if 'gui' in self.modules else '--base-libs'],
'link_args')) 'link_args'))
def find_config(self, versions=None): def find_config(self, versions=None, returncode: int = 0):
tool = [self.tools[0]] tool = [self.tools[0]]
try: try:
p, out = Popen_safe(tool + ['--help'])[:2] p, out = Popen_safe(tool + ['--help'])[:2]
except (FileNotFoundError, PermissionError): except (FileNotFoundError, PermissionError):
return (None, None) return (None, None)
if p.returncode != 0: if p.returncode != returncode:
return (None, None) return (None, None)
self.config = tool self.config = tool
found_version = self.detect_version() found_version = self.detect_version()