diff options
author | Dylan Baker <dylan@pnwbakers.com> | 2019-05-03 10:17:20 -0700 |
---|---|---|
committer | GitHub <noreply@github.com> | 2019-05-03 10:17:20 -0700 |
commit | 6c61edeb3036a6b2efd1e8c94496a9954c52b039 (patch) | |
tree | decd649a536ed2c4d050d4715b2d04cfd542f48d /mesonbuild/dependencies/dev.py | |
parent | 529d3788ab70785e12735d4aa9a3cf9e64023bc9 (diff) | |
parent | 25de6dd67568d1c02ad0ad5358cd3719c428b88b (diff) | |
download | meson-6c61edeb3036a6b2efd1e8c94496a9954c52b039.zip meson-6c61edeb3036a6b2efd1e8c94496a9954c52b039.tar.gz meson-6c61edeb3036a6b2efd1e8c94496a9954c52b039.tar.bz2 |
Merge pull request #5185 from mensinda/cmakeLLVM
CMake llvm dependency backend
Diffstat (limited to 'mesonbuild/dependencies/dev.py')
-rw-r--r-- | mesonbuild/dependencies/dev.py | 68 |
1 files changed, 65 insertions, 3 deletions
diff --git a/mesonbuild/dependencies/dev.py b/mesonbuild/dependencies/dev.py index 5ee85bf..4d541a3 100644 --- a/mesonbuild/dependencies/dev.py +++ b/mesonbuild/dependencies/dev.py @@ -20,14 +20,16 @@ import glob import os import re -from .. import mesonlib +from .. import mesonlib, mlog from ..mesonlib import version_compare, stringlistify, extract_as_list, MachineChoice from .base import ( DependencyException, DependencyMethods, ExternalDependency, PkgConfigDependency, - strip_system_libdirs, ConfigToolDependency, + strip_system_libdirs, ConfigToolDependency, CMakeDependency ) from .misc import ThreadDependency +from typing import List, Tuple + def get_shared_library_suffix(environment, native): """This is only gauranteed to work for languages that compile to machine @@ -192,7 +194,7 @@ class GMockDependency(ExternalDependency): return [DependencyMethods.PKGCONFIG, DependencyMethods.SYSTEM] -class LLVMDependency(ConfigToolDependency): +class LLVMDependencyConfigTool(ConfigToolDependency): """ LLVM uses a special tool, llvm-config, which has arguments for getting c args, cxx args, and ldargs as well as version. @@ -399,6 +401,66 @@ class LLVMDependency(ConfigToolDependency): return 'modules: ' + ', '.join(self.module_details) return '' +class LLVMDependencyCMake(CMakeDependency): + def __init__(self, env, kwargs): + self.llvm_modules = stringlistify(extract_as_list(kwargs, 'modules')) + self.llvm_opt_modules = stringlistify(extract_as_list(kwargs, 'optional_modules')) + super().__init__(name='LLVM', environment=env, language='cpp', kwargs=kwargs) + + # Extract extra include directories and definitions + inc_dirs = self.get_cmake_var('PACKAGE_INCLUDE_DIRS') + defs = self.get_cmake_var('PACKAGE_DEFINITIONS') + temp = ['-I' + x for x in inc_dirs] + defs + self.compile_args += [x for x in temp if x not in self.compile_args] + self._add_sub_dependency(ThreadDependency, env, kwargs) + + def _main_cmake_file(self) -> str: + # Use a custom CMakeLists.txt for LLVM + return 'CMakeListsLLVM.txt' + + def _extra_cmake_opts(self) -> List[str]: + return ['-DLLVM_MESON_MODULES={}'.format(';'.join(self.llvm_modules + self.llvm_opt_modules))] + + def _map_module_list(self, modules: List[Tuple[str, bool]]) -> List[Tuple[str, bool]]: + res = [] + for mod, required in modules: + cm_targets = self.get_cmake_var('MESON_LLVM_TARGETS_{}'.format(mod)) + if not cm_targets: + if required: + raise self._gen_exception('LLVM module {} was not found'.format(mod)) + else: + mlog.warning('Optional LLVM module', mlog.bold(mod), 'was not found') + continue + for i in cm_targets: + res += [(i, required)] + return res + + def _original_module_name(self, module: str) -> str: + orig_name = self.get_cmake_var('MESON_TARGET_TO_LLVM_{}'.format(module)) + if orig_name: + return orig_name[0] + return module + +class LLVMDependency(ExternalDependency): + def __init__(self, env, kwargs): + super().__init__('LLVM', env, 'cpp', kwargs) + + @classmethod + def _factory(cls, env, kwargs): + methods = cls._process_method_kw(kwargs) + candidates = [] + + if DependencyMethods.CMAKE in methods: + candidates.append(functools.partial(LLVMDependencyCMake, env, kwargs)) + + if DependencyMethods.CONFIG_TOOL in methods: + candidates.append(functools.partial(LLVMDependencyConfigTool, env, kwargs)) + + return candidates + + @staticmethod + def get_methods(): + return [DependencyMethods.CMAKE, DependencyMethods.CONFIG_TOOL] class ValgrindDependency(PkgConfigDependency): ''' |