Relax restrictions on detecting boost dependency

This does two things:
* allows the library files to be symlinks
* searches `lib` and `lib64` in `BOOST_ROOT` even if it finds lib
  directories from the compiler

The first condition is needed for the homebrew on macOS because boost and boost
python are provided in seperate packages and are put together in /usr/local/lib
with symlinks to the library files. The both conditions are needed for high
performace computing environments where dependencies are often provided in
nonstandard directories with symlinks

A test case was added which looks for boost libraries in seperate directories
which have been symlinked to BOOST_ROOT/lib
pull/9063/head
Kevin Meagher 4 years ago committed by Daniel Mensinger
parent 9da99e7a59
commit 7ce29e1eda
  1. 20
      mesonbuild/dependencies/boost.py
  2. 0
      test cases/frameworks/35 boost symlinks/boost/Cellar/boost-python/0.3.0/lib/boost_python-vc142-mt-gd-x32-0_3.lib
  3. 0
      test cases/frameworks/35 boost symlinks/boost/Cellar/boost-python/0.3.0/lib/boost_python-vc142-mt-gd-x64-0_3.lib
  4. 0
      test cases/frameworks/35 boost symlinks/boost/Cellar/boost-python/0.3.0/lib/libboost_python.so.0.3.0
  5. 3
      test cases/frameworks/35 boost symlinks/boost/Cellar/boost/0.3.0/include/boost/version.hpp
  6. 0
      test cases/frameworks/35 boost symlinks/boost/Cellar/boost/0.3.0/lib/boost_regex-vc142-mt-gd-x32-0_3.lib
  7. 0
      test cases/frameworks/35 boost symlinks/boost/Cellar/boost/0.3.0/lib/boost_regex-vc142-mt-gd-x64-0_3.lib
  8. 0
      test cases/frameworks/35 boost symlinks/boost/Cellar/boost/0.3.0/lib/libboost_regex.so.0.3.0
  9. 1
      test cases/frameworks/35 boost symlinks/boost/include/boost
  10. 1
      test cases/frameworks/35 boost symlinks/boost/lib/boost_python-vc142-mt-gd-x32-0_3.lib
  11. 1
      test cases/frameworks/35 boost symlinks/boost/lib/boost_python-vc142-mt-gd-x64-0_3.lib
  12. 1
      test cases/frameworks/35 boost symlinks/boost/lib/boost_regex-vc142-mt-gd-x32-0_3.lib
  13. 1
      test cases/frameworks/35 boost symlinks/boost/lib/boost_regex-vc142-mt-gd-x64-0_3.lib
  14. 1
      test cases/frameworks/35 boost symlinks/boost/lib/libboost_python.so.0.3.0
  15. 1
      test cases/frameworks/35 boost symlinks/boost/lib/libboost_regex.so.0.3.0
  16. 6
      test cases/frameworks/35 boost symlinks/meson.build
  17. 2
      test cases/frameworks/35 boost symlinks/nativefile.ini.in

@ -541,11 +541,7 @@ class BoostDependency(SystemDependency):
system_dirs = [x for x in system_dirs if mesonlib.path_is_in_root(x, root)]
system_dirs = list(mesonlib.OrderedSet(system_dirs))
if system_dirs:
return system_dirs
# No system include paths were found --> fall back to manually looking
# for library dirs in root
# In addition to the system include paths, also look in "lib"
dirs = [] # type: T.List[Path]
subdirs = [] # type: T.List[Path]
for i in root.iterdir():
@ -561,7 +557,7 @@ class BoostDependency(SystemDependency):
# Filter out paths that don't match the target arch to avoid finding
# the wrong libraries. See https://github.com/mesonbuild/meson/issues/7110
if not self.arch:
return dirs + subdirs
return system_dirs + dirs + subdirs
arch_list_32 = ['32', 'i386']
arch_list_64 = ['64']
@ -615,15 +611,19 @@ class BoostDependency(SystemDependency):
return libs
def detect_libraries(self, libdir: Path) -> T.List[BoostLibraryFile]:
libs = [] # type: T.List[BoostLibraryFile]
libs = [] # type: T.List[Path]
for i in libdir.iterdir():
if not i.is_file() or i.is_symlink():
if not i.is_file():
continue
if not any([i.name.startswith(x) for x in ['libboost_', 'boost_']]):
continue
libs += [BoostLibraryFile(i)]
return [x for x in libs if x.is_boost()] # Filter out no boost libraries
libs += [i.resolve()]
# Remove duplicate libraries caused by resolving symlinks
blibs = [BoostLibraryFile(i) for i in set(libs)] # type: T.List[BoostLibraryFile]
return [x for x in blibs if x.is_boost()] # Filter out no boost libraries
def detect_split_root(self, inc_dir: Path, lib_dir: Path) -> None:
boost_inc_dir = None

@ -0,0 +1,3 @@
#define BOOST_VERSION 300
#error This is not a real version of boost

@ -0,0 +1 @@
../Cellar/boost-python/0.3.0/lib/boost_python-vc142-mt-gd-x32-0_3.lib

@ -0,0 +1 @@
../Cellar/boost-python/0.3.0/lib/boost_python-vc142-mt-gd-x64-0_3.lib

@ -0,0 +1 @@
../Cellar/boost/0.3.0/lib/boost_regex-vc142-mt-gd-x32-0_3.lib

@ -0,0 +1 @@
../Cellar/boost/0.3.0/lib/boost_regex-vc142-mt-gd-x64-0_3.lib

@ -0,0 +1 @@
../Cellar/boost-python/0.3.0/lib/libboost_python.so.0.3.0

@ -0,0 +1 @@
../Cellar/boost/0.3.0/lib/libboost_regex.so.0.3.0

@ -0,0 +1,6 @@
project('boosttestsymlinks', 'cpp')
dep = dependency('boost', modules : ['regex', 'python'], required: false)
assert(dep.found(), 'expected to find a fake version of boost')
assert(dep.version() == '0.3.0', 'expected to find version 0.3.0')

@ -0,0 +1,2 @@
[properties]
boost_root = '@MESON_TEST_ROOT@/boost'
Loading…
Cancel
Save