Added support for calling into C.
This commit is contained in:
parent
961b000090
commit
161d633f36
|
@ -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 []
|
||||
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -0,0 +1,3 @@
|
|||
let num = getNumber()
|
||||
|
||||
print("The number returned from C code is: \(num).")
|
|
@ -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)
|
|
@ -0,0 +1,5 @@
|
|||
#include"mylib.h"
|
||||
|
||||
int getNumber() {
|
||||
return 42;
|
||||
}
|
|
@ -0,0 +1,3 @@
|
|||
#pragma once
|
||||
|
||||
int getNumber();
|
Loading…
Reference in New Issue