aboutsummaryrefslogtreecommitdiff
path: root/mesonbuild/dependencies/dev.py
diff options
context:
space:
mode:
authorDylan Baker <dylan@pnwbakers.com>2019-05-03 10:17:20 -0700
committerGitHub <noreply@github.com>2019-05-03 10:17:20 -0700
commit6c61edeb3036a6b2efd1e8c94496a9954c52b039 (patch)
treedecd649a536ed2c4d050d4715b2d04cfd542f48d /mesonbuild/dependencies/dev.py
parent529d3788ab70785e12735d4aa9a3cf9e64023bc9 (diff)
parent25de6dd67568d1c02ad0ad5358cd3719c428b88b (diff)
downloadmeson-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.py68
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):
'''