From 0304ebc9885f29440b0cc48ced79e747c9685cb5 Mon Sep 17 00:00:00 2001 From: Daniel Mensinger Date: Sat, 26 Dec 2020 14:27:11 +0100 Subject: cmake: fix missing languages from CMake (fixes #8132) --- cross/linux-mingw-w64-32bit.txt | 1 + cross/linux-mingw-w64-64bit.txt | 1 + mesonbuild/cmake/interpreter.py | 37 +++++++++++++++++----- test cases/cmake/24 mixing languages/main.c | 5 +++ test cases/cmake/24 mixing languages/meson.build | 13 ++++++++ .../subprojects/cmTest/CMakeLists.txt | 8 +++++ .../subprojects/cmTest/cmTest.c | 13 ++++++++ .../subprojects/cmTest/cmTest.h | 3 ++ .../subprojects/cmTest/cmTest.m | 7 ++++ 9 files changed, 80 insertions(+), 8 deletions(-) create mode 100644 test cases/cmake/24 mixing languages/main.c create mode 100644 test cases/cmake/24 mixing languages/meson.build create mode 100644 test cases/cmake/24 mixing languages/subprojects/cmTest/CMakeLists.txt create mode 100644 test cases/cmake/24 mixing languages/subprojects/cmTest/cmTest.c create mode 100644 test cases/cmake/24 mixing languages/subprojects/cmTest/cmTest.h create mode 100644 test cases/cmake/24 mixing languages/subprojects/cmTest/cmTest.m 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 + +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 + +#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; +} -- cgit v1.1