diff options
Diffstat (limited to 'dependencies.py')
-rw-r--r-- | dependencies.py | 80 |
1 files changed, 68 insertions, 12 deletions
diff --git a/dependencies.py b/dependencies.py index d47dac8..d3a82db 100644 --- a/dependencies.py +++ b/dependencies.py @@ -393,6 +393,7 @@ class BoostDependency(Dependency): def __init__(self, environment, kwargs): Dependency.__init__(self) self.name = 'boost' + self.libdir = '' try: self.boost_root = os.environ['BOOST_ROOT'] if not os.path.isabs(self.boost_root): @@ -400,9 +401,15 @@ class BoostDependency(Dependency): except KeyError: self.boost_root = None if self.boost_root is None: - self.incdir = '/usr/include/boost' + if mesonlib.is_windows(): + self.boost_root = self.detect_win_root() + self.incdir = self.boost_root + else: + self.incdir = '/usr/include' else: - self.incdir = os.path.join(self.boost_root, 'include/boost') + self.incdir = os.path.join(self.boost_root, 'include') + self.boost_inc_subdir = os.path.join(self.incdir, 'boost') + mlog.debug('Boost library root dir is', self.boost_root) self.src_modules = {} self.lib_modules = {} self.lib_modules_mt = {} @@ -422,17 +429,26 @@ class BoostDependency(Dependency): else: mlog.log("Dependency Boost (%s) found:" % module_str, mlog.red('NO')) + def detect_win_root(self): + globtext = 'c:\\local\\boost_*' + files = glob.glob(globtext) + if len(files) > 0: + return files[0] + return 'C:\\' + def get_compile_args(self): args = [] if self.boost_root is not None: - args.append('-I' + os.path.join(self.boost_root, 'include')) + if mesonlib.is_windows(): + args.append('-I' + self.boost_root) + else: + args.append('-I' + os.path.join(self.boost_root, 'include')) + else: + args.append('-I' + self.incdir) return args def get_requested(self, kwargs): - modules = 'modules' - if not modules in kwargs: - raise DependencyException('Boost dependency must specify "%s" keyword.' % modules) - candidates = kwargs[modules] + candidates = kwargs.get('modules', []) if isinstance(candidates, str): return [candidates] for c in candidates: @@ -453,7 +469,7 @@ class BoostDependency(Dependency): def detect_version(self): try: - ifile = open(os.path.join(self.incdir, 'version.hpp')) + ifile = open(os.path.join(self.boost_inc_subdir, 'version.hpp')) except FileNotFoundError: self.version = None return @@ -466,13 +482,41 @@ class BoostDependency(Dependency): self.version = None def detect_src_modules(self): - for entry in os.listdir(self.incdir): - entry = os.path.join(self.incdir, entry) + for entry in os.listdir(self.boost_inc_subdir): + entry = os.path.join(self.boost_inc_subdir, entry) if stat.S_ISDIR(os.stat(entry).st_mode): self.src_modules[os.path.split(entry)[-1]] = True def detect_lib_modules(self): - globber = 'libboost_*.so' # FIXME, make platform independent. + if mesonlib.is_windows(): + return self.detect_lib_modules_win() + return self.detect_lib_modules_nix() + + def detect_lib_modules_win(self): + if mesonlib.is_32bit(): + gl = 'lib32*' + else: + gl = 'lib64*' + libdir = glob.glob(os.path.join(self.boost_root, gl)) + if len(libdir) == 0: + return + libdir = libdir[0] + self.libdir = libdir + globber = 'boost_*-gd-*.lib' # FIXME + for entry in glob.glob(os.path.join(libdir, globber)): + (_, fname) = os.path.split(entry) + base = fname.split('_', 1)[1] + modname = base.split('-', 1)[0] + self.lib_modules_mt[modname] = fname + + def detect_lib_modules_nix(self): + libsuffix = None + if mesonlib.is_osx(): + libsuffix = 'dylib' + else: + libsuffix = 'so' + + globber = 'libboost_*.{}'.format(libsuffix) if self.boost_root is None: libdirs = mesonlib.get_library_dirs() else: @@ -488,12 +532,24 @@ class BoostDependency(Dependency): else: self.lib_modules[name] = True - def get_link_args(self): + def get_win_link_args(self): args = [] if self.boost_root: # FIXME, these are in gcc format, not msvc. # On the other hand, so are the args that # pkg-config returns. + args.append('/LIBPATH:' + self.libdir) + for module in self.requested_modules: + module = BoostDependency.name2lib.get(module, module) + if module in self.lib_modules_mt: + args.append(self.lib_modules_mt[module]) + return args + + def get_link_args(self): + if mesonlib.is_windows(): + return self.get_win_link_args() + args = [] + if self.boost_root: args.append('-L' + os.path.join(self.boost_root, 'lib')) for module in self.requested_modules: module = BoostDependency.name2lib.get(module, module) |