Minor tweaks to abi code.

This commit is contained in:
Todd Gamblin 2016-02-07 11:27:39 -07:00
parent 0244d794cd
commit b0572a5462

View File

@ -69,11 +69,11 @@ def _gcc_get_libstdcxx_version(self, version):
if not libpath: if not libpath:
return None return None
return os.path.basename(libpath) return os.path.basename(libpath)
@memoized @memoized
def _gcc_compiler_compare(self, pversion, cversion): def _gcc_compiler_compare(self, pversion, cversion):
"""Returns true iff the gcc version pversion and cversion """Returns true iff the gcc version pversion and cversion
are ABI compatible.""" are ABI compatible."""
plib = self._gcc_get_libstdcxx_version(pversion) plib = self._gcc_get_libstdcxx_version(pversion)
clib = self._gcc_get_libstdcxx_version(cversion) clib = self._gcc_get_libstdcxx_version(cversion)
@ -86,43 +86,43 @@ def _intel_compiler_compare(self, pversion, cversion):
"""Returns true iff the intel version pversion and cversion """Returns true iff the intel version pversion and cversion
are ABI compatible""" are ABI compatible"""
#Test major and minor versions. Ignore build version. # Test major and minor versions. Ignore build version.
if (len(pversion.version) < 2 or len(cversion.version) < 2): if (len(pversion.version) < 2 or len(cversion.version) < 2):
return False return False
return (pversion.version[0] == cversion.version[0]) and \ return pversion.version[:2] == cversion.version[:2]
(pversion.version[1] == cversion.version[1])
def compiler_compatible(self, parent, child, **kwargs): def compiler_compatible(self, parent, child, **kwargs):
"""Returns true iff the compilers for parent and child specs are ABI compatible""" """Returns true iff the compilers for parent and child specs are ABI compatible"""
if not parent.compiler or not child.compiler: if not parent.compiler or not child.compiler:
return True return True
if parent.compiler.name != child.compiler.name: if parent.compiler.name != child.compiler.name:
#Different compiler families are assumed ABI incompatible # Different compiler families are assumed ABI incompatible
return False return False
if kwargs.get('loose', False): if kwargs.get('loose', False):
return True return True
# TODO: Can we move the specialized ABI matching stuff
# TODO: into compiler classes?
for pversion in parent.compiler.versions: for pversion in parent.compiler.versions:
for cversion in child.compiler.versions: for cversion in child.compiler.versions:
#For a few compilers use specialized comparisons. Otherwise # For a few compilers use specialized comparisons. Otherwise
# match on version match. # match on version match.
if pversion.satisfies(cversion): if pversion.satisfies(cversion):
return True return True
elif parent.compiler.name == "gcc" and \ elif (parent.compiler.name == "gcc" and
self._gcc_compiler_compare(pversion, cversion): self._gcc_compiler_compare(pversion, cversion)):
return True return True
elif parent.compiler.name == "intel" and \ elif (parent.compiler.name == "intel" and
self._intel_compiler_compare(pversion, cversion): self._intel_compiler_compare(pversion, cversion)):
return True return True
return False return False
def compatible(self, parent, child, **kwargs): def compatible(self, parent, child, **kwargs):
"""Returns true iff a parent and child spec are ABI compatible""" """Returns true iff a parent and child spec are ABI compatible"""
loosematch = kwargs.get('loose', False) loosematch = kwargs.get('loose', False)
return self.architecture_compatible(parent, child) and \ return self.architecture_compatible(parent, child) and \
self.compiler_compatible(parent, child, loose=loosematch) self.compiler_compatible(parent, child, loose=loosematch)