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):
|
def get_linker_output_args(self, target):
|
||||||
return ['-o', target]
|
return ['-o', target]
|
||||||
|
|
||||||
|
def get_header_import_args(self, headername):
|
||||||
|
return ['-import-objc-header', headername]
|
||||||
|
|
||||||
def get_warn_args(self, level):
|
def get_warn_args(self, level):
|
||||||
return []
|
return []
|
||||||
|
|
||||||
|
|
|
@ -844,10 +844,17 @@ class NinjaBackend(backends.Backend):
|
||||||
def target_swift_modulename(self, target):
|
def target_swift_modulename(self, target):
|
||||||
return target.name
|
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):
|
def determine_swift_dep_modules(self, target):
|
||||||
result = []
|
result = []
|
||||||
for l in target.link_targets:
|
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
|
return result
|
||||||
|
|
||||||
def determine_swift_dep_dirs(self, target):
|
def determine_swift_dep_dirs(self, target):
|
||||||
|
@ -886,12 +893,20 @@ class NinjaBackend(backends.Backend):
|
||||||
module_name = self.target_swift_modulename(target)
|
module_name = self.target_swift_modulename(target)
|
||||||
swiftc = self.environment.coredata.compilers['swift']
|
swiftc = self.environment.coredata.compilers['swift']
|
||||||
abssrc = []
|
abssrc = []
|
||||||
|
abs_headers = []
|
||||||
|
header_imports = []
|
||||||
for i in target.get_sources():
|
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())
|
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)
|
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_compile_only_args()
|
||||||
compile_args += swiftc.get_module_args(module_name)
|
compile_args += swiftc.get_module_args(module_name)
|
||||||
|
@ -922,7 +937,8 @@ class NinjaBackend(backends.Backend):
|
||||||
'swift_COMPILER',
|
'swift_COMPILER',
|
||||||
abssrc)
|
abssrc)
|
||||||
elem.add_dep(in_module_files + rel_generated)
|
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.add_item('RUNDIR', rundir)
|
||||||
elem.write(outfile)
|
elem.write(outfile)
|
||||||
self.check_outputs(elem)
|
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