summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJonathan Schleifer <js@nil.im>2024-08-04 14:55:33 +0200
committerDylan Baker <dylan@pnwbakers.com>2024-08-08 15:56:43 -0700
commit81b151f61138357950330f26b601e0b345bf77fa (patch)
treea1cf56aaf434423bb407e65a418b46b303d93c4f
parent43b80e02ce0e87dfcf069111e62ad8eff4435d6e (diff)
downloadmeson-81b151f61138357950330f26b601e0b345bf77fa.tar.gz
Fix compiling ObjC/ObjC++ on Windows/MinGW
Co-Authored-By: L. E. Segovia <amy@amyspark.me>
-rw-r--r--mesonbuild/cmake/toolchain.py2
-rw-r--r--mesonbuild/compilers/detect.py4
-rw-r--r--mesonbuild/compilers/mixins/clang.py2
-rw-r--r--mesonbuild/compilers/mixins/visualstudio.py2
-rw-r--r--mesonbuild/linkers/linkers.py3
-rw-r--r--test cases/cmake/24 mixing languages/meson.build6
-rw-r--r--test cases/cmake/24 mixing languages/subprojects/cmTest/CMakeLists.txt2
-rw-r--r--test cases/failing build/11 objc werror/meson.build3
-rw-r--r--test cases/failing build/12 objcpp werror/meson.build3
-rw-r--r--test cases/objc/1 simple/meson.build4
-rw-r--r--test cases/objc/2 nsstring/meson.build4
-rw-r--r--test cases/objc/3 objc args/meson.build4
-rw-r--r--test cases/objc/4 c++ project objc subproject/meson.build4
-rw-r--r--test cases/objc/4 c++ project objc subproject/subprojects/foo/meson.build4
-rw-r--r--test cases/objc/5 objfw/meson.build4
-rw-r--r--test cases/objcpp/1 simple/meson.build4
-rw-r--r--test cases/objcpp/2 objc++ args/meson.build4
-rw-r--r--test cases/objcpp/3 objfw/meson.build4
18 files changed, 60 insertions, 3 deletions
diff --git a/mesonbuild/cmake/toolchain.py b/mesonbuild/cmake/toolchain.py
index 1aad0bc3b..89d5d8444 100644
--- a/mesonbuild/cmake/toolchain.py
+++ b/mesonbuild/cmake/toolchain.py
@@ -188,6 +188,8 @@ class CMakeToolchain:
defaults[prefix + 'COMPILER'] = exe_list
if comp_obj.get_id() == 'clang-cl':
defaults['CMAKE_LINKER'] = comp_obj.get_linker_exelist()
+ if lang.startswith('objc') and comp_obj.get_id().startswith('clang'):
+ defaults[f'{prefix}FLAGS'] = ['-D__STDC__=1']
return defaults
diff --git a/mesonbuild/compilers/detect.py b/mesonbuild/compilers/detect.py
index c796c2f38..2e6b88dfc 100644
--- a/mesonbuild/compilers/detect.py
+++ b/mesonbuild/compilers/detect.py
@@ -47,8 +47,8 @@ if is_windows():
defaults['cpp'] = ['icl', 'cl', 'c++', 'g++', 'clang++', 'clang-cl']
# the binary flang-new will be renamed to flang in the foreseeable future
defaults['fortran'] = ['ifort', 'gfortran', 'flang-new', 'flang', 'pgfortran', 'g95']
- defaults['objc'] = ['clang-cl', 'gcc']
- defaults['objcpp'] = ['clang-cl', 'g++']
+ defaults['objc'] = ['clang', 'clang-cl', 'gcc']
+ defaults['objcpp'] = ['clang++', 'clang-cl', 'g++']
defaults['cs'] = ['csc', 'mcs']
else:
if platform.machine().lower() == 'e2k':
diff --git a/mesonbuild/compilers/mixins/clang.py b/mesonbuild/compilers/mixins/clang.py
index 1d2863882..a0d3d5ffb 100644
--- a/mesonbuild/compilers/mixins/clang.py
+++ b/mesonbuild/compilers/mixins/clang.py
@@ -58,6 +58,8 @@ class ClangCompiler(GnuLikeCompiler):
# linkers don't have base_options.
if isinstance(self.linker, AppleDynamicLinker):
self.base_options.add(OptionKey('b_bitcode'))
+ elif isinstance(self.linker, MSVCDynamicLinker):
+ self.base_options.add(OptionKey('b_vscrt'))
# All Clang backends can also do LLVM IR
self.can_compile_suffixes.add('ll')
diff --git a/mesonbuild/compilers/mixins/visualstudio.py b/mesonbuild/compilers/mixins/visualstudio.py
index f095b95e2..78d62cb42 100644
--- a/mesonbuild/compilers/mixins/visualstudio.py
+++ b/mesonbuild/compilers/mixins/visualstudio.py
@@ -383,6 +383,8 @@ class VisualStudioLikeCompiler(Compiler, metaclass=abc.ABCMeta):
# As a last resort, try search in a compiled binary
return self._symbols_have_underscore_prefix_searchbin(env)
+ def get_pie_args(self) -> T.List[str]:
+ return []
class MSVCCompiler(VisualStudioLikeCompiler):
diff --git a/mesonbuild/linkers/linkers.py b/mesonbuild/linkers/linkers.py
index 18157a36b..d00fd7a4b 100644
--- a/mesonbuild/linkers/linkers.py
+++ b/mesonbuild/linkers/linkers.py
@@ -1326,6 +1326,9 @@ class VisualStudioLikeLinkerMixin(DynamicLinkerBase):
def rsp_file_syntax(self) -> RSPFileSyntax:
return self.rsp_syntax
+ def get_pie_args(self) -> T.List[str]:
+ return []
+
class MSVCDynamicLinker(VisualStudioLikeLinkerMixin, DynamicLinker):
diff --git a/test cases/cmake/24 mixing languages/meson.build b/test cases/cmake/24 mixing languages/meson.build
index 55d7a7d68..a4662fe37 100644
--- a/test cases/cmake/24 mixing languages/meson.build
+++ b/test cases/cmake/24 mixing languages/meson.build
@@ -7,6 +7,12 @@ if not add_languages('objc', required : false)
error('MESON_SKIP_TEST: No ObjC compiler')
endif
+objc = meson.get_compiler('objc')
+c = meson.get_compiler('c')
+if c.get_argument_syntax() != objc.get_argument_syntax()
+ error('MESON_SKIP_TEST: cmake cannot mix compiler types on Windows')
+endif
+
cm = import('cmake')
sub_pro = cm.subproject('cmTest')
diff --git a/test cases/cmake/24 mixing languages/subprojects/cmTest/CMakeLists.txt b/test cases/cmake/24 mixing languages/subprojects/cmTest/CMakeLists.txt
index 80a256f0d..a1886115b 100644
--- a/test cases/cmake/24 mixing languages/subprojects/cmTest/CMakeLists.txt
+++ b/test cases/cmake/24 mixing languages/subprojects/cmTest/CMakeLists.txt
@@ -1,6 +1,6 @@
cmake_minimum_required(VERSION 3.5)
-project(cmTest)
+project(cmTest LANGUAGES C OBJC)
include_directories(${CMAKE_CURRENT_BINARY_DIR})
diff --git a/test cases/failing build/11 objc werror/meson.build b/test cases/failing build/11 objc werror/meson.build
index 9f8e47828..5e83d3850 100644
--- a/test cases/failing build/11 objc werror/meson.build
+++ b/test cases/failing build/11 objc werror/meson.build
@@ -2,4 +2,7 @@ project('test', default_options: ['werror=true'])
if not add_languages('objc', required: false)
error('MESON_SKIP_TEST: Objective C not found')
endif
+if get_option('backend').startswith('vs')
+ error('MESON_SKIP_TEST: objcpp is not supported by vs backend')
+endif
executable('prog', 'test.m')
diff --git a/test cases/failing build/12 objcpp werror/meson.build b/test cases/failing build/12 objcpp werror/meson.build
index 5bc9bee21..ee0d7cdba 100644
--- a/test cases/failing build/12 objcpp werror/meson.build
+++ b/test cases/failing build/12 objcpp werror/meson.build
@@ -2,4 +2,7 @@ project('test', default_options: ['werror=true'])
if not add_languages('objcpp', required: false)
error('MESON_SKIP_TEST: Objective C++ not found')
endif
+if get_option('backend').startswith('vs')
+ error('MESON_SKIP_TEST: objcpp is not supported by vs backend')
+endif
executable('prog', 'test.mm')
diff --git a/test cases/objc/1 simple/meson.build b/test cases/objc/1 simple/meson.build
index f9d5c1450..bb45839f1 100644
--- a/test cases/objc/1 simple/meson.build
+++ b/test cases/objc/1 simple/meson.build
@@ -1,4 +1,8 @@
project('objective c', 'objc', default_options: ['c_std=c99'])
+if get_option('backend').startswith('vs')
+ error('MESON_SKIP_TEST: objc is not supported by vs backend')
+endif
+
exe = executable('prog', 'prog.m')
test('objctest', exe)
diff --git a/test cases/objc/2 nsstring/meson.build b/test cases/objc/2 nsstring/meson.build
index 2c483d50d..b12710d73 100644
--- a/test cases/objc/2 nsstring/meson.build
+++ b/test cases/objc/2 nsstring/meson.build
@@ -1,5 +1,9 @@
project('nsstring', 'objc')
+if get_option('backend').startswith('vs')
+ error('MESON_SKIP_TEST: objc is not supported by vs backend')
+endif
+
if host_machine.system() == 'darwin'
dep = dependency('appleframeworks', modules : 'Foundation')
elif host_machine.system() == 'cygwin'
diff --git a/test cases/objc/3 objc args/meson.build b/test cases/objc/3 objc args/meson.build
index 8887d96bc..dd6f50990 100644
--- a/test cases/objc/3 objc args/meson.build
+++ b/test cases/objc/3 objc args/meson.build
@@ -1,4 +1,8 @@
project('objective c args', 'objc')
+if get_option('backend').startswith('vs')
+ error('MESON_SKIP_TEST: objc is not supported by vs backend')
+endif
+
exe = executable('prog', 'prog.m', objc_args : ['-DMESON_TEST'])
test('objective c args', exe)
diff --git a/test cases/objc/4 c++ project objc subproject/meson.build b/test cases/objc/4 c++ project objc subproject/meson.build
index 8a77dedce..946af11f6 100644
--- a/test cases/objc/4 c++ project objc subproject/meson.build
+++ b/test cases/objc/4 c++ project objc subproject/meson.build
@@ -1,5 +1,9 @@
project('master', ['cpp'])
+if get_option('backend').startswith('vs')
+ error('MESON_SKIP_TEST: objc is not supported by vs backend')
+endif
+
foo = subproject('foo')
dep = foo.get_variable('foo_dep')
diff --git a/test cases/objc/4 c++ project objc subproject/subprojects/foo/meson.build b/test cases/objc/4 c++ project objc subproject/subprojects/foo/meson.build
index 2dbf8ab26..5f4d9fd83 100644
--- a/test cases/objc/4 c++ project objc subproject/subprojects/foo/meson.build
+++ b/test cases/objc/4 c++ project objc subproject/subprojects/foo/meson.build
@@ -1,5 +1,9 @@
project('foo', ['objc'])
+if get_option('backend').startswith('vs')
+ error('MESON_SKIP_TEST: objc is not supported by vs backend')
+endif
+
l = static_library('foo', 'foo.m')
foo_dep = declare_dependency(link_with : l)
diff --git a/test cases/objc/5 objfw/meson.build b/test cases/objc/5 objfw/meson.build
index 40ddb7968..761b49f67 100644
--- a/test cases/objc/5 objfw/meson.build
+++ b/test cases/objc/5 objfw/meson.build
@@ -1,5 +1,9 @@
project('objfw build tests', 'objc')
+if get_option('backend').startswith('vs')
+ error('MESON_SKIP_TEST: objc is not supported by vs backend')
+endif
+
objfw_dep = dependency('objfw', required: false)
objfwtest_dep = dependency('objfw', modules: ['ObjFWTest'], required: false)
diff --git a/test cases/objcpp/1 simple/meson.build b/test cases/objcpp/1 simple/meson.build
index c9a5c8498..c3acc879a 100644
--- a/test cases/objcpp/1 simple/meson.build
+++ b/test cases/objcpp/1 simple/meson.build
@@ -1,4 +1,8 @@
project('Objective C++', 'objcpp', default_options: 'cpp_std=c++14')
+if get_option('backend').startswith('vs')
+ error('MESON_SKIP_TEST: objcpp is not supported by vs backend')
+endif
+
exe = executable('objcppprog', 'prog.mm')
test('objcpp', exe)
diff --git a/test cases/objcpp/2 objc++ args/meson.build b/test cases/objcpp/2 objc++ args/meson.build
index e0e34b0f1..8797b619d 100644
--- a/test cases/objcpp/2 objc++ args/meson.build
+++ b/test cases/objcpp/2 objc++ args/meson.build
@@ -1,4 +1,8 @@
project('objective c++ args', 'objcpp')
+if get_option('backend').startswith('vs')
+ error('MESON_SKIP_TEST: objcpp is not supported by vs backend')
+endif
+
exe = executable('prog', 'prog.mm', objcpp_args : ['-DMESON_OBJCPP_TEST'])
test('objective c++ args', exe)
diff --git a/test cases/objcpp/3 objfw/meson.build b/test cases/objcpp/3 objfw/meson.build
index da14681eb..3fcc84dd5 100644
--- a/test cases/objcpp/3 objfw/meson.build
+++ b/test cases/objcpp/3 objfw/meson.build
@@ -1,5 +1,9 @@
project('objfw build tests', 'objcpp')
+if get_option('backend').startswith('vs')
+ error('MESON_SKIP_TEST: objcpp is not supported by vs backend')
+endif
+
objfw_dep = dependency('objfw', required: false)
objfwtest_dep = dependency('objfw', modules: ['ObjFWTest'], required: false)