aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDaniel Mensinger <daniel@mensinger-ka.de>2020-12-26 14:27:11 +0100
committerNirbheek Chauhan <nirbheek@centricular.com>2021-01-06 14:53:07 +0530
commit0304ebc9885f29440b0cc48ced79e747c9685cb5 (patch)
treed22a57c8b687553b625608a1f153ce0c47dc2a2e
parent956281b864aa2db86d86086139f841562a395a01 (diff)
downloadmeson-0304ebc9885f29440b0cc48ced79e747c9685cb5.zip
meson-0304ebc9885f29440b0cc48ced79e747c9685cb5.tar.gz
meson-0304ebc9885f29440b0cc48ced79e747c9685cb5.tar.bz2
cmake: fix missing languages from CMake (fixes #8132)
-rw-r--r--cross/linux-mingw-w64-32bit.txt1
-rw-r--r--cross/linux-mingw-w64-64bit.txt1
-rw-r--r--mesonbuild/cmake/interpreter.py37
-rw-r--r--test cases/cmake/24 mixing languages/main.c5
-rw-r--r--test cases/cmake/24 mixing languages/meson.build13
-rw-r--r--test cases/cmake/24 mixing languages/subprojects/cmTest/CMakeLists.txt8
-rw-r--r--test cases/cmake/24 mixing languages/subprojects/cmTest/cmTest.c13
-rw-r--r--test cases/cmake/24 mixing languages/subprojects/cmTest/cmTest.h3
-rw-r--r--test cases/cmake/24 mixing languages/subprojects/cmTest/cmTest.m7
9 files changed, 80 insertions, 8 deletions
diff --git a/cross/linux-mingw-w64-32bit.txt b/cross/linux-mingw-w64-32bit.txt
index e29aa46..caf1da1 100644
--- a/cross/linux-mingw-w64-32bit.txt
+++ b/cross/linux-mingw-w64-32bit.txt
@@ -1,6 +1,7 @@
[binaries]
c = '/usr/bin/i686-w64-mingw32-gcc'
cpp = '/usr/bin/i686-w64-mingw32-g++'
+objc = '/usr/bin/i686-w64-mingw32-gcc'
ar = '/usr/bin/i686-w64-mingw32-ar'
strip = '/usr/bin/i686-w64-mingw32-strip'
pkgconfig = '/usr/bin/i686-w64-mingw32-pkg-config'
diff --git a/cross/linux-mingw-w64-64bit.txt b/cross/linux-mingw-w64-64bit.txt
index 261dad0..f49fb35 100644
--- a/cross/linux-mingw-w64-64bit.txt
+++ b/cross/linux-mingw-w64-64bit.txt
@@ -1,6 +1,7 @@
[binaries]
c = '/usr/bin/x86_64-w64-mingw32-gcc'
cpp = '/usr/bin/x86_64-w64-mingw32-g++'
+objc = '/usr/bin/x86_64-w64-mingw32-gcc'
ar = '/usr/bin/x86_64-w64-mingw32-ar'
strip = '/usr/bin/x86_64-w64-mingw32-strip'
pkgconfig = '/usr/bin/x86_64-w64-mingw32-pkg-config'
diff --git a/mesonbuild/cmake/interpreter.py b/mesonbuild/cmake/interpreter.py
index 68ff600..24395d3 100644
--- a/mesonbuild/cmake/interpreter.py
+++ b/mesonbuild/cmake/interpreter.py
@@ -231,7 +231,7 @@ class ConverterTarget:
if target.install_paths:
self.install_dir = target.install_paths[0]
- self.languages = [] # type: T.List[str]
+ self.languages = set() # type: T.Set[str]
self.sources = [] # type: T.List[Path]
self.generated = [] # type: T.List[Path]
self.generated_ctgt = [] # type: T.List[CustomTargetReference]
@@ -250,19 +250,40 @@ class ConverterTarget:
self.name = _sanitize_cmake_name(self.name)
self.generated_raw = [] # type: T.List[Path]
+
for i in target.files:
- # Determine the meson language
+ languages = set() # type: T.Set[str]
+ src_suffixes = set() # type: T.Set[str]
+
+ # Insert suffixes
+ for j in i.sources:
+ if not j.suffix:
+ continue
+ src_suffixes.add(j.suffix[1:])
+
+ # Determine the meson language(s)
+ # Extract the default language from the explicit CMake field
lang_cmake_to_meson = {val.lower(): key for key, val in language_map.items()}
- lang = lang_cmake_to_meson.get(i.language.lower(), 'c')
- if lang not in self.languages:
- self.languages += [lang]
- if lang not in self.compile_opts:
- self.compile_opts[lang] = []
+ languages.add(lang_cmake_to_meson.get(i.language.lower(), 'c'))
+
+ # Determine missing languages from the source suffixes
+ for sfx in src_suffixes:
+ for key, val in lang_suffixes.items():
+ if sfx in val:
+ languages.add(key)
+ break
+
+ # Register the new languages and initialize the compile opts array
+ for lang in languages:
+ self.languages.add(lang)
+ if lang not in self.compile_opts:
+ self.compile_opts[lang] = []
# Add arguments, but avoid duplicates
args = i.flags
args += ['-D{}'.format(x) for x in i.defines]
- self.compile_opts[lang] += [x for x in args if x not in self.compile_opts[lang]]
+ for lang in languages:
+ self.compile_opts[lang] += [x for x in args if x not in self.compile_opts[lang]]
# Handle include directories
self.includes += [x.path for x in i.includes if x.path not in self.includes and not x.isSystem]
diff --git a/test cases/cmake/24 mixing languages/main.c b/test cases/cmake/24 mixing languages/main.c
new file mode 100644
index 0000000..028a78e
--- /dev/null
+++ b/test cases/cmake/24 mixing languages/main.c
@@ -0,0 +1,5 @@
+#include <cmTest.h>
+
+int main(void) {
+ return doStuff();
+}
diff --git a/test cases/cmake/24 mixing languages/meson.build b/test cases/cmake/24 mixing languages/meson.build
new file mode 100644
index 0000000..4ab1d85
--- /dev/null
+++ b/test cases/cmake/24 mixing languages/meson.build
@@ -0,0 +1,13 @@
+project('CMake mix', ['c', 'cpp'])
+
+if not add_languages('objc', required : false)
+ error('MESON_SKIP_TEST: No ObjC compiler')
+endif
+
+cm = import('cmake')
+
+sub_pro = cm.subproject('cmTest')
+sub_dep = sub_pro.dependency('cmTest', include_type: 'system')
+
+exe1 = executable('exe1', ['main.c'], dependencies: [sub_dep])
+test('test1', exe1)
diff --git a/test cases/cmake/24 mixing languages/subprojects/cmTest/CMakeLists.txt b/test cases/cmake/24 mixing languages/subprojects/cmTest/CMakeLists.txt
new file mode 100644
index 0000000..80a256f
--- /dev/null
+++ b/test cases/cmake/24 mixing languages/subprojects/cmTest/CMakeLists.txt
@@ -0,0 +1,8 @@
+cmake_minimum_required(VERSION 3.5)
+
+project(cmTest)
+
+include_directories(${CMAKE_CURRENT_BINARY_DIR})
+
+add_library(cmTest STATIC cmTest.c cmTest.m)
+target_compile_definitions(cmTest PUBLIC SOME_MAGIC_DEFINE=42)
diff --git a/test cases/cmake/24 mixing languages/subprojects/cmTest/cmTest.c b/test cases/cmake/24 mixing languages/subprojects/cmTest/cmTest.c
new file mode 100644
index 0000000..066d676
--- /dev/null
+++ b/test cases/cmake/24 mixing languages/subprojects/cmTest/cmTest.c
@@ -0,0 +1,13 @@
+#include "cmTest.h"
+#include <stdio.h>
+
+#if SOME_MAGIC_DEFINE != 42
+#error "SOME_MAGIC_DEFINE != 42"
+#endif
+
+int foo(int x);
+
+int doStuff(void) {
+ printf("Hello World\n");
+ return foo(42);
+}
diff --git a/test cases/cmake/24 mixing languages/subprojects/cmTest/cmTest.h b/test cases/cmake/24 mixing languages/subprojects/cmTest/cmTest.h
new file mode 100644
index 0000000..a6a5c24
--- /dev/null
+++ b/test cases/cmake/24 mixing languages/subprojects/cmTest/cmTest.h
@@ -0,0 +1,3 @@
+#pragma once
+
+int doStuff(void);
diff --git a/test cases/cmake/24 mixing languages/subprojects/cmTest/cmTest.m b/test cases/cmake/24 mixing languages/subprojects/cmTest/cmTest.m
new file mode 100644
index 0000000..16ec805
--- /dev/null
+++ b/test cases/cmake/24 mixing languages/subprojects/cmTest/cmTest.m
@@ -0,0 +1,7 @@
+#if SOME_MAGIC_DEFINE != 42
+#error "SOME_MAGIC_DEFINE != 42"
+#endif
+
+int foo(int x) {
+ return 42 - x;
+}