aboutsummaryrefslogtreecommitdiff
path: root/mesonbuild/dependencies
diff options
context:
space:
mode:
authorMichael Hirsch, Ph.D <scivision@users.noreply.github.com>2019-11-27 01:35:15 -0500
committerMichael Hirsch, Ph.D <10931741+scivision@users.noreply.github.com>2019-12-09 11:15:58 -0500
commit98fd4e5557cb21affd2e2c124a132953b471a748 (patch)
treeb350f0499b18795c89378790074a790488a3c351 /mesonbuild/dependencies
parent419a7a8f51fb68cdd40f7005394590a0963d3f32 (diff)
downloadmeson-98fd4e5557cb21affd2e2c124a132953b471a748.zip
meson-98fd4e5557cb21affd2e2c124a132953b471a748.tar.gz
meson-98fd4e5557cb21affd2e2c124a132953b471a748.tar.bz2
cmake: add project language to cmakelists.txt
cmake: get language from Meson project if not specified as depedency(..., langugage: ...) deps: add threads method:cmake dependency('threads', method: 'cmake') is useful for cmake unit tests or those who just want to find threads using cmake. cmake: project(... Fortran) generally also requires C language
Diffstat (limited to 'mesonbuild/dependencies')
-rw-r--r--mesonbuild/dependencies/base.py53
-rw-r--r--mesonbuild/dependencies/data/CMakeLists.txt6
-rw-r--r--mesonbuild/dependencies/misc.py38
3 files changed, 84 insertions, 13 deletions
diff --git a/mesonbuild/dependencies/base.py b/mesonbuild/dependencies/base.py
index 8e7179a..cbc9f65 100644
--- a/mesonbuild/dependencies/base.py
+++ b/mesonbuild/dependencies/base.py
@@ -1037,7 +1037,23 @@ class CMakeDependency(ExternalDependency):
# one module
return module
- def __init__(self, name: str, environment: Environment, kwargs, language=None):
+ def __init__(self, name: str, environment: Environment, kwargs, language: str = None):
+ if language is None:
+ if kwargs.get('native', False):
+ if 'c' in environment.coredata.compilers.build.keys():
+ language = 'c'
+ elif 'cpp' in environment.coredata.compilers.build.keys():
+ language = 'cpp'
+ elif 'fortran' in environment.coredata.compilers.build.keys():
+ language = 'fortran'
+ else:
+ if 'c' in environment.coredata.compilers.host.keys():
+ language = 'c'
+ elif 'cpp' in environment.coredata.compilers.host.keys():
+ language = 'cpp'
+ elif 'fortran' in environment.coredata.compilers.host.keys():
+ language = 'fortran'
+
super().__init__('cmake', environment, language, kwargs)
self.name = name
self.is_libtool = False
@@ -1460,9 +1476,40 @@ class CMakeDependency(ExternalDependency):
build_dir = Path(self.cmake_root_dir) / 'cmake_{}'.format(self.name)
build_dir.mkdir(parents=True, exist_ok=True)
- # Copy the CMakeLists.txt
+ # Insert language parameters into the CMakeLists.txt and write new CMakeLists.txt
src_cmake = Path(__file__).parent / 'data' / cmake_file
- shutil.copyfile(str(src_cmake), str(build_dir / 'CMakeLists.txt')) # str() is for Python 3.5
+ cmake_txt = src_cmake.read_text()
+
+ # In general, some Fortran CMake find_package() also require C language enabled,
+ # even if nothing from C is directly used. An easy Fortran example that fails
+ # without C language is
+ # find_package(Threads)
+ # To make this general to
+ # any other language that might need this, we use a list for all
+ # languages and expand in the cmake Project(... LANGUAGES ...) statement.
+ if self.language is None:
+ cmake_language = ['NONE']
+ elif self.language == 'c':
+ cmake_language = ['C']
+ elif self.language == 'cpp':
+ cmake_language = ['CXX']
+ elif self.language == 'cs':
+ cmake_language = ['CSharp']
+ elif self.language == 'cuda':
+ cmake_language = ['CUDA']
+ elif self.language == 'fortran':
+ cmake_language = ['C', 'Fortran']
+ elif self.language == 'objc':
+ cmake_language = ['OBJC']
+ elif self.language == 'objcpp':
+ cmake_language = ['OBJCXX']
+
+ cmake_txt = """
+cmake_minimum_required(VERSION ${{CMAKE_VERSION}})
+project(MesonTemp LANGUAGES {})
+""".format(' '.join(cmake_language)) + cmake_txt
+
+ (build_dir / 'CMakeLists.txt').write_text(cmake_txt)
return str(build_dir)
diff --git a/mesonbuild/dependencies/data/CMakeLists.txt b/mesonbuild/dependencies/data/CMakeLists.txt
index 64f5b23..b52a69a 100644
--- a/mesonbuild/dependencies/data/CMakeLists.txt
+++ b/mesonbuild/dependencies/data/CMakeLists.txt
@@ -1,4 +1,8 @@
-cmake_minimum_required(VERSION ${CMAKE_MAJOR_VERSION}.${CMAKE_MINOR_VERSION}.${CMAKE_PATCH_VERSION} )
+# fail noisily if attempt to use this file without setting:
+# cmake_minimum_required(VERSION ${CMAKE_VERSION})
+# project(... LANGUAGES ...)
+
+cmake_policy(SET CMP0000 NEW)
set(PACKAGE_FOUND FALSE)
set(_packageName "${NAME}")
diff --git a/mesonbuild/dependencies/misc.py b/mesonbuild/dependencies/misc.py
index bfd450c..d773eb7 100644
--- a/mesonbuild/dependencies/misc.py
+++ b/mesonbuild/dependencies/misc.py
@@ -22,6 +22,7 @@ import sysconfig
from .. import mlog
from .. import mesonlib
from ..environment import detect_cpu_family
+from ..mesonlib import listify
from .base import (
DependencyException, DependencyMethods, ExternalDependency,
@@ -109,15 +110,34 @@ class ThreadDependency(ExternalDependency):
def __init__(self, environment, kwargs):
super().__init__('threads', environment, None, kwargs)
self.name = 'threads'
- self.is_found = True
- # Happens if you are using a language with threads
- # concept without C, such as plain Cuda.
- if self.clib_compiler is None:
- self.compile_args = []
- self.link_args = []
- else:
- self.compile_args = self.clib_compiler.thread_flags(environment)
- self.link_args = self.clib_compiler.thread_link_flags(environment)
+ self.is_found = False
+ methods = listify(self.methods)
+ if DependencyMethods.AUTO in methods:
+ self.is_found = True
+ # Happens if you are using a language with threads
+ # concept without C, such as plain Cuda.
+ if self.clib_compiler is None:
+ self.compile_args = []
+ self.link_args = []
+ else:
+ self.compile_args = self.clib_compiler.thread_flags(environment)
+ self.link_args = self.clib_compiler.thread_link_flags(environment)
+ return
+
+ if DependencyMethods.CMAKE in methods:
+ # for unit tests and for those who simply want
+ # dependency('threads', method: 'cmake')
+ cmakedep = CMakeDependency('Threads', environment, kwargs)
+ if cmakedep.found():
+ self.compile_args = cmakedep.get_compile_args()
+ self.link_args = cmakedep.get_link_args()
+ self.version = cmakedep.get_version()
+ self.is_found = True
+ return
+
+ @staticmethod
+ def get_methods():
+ return [DependencyMethods.AUTO, DependencyMethods.CMAKE]
class BlocksDependency(ExternalDependency):