Home | History | Annotate | Download | only in src
      1 # Get sources
      2 
      3 set(LIBUNWIND_CXX_SOURCES
      4     libunwind.cpp
      5     Unwind-EHABI.cpp)
      6 append_if(LIBUNWIND_CXX_SOURCES APPLE Unwind_AppleExtras.cpp)
      7 
      8 set(LIBUNWIND_C_SOURCES
      9     UnwindLevel1.c
     10     UnwindLevel1-gcc-ext.c
     11     Unwind-sjlj.c)
     12 set_source_files_properties(${LIBUNWIND_C_SOURCES}
     13                             PROPERTIES
     14                               COMPILE_FLAGS "-std=c99")
     15 
     16 set(LIBUNWIND_ASM_SOURCES
     17     UnwindRegistersRestore.S
     18     UnwindRegistersSave.S)
     19 set_source_files_properties(${LIBUNWIND_ASM_SOURCES}
     20                             PROPERTIES
     21                               LANGUAGE C)
     22 
     23 set(LIBUNWIND_HEADERS
     24     AddressSpace.hpp
     25     assembly.h
     26     CompactUnwinder.hpp
     27     config.h
     28     dwarf2.h
     29     DwarfInstructions.hpp
     30     DwarfParser.hpp
     31     libunwind_ext.h
     32     Registers.hpp
     33     RWMutex.hpp
     34     UnwindCursor.hpp
     35     ${CMAKE_CURRENT_SOURCE_DIR}/../include/libunwind.h
     36     ${CMAKE_CURRENT_SOURCE_DIR}/../include/unwind.h)
     37 
     38 append_if(LIBUNWIND_HEADERS APPLE
     39           "${CMAKE_CURRENT_SOURCE_DIR}/../include/mach-o/compact_unwind_encoding.h")
     40 
     41 if (MSVC_IDE)
     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   source_group("Header Files" FILES ${LIBUNWIND_HEADERS})
     45 endif()
     46 
     47 set(LIBUNWIND_SOURCES
     48     ${LIBUNWIND_CXX_SOURCES}
     49     ${LIBUNWIND_C_SOURCES}
     50     ${LIBUNWIND_ASM_SOURCES})
     51 
     52 # Generate library list.
     53 set(libraries ${LIBUNWINDCXX_ABI_LIBRARIES})
     54 append_if(libraries LIBUNWIND_HAS_C_LIB c)
     55 append_if(libraries LIBUNWIND_HAS_DL_LIB dl)
     56 if (LIBUNWIND_ENABLE_THREADS)
     57   append_if(libraries LIBUNWIND_HAS_PTHREAD_LIB pthread)
     58 endif()
     59 
     60 # Setup flags.
     61 append_if(LIBUNWIND_CXX_FLAGS LIBUNWIND_HAS_NO_RTTI_FLAG -fno-rtti)
     62 
     63 append_if(LIBUNWIND_LINK_FLAGS LIBUNWIND_HAS_NODEFAULTLIBS_FLAG -nodefaultlibs)
     64 
     65 if (LIBUNWIND_HAS_NO_EXCEPTIONS_FLAG AND LIBUNWIND_HAS_FUNWIND_TABLES)
     66   list(APPEND LIBUNWIND_COMPILE_FLAGS -fno-exceptions)
     67   list(APPEND LIBUNWIND_COMPILE_FLAGS -funwind-tables)
     68 elseif (LIBUNWIND_ENABLE_SHARED)
     69   message(FATAL_ERROR
     70           "Compiler doesn't support generation of unwind tables if exception "
     71           "support is disabled.  Building libunwind DSO with runtime dependency "
     72           "on C++ ABI library is not supported.")
     73 endif()
     74 
     75 if (APPLE)
     76   list(APPEND LIBUNWIND_COMPILE_FLAGS "-U__STRICT_ANSI__")
     77   list(APPEND LIBUNWIND_LINK_FLAGS
     78        "-compatibility_version 1"
     79        "-install_name /usr/lib/libunwind.1.dylib")
     80 
     81   if (CMAKE_OSX_DEPLOYMENT_TARGET STREQUAL "10.6")
     82     list(APPEND LIBUNWIND_LINK_FLAGS
     83          "-current_version ${LIBUNWIND_VERSION}"
     84          "/usr/lib/libSystem.B.dylib")
     85   endif ()
     86 endif ()
     87 
     88 string(REPLACE ";" " " LIBUNWIND_COMPILE_FLAGS "${LIBUNWIND_COMPILE_FLAGS}")
     89 string(REPLACE ";" " " LIBUNWIND_CXX_FLAGS "${LIBUNWIND_CXX_FLAGS}")
     90 string(REPLACE ";" " " LIBUNWIND_C_FLAGS "${LIBUNWIND_C_FLAGS}")
     91 string(REPLACE ";" " " LIBUNWIND_LINK_FLAGS "${LIBUNWIND_LINK_FLAGS}")
     92 
     93 set_property(SOURCE ${LIBUNWIND_CXX_SOURCES}
     94              APPEND_STRING PROPERTY COMPILE_FLAGS " ${CMAKE_CXX_FLAGS} ${LIBUNWIND_CXX_FLAGS}")
     95 set_property(SOURCE ${LIBUNWIND_C_SOURCES}
     96              APPEND_STRING PROPERTY COMPILE_FLAGS " ${CMAKE_C_FLAGS} ${LIBUNWIND_C_FLAGS}")
     97 
     98 # Add a object library that contains the compiled source files.
     99 add_library(unwind_objects OBJECT ${LIBUNWIND_SOURCES} ${LIBUNWIND_HEADERS})
    100 
    101 set_target_properties(unwind_objects
    102                       PROPERTIES
    103                         COMPILE_FLAGS "${LIBUNWIND_COMPILE_FLAGS}"
    104                         POSITION_INDEPENDENT_CODE ON)
    105 
    106 set(LIBUNWIND_TARGETS)
    107 
    108 # Build the shared library.
    109 if (LIBUNWIND_ENABLE_SHARED)
    110   add_library(unwind_shared SHARED $<TARGET_OBJECTS:unwind_objects>)
    111   target_link_libraries(unwind_shared ${libraries})
    112   set_target_properties(unwind_shared
    113                         PROPERTIES
    114                           LINK_FLAGS    "${LIBUNWIND_LINK_FLAGS}"
    115                           OUTPUT_NAME   "unwind"
    116                           VERSION       "1.0"
    117                           SOVERSION     "1")
    118   list(APPEND LIBUNWIND_TARGETS "unwind_shared")
    119 endif()
    120 
    121 # Build the static library.
    122 if (LIBUNWIND_ENABLE_STATIC)
    123   add_library(unwind_static STATIC $<TARGET_OBJECTS:unwind_objects>)
    124   target_link_libraries(unwind_static ${libraries})
    125   set_target_properties(unwind_static
    126                         PROPERTIES
    127                           LINK_FLAGS    "${LIBUNWIND_LINK_FLAGS}"
    128                           OUTPUT_NAME   "unwind")
    129   list(APPEND LIBUNWIND_TARGETS "unwind_static")
    130 endif()
    131 
    132 # Add a meta-target for both libraries.
    133 add_custom_target(unwind DEPENDS ${LIBUNWIND_TARGETS})
    134 
    135 if (LIBUNWIND_INSTALL_LIBRARY)
    136   install(TARGETS ${LIBUNWIND_TARGETS}
    137     LIBRARY DESTINATION ${LIBUNWIND_INSTALL_PREFIX}lib${LIBUNWIND_LIBDIR_SUFFIX} COMPONENT unwind
    138     ARCHIVE DESTINATION ${LIBUNWIND_INSTALL_PREFIX}lib${LIBUNWIND_LIBDIR_SUFFIX} COMPONENT unwind)
    139 endif()
    140 
    141 if (NOT CMAKE_CONFIGURATION_TYPES AND LIBUNWIND_INSTALL_LIBRARY)
    142   add_custom_target(install-unwind
    143     DEPENDS unwind
    144     COMMAND "${CMAKE_COMMAND}"
    145             -DCMAKE_INSTALL_COMPONENT=unwind
    146             -P "${LIBUNWIND_BINARY_DIR}/cmake_install.cmake")
    147   add_custom_target(install-unwind-stripped
    148     DEPENDS unwind
    149     COMMAND "${CMAKE_COMMAND}"
    150             -DCMAKE_INSTALL_COMPONENT=unwind
    151             -DCMAKE_INSTALL_DO_STRIP=1
    152             -P "${LIBUNWIND_BINARY_DIR}/cmake_install.cmake")
    153 endif()
    154