aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--compilers.py3
-rw-r--r--ninjabackend.py28
-rw-r--r--test cases/swift/5 mixed/main.swift3
-rw-r--r--test cases/swift/5 mixed/meson.build6
-rw-r--r--test cases/swift/5 mixed/mylib.c5
-rw-r--r--test cases/swift/5 mixed/mylib.h3
6 files changed, 42 insertions, 6 deletions
diff --git a/compilers.py b/compilers.py
index ed8d4fb..0567764 100644
--- a/compilers.py
+++ b/compilers.py
@@ -1000,6 +1000,9 @@ class SwiftCompiler(Compiler):
def get_linker_output_args(self, target):
return ['-o', target]
+ def get_header_import_args(self, headername):
+ return ['-import-objc-header', headername]
+
def get_warn_args(self, level):
return []
diff --git a/ninjabackend.py b/ninjabackend.py
index b91250c..1258f07 100644
--- a/ninjabackend.py
+++ b/ninjabackend.py
@@ -844,10 +844,17 @@ class NinjaBackend(backends.Backend):
def target_swift_modulename(self, target):
return target.name
+ def is_swift_target(self, target):
+ for s in target.sources:
+ if s.endswith('swift'):
+ return True
+ return False
+
def determine_swift_dep_modules(self, target):
result = []
for l in target.link_targets:
- result.append(self.swift_module_file_name(l))
+ if self.is_swift_target(l):
+ result.append(self.swift_module_file_name(l))
return result
def determine_swift_dep_dirs(self, target):
@@ -886,12 +893,20 @@ class NinjaBackend(backends.Backend):
module_name = self.target_swift_modulename(target)
swiftc = self.environment.coredata.compilers['swift']
abssrc = []
+ abs_headers = []
+ header_imports = []
for i in target.get_sources():
- if not swiftc.can_compile(i):
+ if swiftc.can_compile(i):
+ relsrc = i.rel_to_builddir(self.build_to_src)
+ abss = os.path.normpath(os.path.join(self.environment.get_build_dir(), relsrc))
+ abssrc.append(abss)
+ elif self.environment.is_header(i):
+ relh = i.rel_to_builddir(self.build_to_src)
+ absh = os.path.normpath(os.path.join(self.environment.get_build_dir(), relh))
+ abs_headers.append(absh)
+ header_imports += swiftc.get_header_import_args(absh)
+ else:
raise InvalidArguments('Swift target %s contains a non-swift source file.' % target.get_basename())
- relsrc = i.rel_to_builddir(self.build_to_src)
- abss = os.path.normpath(os.path.join(self.environment.get_build_dir(), relsrc))
- abssrc.append(abss)
os.makedirs(os.path.join(self.get_target_private_dir_abs(target)), exist_ok=True)
compile_args = swiftc.get_compile_only_args()
compile_args += swiftc.get_module_args(module_name)
@@ -922,7 +937,8 @@ class NinjaBackend(backends.Backend):
'swift_COMPILER',
abssrc)
elem.add_dep(in_module_files + rel_generated)
- elem.add_item('ARGS', compile_args + abs_generated + module_includes)
+ elem.add_dep(abs_headers)
+ elem.add_item('ARGS', compile_args + header_imports + abs_generated + module_includes)
elem.add_item('RUNDIR', rundir)
elem.write(outfile)
self.check_outputs(elem)
diff --git a/test cases/swift/5 mixed/main.swift b/test cases/swift/5 mixed/main.swift
new file mode 100644
index 0000000..5574126
--- /dev/null
+++ b/test cases/swift/5 mixed/main.swift
@@ -0,0 +1,3 @@
+let num = getNumber()
+
+print("The number returned from C code is: \(num).")
diff --git a/test cases/swift/5 mixed/meson.build b/test cases/swift/5 mixed/meson.build
new file mode 100644
index 0000000..71cb99d
--- /dev/null
+++ b/test cases/swift/5 mixed/meson.build
@@ -0,0 +1,6 @@
+project('mixed', 'c', 'swift')
+
+lib = static_library('mylib', 'mylib.c')
+exe = executable('prog', 'main.swift', 'mylib.h',
+ link_with : lib)
+test('c interface', exe)
diff --git a/test cases/swift/5 mixed/mylib.c b/test cases/swift/5 mixed/mylib.c
new file mode 100644
index 0000000..e091836
--- /dev/null
+++ b/test cases/swift/5 mixed/mylib.c
@@ -0,0 +1,5 @@
+#include"mylib.h"
+
+int getNumber() {
+ return 42;
+}
diff --git a/test cases/swift/5 mixed/mylib.h b/test cases/swift/5 mixed/mylib.h
new file mode 100644
index 0000000..21bd9eb
--- /dev/null
+++ b/test cases/swift/5 mixed/mylib.h
@@ -0,0 +1,3 @@
+#pragma once
+
+int getNumber();