@ -382,7 +382,7 @@ class BoostDependency(SystemDependency):
# Finally, look for paths from .pc files and from searching the filesystem
# Finally, look for paths from .pc files and from searching the filesystem
self . detect_roots ( )
self . detect_roots ( )
def check_and_set_roots ( self , roots : T . List [ Path ] ) - > None :
def check_and_set_roots ( self , roots : T . List [ Path ] , use_system : bool ) - > None :
roots = list ( mesonlib . OrderedSet ( roots ) )
roots = list ( mesonlib . OrderedSet ( roots ) )
for j in roots :
for j in roots :
# 1. Look for the boost headers (boost/version.hpp)
# 1. Look for the boost headers (boost/version.hpp)
@ -394,7 +394,7 @@ class BoostDependency(SystemDependency):
if not inc_dirs :
if not inc_dirs :
continue
continue
lib_dirs = self . detect_lib_dirs ( j )
lib_dirs = self . detect_lib_dirs ( j , use_system )
self . is_found = self . run_check ( inc_dirs , lib_dirs )
self . is_found = self . run_check ( inc_dirs , lib_dirs )
if self . is_found :
if self . is_found :
self . boost_root = j
self . boost_root = j
@ -436,7 +436,7 @@ class BoostDependency(SystemDependency):
if paths and any ( [ not x . is_absolute ( ) for x in paths ] ) :
if paths and any ( [ not x . is_absolute ( ) for x in paths ] ) :
raise DependencyException ( ' boost_root path given in machine file must be absolute ' )
raise DependencyException ( ' boost_root path given in machine file must be absolute ' )
self . check_and_set_roots ( paths )
self . check_and_set_roots ( paths , use_system = False )
def run_check ( self , inc_dirs : T . List [ BoostIncludeDir ] , lib_dirs : T . List [ Path ] ) - > bool :
def run_check ( self , inc_dirs : T . List [ BoostIncludeDir ] , lib_dirs : T . List [ Path ] ) - > bool :
mlog . debug ( ' - potential library dirs: {} ' . format ( [ x . as_posix ( ) for x in lib_dirs ] ) )
mlog . debug ( ' - potential library dirs: {} ' . format ( [ x . as_posix ( ) for x in lib_dirs ] ) )
@ -532,16 +532,22 @@ class BoostDependency(SystemDependency):
candidates = [ x for x in candidates if x . exists ( ) ]
candidates = [ x for x in candidates if x . exists ( ) ]
return [ self . _include_dir_from_version_header ( x ) for x in candidates ]
return [ self . _include_dir_from_version_header ( x ) for x in candidates ]
def detect_lib_dirs ( self , root : Path ) - > T . List [ Path ] :
def detect_lib_dirs ( self , root : Path , use_system : bool ) - > T . List [ Path ] :
# First check the system include paths. Only consider those within the
# First check the system include paths. Only consider those within the
# given root path
# given root path
system_dirs_t = self . clib_compiler . get_library_dirs ( self . env )
system_dirs = [ Path ( x ) for x in system_dirs_t ]
system_dirs = [ x . resolve ( ) for x in system_dirs if x . exists ( ) ]
system_dirs = [ x for x in system_dirs if mesonlib . path_is_in_root ( x , root ) ]
system_dirs = list ( mesonlib . OrderedSet ( system_dirs ) )
# In addition to the system include paths, also look in "lib"
if use_system :
system_dirs_t = self . clib_compiler . get_library_dirs ( self . env )
system_dirs = [ Path ( x ) for x in system_dirs_t ]
system_dirs = [ x . resolve ( ) for x in system_dirs if x . exists ( ) ]
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
dirs = [ ] # type: T.List[Path]
dirs = [ ] # type: T.List[Path]
subdirs = [ ] # type: T.List[Path]
subdirs = [ ] # type: T.List[Path]
for i in root . iterdir ( ) :
for i in root . iterdir ( ) :
@ -557,7 +563,7 @@ class BoostDependency(SystemDependency):
# Filter out paths that don't match the target arch to avoid finding
# Filter out paths that don't match the target arch to avoid finding
# the wrong libraries. See https://github.com/mesonbuild/meson/issues/7110
# the wrong libraries. See https://github.com/mesonbuild/meson/issues/7110
if not self . arch :
if not self . arch :
return system_dirs + dirs + subdirs
return dirs + subdirs
arch_list_32 = [ ' 32 ' , ' i386 ' ]
arch_list_32 = [ ' 32 ' , ' i386 ' ]
arch_list_64 = [ ' 64 ' ]
arch_list_64 = [ ' 64 ' ]
@ -611,19 +617,16 @@ class BoostDependency(SystemDependency):
return libs
return libs
def detect_libraries ( self , libdir : Path ) - > T . List [ BoostLibraryFile ] :
def detect_libraries ( self , libdir : Path ) - > T . List [ BoostLibraryFile ] :
libs = set ( ) # type: T.Set[Path ]
libs = set ( ) # type: T.Set[BoostLibraryFile ]
for i in libdir . iterdir ( ) :
for i in libdir . iterdir ( ) :
if not i . is_file ( ) :
if not i . is_file ( ) :
continue
continue
if not any ( [ i . name . startswith ( x ) for x in [ ' libboost_ ' , ' boost_ ' ] ] ) :
if not any ( [ i . name . startswith ( x ) for x in [ ' libboost_ ' , ' boost_ ' ] ] ) :
continue
continue
libs . add ( i . resolve ( ) )
libs . add ( BoostLibraryFile ( i . resolve ( ) ) )
# Remove duplicate libraries caused by resolving symlinks
return [ x for x in libs if x . is_boost ( ) ] # Filter out no boost libraries
blibs = [ BoostLibraryFile ( i ) for i in 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 :
def detect_split_root ( self , inc_dir : Path , lib_dir : Path ) - > None :
boost_inc_dir = None
boost_inc_dir = None
@ -679,11 +682,6 @@ class BoostDependency(SystemDependency):
else :
else :
tmp = [ ] # type: T.List[Path]
tmp = [ ] # type: T.List[Path]
# Homebrew
brew_boost = Path ( ' /usr/local/Cellar/boost ' )
if brew_boost . is_dir ( ) :
tmp + = [ x for x in brew_boost . iterdir ( ) ]
# Add some default system paths
# Add some default system paths
tmp + = [ Path ( ' /opt/local ' ) ]
tmp + = [ Path ( ' /opt/local ' ) ]
tmp + = [ Path ( ' /usr/local/opt/boost ' ) ]
tmp + = [ Path ( ' /usr/local/opt/boost ' ) ]
@ -695,7 +693,7 @@ class BoostDependency(SystemDependency):
tmp = [ x . resolve ( ) for x in tmp ]
tmp = [ x . resolve ( ) for x in tmp ]
roots + = tmp
roots + = tmp
self . check_and_set_roots ( roots )
self . check_and_set_roots ( roots , use_system = True )
def log_details ( self ) - > str :
def log_details ( self ) - > str :
res = ' '
res = ' '