Skip to content

Commit 6925011

Browse files
tangalbert919jpakkane
authored andcommitted
swift: Add support for C++/Objective-C++ interoperability
As of Swift 5.9, C++/Objective-C++ code can be mixed with Swift, and C++ APIs can be imported to Swift. However, this must be explicitly enabled, as it is disabled by default. Xcode 15 introduces a new setting for this, so only set it on Xcode 15 and above.
1 parent 98f5802 commit 6925011

File tree

3 files changed

+14
-0
lines changed

3 files changed

+14
-0
lines changed

mesonbuild/backend/ninjabackend.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2266,6 +2266,10 @@ def generate_swift_target(self, target) -> None:
22662266
os.makedirs(self.get_target_private_dir_abs(target), exist_ok=True)
22672267
compile_args = self.generate_basic_compiler_args(target, swiftc)
22682268
compile_args += swiftc.get_module_args(module_name)
2269+
if mesonlib.version_compare(swiftc.version, '>=5.9'):
2270+
compile_args += swiftc.get_cxx_interoperability_args(target.compilers)
2271+
compile_args += self.build.get_project_args(swiftc, target.subproject, target.for_machine)
2272+
compile_args += self.build.get_global_args(swiftc, target.for_machine)
22692273
for i in reversed(target.get_include_dirs()):
22702274
basedir = i.get_curdir()
22712275
for d in i.get_incdirs():

mesonbuild/backend/xcodebackend.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1596,6 +1596,7 @@ def generate_single_build_target(self, objects_dict, target_name, target) -> Non
15961596
headerdirs = []
15971597
bridging_header = ""
15981598
is_swift = self.is_swift_target(target)
1599+
langs = set()
15991600
for d in target.include_dirs:
16001601
for sd in d.incdirs:
16011602
cd = os.path.join(d.curdir, sd)
@@ -1715,6 +1716,7 @@ def generate_single_build_target(self, objects_dict, target_name, target) -> Non
17151716
lang = 'c'
17161717
elif lang == 'objcpp':
17171718
lang = 'cpp'
1719+
langs.add(lang)
17181720
langname = LANGNAMEMAP[lang]
17191721
langargs.setdefault(langname, [])
17201722
langargs[langname] = cargs + cti_args + args
@@ -1776,6 +1778,8 @@ def generate_single_build_target(self, objects_dict, target_name, target) -> Non
17761778
settings_dict.add_item('SECTORDER_FLAGS', '')
17771779
if is_swift and bridging_header:
17781780
settings_dict.add_item('SWIFT_OBJC_BRIDGING_HEADER', bridging_header)
1781+
if self.objversion >= 60 and 'cpp' in langs:
1782+
settings_dict.add_item('SWIFT_OBJC_INTEROP_MODE', 'objcxx')
17791783
settings_dict.add_item('BUILD_DIR', symroot)
17801784
settings_dict.add_item('OBJROOT', f'{symroot}/build')
17811785
sysheader_arr = PbxArray()

mesonbuild/compilers/swift.py

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -153,6 +153,12 @@ def get_working_directory_args(self, path: str) -> T.Optional[T.List[str]]:
153153

154154
return ['-working-directory', path]
155155

156+
def get_cxx_interoperability_args(self, lang: T.Dict[str, Compiler]) -> T.List[str]:
157+
if 'cpp' in lang or 'objcpp' in lang:
158+
return ['-cxx-interoperability-mode=default']
159+
else:
160+
return ['-cxx-interoperability-mode=off']
161+
156162
def compute_parameters_with_absolute_paths(self, parameter_list: T.List[str],
157163
build_dir: str) -> T.List[str]:
158164
for idx, i in enumerate(parameter_list):

0 commit comments

Comments
 (0)