1
1
cmake_minimum_required (VERSION 3.1)
2
2
3
- project (libobjc)
4
- enable_language (ASM)
3
+ project (libobjc C ASM CXX)
5
4
6
5
INCLUDE (CheckCXXSourceCompiles)
7
6
@@ -10,13 +9,15 @@ macro(install_symlink filepath sympath)
10
9
install (CODE "message(\" -- Symlinking: ${sympath} -> ${filepath} \" )" )
11
10
endmacro (install_symlink)
12
11
13
- set (CMAKE_C_FLAGS_DEBUG "-g -O0 -fno-inline ${CMAKE_C_FLAGS_DEBUG} " )
12
+ set (CMAKE_C_FLAGS_DEBUG "/Z7 -O0 -Xclang -fno-inline ${CMAKE_C_FLAGS_DEBUG} " )
13
+ set (CMAKE_SHARED_LINKER_FLAGS "/DEBUG /INCREMENTAL:NO ${CMAKE_SHARED_LINKER_FLAGS} " )
14
14
set (CMAKE_C_FLAGS_RELEASE "-O3 ${CMAKE_C_FLAGS_RELEASE} " )
15
- set (CMAKE_C_FLAGS "-std=gnu99 ${CMAKE_C_FLAGS} " )
15
+ set (CMAKE_C_FLAGS "${CMAKE_C_FLAGS} " )
16
16
17
17
set (libobjc_VERSION 4.6)
18
18
19
- set (CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fexceptions" )
19
+ set (CMAKE_C_FLAGS "${CMAKE_C_FLAGS} /EHas -Xclang -fexceptions -Xclang -fobjc-exceptions" )
20
+ set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /EHas" )
20
21
# Build configuration
21
22
add_definitions ( -DGNUSTEP -D__OBJC_RUNTIME_INTERNAL__=1)
22
23
@@ -37,7 +38,6 @@ set(libobjc_C_SRCS
37
38
category_loader.c
38
39
class_table.c
39
40
dtable.c
40
- eh_personality.c
41
41
encoding2.c
42
42
hooks.c
43
43
ivar.c
@@ -68,10 +68,16 @@ set(libobjc_HDRS
68
68
objc/objc.h
69
69
objc/runtime-deprecated.h
70
70
objc/runtime.h
71
- objc/slot.h
72
- )
71
+ objc/slot.h)
72
+
73
+ # Windows does not use DWARF EH
74
+ if (WIN32 )
75
+ list (APPEND libobjc_CXX_SRCS eh_win32_msvc.cc)
76
+ else ()
77
+ list (APPEND libobjc_C_SRCS eh_personality.c)
78
+ set (libobjcxx_CXX_SRCS objcxx_eh.cc)
79
+ endif (WIN32 )
73
80
74
- set (libobjcxx_CXX_SRCS objcxx_eh.cc)
75
81
76
82
# For release builds, we disable spamming the terminal with warnings about
77
83
# selector type mismatches
@@ -154,10 +160,26 @@ endif ()
154
160
155
161
set (INSTALL_TARGETS objc)
156
162
163
+ # On Windows, CMake adds /TC to the clang-cl flags and doesn't provide a way to
164
+ # tell it not to. We fix this by telling clang do disregard that option,
165
+ # unconditionally (which means that it still defaults to C for .c files).
166
+ set (ENV{CCC_OVERRIDE_OPTIONS} "x/TC x/Gm-" )
167
+
168
+ set_source_files_properties (
169
+ ${libobjc_ASM_SRCS}
170
+ LANGUAGE C
171
+ COMPILE_FLAGS "${CMAKE_OBJC_FLAGS} -Xclang -x -Xclang assembler-with-cpp"
172
+ )
173
+
174
+ set_source_files_properties (
175
+ ${libobjc_CXX_SRCS}
176
+ LANGUAGE CXX
177
+ COMPILE_FLAGS "${CMAKE_CXX_FLAGS} "
178
+ )
179
+
157
180
set_source_files_properties (
158
181
${libobjc_OBJC_SRCS}
159
- PROPERTIES LANGUAGE C
160
- COMPILE_FLAGS "${CMAKE_OBJC_FLAGS} "
182
+ COMPILE_FLAGS "${CMAKE_OBJC_FLAGS} -Xclang -x -Xclang objective-c"
161
183
)
162
184
163
185
#
@@ -186,40 +208,55 @@ set(ENABLE_OBJCXX true CACHE BOOL
186
208
187
209
set (CXXRT_IS_STDLIB false )
188
210
189
- add_library (objc SHARED ${libobjc_C_SRCS} ${libobjc_ASM_SRCS} ${libobjc_OBJC_SRCS} )
211
+ add_custom_command (OUTPUT block_trampolines.obj
212
+ COMMAND ${CMAKE_C_COMPILER} -c "${CMAKE_SOURCE_DIR} /block_trampolines.S" -o "${CMAKE_BINARY_DIR} /block_trampolines.obj"
213
+ MAIN_DEPENDENCY block_trampolines.S
214
+ )
215
+ add_custom_command (OUTPUT objc_msgSend.obj
216
+ COMMAND ${CMAKE_C_COMPILER} -c "${CMAKE_SOURCE_DIR} /objc_msgSend.S" -o "${CMAKE_BINARY_DIR} /objc_msgSend.obj"
217
+ MAIN_DEPENDENCY objc_msgSend.S
218
+ DEPENDS objc_msgSend.aarch64.S objc_msgSend.arm.S objc_msgSend.mips.S objc_msgSend.x86-32.S objc_msgSend.x86-64.S
219
+ )
220
+
221
+
222
+ add_library (objc SHARED ${libobjc_C_SRCS} ${libobjc_ASM_SRCS} ${libobjc_OBJC_SRCS} block_trampolines.obj objc_msgSend.obj)
190
223
191
224
if (ENABLE_OBJCXX)
192
- message (STATUS "Testing C++ interop" )
193
- # Try to find libcxxrt.so. We can link to this to provide the C++ ABI
194
- # layer, if it exists.
195
- test_cxx(cxxrt false )
196
- # If it doesn't, then look for GNU libsupc++.so instead (either works,
197
- # they're ABI compatible).
198
- if (NOT CXX_RUNTIME)
199
- test_cxx(supc++ false )
200
- endif (NOT CXX_RUNTIME)
201
- if (NOT CXX_RUNTIME)
202
- test_cxx(c++abi false )
203
- endif (NOT CXX_RUNTIME)
204
-
205
- # If we have a C++ ABI library, then we can produce a single libobjc that
206
- # works for Objective-C and Objective-C++. If not, then we need to provide
207
- # a separate libobjcxx.
208
- if (CXX_RUNTIME)
209
- message (STATUS "Using ${CXX_RUNTIME} as the C++ runtime library" )
210
- else ()
211
- message (STATUS "Testing C++ standard library" )
212
- try_compile (USERUNTIME
213
- "${CMAKE_BINARY_DIR} /CMake"
214
- "${CMAKE_SOURCE_DIR} /CMake"
215
- test_cxx_runtime)
216
- if (${USERUNTIME} )
217
- message (STATUS "libobjc will depend on C++ standard library" )
218
- set (CXXRT_IS_STDLIB true )
225
+ if (WIN32 )
226
+ message (STATUS "Using MSVC-compatible exception model" )
227
+ else ()
228
+ message (STATUS "Testing C++ interop" )
229
+ # Try to find libcxxrt.so. We can link to this to provide the C++ ABI
230
+ # layer, if it exists.
231
+ test_cxx(cxxrt false )
232
+ # If it doesn't, then look for GNU libsupc++.so instead (either works,
233
+ # they're ABI compatible).
234
+ if (NOT CXX_RUNTIME)
235
+ test_cxx(supc++ false )
236
+ endif (NOT CXX_RUNTIME)
237
+ if (NOT CXX_RUNTIME)
238
+ test_cxx(c++abi false )
239
+ endif (NOT CXX_RUNTIME)
240
+
241
+ # If we have a C++ ABI library, then we can produce a single libobjc that
242
+ # works for Objective-C and Objective-C++. If not, then we need to provide
243
+ # a separate libobjcxx.
244
+ if (CXX_RUNTIME)
245
+ message (STATUS "Using ${CXX_RUNTIME} as the C++ runtime library" )
219
246
else ()
220
- message (STATUS "No useable C++ runtime found" )
221
- set (ENABLE_OBJCXX false )
222
- endif ()
247
+ message (STATUS "Testing C++ standard library" )
248
+ try_compile (USERUNTIME
249
+ "${CMAKE_BINARY_DIR} /CMake"
250
+ "${CMAKE_SOURCE_DIR} /CMake"
251
+ test_cxx_runtime)
252
+ if (${USERUNTIME} )
253
+ message (STATUS "libobjc will depend on C++ standard library" )
254
+ set (CXXRT_IS_STDLIB true )
255
+ else ()
256
+ message (STATUS "No useable C++ runtime found" )
257
+ set (ENABLE_OBJCXX false )
258
+ endif ()
259
+ endif ()
223
260
endif ()
224
261
endif (ENABLE_OBJCXX)
225
262
@@ -231,8 +268,8 @@ if (ENABLE_OBJCXX)
231
268
set (CMAKE_CXX_IMPLICIT_LINK_LIBRARIES "" )
232
269
target_link_libraries (objc ${CXX_RUNTIME} )
233
270
endif ()
234
- set ( libobjc_CXX_SRCS ${libobjcxx_CXX_SRCS} )
235
- target_sources (objc PRIVATE ${libobjcxx_CXX_SRCS } )
271
+ list ( APPEND libobjc_CXX_SRCS ${libobjcxx_CXX_SRCS} )
272
+ target_sources (objc PRIVATE ${libobjc_CXX_SRCS } )
236
273
endif ()
237
274
238
275
@@ -264,8 +301,6 @@ if (BUILD_STATIC_LIBOBJC)
264
301
list (APPEND INSTALL_TARGETS objc-static )
265
302
endif ()
266
303
267
-
268
-
269
304
# Explicitly link libgc if we are compiling with gc support.
270
305
if (LIBGC)
271
306
target_link_libraries (objc ${LIBGC} )
0 commit comments