blob: a32f293144719012bd12bd5cac126b38361eae49 [file] [log] [blame]
Eric Fiselierbf9653d2015-03-31 04:15:45 +00001set(LIBCXX_LIB_CMAKEFILES_DIR "${CMAKE_CURRENT_BINARY_DIR}${CMAKE_FILES_DIRECTORY}" PARENT_SCOPE)
2
Michael J. Spencer626916f2010-12-10 19:47:54 +00003# Get sources
Howard Hinnant87c61a62012-03-19 15:40:23 +00004file(GLOB LIBCXX_SOURCES ../src/*.cpp)
Howard Hinnant92a07002011-09-22 19:10:18 +00005if(WIN32)
Howard Hinnant87c61a62012-03-19 15:40:23 +00006 file(GLOB LIBCXX_WIN32_SOURCES ../src/support/win32/*.cpp)
7 list(APPEND LIBCXX_SOURCES ${LIBCXX_WIN32_SOURCES})
Eric Fiselier6cb69ff2014-11-25 21:57:41 +00008elseif("${CMAKE_SYSTEM_NAME}" STREQUAL "SunOS")
9 file(GLOB LIBCXX_SOLARIS_SOURCES ../src/support/solaris/*.c)
10 list(APPEND LIBCXX_SOURCES ${LIBCXX_SOLARIS_SOURCES})
Howard Hinnant92a07002011-09-22 19:10:18 +000011endif()
Michael J. Spencer626916f2010-12-10 19:47:54 +000012
13# Add all the headers to the project for IDEs.
14if (MSVC_IDE OR XCODE)
Howard Hinnant87c61a62012-03-19 15:40:23 +000015 file(GLOB_RECURSE LIBCXX_HEADERS ${CMAKE_CURRENT_SOURCE_DIR}/../include/*)
Howard Hinnant92a07002011-09-22 19:10:18 +000016 if(WIN32)
Howard Hinnant87c61a62012-03-19 15:40:23 +000017 file( GLOB LIBCXX_WIN32_HEADERS ${CMAKE_CURRENT_SOURCE_DIR}/../include/support/win32/*.h)
18 list(APPEND LIBCXX_HEADERS ${LIBCXX_WIN32_HEADERS})
Howard Hinnant92a07002011-09-22 19:10:18 +000019 endif()
Michael J. Spencer626916f2010-12-10 19:47:54 +000020 # 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)
Howard Hinnant87c61a62012-03-19 15:40:23 +000023 source_group("Header Files" FILES ${LIBCXX_HEADERS})
Michael J. Spencer626916f2010-12-10 19:47:54 +000024 endif()
25endif()
26
27if (LIBCXX_ENABLE_SHARED)
28 add_library(cxx SHARED
Howard Hinnant87c61a62012-03-19 15:40:23 +000029 ${LIBCXX_SOURCES}
30 ${LIBCXX_HEADERS}
Michael J. Spencer626916f2010-12-10 19:47:54 +000031 )
32else()
33 add_library(cxx STATIC
Howard Hinnant87c61a62012-03-19 15:40:23 +000034 ${LIBCXX_SOURCES}
35 ${LIBCXX_HEADERS}
Michael J. Spencer626916f2010-12-10 19:47:54 +000036 )
37endif()
38
Eric Fiselierc0b166e2015-03-03 15:59:51 +000039#if LIBCXX_CXX_ABI_LIBRARY_PATH is defined we want to add it to the search path.
40if (DEFINED LIBCXX_CXX_ABI_LIBRARY_PATH)
41 target_link_libraries(cxx "-L${LIBCXX_CXX_ABI_LIBRARY_PATH}")
42endif()
43
Michael J. Spencerdb8a0302012-12-31 19:34:21 +000044if (DEFINED LIBCXX_CXX_ABI_DEPS)
David Fang44ead612014-06-24 20:32:11 +000045 add_dependencies(cxx LIBCXX_CXX_ABI_DEPS)
Michael J. Spencerdb8a0302012-12-31 19:34:21 +000046endif()
Michael J. Spencera358fbe2012-11-30 21:02:29 +000047
Eric Fiselierc0b166e2015-03-03 15:59:51 +000048set(libraries "")
49if (LIBCXX_ENABLE_STATIC_ABI_LIBRARY)
50 # TODO(ericwf): Remove these GNU specific linker flags and let CMake do the
51 # configuration. This will be more portable.
52 list(APPEND libraries "-Wl,--whole-archive" "-Wl,-Bstatic")
53 list(APPEND libraries "${LIBCXX_CXX_ABI_LIBRARY}")
54 list(APPEND libraries "-Wl,-Bdynamic" "-Wl,--no-whole-archive")
55else()
56 list(APPEND libraries "${LIBCXX_CXX_ABI_LIBRARY}")
57endif()
58
Michael J. Spencer626916f2010-12-10 19:47:54 +000059# Generate library list.
60append_if(libraries LIBCXX_HAS_PTHREAD_LIB pthread)
61append_if(libraries LIBCXX_HAS_C_LIB c)
62append_if(libraries LIBCXX_HAS_M_LIB m)
Howard Hinnant20542c02011-05-24 12:54:00 +000063append_if(libraries LIBCXX_HAS_RT_LIB rt)
Michael J. Spencer626916f2010-12-10 19:47:54 +000064append_if(libraries LIBCXX_HAS_GCC_S_LIB gcc_s)
65
Eric Fiselierbf9653d2015-03-31 04:15:45 +000066if (LIBCXX_COVERAGE_LIBRARY)
67 target_link_libraries(cxx ${LIBCXX_COVERAGE_LIBRARY})
68endif()
Michael J. Spencer626916f2010-12-10 19:47:54 +000069target_link_libraries(cxx ${libraries})
70
Eric Fiselier938c96e2015-07-22 00:33:36 +000071if (APPLE AND LLVM_USE_SANITIZER)
72 if ("${LLVM_USE_SANITIZER}" STREQUAL "Address")
73 set(LIBFILE "libclang_rt.asan_osx_dynamic.dylib")
74 elseif("${LLVM_USE_SANITIZER}" STREQUAL "Undefined")
75 set(LIBFILE "libclang_rt.ubsan_osx_dynamic.dylib")
76 else()
77 message(WARNING "LLVM_USE_SANITIZER=${LLVM_USE_SANITIZER} is not supported on OS X")
78 endif()
79 if (LIBFILE)
80 execute_process(COMMAND ${CMAKE_CXX_COMPILER} -print-file-name=lib OUTPUT_VARIABLE LIBDIR RESULT_VARIABLE Result)
81 if (NOT ${Result} EQUAL "0")
82 message(FATAL "Failed to find library resource directory")
83 endif()
84 string(STRIP "${LIBDIR}" LIBDIR)
85 set(LIBDIR "${LIBDIR}/darwin/")
86 if (NOT IS_DIRECTORY "${LIBDIR}")
87 message(FATAL_ERROR "Cannot find compiler-rt directory on OS X required for LLVM_USE_SANITIZER")
88 endif()
89 set(LIBCXX_SANITIZER_LIBRARY "${LIBDIR}/${LIBFILE}")
90 set(LIBCXX_SANITIZER_LIBRARY "${LIBCXX_SANITIZER_LIBRARY}" PARENT_SCOPE)
91 message(STATUS "Manually linking compiler-rt library: ${LIBCXX_SANITIZER_LIBRARY}")
92 target_link_libraries(cxx "${LIBCXX_SANITIZER_LIBRARY}")
93 target_link_libraries(cxx "-Wl,-rpath,${LIBDIR}")
94 endif()
95endif()
96
Eric Fiselierbf9653d2015-03-31 04:15:45 +000097
Michael J. Spencer626916f2010-12-10 19:47:54 +000098# Setup flags.
Eric Fiselier8e2855c2014-11-15 06:26:30 +000099append_if(LIBCXX_COMPILE_FLAGS LIBCXX_HAS_FPIC_FLAG -fPIC)
100append_if(LIBCXX_LINK_FLAGS LIBCXX_HAS_NODEFAULTLIBS_FLAG -nodefaultlibs)
Michael J. Spencer626916f2010-12-10 19:47:54 +0000101
Eric Fiselier4f274d02015-03-27 09:00:45 +0000102if ( APPLE AND (LIBCXX_CXX_ABI_LIBNAME STREQUAL "libcxxabi" OR
103 LIBCXX_CXX_ABI_LIBNAME STREQUAL "none"))
Eric Fiselier45969ec2015-02-21 02:26:24 +0000104 if (NOT DEFINED LIBCXX_LIBCPPABI_VERSION)
105 set(LIBCXX_LIBCPPABI_VERSION "2")
106 endif()
107
Michael Gottesman8a1fc892013-09-02 07:28:03 +0000108 if ( CMAKE_OSX_DEPLOYMENT_TARGET STREQUAL "10.6" )
Eric Fiselier8e2855c2014-11-15 06:26:30 +0000109 list(APPEND LIBCXX_COMPILE_FLAGS "-U__STRICT_ANSI__")
110 list(APPEND LIBCXX_LINK_FLAGS
Michael Gottesman8a1fc892013-09-02 07:28:03 +0000111 "-compatibility_version 1"
Hans Wennborgf3b5f0e2014-08-12 17:32:07 +0000112 "-current_version 1"
Michael Gottesman8a1fc892013-09-02 07:28:03 +0000113 "-install_name /usr/lib/libc++.1.dylib"
114 "-Wl,-reexport_library,/usr/lib/libc++abi.dylib"
115 "-Wl,-unexported_symbols_list,${CMAKE_CURRENT_SOURCE_DIR}/libc++unexp.exp"
116 "/usr/lib/libSystem.B.dylib")
117 else()
118 if ( ${CMAKE_OSX_SYSROOT} )
119 list(FIND ${CMAKE_OSX_ARCHITECTURES} "armv7" OSX_HAS_ARMV7)
120 if (OSX_HAS_ARMV7)
121 set(OSX_RE_EXPORT_LINE
122 "${CMAKE_OSX_SYSROOT}/usr/lib/libc++abi.dylib"
123 "-Wl,-reexported_symbols_list,${CMAKE_CURRENT_SOURCE_DIR}/libc++sjlj-abi.exp")
124 else()
125 set(OSX_RE_EXPORT_LINE
126 "-Wl,-reexport_library,${CMAKE_OSX_SYSROOT}/usr/lib/libc++abi.dylib")
127 endif()
128 else()
129 set (OSX_RE_EXPORT_LINE "/usr/lib/libc++abi.dylib -Wl,-reexported_symbols_list,${CMAKE_CURRENT_SOURCE_DIR}/libc++abi${LIBCXX_LIBCPPABI_VERSION}.exp")
130 endif()
131
Eric Fiselier8e2855c2014-11-15 06:26:30 +0000132 list(APPEND LIBCXX_LINK_FLAGS
Michael Gottesman8a1fc892013-09-02 07:28:03 +0000133 "-compatibility_version 1"
134 "-install_name /usr/lib/libc++.1.dylib"
135 "-Wl,-unexported_symbols_list,${CMAKE_CURRENT_SOURCE_DIR}/libc++unexp.exp"
136 "${OSX_RE_EXPORT_LINE}"
137 "-Wl,-force_symbols_not_weak_list,${CMAKE_CURRENT_SOURCE_DIR}/notweak.exp"
138 "-Wl,-force_symbols_weak_list,${CMAKE_CURRENT_SOURCE_DIR}/weak.exp")
139 endif()
140endif()
141
Eric Fiselier8e2855c2014-11-15 06:26:30 +0000142string(REPLACE ";" " " LIBCXX_COMPILE_FLAGS "${LIBCXX_COMPILE_FLAGS}")
143string(REPLACE ";" " " LIBCXX_LINK_FLAGS "${LIBCXX_LINK_FLAGS}")
Michael Gottesman8a1fc892013-09-02 07:28:03 +0000144
Michael J. Spencer626916f2010-12-10 19:47:54 +0000145set_target_properties(cxx
146 PROPERTIES
Eric Fiselier8e2855c2014-11-15 06:26:30 +0000147 COMPILE_FLAGS "${LIBCXX_COMPILE_FLAGS}"
148 LINK_FLAGS "${LIBCXX_LINK_FLAGS}"
Michael J. Spencer626916f2010-12-10 19:47:54 +0000149 OUTPUT_NAME "c++"
150 VERSION "1.0"
151 SOVERSION "1"
152 )
153
154install(TARGETS cxx
Chandler Carruth7a033ca2014-12-29 12:15:47 +0000155 LIBRARY DESTINATION lib${LIBCXX_LIBDIR_SUFFIX}
156 ARCHIVE DESTINATION lib${LIBCXX_LIBDIR_SUFFIX}
Michael J. Spencer626916f2010-12-10 19:47:54 +0000157 )