@@ -111,3 +111,98 @@ function(add_unittest test_suite test_name)
111
111
112
112
set_property (TARGET ${test_name} APPEND PROPERTY COMPILE_DEFINITIONS GTEST_HAS_RTTI=0)
113
113
endfunction ()
114
+
115
+ # Compile swift sources to a dynamic framework.
116
+ # Usage:
117
+ # target # Target name
118
+ # name # Swift Module name
119
+ # deps # Target dependencies
120
+ # sources # List of sources
121
+ # additional_args # List of additional args to pass
122
+ function (add_swift_module target name deps sources additional_args)
123
+
124
+ set (BUILD_DIR ${CMAKE_CURRENT_BINARY_DIR}${CMAKE_FILES_DIRECTORY} )
125
+
126
+ list (APPEND ARGS -module-name ${name} )
127
+ list (APPEND ARGS -incremental -emit-dependencies -emit-module)
128
+ list (APPEND ARGS -emit-module-path ${name} .swiftmodule)
129
+
130
+ set (FILEMAP ${BUILD_DIR} /output -file-map.json)
131
+ set (OUTPUT_FILE_MAP ${FILEMAP} )
132
+
133
+ # Remove old file and start writing new one.
134
+ file (REMOVE ${FILEMAP} )
135
+ file (APPEND ${FILEMAP} "{\n " )
136
+ foreach (source ${sources} )
137
+ file (APPEND ${FILEMAP} "\" ${CMAKE_CURRENT_SOURCE_DIR} /${source} \" : {\n " )
138
+ file (APPEND ${FILEMAP} "\" dependencies\" : \" ${BUILD_DIR} /${source} .d\" ,\n " )
139
+ set (OBJECT ${BUILD_DIR} /${source} .o)
140
+ list (APPEND OUTPUTS ${OBJECT} )
141
+ file (APPEND ${FILEMAP} "\" object\" : \" ${OBJECT} \" ,\n " )
142
+ file (APPEND ${FILEMAP} "\" swiftmodule\" : \" ${BUILD_DIR} /${source} ~partial.swiftmodule\" ,\n " )
143
+ file (APPEND ${FILEMAP} "\" swift-dependencies\" : \" ${BUILD_DIR} /${source} .swiftdeps\"\n },\n " )
144
+ endforeach ()
145
+ file (APPEND ${FILEMAP} "\"\" : {\n " )
146
+ file (APPEND ${FILEMAP} "\" swift-dependencies\" : \" ${BUILD_DIR} /master.swiftdeps\"\n " )
147
+ file (APPEND ${FILEMAP} "}\n " )
148
+ file (APPEND ${FILEMAP} "}" )
149
+
150
+ list (APPEND ARGS -output -file-map ${OUTPUT_FILE_MAP} )
151
+ list (APPEND ARGS -parse-as-library)
152
+ list (APPEND ARGS -c)
153
+
154
+ foreach (source ${sources} )
155
+ list (APPEND ARGS ${CMAKE_CURRENT_SOURCE_DIR} /${source} )
156
+ endforeach ()
157
+
158
+ # FIXME: Find a better way to handle build types.
159
+ if (CMAKE_BUILD_TYPE STREQUAL "RelWithDebInfo" )
160
+ list (APPEND ARGS -g)
161
+ endif ()
162
+ if (CMAKE_BUILD_TYPE STREQUAL "Debug" )
163
+ list (APPEND ARGS -Onone -g)
164
+ else ()
165
+ list (APPEND ARGS -O -whole-module-optimization)
166
+ endif ()
167
+
168
+ foreach (arg ${additional_args} )
169
+ list (APPEND ARGS ${arg} )
170
+ endforeach ()
171
+
172
+ if (${CMAKE_SYSTEM_NAME} MATCHES "Darwin" )
173
+ list (APPEND ARGS -sdk ${CMAKE_OSX_SYSROOT} )
174
+ endif ()
175
+
176
+ # Compile swiftmodule.
177
+ add_custom_command (
178
+ OUTPUT ${OUTPUTS}
179
+ COMMAND swiftc
180
+ ARGS ${ARGS}
181
+ DEPENDS ${sources}
182
+ )
183
+
184
+ # Link and create dynamic framework.
185
+ set (DYLIB_OUTPUT ${LLBUILD_LIBRARY_OUTPUT_INTDIR} /${target} .dylib)
186
+
187
+ if (${CMAKE_SYSTEM_NAME} MATCHES "Darwin" )
188
+ list (APPEND DYLYB_ARGS -sdk ${CMAKE_OSX_SYSROOT} )
189
+ endif ()
190
+
191
+ list (APPEND DYLYB_ARGS -module-name ${name} )
192
+ list (APPEND DYLYB_ARGS -o ${DYLIB_OUTPUT} )
193
+ list (APPEND DYLYB_ARGS -emit-library ${OUTPUTS} )
194
+ foreach (arg ${additional_args} )
195
+ list (APPEND DYLYB_ARGS ${arg} )
196
+ endforeach ()
197
+ list (APPEND DYLYB_ARGS -L ${LLBUILD_LIBRARY_OUTPUT_INTDIR} )
198
+
199
+ add_custom_command (
200
+ OUTPUT ${DYLIB_OUTPUT}
201
+ COMMAND swiftc
202
+ ARGS ${DYLYB_ARGS}
203
+ DEPENDS ${OUTPUTS}
204
+ )
205
+
206
+ # Add the target.
207
+ add_custom_target (${target} ALL DEPENDS ${deps} ${DYLIB_OUTPUT} ${sources} )
208
+ endfunction ()
0 commit comments