diff options
-rw-r--r-- | compilers.py | 3 | ||||
-rw-r--r-- | ninjabackend.py | 28 | ||||
-rw-r--r-- | test cases/swift/5 mixed/main.swift | 3 | ||||
-rw-r--r-- | test cases/swift/5 mixed/meson.build | 6 | ||||
-rw-r--r-- | test cases/swift/5 mixed/mylib.c | 5 | ||||
-rw-r--r-- | test cases/swift/5 mixed/mylib.h | 3 |
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(); |