aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--mesonbuild/dependencies/data/CMakeListsLLVM.txt70
-rw-r--r--mesonbuild/dependencies/dev.py37
-rw-r--r--setup.py2
-rw-r--r--test cases/common/161 config tool variable/meson.build2
-rw-r--r--test cases/unit/47 native file binary/meson.build2
5 files changed, 108 insertions, 5 deletions
diff --git a/mesonbuild/dependencies/data/CMakeListsLLVM.txt b/mesonbuild/dependencies/data/CMakeListsLLVM.txt
new file mode 100644
index 0000000..3f06441
--- /dev/null
+++ b/mesonbuild/dependencies/data/CMakeListsLLVM.txt
@@ -0,0 +1,70 @@
+cmake_minimum_required(VERSION ${CMAKE_MAJOR_VERSION}.${CMAKE_MINOR_VERSION}.${CMAKE_PATCH_VERSION} )
+
+set(PACKAGE_FOUND FALSE)
+
+while(TRUE)
+ find_package(LLVM REQUIRED CONFIG QUIET)
+
+ # ARCHS has to be set via the CMD interface
+ if(LLVM_FOUND OR "${ARCHS}" STREQUAL "")
+ break()
+ endif()
+
+ list(GET ARCHS 0 CMAKE_LIBRARY_ARCHITECTURE)
+ list(REMOVE_AT ARCHS 0)
+endwhile()
+
+if(LLVM_FOUND)
+ set(PACKAGE_FOUND TRUE)
+
+ llvm_map_components_to_libnames(llvm_libs ${LLVM_MESON_MODULES})
+ set(MESON_RESOLVED_LLVM_MODULES ${llvm_libs})
+
+ # Check the following variables:
+ # LLVM_PACKAGE_VERSION
+ # LLVM_VERSION
+ # LLVM_VERSION_STRING
+ if(NOT DEFINED PACKAGE_VERSION)
+ if(DEFINED LLVM_PACKAGE_VERSION)
+ set(PACKAGE_VERSION "${LLVM_PACKAGE_VERSION}")
+ elseif(DEFINED LLVM_VERSION)
+ set(PACKAGE_VERSION "${LLVM_VERSION}")
+ elseif(DEFINED LLVM_VERSION_STRING)
+ set(PACKAGE_VERSION "${LLVM_VERSION_STRING}")
+ endif()
+ endif()
+
+ # Check the following variables:
+ # LLVM_LIBRARIES
+ # LLVM_LIBS
+ set(libs)
+ if(DEFINED LLVM_LIBRARIES)
+ set(libs LLVM_LIBRARIES)
+ elseif(DEFINED LLVM_LIBS)
+ set(libs LLVM_LIBS)
+ endif()
+
+ # Check the following variables:
+ # LLVM_INCLUDE_DIRS
+ # LLVM_INCLUDES
+ # LLVM_INCLUDE_DIR
+ set(includes)
+ if(DEFINED LLVM_INCLUDE_DIRS)
+ set(includes LLVM_INCLUDE_DIRS)
+ elseif(DEFINED LLVM_INCLUDES)
+ set(includes LLVM_INCLUDES)
+ elseif(DEFINED LLVM_INCLUDE_DIR)
+ set(includes LLVM_INCLUDE_DIR)
+ endif()
+
+ # Check the following variables:
+ # LLVM_DEFINITIONS
+ set(definitions)
+ if(DEFINED LLVM_DEFINITIONS)
+ set(definitions LLVM_DEFINITIONS)
+ endif()
+
+ set(PACKAGE_INCLUDE_DIRS "${${includes}}")
+ set(PACKAGE_DEFINITIONS "${${definitions}}")
+ set(PACKAGE_LIBRARIES "${${libs}}")
+endif()
diff --git a/mesonbuild/dependencies/dev.py b/mesonbuild/dependencies/dev.py
index 2a89606..74e1412 100644
--- a/mesonbuild/dependencies/dev.py
+++ b/mesonbuild/dependencies/dev.py
@@ -24,7 +24,7 @@ from .. import mesonlib
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
@@ -399,6 +399,36 @@ class LLVMDependencyConfigTool(ConfigToolDependency):
return 'modules: ' + ', '.join(self.module_details)
return ''
+class LLVMDependencyCMake(CMakeDependency):
+ def __init__(self, env, kwargs):
+ self.llvm_modules = kwargs.get('modules', [])
+ super().__init__(name='LLVM', environment=env, language='cpp', kwargs=kwargs)
+
+ # Extract extra include directories and definitions
+ incDirs = self.get_cmake_var('PACKAGE_INCLUDE_DIRS')
+ defs = self.get_cmake_var('PACKAGE_DEFINITIONS')
+ temp = list(map(lambda x: '-I{}'.format(x), incDirs)) + defs
+ self.compile_args += [x for x in temp if x not in self.compile_args]
+
+ def _main_cmake_file(self):
+ # Use a custom CMakeLists.txt for LLVM
+ return 'CMakeListsLLVM.txt'
+
+ def _extra_cmake_opts(self):
+ return ['-DLLVM_MESON_MODULES={}'.format(';'.join(self.llvm_modules))]
+
+ def _map_module_list(self, modules):
+ return self.get_cmake_var('MESON_RESOLVED_LLVM_MODULES')
+
+ def need_threads(self):
+ return True
+
+ def log_details(self):
+ modules = self.get_cmake_var('MESON_RESOLVED_LLVM_MODULES')
+ if modules:
+ return 'modules: ' + ', '.join(modules)
+ return ''
+
class LLVMDependency(ExternalDependency):
def __init__(self, env, kwargs):
super().__init__('LLVM', env, 'cpp', kwargs)
@@ -408,6 +438,9 @@ class LLVMDependency(ExternalDependency):
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))
@@ -415,7 +448,7 @@ class LLVMDependency(ExternalDependency):
@staticmethod
def get_methods():
- return [DependencyMethods.CONFIG_TOOL]
+ return [DependencyMethods.CMAKE, DependencyMethods.CONFIG_TOOL]
class ValgrindDependency(PkgConfigDependency):
'''
diff --git a/setup.py b/setup.py
index 07bd3dd..aab740e 100644
--- a/setup.py
+++ b/setup.py
@@ -35,7 +35,7 @@ packages = ['mesonbuild',
'mesonbuild.modules',
'mesonbuild.scripts',
'mesonbuild.wrap']
-package_data = {'mesonbuild.dependencies': ['data/CMakeLists.txt', 'data/CMakePathInfo.txt']}
+package_data = {'mesonbuild.dependencies': ['data/CMakeLists.txt', 'data/CMakeListsLLVM.txt', 'data/CMakePathInfo.txt']}
data_files = []
if sys.platform != 'win32':
# Only useful on UNIX-like systems
diff --git a/test cases/common/161 config tool variable/meson.build b/test cases/common/161 config tool variable/meson.build
index 0643042..9584117 100644
--- a/test cases/common/161 config tool variable/meson.build
+++ b/test cases/common/161 config tool variable/meson.build
@@ -15,7 +15,7 @@
project('config tool variable', 'cpp')
-dep_llvm = dependency('llvm', required : false)
+dep_llvm = dependency('llvm', method : 'config-tool', required : false)
if not dep_llvm.found()
error('MESON_SKIP_TEST LLVM not installed.')
endif
diff --git a/test cases/unit/47 native file binary/meson.build b/test cases/unit/47 native file binary/meson.build
index 4489ac1..c9b6e5d 100644
--- a/test cases/unit/47 native file binary/meson.build
+++ b/test cases/unit/47 native file binary/meson.build
@@ -8,7 +8,7 @@ if case == 'find_program'
assert(result.stdout().strip().endswith('12345'), 'Didn\'t load bash from config file')
elif case == 'config_dep'
add_languages('cpp')
- dep = dependency('llvm')
+ dep = dependency('llvm', method : 'config-tool')
assert(dep.get_configtool_variable('version').endswith('12345'), 'Didn\'t load llvm from config file')
elif case == 'python3'
prog = import('python3').find_python()