aboutsummaryrefslogtreecommitdiff
path: root/mesonbuild/dependencies/base.py
diff options
context:
space:
mode:
Diffstat (limited to 'mesonbuild/dependencies/base.py')
-rw-r--r--mesonbuild/dependencies/base.py53
1 files changed, 50 insertions, 3 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)