diff options
author | Michael Hirsch, Ph.D <scivision@users.noreply.github.com> | 2019-11-27 01:35:15 -0500 |
---|---|---|
committer | Michael Hirsch, Ph.D <10931741+scivision@users.noreply.github.com> | 2019-12-09 11:15:58 -0500 |
commit | 98fd4e5557cb21affd2e2c124a132953b471a748 (patch) | |
tree | b350f0499b18795c89378790074a790488a3c351 /mesonbuild/dependencies | |
parent | 419a7a8f51fb68cdd40f7005394590a0963d3f32 (diff) | |
download | meson-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.py | 53 | ||||
-rw-r--r-- | mesonbuild/dependencies/data/CMakeLists.txt | 6 | ||||
-rw-r--r-- | mesonbuild/dependencies/misc.py | 38 |
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): |