@@ -94,7 +94,6 @@ set(libobjc_HDRS
9494 objc/objc-arc.h
9595 objc/objc-auto.h
9696 objc/objc-class.h
97- objc/objc-exception.h
9897 objc/objc-runtime.h
9998 objc/objc-visibility.h
10099 objc/objc.h
@@ -107,12 +106,6 @@ set(libobjc_CXX_SRCS
107106 selector_table.cc
108107 )
109108
110- # Windows does not use DWARF EH, except when using the GNU ABI (MinGW)
111- if (WIN32 AND NOT MINGW)
112- list (APPEND libobjc_CXX_SRCS eh_win32_msvc.cc)
113- elseif (NOT MINGW)
114- list (APPEND libobjc_C_SRCS eh_personality.c)
115- endif ()
116109
117110find_package (tsl-robin-map)
118111
@@ -141,6 +134,7 @@ option(LEGACY_COMPAT "Enable legacy compatibility features" OFF)
141134option (DEBUG_ARC_COMPAT
142135 "Log warnings for classes that don't hit ARC fast paths" OFF )
143136option (ENABLE_OBJCXX "Enable support for Objective-C++" ON )
137+ option (ENABLE_EXCEPTIONS "Enable exceptions" ON )
144138option (TESTS "Enable building the tests" )
145139option (EMBEDDED_BLOCKS_RUNTIME "Include an embedded blocks runtime, rather than relying on libBlocksRuntime to supply it" ON )
146140option (STRICT_APPLE_COMPATIBILITY "Use strict Apple compatibility, always defining BOOL as signed char" OFF )
@@ -161,6 +155,17 @@ if (EMBEDDED_BLOCKS_RUNTIME)
161155 list (APPEND libobjc_C_SRCS block_to_imp.c)
162156endif ()
163157
158+ if (ENABLE_EXCEPTIONS)
159+ # Windows does not use DWARF EH, except when using the GNU ABI (MinGW)
160+ if (WIN32 AND NOT MINGW)
161+ list (APPEND libobjc_CXX_SRCS eh_win32_msvc.cc)
162+ elseif (NOT MINGW)
163+ list (APPEND libobjc_C_SRCS eh_personality.c)
164+ endif ()
165+
166+ list (APPEND libobjc_HDRS objc/objc-exception.h)
167+ endif ()
168+
164169if (OLDABI_COMPAT)
165170 list (APPEND libobjc_C_SRCS legacy.c abi_version.c statics_loader.c)
166171 add_definitions (-DOLDABI_COMPAT=1)
@@ -220,23 +225,25 @@ endif()
220225
221226
222227
223- if (WIN32 AND NOT MINGW)
224- message (STATUS "Using MSVC-compatible exception model" )
225- elseif (MINGW)
226- message (STATUS "Using MinGW-compatible exception model" )
227- list (APPEND libobjc_CXX_SRCS objcxx_eh.cc objcxx_eh_mingw.cc)
228- else ()
229- set (EH_PERSONALITY_FLAGS "" )
230- if (CMAKE_CXX_COMPILER_TARGET)
231- list (APPEND EH_PERSONALITY_FLAGS "${CMAKE_CXX_COMPILE_OPTIONS_TARGET}${CMAKE_CXX_COMPILER_TARGET} " )
228+ if (ENABLE_EXCEPTIONS)
229+ if (WIN32 AND NOT MINGW)
230+ message (STATUS "Using MSVC-compatible exception model" )
231+ elseif (MINGW)
232+ message (STATUS "Using MinGW-compatible exception model" )
233+ list (APPEND libobjc_CXX_SRCS objcxx_eh.cc objcxx_eh_mingw.cc)
234+ else ()
235+ set (EH_PERSONALITY_FLAGS "" )
236+ if (CMAKE_CXX_COMPILER_TARGET)
237+ list (APPEND EH_PERSONALITY_FLAGS "${CMAKE_CXX_COMPILE_OPTIONS_TARGET}${CMAKE_CXX_COMPILER_TARGET} " )
238+ endif ()
239+ add_custom_command (OUTPUT eh_trampoline.S
240+ COMMAND ${CMAKE_CXX_COMPILER} ARGS ${EH_PERSONALITY_FLAGS} -fPIC -S "${CMAKE_SOURCE_DIR} /eh_trampoline.cc" -o - -fexceptions -fno-inline | sed "s/__gxx_personality_v0/test_eh_personality/g" > "${CMAKE_BINARY_DIR} /eh_trampoline.S"
241+ MAIN_DEPENDENCY eh_trampoline.cc)
242+ list (APPEND libobjc_ASM_SRCS eh_trampoline.S)
243+ list (APPEND libobjc_CXX_SRCS objcxx_eh.cc)
244+ # Find libm for linking, as some versions of libc++ don't link against it
245+ find_library (M_LIBRARY m)
232246 endif ()
233- add_custom_command (OUTPUT eh_trampoline.S
234- COMMAND ${CMAKE_CXX_COMPILER} ARGS ${EH_PERSONALITY_FLAGS} -fPIC -S "${CMAKE_SOURCE_DIR} /eh_trampoline.cc" -o - -fexceptions -fno-inline | sed "s/__gxx_personality_v0/test_eh_personality/g" > "${CMAKE_BINARY_DIR} /eh_trampoline.S"
235- MAIN_DEPENDENCY eh_trampoline.cc)
236- list (APPEND libobjc_ASM_SRCS eh_trampoline.S)
237- list (APPEND libobjc_CXX_SRCS objcxx_eh.cc)
238- # Find libm for linking, as some versions of libc++ don't link against it
239- find_library (M_LIBRARY m)
240247endif ()
241248
242249if (EMBEDDED_BLOCKS_RUNTIME)
@@ -256,7 +263,9 @@ else ()
256263endif ()
257264
258265add_library (objc SHARED ${libobjc_C_SRCS} ${libobjc_ASM_SRCS} ${libobjc_OBJC_SRCS} ${libobjc_OBJCXX_SRCS} ${libobjc_ASM_OBJS} )
259- target_compile_options (objc PRIVATE "$<$<OR:$<COMPILE_LANGUAGE:OBJC>,$<COMPILE_LANGUAGE:OBJCXX>>:-Wno-gnu-folding-constant;-Wno-deprecated-objc-isa-usage;-Wno-objc-root-class;-fobjc-runtime=gnustep-2.0>$<$<COMPILE_LANGUAGE:C>:-Xclang;-fexceptions;-Wno-gnu-folding-constant>" )
266+
267+ #target_compile_options(objc PRIVATE "$<$<OR:$<COMPILE_LANGUAGE:OBJC>,$<COMPILE_LANGUAGE:OBJCXX>>:-Wno-gnu-folding-constant;-Wno-deprecated-objc-isa-usage;-Wno-objc-root-class;-fobjc-runtime=gnustep-2.0>$<$<COMPILE_LANGUAGE:C>:-Xclang;-fexceptions;-Wno-gnu-folding-constant>")
268+ target_compile_options (objc PRIVATE "$<$<OR:$<COMPILE_LANGUAGE:OBJC>,$<COMPILE_LANGUAGE:OBJCXX>>:-Wno-gnu-folding-constant;-fno-exceptions;-fno-objc-exceptions;-Wno-deprecated-objc-isa-usage;-Wno-objc-root-class;-fobjc-runtime=gnustep-2.0>$<$<COMPILE_LANGUAGE:C>:-Xclang;-Wno-gnu-folding-constant>" )
260269
261270list (APPEND libobjc_CXX_SRCS ${libobjcxx_CXX_SRCS} )
262271target_sources (objc PRIVATE ${libobjc_CXX_SRCS} )
@@ -466,13 +475,15 @@ if (TESTS)
466475 add_subdirectory (Test )
467476endif (TESTS)
468477
469- CHECK_CXX_SOURCE_COMPILES("
470- #include <stdlib.h>
471- extern \" C\" {
472- __attribute__((weak))
473- void *__cxa_allocate_exception(size_t thrown_size) noexcept;
474- }
475- #include <exception>
476- int main() { return 0; }" CXA_ALLOCATE_EXCEPTION_NOEXCEPT_COMPILES)
477-
478- add_compile_definitions ($<IF:$<BOOL :${CXA_ALLOCATE_EXCEPTION_NOEXCEPT_COMPILES} >,CXA_ALLOCATE_EXCEPTION_SPECIFIER=noexcept,CXA_ALLOCATE_EXCEPTION_SPECIFIER>)
478+ if (ENABLE_EXCEPTIONS)
479+ CHECK_CXX_SOURCE_COMPILES("
480+ #include <stdlib.h>
481+ extern \" C\" {
482+ __attribute__((weak))
483+ void *__cxa_allocate_exception(size_t thrown_size) noexcept;
484+ }
485+ #include <exception>
486+ int main() { return 0; }" CXA_ALLOCATE_EXCEPTION_NOEXCEPT_COMPILES)
487+
488+ add_compile_definitions ($<IF:$<BOOL :${CXA_ALLOCATE_EXCEPTION_NOEXCEPT_COMPILES} >,CXA_ALLOCATE_EXCEPTION_SPECIFIER=noexcept,CXA_ALLOCATE_EXCEPTION_SPECIFIER>)
489+ endif ()
0 commit comments