Home | History | Annotate | Download | only in src
      1 # Get sources
      2 set(LIBCXXABI_SOURCES
      3   # C++ABI files
      4   cxa_aux_runtime.cpp
      5   cxa_default_handlers.cpp
      6   cxa_demangle.cpp
      7   cxa_exception_storage.cpp
      8   cxa_guard.cpp
      9   cxa_handlers.cpp
     10   cxa_unexpected.cpp
     11   cxa_vector.cpp
     12   cxa_virtual.cpp
     13   # C++ STL files
     14   stdlib_exception.cpp
     15   stdlib_stdexcept.cpp
     16   stdlib_typeinfo.cpp
     17   # Internal files
     18   abort_message.cpp
     19   fallback_malloc.cpp
     20   private_typeinfo.cpp
     21 )
     22 
     23 if (LIBCXXABI_ENABLE_NEW_DELETE_DEFINITIONS)
     24   list(APPEND LIBCXXABI_SOURCES stdlib_new_delete.cpp)
     25 endif()
     26 
     27 if (LIBCXXABI_ENABLE_EXCEPTIONS)
     28   list(APPEND LIBCXXABI_SOURCES cxa_exception.cpp)
     29   list(APPEND LIBCXXABI_SOURCES cxa_personality.cpp)
     30 else()
     31   list(APPEND LIBCXXABI_SOURCES cxa_noexception.cpp)
     32 endif()
     33 
     34 if (LIBCXXABI_ENABLE_THREADS AND UNIX AND NOT (APPLE OR CYGWIN))
     35   list(APPEND LIBCXXABI_SOURCES cxa_thread_atexit.cpp)
     36 endif()
     37 
     38 set(LIBCXXABI_HEADERS ../include/cxxabi.h)
     39 
     40 # Add all the headers to the project for IDEs.
     41 if (MSVC_IDE OR XCODE)
     42   # Force them all into the headers dir on MSVC, otherwise they end up at
     43   # project scope because they don't have extensions.
     44   if (MSVC_IDE)
     45     source_group("Header Files" FILES ${LIBCXXABI_HEADERS})
     46   endif()
     47 endif()
     48 
     49 include_directories("${LIBCXXABI_LIBCXX_INCLUDES}")
     50 
     51 if (LIBCXXABI_HAS_CXA_THREAD_ATEXIT_IMPL)
     52   add_definitions(-DHAVE___CXA_THREAD_ATEXIT_IMPL)
     53 endif()
     54 
     55 if (LIBCXXABI_ENABLE_THREADS)
     56   add_library_flags_if(LIBCXXABI_HAS_PTHREAD_LIB pthread)
     57 endif()
     58 
     59 add_library_flags_if(LIBCXXABI_HAS_C_LIB c)
     60 if (LIBCXXABI_USE_LLVM_UNWINDER)
     61   # Prefer using the in-tree version of libunwind, either shared or static. If
     62   # none are found fall back to using -lunwind.
     63   # FIXME: Is it correct to prefer the static version of libunwind?
     64   if (NOT LIBCXXABI_ENABLE_STATIC_UNWINDER AND (TARGET unwind_shared OR HAVE_LIBUNWIND))
     65     list(APPEND LIBCXXABI_LIBRARIES unwind_shared)
     66   elseif (LIBCXXABI_ENABLE_STATIC_UNWINDER AND (TARGET unwind_static OR HAVE_LIBUNWIND))
     67     list(APPEND LIBCXXABI_LIBRARIES unwind_static)
     68   else()
     69     list(APPEND LIBCXXABI_LIBRARIES unwind)
     70   endif()
     71 else()
     72   add_library_flags_if(LIBCXXABI_HAS_GCC_S_LIB gcc_s)
     73 endif()
     74 if (MINGW)
     75   # MINGW_LIBRARIES is defined in config-ix.cmake
     76   list(APPEND LIBCXXABI_LIBRARIES ${MINGW_LIBRARIES})
     77 endif()
     78 
     79 # Setup flags.
     80 add_link_flags_if_supported(-nodefaultlibs)
     81 
     82 set(LIBCXXABI_SHARED_LINK_FLAGS)
     83 
     84 if ( APPLE )
     85   if ( CMAKE_OSX_DEPLOYMENT_TARGET STREQUAL "10.6" )
     86     list(APPEND LIBCXXABI_COMPILE_FLAGS "-U__STRICT_ANSI__")
     87     list(APPEND LIBCXXABI_SHARED_LINK_FLAGS
     88       "-compatibility_version 1"
     89       "-current_version 1"
     90       "-install_name /usr/lib/libc++abi.1.dylib")
     91     list(APPEND LIBCXXABI_LINK_FLAGS
     92         "/usr/lib/libSystem.B.dylib")
     93   else()
     94     list(APPEND LIBCXXABI_SHARED_LINK_FLAGS
     95       "-compatibility_version 1"
     96       "-install_name /usr/lib/libc++abi.1.dylib")
     97   endif()
     98 endif()
     99 
    100 split_list(LIBCXXABI_COMPILE_FLAGS)
    101 split_list(LIBCXXABI_LINK_FLAGS)
    102 split_list(LIBCXXABI_SHARED_LINK_FLAGS)
    103 
    104 # FIXME: libc++abi.so will not link when modules are enabled because it depends
    105 # on symbols defined in libc++.so which has not yet been built.
    106 if (LLVM_ENABLE_MODULES)
    107   string(REPLACE "-Wl,-z,defs" "" CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS}")
    108 endif()
    109 
    110 # Add a object library that contains the compiled source files.
    111 add_library(cxxabi_objects OBJECT ${LIBCXXABI_SOURCES} ${LIBCXXABI_HEADERS})
    112 set_target_properties(cxxabi_objects
    113                       PROPERTIES
    114                         CXX_EXTENSIONS
    115                           OFF
    116                         CXX_STANDARD
    117                           11
    118                         CXX_STANDARD_REQUIRED
    119                           ON
    120                         COMPILE_FLAGS
    121                           "${LIBCXXABI_COMPILE_FLAGS}"
    122                         POSITION_INDEPENDENT_CODE
    123                           ON)
    124 
    125 set(LIBCXXABI_TARGETS)
    126 
    127 # Build the shared library.
    128 if (LIBCXXABI_ENABLE_SHARED)
    129   add_library(cxxabi_shared SHARED $<TARGET_OBJECTS:cxxabi_objects>)
    130   target_link_libraries(cxxabi_shared ${LIBCXXABI_LIBRARIES})
    131   set_target_properties(cxxabi_shared
    132                         PROPERTIES
    133                           CXX_EXTENSIONS
    134                             OFF
    135                           CXX_STANDARD
    136                             11
    137                           CXX_STANDARD_REQUIRED
    138                             ON
    139                           LINK_FLAGS
    140                             "${LIBCXXABI_LINK_FLAGS} ${LIBCXXABI_SHARED_LINK_FLAGS}"
    141                           OUTPUT_NAME
    142                             "c++abi"
    143                           POSITION_INDEPENDENT_CODE
    144                             ON
    145                           SOVERSION
    146                             "1"
    147                           VERSION
    148                             "1.0")
    149   list(APPEND LIBCXXABI_TARGETS "cxxabi_shared")
    150 endif()
    151 
    152 # Build the static library.
    153 if (LIBCXXABI_ENABLE_STATIC)
    154   add_library(cxxabi_static STATIC $<TARGET_OBJECTS:cxxabi_objects>)
    155   target_link_libraries(cxxabi_static ${LIBCXXABI_LIBRARIES})
    156   set_target_properties(cxxabi_static
    157                         PROPERTIES
    158                           CXX_EXTENSIONS
    159                             OFF
    160                           CXX_STANDARD
    161                             11
    162                           CXX_STANDARD_REQUIRED
    163                             ON
    164                           LINK_FLAGS
    165                             "${LIBCXXABI_LINK_FLAGS}"
    166                           OUTPUT_NAME
    167                             "c++abi"
    168                           POSITION_INDEPENDENT_CODE
    169                             ON)
    170   list(APPEND LIBCXXABI_TARGETS "cxxabi_static")
    171 endif()
    172 
    173 # Add a meta-target for both libraries.
    174 add_custom_target(cxxabi DEPENDS ${LIBCXXABI_TARGETS})
    175 
    176 install(TARGETS ${LIBCXXABI_TARGETS}
    177   LIBRARY DESTINATION ${LIBCXXABI_INSTALL_PREFIX}lib${LIBCXXABI_LIBDIR_SUFFIX} COMPONENT cxxabi
    178   ARCHIVE DESTINATION ${LIBCXXABI_INSTALL_PREFIX}lib${LIBCXXABI_LIBDIR_SUFFIX} COMPONENT cxxabi
    179   )
    180 
    181 if (NOT CMAKE_CONFIGURATION_TYPES)
    182   add_custom_target(install-cxxabi
    183     DEPENDS cxxabi
    184     COMMAND "${CMAKE_COMMAND}"
    185             -DCMAKE_INSTALL_COMPONENT=cxxabi
    186             -P "${LIBCXXABI_BINARY_DIR}/cmake_install.cmake")
    187 
    188   # TODO: This is a legacy target name and should be removed at some point.
    189   add_custom_target(install-libcxxabi DEPENDS install-cxxabi)
    190 endif()
    191