@ -73,7 +73,7 @@ set(libobjc_HDRS
o b j c / s l o t . h
)
set ( libobjc _CXX_SRCS objcxx_eh.cc )
set ( libobjc xx _CXX_SRCS objcxx_eh.cc )
# F o r r e l e a s e b u i l d s , w e d i s a b l e s p a m m i n g t h e t e r m i n a l w i t h w a r n i n g s a b o u t
# s e l e c t o r t y p e m i s m a t c h e s
@ -162,18 +162,43 @@ set_source_files_properties(
# C + + R u n t i m e i n t e r a c t i o n
#
function ( test_cxx CXX_RUNTIME_NAME IS_STDLIB )
set ( CXX_RUNTIME_NAME "${CMAKE_SHARED_LIBRARY_PREFIX}${CXX_RUNTIME_NAME}${CMAKE_SHARED_LIBRARY_SUFFIX}" )
message ( STATUS "Testing ${CXX_RUNTIME_NAME} as the C++ runtime library" )
find_library ( CXX_RUNTIME NAMES libsupc++.so )
if ( CXX_RUNTIME )
message ( STATUS "Testing ${CXX_RUNTIME} as the C++ runtime library" )
try_compile ( USERUNTIME
" $ { C M A K E _ B I N A R Y _ D I R } / C M a k e "
" $ { C M A K E _ S O U R C E _ D I R } / C M a k e "
t e s t _ c x x _ r u n t i m e
C M A K E _ F L A G S " - D C X X _ R U N T I M E = $ { C X X _ R U N T I M E } - D T E S T _ L I N K E R _ L A N G U A G E = C " )
if ( ${ USERUNTIME } )
set ( CXX_RUNTIME ${ CXX_RUNTIME } PARENT_SCOPE )
endif ( )
endif ( )
endfunction ( )
set ( ENABLE_OBJCXX true CACHE BOOL
" E n a b l e s u p p o r t f o r O b j e c t i v e - C + + " )
set ( FORCE_LIBOBJCXX false CACHE BOOL
" F o r c e b u i l d i n g a s e p a r a t e O b j e c t i v e - C + + r u n t i m e l i b r a r y " )
set ( CXXRT_IS_STDLIB false )
add_library ( objc SHARED ${ libobjc_C_SRCS } ${ libobjc_ASM_SRCS } ${ libobjc_OBJC_SRCS } )
if ( ENABLE_OBJCXX )
message ( STATUS "Testing C++ interop" )
# T r y t o f i n d l i b c x x r t . s o . W e c a n l i n k t o t h i s t o p r o v i d e t h e C + + A B I
# l a y e r , i f i t e x i s t s .
find_library ( CXX_RUNTIME NAMES libcxxrt.so )
test_cxx( cxxrt false )
# I f i t d o e s n ' t , t h e n l o o k f o r G N U l i b s u p c + + . s o instead ( either works,
# t h e y ' r e A B I c o m p a t i b l e ) .
if ( NOT CXX_RUNTIME )
find_library ( CXX_RUNTIME NAMES libsupc++.so )
test_cxx ( supc++ false )
endif ( NOT CXX_RUNTIME )
if ( NOT CXX_RUNTIME )
test_cxx ( c++abi false )
endif ( NOT CXX_RUNTIME )
# I f w e h a v e a C + + A B I l i b r a r y , t h e n w e c a n p r o d u c e a s i n g l e l i b o b j c t h a t
@ -181,26 +206,34 @@ if (ENABLE_OBJCXX)
# a s e p a r a t e l i b o b j c x x .
if ( CXX_RUNTIME )
message ( STATUS "Using ${CXX_RUNTIME} as the C++ runtime library" )
try_compile ( USERUNTIME
else ( )
message ( STATUS "Testing C++ standard library" )
try_compile ( USERUNTIME
" $ { C M A K E _ B I N A R Y _ D I R } / C M a k e "
" $ { C M A K E _ S O U R C E _ D I R } / C M a k e "
t e s t _ c x x _ r u n t i m e
C M A K E _ F L A G S " - D C X X _ R U N T I M E = $ { C X X _ R U N T I M E } " )
message ( STATUS "Is runtime useable? ${USERUNTIME}" )
if ( NOT ${ USERUNTIME } )
t e s t _ c x x _ r u n t i m e )
if ( ${ USERUNTIME } )
message ( STATUS "libobjc will depend on C++ standard library" )
else ( )
# W e d o n ' t w a n t t o l i n k t h e S T L implementation ( e.g. libstdc++ ) i f
# w e h a v e a s e p a r a t e C + + r u n t i m e .
set ( CMAKE_CXX_IMPLICIT_LINK_LIBRARIES "" )
target_link_libraries ( objc ${ CXX_RUNTIME } )
endif ( )
else ( )
message ( STATUS "libobjc will depend on C++ standard library" )
set ( CXXRT_IS_STDLIB true )
else ( )
message ( STATUS "No useable C++ runtime found" )
set ( ENABLE_OBJCXX false )
endif ( )
endif ( )
endif ( ENABLE_OBJCXX )
if ( ENABLE_OBJCXX )
if ( NOT CXXRT_IS_STDLIB )
# W e d o n ' t w a n t t o l i n k t h e S T L implementation ( e.g. libstdc++ ) i f
# w e h a v e a s e p a r a t e C + + r u n t i m e .
set ( CMAKE_CXX_IMPLICIT_LINK_LIBRARIES "" )
target_link_libraries ( objc ${ CXX_RUNTIME } )
endif ( )
set ( libobjc_CXX_SRCS ${ libobjcxx_CXX_SRCS } )
target_sources ( objc ${ libobjcxx_CXX_SRCS } )
endif ( )
# C u r r e n t l y , w e a c t u a l l y n e e d p t h r e a d s , b u t w e s h o u l d u s e t h e p l a t f o r m ' s n a t i v e
# t h r e a d i n g implementation ( we do for everything except thread-local storage )
@ -210,7 +243,6 @@ set(objc_LINK_FLAGS "${objc_LINK_FLAGS} ${CMAKE_THREAD_LIBS_INIT}")
add_library ( objc SHARED ${ libobjc_C_SRCS } ${ libobjc_ASM_SRCS } ${ libobjc_OBJC_SRCS } ${ libobjc_CXX_SRCS } )
set_target_properties ( objc PROPERTIES
L I N K E R _ L A N G U A G E C