From 4e52a0f7fd9f6490fe31781809f2871a918be458 Mon Sep 17 00:00:00 2001 From: Daniel Mensinger Date: Fri, 27 Mar 2020 14:45:43 +0100 Subject: [PATCH] boost: Better python module detection --- mesonbuild/dependencies/boost.py | 34 ++++++++++++++++++++++- test cases/frameworks/1 boost/meson.build | 18 ++---------- 2 files changed, 35 insertions(+), 17 deletions(-) diff --git a/mesonbuild/dependencies/boost.py b/mesonbuild/dependencies/boost.py index ad27d1ddf9e0..d35069e03b29 100644 --- a/mesonbuild/dependencies/boost.py +++ b/mesonbuild/dependencies/boost.py @@ -101,6 +101,11 @@ def __lt__(self, other: T.Any) -> bool: @functools.total_ordering class BoostLibraryFile(): + # Python libraries are special because of the included + # minor version in the module name. + boost_python_libs = ['boost_python', 'boost_numpy'] + reg_python_mod_split = re.compile(r'(boost_[a-zA-Z]+)([0-9]*)') + reg_abi_tag = re.compile(r'^s?g?y?d?p?n?$') reg_ver_tag = re.compile(r'^[0-9_]+$') @@ -218,6 +223,33 @@ def abitag(self) -> str: def is_boost(self) -> bool: return any([self.name.startswith(x) for x in ['libboost_', 'boost_']]) + def is_python_lib(self) -> bool: + return any([self.mod_name.startswith(x) for x in BoostLibraryFile.boost_python_libs]) + + def mod_name_matches(self, mod_name: str) -> bool: + if self.mod_name == mod_name: + return True + if not self.is_python_lib(): + return False + + m_cur = BoostLibraryFile.reg_python_mod_split.match(self.mod_name) + m_arg = BoostLibraryFile.reg_python_mod_split.match(mod_name) + + if not m_cur or not m_arg: + return False + + if m_cur.group(1) != m_arg.group(1): + return False + + cur_vers = m_cur.group(2) + arg_vers = m_arg.group(2) + + # Always assume python 2 if nothing is specified + if not arg_vers: + arg_vers = '2' + + return cur_vers.startswith(arg_vers) + def version_matches(self, version_lib: str) -> bool: # If no version tag is present, assume that it fits if not self.version_lib or not version_lib: @@ -361,7 +393,7 @@ def run_check(self, inc_dirs: T.List[BoostIncludeDir], lib_dirs: T.List[Path]) - for mod in modules: found = False for l in f_libs: - if l.mod_name == mod: + if l.mod_name_matches(mod): selected_modules += [l] found = True break diff --git a/test cases/frameworks/1 boost/meson.build b/test cases/frameworks/1 boost/meson.build index ccfaa6647c72..cb8c2dfab72e 100644 --- a/test cases/frameworks/1 boost/meson.build +++ b/test cases/frameworks/1 boost/meson.build @@ -29,28 +29,14 @@ python3dep = python3.dependency(required: host_machine.system() == 'linux', embe # compile python 2/3 modules only if we found a corresponding python version if(python2dep.found() and host_machine.system() == 'linux' and not s) - if(dep.version().version_compare('>=1.67')) - # if we have a new version of boost, we need to construct the module name based - # on the installed version of python (and hope that they match the version boost - # was compiled against) - py2version_string = ''.join(python2dep.version().split('.')) - bpython2dep = dependency('boost', static: s, modules : ['python' + py2version_string], required: false, disabler: true) - else - # if we have an older version of boost, we need to use the old module names - bpython2dep = dependency('boost', static: s, modules : ['python'], required: false, disabler: true) - endif + bpython2dep = dependency('boost', static: s, modules : ['python'], required: false, disabler: true) else python2dep = disabler() bpython2dep = disabler() endif if(python3dep.found() and host_machine.system() == 'linux' and not s) - if(dep.version().version_compare('>=1.67')) - py3version_string = ''.join(python3dep.version().split('.')) - bpython3dep = dependency('boost', static: s, modules : ['python' + py3version_string], required: false, disabler: true) - else - bpython3dep = dependency('boost', static: s, modules : ['python3'], required: false, disabler: true) - endif + bpython3dep = dependency('boost', static: s, modules : ['python3'], required: false, disabler: true) else python3dep = disabler() bpython3dep = disabler()