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_new_delete.cpp
     11   cxa_unexpected.cpp
     12   cxa_vector.cpp
     13   cxa_virtual.cpp
     14   # C++ STL files
     15   stdlib_exception.cpp
     16   stdlib_stdexcept.cpp
     17   stdlib_typeinfo.cpp
     18   # Internal files
     19   abort_message.cpp
     20   fallback_malloc.cpp
     21   private_typeinfo.cpp
     22 )
     23 
     24 if (LIBCXXABI_ENABLE_EXCEPTIONS)
     25   list(APPEND LIBCXXABI_SOURCES cxa_exception.cpp)
     26   list(APPEND LIBCXXABI_SOURCES cxa_personality.cpp)
     27 else()
     28   list(APPEND LIBCXXABI_SOURCES cxa_noexception.cpp)
     29 endif()
     30 
     31 if (LIBCXXABI_ENABLE_THREADS AND UNIX AND NOT (APPLE OR CYGWIN))
     32   list(APPEND LIBCXXABI_SOURCES cxa_thread_atexit.cpp)
     33 endif()
     34 
     35 set(LIBCXXABI_HEADERS ../include/cxxabi.h)
     36 
     37 # Add all the headers to the project for IDEs.
     38 if (MSVC_IDE OR XCODE)
     39   # Force them all into the headers dir on MSVC, otherwise they end up at
     40   # project scope because they don't have extensions.
     41   if (MSVC_IDE)
     42     source_group("Header Files" FILES ${LIBCXXABI_HEADERS})
     43   endif()
     44 endif()
     45 
     46 include_directories("${LIBCXXABI_LIBCXX_INCLUDES}")
     47 
     48 if (LIBCXXABI_HAS_CXA_THREAD_ATEXIT_IMPL)
     49   add_definitions(-DHAVE___CXA_THREAD_ATEXIT_IMPL)
     50 endif()
     51 
     52 # Generate library list
     53 set(libraries ${LIBCXXABI_CXX_ABI_LIBRARIES})
     54 
     55 if (LIBCXXABI_ENABLE_THREADS)
     56   append_if(libraries LIBCXXABI_HAS_PTHREAD_LIB pthread)
     57 endif()
     58 
     59 append_if(libraries 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 (TARGET unwind_shared)
     65     list(APPEND libraries unwind_shared)
     66   elseif(TARGET unwind_static)
     67     list(APPEND libraries unwind_static)
     68   else()
     69     list(APPEND libraries unwind)
     70   endif()
     71 else()
     72   append_if(libraries LIBCXXABI_HAS_GCC_S_LIB gcc_s)
     73 endif()
     74 
     75 # Setup flags.
     76 append_if(LIBCXXABI_COMPILE_FLAGS LIBCXXABI_HAS_FPIC_FLAG -fPIC)
     77 append_if(LIBCXXABI_LINK_FLAGS LIBCXXABI_HAS_NODEFAULTLIBS_FLAG -nodefaultlibs)
     78 
     79 set(LIBCXXABI_SHARED_LINK_FLAGS)
     80 
     81 if ( APPLE )
     82   if ( CMAKE_OSX_DEPLOYMENT_TARGET STREQUAL "10.6" )
     83     list(APPEND LIBCXXABI_COMPILE_FLAGS "-U__STRICT_ANSI__")
     84     list(APPEND LIBCXXABI_SHARED_LINK_FLAGS
     85       "-compatibility_version 1"
     86       "-current_version 1"
     87       "-install_name /usr/lib/libc++abi.1.dylib")
     88     list(APPEND LIBCXXABI_LINK_FLAGS
     89         "/usr/lib/libSystem.B.dylib")
     90   else()
     91     list(APPEND LIBCXXABI_SHARED_LINK_FLAGS
     92       "-compatibility_version 1"
     93       "-install_name /usr/lib/libc++abi.1.dylib")
     94   endif()
     95 endif()
     96 
     97 string(REPLACE ";" " " LIBCXXABI_COMPILE_FLAGS "${LIBCXXABI_COMPILE_FLAGS}")
     98 string(REPLACE ";" " " LIBCXXABI_LINK_FLAGS "${LIBCXXABI_LINK_FLAGS}")
     99 string(REPLACE ";" " " LIBCXXABI_SHARED_LINK_FLAGS "${LIBCXXABI_SHARED_LINK_FLAGS}")
    100 
    101 # FIXME: libc++abi.so will not link when modules are enabled because it depends
    102 # on symbols defined in libc++.so which has not yet been built.
    103 if (LLVM_ENABLE_MODULES)
    104   string(REPLACE "-Wl,-z,defs" "" CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS}")
    105 endif()
    106 
    107 # Add a object library that contains the compiled source files.
    108 add_library(cxxabi_objects OBJECT ${LIBCXXABI_SOURCES} ${LIBCXXABI_HEADERS})
    109 
    110 set_target_properties(cxxabi_objects
    111   PROPERTIES
    112     COMPILE_FLAGS "${LIBCXXABI_COMPILE_FLAGS}"
    113   )
    114 
    115 set(LIBCXXABI_TARGETS)
    116 
    117 # Build the shared library.
    118 if (LIBCXXABI_ENABLE_SHARED)
    119   add_library(cxxabi_shared SHARED $<TARGET_OBJECTS:cxxabi_objects>)
    120   target_link_libraries(cxxabi_shared ${libraries})
    121   set_target_properties(cxxabi_shared
    122     PROPERTIES
    123       LINK_FLAGS    "${LIBCXXABI_LINK_FLAGS} ${LIBCXXABI_SHARED_LINK_FLAGS}"
    124       OUTPUT_NAME   "c++abi"
    125       VERSION       "1.0"
    126       SOVERSION     "1"
    127     )
    128   list(APPEND LIBCXXABI_TARGETS "cxxabi_shared")
    129 endif()
    130 
    131 # Build the static library.
    132 if (LIBCXXABI_ENABLE_STATIC)
    133   add_library(cxxabi_static STATIC $<TARGET_OBJECTS:cxxabi_objects>)
    134   target_link_libraries(cxxabi_static ${libraries})
    135   set_target_properties(cxxabi_static
    136     PROPERTIES
    137       LINK_FLAGS    "${LIBCXXABI_LINK_FLAGS}"
    138       OUTPUT_NAME   "c++abi"
    139   )
    140   list(APPEND LIBCXXABI_TARGETS "cxxabi_static")
    141 endif()
    142 
    143 # Add a meta-target for both libraries.
    144 add_custom_target(cxxabi DEPENDS ${LIBCXXABI_TARGETS})
    145 
    146 install(TARGETS ${LIBCXXABI_TARGETS}
    147   LIBRARY DESTINATION lib${LIBCXXABI_LIBDIR_SUFFIX} COMPONENT cxxabi
    148   ARCHIVE DESTINATION lib${LIBCXXABI_LIBDIR_SUFFIX} COMPONENT cxxabi
    149   )
    150 
    151 if (NOT CMAKE_CONFIGURATION_TYPES)
    152   add_custom_target(install-cxxabi
    153     DEPENDS cxxabi
    154     COMMAND "${CMAKE_COMMAND}"
    155             -DCMAKE_INSTALL_COMPONENT=cxxabi
    156             -P "${LIBCXXABI_BINARY_DIR}/cmake_install.cmake")
    157 
    158   # TODO: This is a legacy target name and should be removed at some point.
    159   add_custom_target(install-libcxxabi DEPENDS install-cxxabi)
    160 endif()
    161