1 set(LIBCXX_LIB_CMAKEFILES_DIR "${CMAKE_CURRENT_BINARY_DIR}${CMAKE_FILES_DIRECTORY}" PARENT_SCOPE) 2 3 # Get sources 4 file(GLOB LIBCXX_SOURCES ../src/*.cpp) 5 if(WIN32) 6 file(GLOB LIBCXX_WIN32_SOURCES ../src/support/win32/*.cpp) 7 list(APPEND LIBCXX_SOURCES ${LIBCXX_WIN32_SOURCES}) 8 elseif("${CMAKE_SYSTEM_NAME}" STREQUAL "SunOS") 9 file(GLOB LIBCXX_SOLARIS_SOURCES ../src/support/solaris/*.c) 10 list(APPEND LIBCXX_SOURCES ${LIBCXX_SOLARIS_SOURCES}) 11 endif() 12 13 # Add all the headers to the project for IDEs. 14 if (MSVC_IDE OR XCODE) 15 file(GLOB_RECURSE LIBCXX_HEADERS ${CMAKE_CURRENT_SOURCE_DIR}/../include/*) 16 if(WIN32) 17 file( GLOB LIBCXX_WIN32_HEADERS ${CMAKE_CURRENT_SOURCE_DIR}/../include/support/win32/*.h) 18 list(APPEND LIBCXX_HEADERS ${LIBCXX_WIN32_HEADERS}) 19 endif() 20 # Force them all into the headers dir on MSVC, otherwise they end up at 21 # project scope because they don't have extensions. 22 if (MSVC_IDE) 23 source_group("Header Files" FILES ${LIBCXX_HEADERS}) 24 endif() 25 endif() 26 27 if (LIBCXX_ENABLE_SHARED) 28 add_library(cxx SHARED ${LIBCXX_SOURCES} ${LIBCXX_HEADERS}) 29 else() 30 add_library(cxx STATIC ${LIBCXX_SOURCES} ${LIBCXX_HEADERS}) 31 endif() 32 33 if (DEFINED LIBCXX_CXX_ABI_DEPS) 34 add_dependencies(cxx LIBCXX_CXX_ABI_DEPS) 35 endif() 36 37 #if LIBCXX_CXX_ABI_LIBRARY_PATH is defined we want to add it to the search path. 38 add_link_flags_if(LIBCXX_CXX_ABI_LIBRARY_PATH "-L${LIBCXX_CXX_ABI_LIBRARY_PATH}") 39 40 add_library_flags_if(LIBCXX_COVERAGE_LIBRARY "${LIBCXX_COVERAGE_LIBRARY}") 41 42 add_library_flags_if(LIBCXX_ENABLE_STATIC_ABI_LIBRARY "-Wl,--whole-archive" "-Wl,-Bstatic") 43 add_library_flags("${LIBCXX_CXX_ABI_LIBRARY}") 44 add_library_flags_if(LIBCXX_ENABLE_STATIC_ABI_LIBRARY "-Wl,-Bdynamic" "-Wl,--no-whole-archive") 45 46 if (APPLE AND LLVM_USE_SANITIZER) 47 if ("${LLVM_USE_SANITIZER}" STREQUAL "Address") 48 set(LIBFILE "libclang_rt.asan_osx_dynamic.dylib") 49 elseif("${LLVM_USE_SANITIZER}" STREQUAL "Undefined") 50 set(LIBFILE "libclang_rt.ubsan_osx_dynamic.dylib") 51 else() 52 message(WARNING "LLVM_USE_SANITIZER=${LLVM_USE_SANITIZER} is not supported on OS X") 53 endif() 54 if (LIBFILE) 55 execute_process(COMMAND ${CMAKE_CXX_COMPILER} -print-file-name=lib OUTPUT_VARIABLE LIBDIR RESULT_VARIABLE Result) 56 if (NOT ${Result} EQUAL "0") 57 message(FATAL "Failed to find library resource directory") 58 endif() 59 string(STRIP "${LIBDIR}" LIBDIR) 60 set(LIBDIR "${LIBDIR}/darwin/") 61 if (NOT IS_DIRECTORY "${LIBDIR}") 62 message(FATAL_ERROR "Cannot find compiler-rt directory on OS X required for LLVM_USE_SANITIZER") 63 endif() 64 set(LIBCXX_SANITIZER_LIBRARY "${LIBDIR}/${LIBFILE}") 65 set(LIBCXX_SANITIZER_LIBRARY "${LIBCXX_SANITIZER_LIBRARY}" PARENT_SCOPE) 66 message(STATUS "Manually linking compiler-rt library: ${LIBCXX_SANITIZER_LIBRARY}") 67 add_library_flags("${LIBCXX_SANITIZER_LIBRARY}") 68 add_link_flags("-Wl,-rpath,${LIBDIR}") 69 endif() 70 endif() 71 72 # Generate library list. 73 add_library_flags_if(LIBCXX_HAS_PTHREAD_LIB pthread) 74 add_library_flags_if(LIBCXX_HAS_C_LIB c) 75 add_library_flags_if(LIBCXX_HAS_M_LIB m) 76 add_library_flags_if(LIBCXX_HAS_RT_LIB rt) 77 add_library_flags_if(LIBCXX_HAS_GCC_S_LIB gcc_s) 78 79 # Setup flags. 80 add_flags_if_supported(-fPIC) 81 add_link_flags_if_supported(-nodefaultlibs) 82 83 if ( APPLE AND (LIBCXX_CXX_ABI_LIBNAME STREQUAL "libcxxabi" OR 84 LIBCXX_CXX_ABI_LIBNAME STREQUAL "none")) 85 if (NOT DEFINED LIBCXX_LIBCPPABI_VERSION) 86 set(LIBCXX_LIBCPPABI_VERSION "2") 87 endif() 88 89 if ( CMAKE_OSX_DEPLOYMENT_TARGET STREQUAL "10.6" ) 90 add_definitions(-D__STRICT_ANSI__) 91 add_link_flags( 92 "-compatibility_version 1" 93 "-current_version 1" 94 "-install_name /usr/lib/libc++.1.dylib" 95 "-Wl,-reexport_library,/usr/lib/libc++abi.dylib" 96 "-Wl,-unexported_symbols_list,${CMAKE_CURRENT_SOURCE_DIR}/libc++unexp.exp" 97 "/usr/lib/libSystem.B.dylib") 98 else() 99 if ( ${CMAKE_OSX_SYSROOT} ) 100 list(FIND ${CMAKE_OSX_ARCHITECTURES} "armv7" OSX_HAS_ARMV7) 101 if (OSX_HAS_ARMV7) 102 set(OSX_RE_EXPORT_LINE 103 "${CMAKE_OSX_SYSROOT}/usr/lib/libc++abi.dylib" 104 "-Wl,-reexported_symbols_list,${CMAKE_CURRENT_SOURCE_DIR}/libc++sjlj-abi.exp") 105 else() 106 set(OSX_RE_EXPORT_LINE 107 "-Wl,-reexport_library,${CMAKE_OSX_SYSROOT}/usr/lib/libc++abi.dylib") 108 endif() 109 else() 110 set (OSX_RE_EXPORT_LINE "/usr/lib/libc++abi.dylib -Wl,-reexported_symbols_list,${CMAKE_CURRENT_SOURCE_DIR}/libc++abi${LIBCXX_LIBCPPABI_VERSION}.exp") 111 endif() 112 113 add_link_flags( 114 "-compatibility_version 1" 115 "-install_name /usr/lib/libc++.1.dylib" 116 "-Wl,-unexported_symbols_list,${CMAKE_CURRENT_SOURCE_DIR}/libc++unexp.exp" 117 "${OSX_RE_EXPORT_LINE}" 118 "-Wl,-force_symbols_not_weak_list,${CMAKE_CURRENT_SOURCE_DIR}/notweak.exp" 119 "-Wl,-force_symbols_weak_list,${CMAKE_CURRENT_SOURCE_DIR}/weak.exp") 120 endif() 121 endif() 122 123 target_link_libraries(cxx ${LIBCXX_LIBRARIES}) 124 split_list(LIBCXX_COMPILE_FLAGS) 125 split_list(LIBCXX_LINK_FLAGS) 126 127 set_target_properties(cxx 128 PROPERTIES 129 COMPILE_FLAGS "${LIBCXX_COMPILE_FLAGS}" 130 LINK_FLAGS "${LIBCXX_LINK_FLAGS}" 131 OUTPUT_NAME "c++" 132 VERSION "1.0" 133 SOVERSION "1" 134 ) 135 136 install(TARGETS cxx 137 LIBRARY DESTINATION lib${LIBCXX_LIBDIR_SUFFIX} 138 ARCHIVE DESTINATION lib${LIBCXX_LIBDIR_SUFFIX} 139 ) 140