forked from apple/foundationdb
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathSwiftToCXXInterop.cmake
84 lines (76 loc) · 3.11 KB
/
SwiftToCXXInterop.cmake
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
include(CompilerChecks)
include(FindSwiftLibs)
function(add_swift_to_cxx_header_gen_target target_name header_target_name header_path)
cmake_parse_arguments(ARG "" "" "SOURCES;FLAGS" ${ARGN})
# Verify toolchain support.
get_filename_component(SwiftBinPath ${CMAKE_Swift_COMPILER} DIRECTORY)
set (SwiftInteropVersionFile ${SwiftBinPath}/../lib/swift/swiftToCxx/experimental-interoperability-version.json)
if (EXISTS ${SwiftInteropVersionFile})
file(READ ${SwiftInteropVersionFile} SwiftInteropVersion)
message(STATUS "Swift: Experimental C++ interop version is ${SwiftInteropVersion}")
if (${SwiftInteropVersion} VERSION_LESS 16)
message(FATAL_ERROR "Swift: reverse interop support is too old. Update your toolchain.")
endif()
else()
message(FATAL_ERROR "Swift: reverse interop is required, but not supported. Update your toolchain.")
endif()
set(target_includes_expr "$<TARGET_PROPERTY:${target_name},INCLUDE_DIRECTORIES>")
if(ARG_SOURCES)
set(target_sources ${ARG_SOURCES})
else()
get_target_property(target_sources ${target_name} SOURCES)
get_target_property(target_source_dir ${target_name} SOURCE_DIR)
list(TRANSFORM target_sources PREPEND "${target_source_dir}/")
endif()
set (SwiftFrontendOpts )
string(REGEX MATCHALL "-Xcc [-=/a-zA-Z0-9_.]+" SwiftXccOptionsFlags "${CMAKE_Swift_FLAGS}")
string(REGEX MATCHALL "-target [-=/a-zA-Z0-9_.]+" SwiftTargetFlags "${CMAKE_Swift_FLAGS}")
string(REGEX MATCHALL "-sdk [-=/a-zA-Z0-9_.]+" SwiftSDKFlags "${CMAKE_Swift_FLAGS}")
string(REGEX MATCHALL "-module-cache-path [-=/a-zA-Z0-9_.]+" SwiftMCFlags "${CMAKE_Swift_FLAGS}")
foreach (flag ${SwiftXccOptionsFlags})
string(SUBSTRING ${flag} 5 -1 clangFlag)
list(APPEND SwiftFrontendOpts "-Xcc")
list(APPEND SwiftFrontendOpts "${clangFlag}")
endforeach()
set(FlagName "-cxx-interoperability-mode")
string(REGEX MATCHALL "${FlagName}=[-_/a-zA-Z0-9.]+" SwiftEqFlags "${CMAKE_Swift_FLAGS}")
foreach (flag ${SwiftEqFlags})
list(APPEND SwiftFrontendOpts "${flag}")
endforeach()
foreach (flag ${SwiftTargetFlags})
string(SUBSTRING ${flag} 8 -1 clangFlag)
list(APPEND SwiftFrontendOpts "-target")
list(APPEND SwiftFrontendOpts "${clangFlag}")
endforeach()
foreach (flag ${SwiftSDKFlags})
string(SUBSTRING ${flag} 5 -1 clangFlag)
list(APPEND SwiftFrontendOpts "-sdk")
list(APPEND SwiftFrontendOpts "${clangFlag}")
endforeach()
foreach (flag ${SwiftMCFlags})
string(SUBSTRING ${flag} 19 -1 clangFlag)
list(APPEND SwiftFrontendOpts "-module-cache-path")
list(APPEND SwiftFrontendOpts "${clangFlag}")
endforeach()
add_custom_command(
OUTPUT
"${header_path}"
COMMAND
${CMAKE_Swift_COMPILER} -frontend -typecheck
${target_sources}
-module-name "${target_name}"
-emit-clang-header-path "${header_path}"
"$<$<BOOL:${target_includes_expr}>:-I$<JOIN:${target_includes_expr},;-I>>"
${ARG_FLAGS}
${SwiftFrontendOpts}
DEPENDS
"${target_sources}"
COMMAND_EXPAND_LISTS
COMMENT
"Generating '${header_path}'"
)
add_custom_target(${header_target_name}
DEPENDS
"${header_path}"
)
endfunction()