1*58b9f456SAndroid Build Coastguard Workerset(LIBCXX_LIB_CMAKEFILES_DIR "${CMAKE_CURRENT_BINARY_DIR}${CMAKE_FILES_DIRECTORY}" PARENT_SCOPE) 2*58b9f456SAndroid Build Coastguard Worker 3*58b9f456SAndroid Build Coastguard Worker# Get sources 4*58b9f456SAndroid Build Coastguard Worker# FIXME: Don't use glob here 5*58b9f456SAndroid Build Coastguard Workerfile(GLOB LIBCXX_SOURCES ../src/*.cpp) 6*58b9f456SAndroid Build Coastguard Workerif(WIN32) 7*58b9f456SAndroid Build Coastguard Worker file(GLOB LIBCXX_WIN32_SOURCES ../src/support/win32/*.cpp) 8*58b9f456SAndroid Build Coastguard Worker list(APPEND LIBCXX_SOURCES ${LIBCXX_WIN32_SOURCES}) 9*58b9f456SAndroid Build Coastguard Workerelseif("${CMAKE_SYSTEM_NAME}" STREQUAL "SunOS") 10*58b9f456SAndroid Build Coastguard Worker file(GLOB LIBCXX_SOLARIS_SOURCES ../src/support/solaris/*.cpp) 11*58b9f456SAndroid Build Coastguard Worker list(APPEND LIBCXX_SOURCES ${LIBCXX_SOLARIS_SOURCES}) 12*58b9f456SAndroid Build Coastguard Workerendif() 13*58b9f456SAndroid Build Coastguard Worker 14*58b9f456SAndroid Build Coastguard Worker# Add all the headers to the project for IDEs. 15*58b9f456SAndroid Build Coastguard Workerif (LIBCXX_CONFIGURE_IDE) 16*58b9f456SAndroid Build Coastguard Worker file(GLOB_RECURSE LIBCXX_HEADERS ${CMAKE_CURRENT_SOURCE_DIR}/../include/*) 17*58b9f456SAndroid Build Coastguard Worker if(WIN32) 18*58b9f456SAndroid Build Coastguard Worker file( GLOB LIBCXX_WIN32_HEADERS ${CMAKE_CURRENT_SOURCE_DIR}/../include/support/win32/*.h) 19*58b9f456SAndroid Build Coastguard Worker list(APPEND LIBCXX_HEADERS ${LIBCXX_WIN32_HEADERS}) 20*58b9f456SAndroid Build Coastguard Worker endif() 21*58b9f456SAndroid Build Coastguard Worker # Force them all into the headers dir on MSVC, otherwise they end up at 22*58b9f456SAndroid Build Coastguard Worker # project scope because they don't have extensions. 23*58b9f456SAndroid Build Coastguard Worker if (MSVC_IDE) 24*58b9f456SAndroid Build Coastguard Worker source_group("Header Files" FILES ${LIBCXX_HEADERS}) 25*58b9f456SAndroid Build Coastguard Worker endif() 26*58b9f456SAndroid Build Coastguard Workerendif() 27*58b9f456SAndroid Build Coastguard Worker 28*58b9f456SAndroid Build Coastguard Workerif(NOT LIBCXX_INSTALL_LIBRARY) 29*58b9f456SAndroid Build Coastguard Worker set(exclude_from_all EXCLUDE_FROM_ALL) 30*58b9f456SAndroid Build Coastguard Workerendif() 31*58b9f456SAndroid Build Coastguard Worker 32*58b9f456SAndroid Build Coastguard Worker# If LIBCXX_CXX_ABI_LIBRARY_PATH is defined we want to add it to the search path. 33*58b9f456SAndroid Build Coastguard Workeradd_link_flags_if(LIBCXX_CXX_ABI_LIBRARY_PATH 34*58b9f456SAndroid Build Coastguard Worker "${CMAKE_LIBRARY_PATH_FLAG}${LIBCXX_CXX_ABI_LIBRARY_PATH}") 35*58b9f456SAndroid Build Coastguard Worker 36*58b9f456SAndroid Build Coastguard Worker 37*58b9f456SAndroid Build Coastguard Workerif (LIBCXX_GENERATE_COVERAGE AND NOT LIBCXX_COVERAGE_LIBRARY) 38*58b9f456SAndroid Build Coastguard Worker find_compiler_rt_library(profile LIBCXX_COVERAGE_LIBRARY) 39*58b9f456SAndroid Build Coastguard Workerendif() 40*58b9f456SAndroid Build Coastguard Workeradd_library_flags_if(LIBCXX_COVERAGE_LIBRARY "${LIBCXX_COVERAGE_LIBRARY}") 41*58b9f456SAndroid Build Coastguard Worker 42*58b9f456SAndroid Build Coastguard Workerif (APPLE AND (LIBCXX_CXX_ABI_LIBNAME STREQUAL "libcxxabi" OR 43*58b9f456SAndroid Build Coastguard Worker LIBCXX_CXX_ABI_LIBNAME STREQUAL "default")) 44*58b9f456SAndroid Build Coastguard Worker set(LIBCXX_OSX_REEXPORT_LIBCXXABI_SYMBOLS ON) 45*58b9f456SAndroid Build Coastguard Workerendif() 46*58b9f456SAndroid Build Coastguard Worker 47*58b9f456SAndroid Build Coastguard Workerif (LIBCXX_STATICALLY_LINK_ABI_IN_SHARED_LIBRARY) 48*58b9f456SAndroid Build Coastguard Worker add_library_flags("-Wl,--whole-archive" "-Wl,-Bstatic") 49*58b9f456SAndroid Build Coastguard Worker add_library_flags("${LIBCXX_CXX_ABI_LIBRARY}") 50*58b9f456SAndroid Build Coastguard Worker add_library_flags("-Wl,-Bdynamic" "-Wl,--no-whole-archive") 51*58b9f456SAndroid Build Coastguard Workerelseif (LIBCXX_OSX_REEXPORT_LIBCXXABI_SYMBOLS) 52*58b9f456SAndroid Build Coastguard Worker add_library_flags("${LIBCXX_CXX_ABI_LIBRARY}") 53*58b9f456SAndroid Build Coastguard Workerelse () 54*58b9f456SAndroid Build Coastguard Worker add_interface_library("${LIBCXX_CXX_ABI_LIBRARY}") 55*58b9f456SAndroid Build Coastguard Workerendif() 56*58b9f456SAndroid Build Coastguard Worker 57*58b9f456SAndroid Build Coastguard Workerif (APPLE AND LLVM_USE_SANITIZER) 58*58b9f456SAndroid Build Coastguard Worker if (("${LLVM_USE_SANITIZER}" STREQUAL "Address") OR 59*58b9f456SAndroid Build Coastguard Worker ("${LLVM_USE_SANITIZER}" STREQUAL "Address;Undefined") OR 60*58b9f456SAndroid Build Coastguard Worker ("${LLVM_USE_SANITIZER}" STREQUAL "Undefined;Address")) 61*58b9f456SAndroid Build Coastguard Worker set(LIBFILE "libclang_rt.asan_osx_dynamic.dylib") 62*58b9f456SAndroid Build Coastguard Worker elseif("${LLVM_USE_SANITIZER}" STREQUAL "Undefined") 63*58b9f456SAndroid Build Coastguard Worker set(LIBFILE "libclang_rt.ubsan_osx_dynamic.dylib") 64*58b9f456SAndroid Build Coastguard Worker elseif("${LLVM_USE_SANITIZER}" STREQUAL "Thread") 65*58b9f456SAndroid Build Coastguard Worker set(LIBFILE "libclang_rt.tsan_osx_dynamic.dylib") 66*58b9f456SAndroid Build Coastguard Worker else() 67*58b9f456SAndroid Build Coastguard Worker message(WARNING "LLVM_USE_SANITIZER=${LLVM_USE_SANITIZER} is not supported on OS X") 68*58b9f456SAndroid Build Coastguard Worker endif() 69*58b9f456SAndroid Build Coastguard Worker if (LIBFILE) 70*58b9f456SAndroid Build Coastguard Worker find_compiler_rt_dir(LIBDIR) 71*58b9f456SAndroid Build Coastguard Worker if (NOT IS_DIRECTORY "${LIBDIR}") 72*58b9f456SAndroid Build Coastguard Worker message(FATAL_ERROR "Cannot find compiler-rt directory on OS X required for LLVM_USE_SANITIZER") 73*58b9f456SAndroid Build Coastguard Worker endif() 74*58b9f456SAndroid Build Coastguard Worker set(LIBCXX_SANITIZER_LIBRARY "${LIBDIR}/${LIBFILE}") 75*58b9f456SAndroid Build Coastguard Worker set(LIBCXX_SANITIZER_LIBRARY "${LIBCXX_SANITIZER_LIBRARY}" PARENT_SCOPE) 76*58b9f456SAndroid Build Coastguard Worker message(STATUS "Manually linking compiler-rt library: ${LIBCXX_SANITIZER_LIBRARY}") 77*58b9f456SAndroid Build Coastguard Worker add_library_flags("${LIBCXX_SANITIZER_LIBRARY}") 78*58b9f456SAndroid Build Coastguard Worker add_link_flags("-Wl,-rpath,${LIBDIR}") 79*58b9f456SAndroid Build Coastguard Worker endif() 80*58b9f456SAndroid Build Coastguard Workerendif() 81*58b9f456SAndroid Build Coastguard Worker 82*58b9f456SAndroid Build Coastguard Worker# Generate private library list. 83*58b9f456SAndroid Build Coastguard Workeradd_library_flags_if(LIBCXX_HAS_PTHREAD_LIB pthread) 84*58b9f456SAndroid Build Coastguard Workeradd_library_flags_if(LIBCXX_HAS_C_LIB c) 85*58b9f456SAndroid Build Coastguard Workeradd_library_flags_if(LIBCXX_HAS_M_LIB m) 86*58b9f456SAndroid Build Coastguard Workeradd_library_flags_if(LIBCXX_HAS_RT_LIB rt) 87*58b9f456SAndroid Build Coastguard Workerif (LIBCXX_USE_COMPILER_RT) 88*58b9f456SAndroid Build Coastguard Worker find_compiler_rt_library(builtins LIBCXX_BUILTINS_LIBRARY) 89*58b9f456SAndroid Build Coastguard Worker add_library_flags_if(LIBCXX_BUILTINS_LIBRARY "${LIBCXX_BUILTINS_LIBRARY}") 90*58b9f456SAndroid Build Coastguard Workerelse() 91*58b9f456SAndroid Build Coastguard Worker add_library_flags_if(LIBCXX_HAS_GCC_S_LIB gcc_s) 92*58b9f456SAndroid Build Coastguard Workerendif() 93*58b9f456SAndroid Build Coastguard Workeradd_library_flags_if(LIBCXX_HAVE_CXX_ATOMICS_WITH_LIB atomic) 94*58b9f456SAndroid Build Coastguard Workeradd_library_flags_if(MINGW "${MINGW_LIBRARIES}") 95*58b9f456SAndroid Build Coastguard Worker 96*58b9f456SAndroid Build Coastguard Worker# Add the unwinder library. 97*58b9f456SAndroid Build Coastguard Workerif (LIBCXXABI_USE_LLVM_UNWINDER) 98*58b9f456SAndroid Build Coastguard Worker if (NOT LIBCXXABI_ENABLE_STATIC_UNWINDER AND (TARGET unwind_shared OR HAVE_LIBUNWIND)) 99*58b9f456SAndroid Build Coastguard Worker add_interface_library(unwind_shared) 100*58b9f456SAndroid Build Coastguard Worker elseif (LIBCXXABI_ENABLE_STATIC_UNWINDER AND (TARGET unwind_static OR HAVE_LIBUNWIND)) 101*58b9f456SAndroid Build Coastguard Worker add_interface_library(unwind_static) 102*58b9f456SAndroid Build Coastguard Worker else() 103*58b9f456SAndroid Build Coastguard Worker add_interface_library(unwind) 104*58b9f456SAndroid Build Coastguard Worker endif() 105*58b9f456SAndroid Build Coastguard Workerendif() 106*58b9f456SAndroid Build Coastguard Worker 107*58b9f456SAndroid Build Coastguard Worker# Setup flags. 108*58b9f456SAndroid Build Coastguard Workerif (NOT WIN32) 109*58b9f456SAndroid Build Coastguard Worker add_flags_if_supported(-fPIC) 110*58b9f456SAndroid Build Coastguard Workerendif() 111*58b9f456SAndroid Build Coastguard Worker 112*58b9f456SAndroid Build Coastguard Workeradd_link_flags_if_supported(-nodefaultlibs) 113*58b9f456SAndroid Build Coastguard Worker 114*58b9f456SAndroid Build Coastguard Workerif (LIBCXX_TARGETING_MSVC) 115*58b9f456SAndroid Build Coastguard Worker if (LIBCXX_DEBUG_BUILD) 116*58b9f456SAndroid Build Coastguard Worker set(LIB_SUFFIX "d") 117*58b9f456SAndroid Build Coastguard Worker else() 118*58b9f456SAndroid Build Coastguard Worker set(LIB_SUFFIX "") 119*58b9f456SAndroid Build Coastguard Worker endif() 120*58b9f456SAndroid Build Coastguard Worker add_compile_flags(/Zl) 121*58b9f456SAndroid Build Coastguard Worker add_link_flags(/nodefaultlib) 122*58b9f456SAndroid Build Coastguard Worker 123*58b9f456SAndroid Build Coastguard Worker add_library_flags(ucrt${LIB_SUFFIX}) # Universal C runtime 124*58b9f456SAndroid Build Coastguard Worker add_library_flags(vcruntime${LIB_SUFFIX}) # C++ runtime 125*58b9f456SAndroid Build Coastguard Worker add_library_flags(msvcrt${LIB_SUFFIX}) # C runtime startup files 126*58b9f456SAndroid Build Coastguard Worker add_library_flags(msvcprt${LIB_SUFFIX}) # C++ standard library. Required for exception_ptr internals. 127*58b9f456SAndroid Build Coastguard Worker # Required for standards-complaint wide character formatting functions 128*58b9f456SAndroid Build Coastguard Worker # (e.g. `printfw`/`scanfw`) 129*58b9f456SAndroid Build Coastguard Worker add_library_flags(iso_stdio_wide_specifiers) 130*58b9f456SAndroid Build Coastguard Workerendif() 131*58b9f456SAndroid Build Coastguard Worker 132*58b9f456SAndroid Build Coastguard Workerif (LIBCXX_OSX_REEXPORT_LIBCXXABI_SYMBOLS) 133*58b9f456SAndroid Build Coastguard Worker if (NOT DEFINED LIBCXX_LIBCPPABI_VERSION) 134*58b9f456SAndroid Build Coastguard Worker set(LIBCXX_LIBCPPABI_VERSION "2") # Default value 135*58b9f456SAndroid Build Coastguard Worker execute_process( 136*58b9f456SAndroid Build Coastguard Worker COMMAND xcrun --show-sdk-version 137*58b9f456SAndroid Build Coastguard Worker OUTPUT_VARIABLE sdk_ver 138*58b9f456SAndroid Build Coastguard Worker RESULT_VARIABLE res 139*58b9f456SAndroid Build Coastguard Worker OUTPUT_STRIP_TRAILING_WHITESPACE) 140*58b9f456SAndroid Build Coastguard Worker if (res EQUAL 0) 141*58b9f456SAndroid Build Coastguard Worker message(STATUS "Found SDK version ${sdk_ver}") 142*58b9f456SAndroid Build Coastguard Worker string(REPLACE "10." "" sdk_ver "${sdk_ver}") 143*58b9f456SAndroid Build Coastguard Worker if (sdk_ver LESS 9) 144*58b9f456SAndroid Build Coastguard Worker set(LIBCXX_LIBCPPABI_VERSION "") 145*58b9f456SAndroid Build Coastguard Worker else() 146*58b9f456SAndroid Build Coastguard Worker set(LIBCXX_LIBCPPABI_VERSION "2") 147*58b9f456SAndroid Build Coastguard Worker endif() 148*58b9f456SAndroid Build Coastguard Worker endif() 149*58b9f456SAndroid Build Coastguard Worker endif() 150*58b9f456SAndroid Build Coastguard Worker 151*58b9f456SAndroid Build Coastguard Worker if ( CMAKE_OSX_DEPLOYMENT_TARGET STREQUAL "10.6" ) 152*58b9f456SAndroid Build Coastguard Worker message(FATAL_ERROR "Mac OSX 10.6 is not supported anymore as a deployment " 153*58b9f456SAndroid Build Coastguard Worker "target. If you need support for this, please contact " 154*58b9f456SAndroid Build Coastguard Worker "the libc++ maintainers.") 155*58b9f456SAndroid Build Coastguard Worker else() 156*58b9f456SAndroid Build Coastguard Worker if ("armv7" IN_LIST CMAKE_OSX_ARCHITECTURES) 157*58b9f456SAndroid Build Coastguard Worker set(RE_EXPORT_LIST "${CMAKE_CURRENT_SOURCE_DIR}/libc++sjlj-abi.exp") 158*58b9f456SAndroid Build Coastguard Worker else() 159*58b9f456SAndroid Build Coastguard Worker set(RE_EXPORT_LIST "${CMAKE_CURRENT_SOURCE_DIR}/libc++abi${LIBCXX_LIBCPPABI_VERSION}.exp") 160*58b9f456SAndroid Build Coastguard Worker endif() 161*58b9f456SAndroid Build Coastguard Worker add_link_flags( 162*58b9f456SAndroid Build Coastguard Worker "-compatibility_version 1" 163*58b9f456SAndroid Build Coastguard Worker "-install_name /usr/lib/libc++.1.dylib" 164*58b9f456SAndroid Build Coastguard Worker "-Wl,-unexported_symbols_list,\"${CMAKE_CURRENT_SOURCE_DIR}/libc++unexp.exp\"" 165*58b9f456SAndroid Build Coastguard Worker "-Wl,-reexported_symbols_list,\"${RE_EXPORT_LIST}\"" 166*58b9f456SAndroid Build Coastguard Worker "-Wl,-force_symbols_not_weak_list,\"${CMAKE_CURRENT_SOURCE_DIR}/notweak.exp\"" 167*58b9f456SAndroid Build Coastguard Worker "-Wl,-force_symbols_weak_list,\"${CMAKE_CURRENT_SOURCE_DIR}/weak.exp\"") 168*58b9f456SAndroid Build Coastguard Worker 169*58b9f456SAndroid Build Coastguard Worker if (NOT LIBCXX_ENABLE_NEW_DELETE_DEFINITIONS) 170*58b9f456SAndroid Build Coastguard Worker add_link_flags("-Wl,-reexported_symbols_list,\"${CMAKE_CURRENT_SOURCE_DIR}/libc++abi-new-delete.exp\"") 171*58b9f456SAndroid Build Coastguard Worker endif() 172*58b9f456SAndroid Build Coastguard Worker endif() 173*58b9f456SAndroid Build Coastguard Workerendif() 174*58b9f456SAndroid Build Coastguard Worker 175*58b9f456SAndroid Build Coastguard Workersplit_list(LIBCXX_COMPILE_FLAGS) 176*58b9f456SAndroid Build Coastguard Workersplit_list(LIBCXX_LINK_FLAGS) 177*58b9f456SAndroid Build Coastguard Worker 178*58b9f456SAndroid Build Coastguard Workermacro(cxx_object_library name) 179*58b9f456SAndroid Build Coastguard Worker cmake_parse_arguments(ARGS "" "" "DEFINES;FLAGS" ${ARGN}) 180*58b9f456SAndroid Build Coastguard Worker 181*58b9f456SAndroid Build Coastguard Worker # Add an object library that contains the compiled source files. 182*58b9f456SAndroid Build Coastguard Worker add_library(${name} OBJECT ${exclude_from_all} ${LIBCXX_SOURCES} ${LIBCXX_HEADERS}) 183*58b9f456SAndroid Build Coastguard Worker if(LIBCXX_CXX_ABI_HEADER_TARGET) 184*58b9f456SAndroid Build Coastguard Worker add_dependencies(${name} ${LIBCXX_CXX_ABI_HEADER_TARGET}) 185*58b9f456SAndroid Build Coastguard Worker endif() 186*58b9f456SAndroid Build Coastguard Worker if(WIN32 AND NOT MINGW) 187*58b9f456SAndroid Build Coastguard Worker target_compile_definitions(${name} 188*58b9f456SAndroid Build Coastguard Worker PRIVATE 189*58b9f456SAndroid Build Coastguard Worker # Ignore the -MSC_VER mismatch, as we may build 190*58b9f456SAndroid Build Coastguard Worker # with a different compatibility version. 191*58b9f456SAndroid Build Coastguard Worker _ALLOW_MSC_VER_MISMATCH 192*58b9f456SAndroid Build Coastguard Worker # Don't check the msvcprt iterator debug levels 193*58b9f456SAndroid Build Coastguard Worker # as we will define the iterator types; libc++ 194*58b9f456SAndroid Build Coastguard Worker # uses a different macro to identify the debug 195*58b9f456SAndroid Build Coastguard Worker # level. 196*58b9f456SAndroid Build Coastguard Worker _ALLOW_ITERATOR_DEBUG_LEVEL_MISMATCH 197*58b9f456SAndroid Build Coastguard Worker # We are building the c++ runtime, don't pull in 198*58b9f456SAndroid Build Coastguard Worker # msvcprt. 199*58b9f456SAndroid Build Coastguard Worker _CRTBLD 200*58b9f456SAndroid Build Coastguard Worker # Don't warn on the use of "deprecated" 201*58b9f456SAndroid Build Coastguard Worker # "insecure" functions which are standards 202*58b9f456SAndroid Build Coastguard Worker # specified. 203*58b9f456SAndroid Build Coastguard Worker _CRT_SECURE_NO_WARNINGS 204*58b9f456SAndroid Build Coastguard Worker # Use the ISO conforming behaviour for conversion 205*58b9f456SAndroid Build Coastguard Worker # in printf, scanf. 206*58b9f456SAndroid Build Coastguard Worker _CRT_STDIO_ISO_WIDE_SPECIFIERS) 207*58b9f456SAndroid Build Coastguard Worker endif() 208*58b9f456SAndroid Build Coastguard Worker 209*58b9f456SAndroid Build Coastguard Worker if(ARGS_DEFINES) 210*58b9f456SAndroid Build Coastguard Worker target_compile_definitions(${name} PRIVATE ${ARGS_DEFINES}) 211*58b9f456SAndroid Build Coastguard Worker endif() 212*58b9f456SAndroid Build Coastguard Worker 213*58b9f456SAndroid Build Coastguard Worker set_target_properties(${name} 214*58b9f456SAndroid Build Coastguard Worker PROPERTIES 215*58b9f456SAndroid Build Coastguard Worker COMPILE_FLAGS ${LIBCXX_COMPILE_FLAGS} 216*58b9f456SAndroid Build Coastguard Worker ) 217*58b9f456SAndroid Build Coastguard Worker 218*58b9f456SAndroid Build Coastguard Worker if(ARGS_FLAGS) 219*58b9f456SAndroid Build Coastguard Worker target_compile_options(${name} PRIVATE ${ARGS_FLAGS}) 220*58b9f456SAndroid Build Coastguard Worker endif() 221*58b9f456SAndroid Build Coastguard Workerendmacro() 222*58b9f456SAndroid Build Coastguard Worker 223*58b9f456SAndroid Build Coastguard Workerif(LIBCXX_HERMETIC_STATIC_LIBRARY) 224*58b9f456SAndroid Build Coastguard Worker append_flags_if_supported(CXX_STATIC_OBJECTS_FLAGS -fvisibility=hidden) 225*58b9f456SAndroid Build Coastguard Worker append_flags_if_supported(CXX_STATIC_OBJECTS_FLAGS -fvisibility-global-new-delete-hidden) 226*58b9f456SAndroid Build Coastguard Worker cxx_object_library(cxx_static_objects 227*58b9f456SAndroid Build Coastguard Worker DEFINES _LIBCPP_DISABLE_VISIBILITY_ANNOTATIONS 228*58b9f456SAndroid Build Coastguard Worker FLAGS ${CXX_STATIC_OBJECTS_FLAGS}) 229*58b9f456SAndroid Build Coastguard Worker cxx_object_library(cxx_shared_objects) 230*58b9f456SAndroid Build Coastguard Worker set(cxx_static_sources $<TARGET_OBJECTS:cxx_static_objects>) 231*58b9f456SAndroid Build Coastguard Worker set(cxx_shared_sources $<TARGET_OBJECTS:cxx_shared_objects>) 232*58b9f456SAndroid Build Coastguard Workerelse() 233*58b9f456SAndroid Build Coastguard Worker cxx_object_library(cxx_objects) 234*58b9f456SAndroid Build Coastguard Worker set(cxx_static_sources $<TARGET_OBJECTS:cxx_objects>) 235*58b9f456SAndroid Build Coastguard Worker set(cxx_shared_sources $<TARGET_OBJECTS:cxx_objects>) 236*58b9f456SAndroid Build Coastguard Workerendif() 237*58b9f456SAndroid Build Coastguard Worker 238*58b9f456SAndroid Build Coastguard Worker# Build the shared library. 239*58b9f456SAndroid Build Coastguard Workerif (LIBCXX_ENABLE_SHARED) 240*58b9f456SAndroid Build Coastguard Worker add_library(cxx_shared SHARED ${cxx_shared_sources}) 241*58b9f456SAndroid Build Coastguard Worker if(COMMAND llvm_setup_rpath) 242*58b9f456SAndroid Build Coastguard Worker llvm_setup_rpath(cxx_shared) 243*58b9f456SAndroid Build Coastguard Worker endif() 244*58b9f456SAndroid Build Coastguard Worker target_link_libraries(cxx_shared ${LIBCXX_LIBRARIES}) 245*58b9f456SAndroid Build Coastguard Worker set_target_properties(cxx_shared 246*58b9f456SAndroid Build Coastguard Worker PROPERTIES 247*58b9f456SAndroid Build Coastguard Worker LINK_FLAGS "${LIBCXX_LINK_FLAGS}" 248*58b9f456SAndroid Build Coastguard Worker OUTPUT_NAME "c++" 249*58b9f456SAndroid Build Coastguard Worker VERSION "${LIBCXX_ABI_VERSION}.0" 250*58b9f456SAndroid Build Coastguard Worker SOVERSION "${LIBCXX_ABI_VERSION}" 251*58b9f456SAndroid Build Coastguard Worker ) 252*58b9f456SAndroid Build Coastguard Worker list(APPEND LIBCXX_BUILD_TARGETS "cxx_shared") 253*58b9f456SAndroid Build Coastguard Worker if (LIBCXX_INSTALL_SHARED_LIBRARY) 254*58b9f456SAndroid Build Coastguard Worker list(APPEND LIBCXX_INSTALL_TARGETS "cxx_shared") 255*58b9f456SAndroid Build Coastguard Worker endif() 256*58b9f456SAndroid Build Coastguard Worker if(WIN32 AND NOT MINGW AND NOT "${CMAKE_HOST_SYSTEM_NAME}" STREQUAL "Windows") 257*58b9f456SAndroid Build Coastguard Worker # Since we most likely do not have a mt.exe replacement, disable the 258*58b9f456SAndroid Build Coastguard Worker # manifest bundling. This allows a normal cmake invocation to pass which 259*58b9f456SAndroid Build Coastguard Worker # will attempt to use the manifest tool to generate the bundled manifest 260*58b9f456SAndroid Build Coastguard Worker set_target_properties(cxx_shared PROPERTIES 261*58b9f456SAndroid Build Coastguard Worker APPEND_STRING PROPERTY LINK_FLAGS " /MANIFEST:NO") 262*58b9f456SAndroid Build Coastguard Worker endif() 263*58b9f456SAndroid Build Coastguard Workerendif() 264*58b9f456SAndroid Build Coastguard Worker 265*58b9f456SAndroid Build Coastguard Worker# Build the static library. 266*58b9f456SAndroid Build Coastguard Workerif (LIBCXX_ENABLE_STATIC) 267*58b9f456SAndroid Build Coastguard Worker add_library(cxx_static STATIC ${cxx_static_sources}) 268*58b9f456SAndroid Build Coastguard Worker target_link_libraries(cxx_static ${LIBCXX_LIBRARIES}) 269*58b9f456SAndroid Build Coastguard Worker set(CMAKE_STATIC_LIBRARY_PREFIX "lib") 270*58b9f456SAndroid Build Coastguard Worker set_target_properties(cxx_static 271*58b9f456SAndroid Build Coastguard Worker PROPERTIES 272*58b9f456SAndroid Build Coastguard Worker LINK_FLAGS "${LIBCXX_LINK_FLAGS}" 273*58b9f456SAndroid Build Coastguard Worker OUTPUT_NAME "c++" 274*58b9f456SAndroid Build Coastguard Worker ) 275*58b9f456SAndroid Build Coastguard Worker list(APPEND LIBCXX_BUILD_TARGETS "cxx_static") 276*58b9f456SAndroid Build Coastguard Worker if (LIBCXX_INSTALL_STATIC_LIBRARY) 277*58b9f456SAndroid Build Coastguard Worker list(APPEND LIBCXX_INSTALL_TARGETS "cxx_static") 278*58b9f456SAndroid Build Coastguard Worker endif() 279*58b9f456SAndroid Build Coastguard Worker # Attempt to merge the libc++.a archive and the ABI library archive into one. 280*58b9f456SAndroid Build Coastguard Worker if (LIBCXX_STATICALLY_LINK_ABI_IN_STATIC_LIBRARY) 281*58b9f456SAndroid Build Coastguard Worker set(MERGE_ARCHIVES_SEARCH_PATHS "") 282*58b9f456SAndroid Build Coastguard Worker if (LIBCXX_CXX_ABI_LIBRARY_PATH) 283*58b9f456SAndroid Build Coastguard Worker set(MERGE_ARCHIVES_SEARCH_PATHS "-L${LIBCXX_CXX_ABI_LIBRARY_PATH}") 284*58b9f456SAndroid Build Coastguard Worker endif() 285*58b9f456SAndroid Build Coastguard Worker if ((TARGET ${LIBCXX_CXX_ABI_LIBRARY}) OR 286*58b9f456SAndroid Build Coastguard Worker (${LIBCXX_CXX_ABI_LIBRARY} MATCHES "cxxabi(_static|_shared)?" AND HAVE_LIBCXXABI)) 287*58b9f456SAndroid Build Coastguard Worker set(MERGE_ARCHIVES_ABI_TARGET "$<TARGET_LINKER_FILE:cxxabi_static>") 288*58b9f456SAndroid Build Coastguard Worker else() 289*58b9f456SAndroid Build Coastguard Worker set(MERGE_ARCHIVES_ABI_TARGET 290*58b9f456SAndroid Build Coastguard Worker "${CMAKE_STATIC_LIBRARY_PREFIX}${LIBCXX_CXX_ABI_LIBRARY}${CMAKE_STATIC_LIBRARY_SUFFIX}") 291*58b9f456SAndroid Build Coastguard Worker endif() 292*58b9f456SAndroid Build Coastguard Worker add_custom_command(TARGET cxx_static POST_BUILD 293*58b9f456SAndroid Build Coastguard Worker COMMAND 294*58b9f456SAndroid Build Coastguard Worker ${PYTHON_EXECUTABLE} ${LIBCXX_SOURCE_DIR}/utils/merge_archives.py 295*58b9f456SAndroid Build Coastguard Worker ARGS 296*58b9f456SAndroid Build Coastguard Worker -o $<TARGET_LINKER_FILE:cxx_static> 297*58b9f456SAndroid Build Coastguard Worker --ar "${CMAKE_AR}" 298*58b9f456SAndroid Build Coastguard Worker "$<TARGET_LINKER_FILE:cxx_static>" 299*58b9f456SAndroid Build Coastguard Worker "${MERGE_ARCHIVES_ABI_TARGET}" 300*58b9f456SAndroid Build Coastguard Worker "${MERGE_ARCHIVES_SEARCH_PATHS}" 301*58b9f456SAndroid Build Coastguard Worker WORKING_DIRECTORY ${LIBCXX_BUILD_DIR} 302*58b9f456SAndroid Build Coastguard Worker ) 303*58b9f456SAndroid Build Coastguard Worker endif() 304*58b9f456SAndroid Build Coastguard Workerendif() 305*58b9f456SAndroid Build Coastguard Worker 306*58b9f456SAndroid Build Coastguard Worker# Add a meta-target for both libraries. 307*58b9f456SAndroid Build Coastguard Workeradd_custom_target(cxx DEPENDS cxx-headers ${LIBCXX_BUILD_TARGETS}) 308*58b9f456SAndroid Build Coastguard Worker 309*58b9f456SAndroid Build Coastguard Workerif (LIBCXX_ENABLE_FILESYSTEM) 310*58b9f456SAndroid Build Coastguard Worker set(LIBCXX_FILESYSTEM_SOURCES 311*58b9f456SAndroid Build Coastguard Worker ../src/filesystem/operations.cpp 312*58b9f456SAndroid Build Coastguard Worker ../src/filesystem/directory_iterator.cpp) 313*58b9f456SAndroid Build Coastguard Worker 314*58b9f456SAndroid Build Coastguard Worker # Filesystem uses __int128_t, which requires a definition of __muloi4 when 315*58b9f456SAndroid Build Coastguard Worker # compiled with UBSAN. This definition is not provided by libgcc_s, but is 316*58b9f456SAndroid Build Coastguard Worker # provided by compiler-rt. So we need to disable it to avoid having multiple 317*58b9f456SAndroid Build Coastguard Worker # definitions. See filesystem/int128_builtins.cpp. 318*58b9f456SAndroid Build Coastguard Worker if (NOT LIBCXX_USE_COMPILER_RT) 319*58b9f456SAndroid Build Coastguard Worker list(APPEND LIBCXX_FILESYSTEM_SOURCES ../src/filesystem/int128_builtins.cpp) 320*58b9f456SAndroid Build Coastguard Worker endif() 321*58b9f456SAndroid Build Coastguard Worker 322*58b9f456SAndroid Build Coastguard Worker add_library(cxx_filesystem STATIC ${LIBCXX_FILESYSTEM_SOURCES}) 323*58b9f456SAndroid Build Coastguard Worker if (LIBCXX_ENABLE_SHARED) 324*58b9f456SAndroid Build Coastguard Worker target_link_libraries(cxx_filesystem cxx_shared) 325*58b9f456SAndroid Build Coastguard Worker else() 326*58b9f456SAndroid Build Coastguard Worker target_link_libraries(cxx_filesystem cxx_static) 327*58b9f456SAndroid Build Coastguard Worker endif() 328*58b9f456SAndroid Build Coastguard Worker 329*58b9f456SAndroid Build Coastguard Worker set(filesystem_flags "${LIBCXX_COMPILE_FLAGS}") 330*58b9f456SAndroid Build Coastguard Worker check_flag_supported(-std=c++14) 331*58b9f456SAndroid Build Coastguard Worker if (NOT MSVC AND LIBCXX_SUPPORTS_STD_EQ_CXX14_FLAG) 332*58b9f456SAndroid Build Coastguard Worker string(REPLACE "-std=c++11" "-std=c++14" filesystem_flags "${LIBCXX_COMPILE_FLAGS}") 333*58b9f456SAndroid Build Coastguard Worker endif() 334*58b9f456SAndroid Build Coastguard Worker set_target_properties(cxx_filesystem 335*58b9f456SAndroid Build Coastguard Worker PROPERTIES 336*58b9f456SAndroid Build Coastguard Worker COMPILE_FLAGS "${filesystem_flags}" 337*58b9f456SAndroid Build Coastguard Worker OUTPUT_NAME "c++fs" 338*58b9f456SAndroid Build Coastguard Worker ) 339*58b9f456SAndroid Build Coastguard Workerendif() 340*58b9f456SAndroid Build Coastguard Worker 341*58b9f456SAndroid Build Coastguard Worker 342*58b9f456SAndroid Build Coastguard Workerif (LIBCXX_ENABLE_EXPERIMENTAL_LIBRARY) 343*58b9f456SAndroid Build Coastguard Worker file(GLOB LIBCXX_EXPERIMENTAL_SOURCES ../src/experimental/*.cpp) 344*58b9f456SAndroid Build Coastguard Worker add_library(cxx_experimental STATIC ${LIBCXX_EXPERIMENTAL_SOURCES}) 345*58b9f456SAndroid Build Coastguard Worker if (LIBCXX_ENABLE_SHARED) 346*58b9f456SAndroid Build Coastguard Worker target_link_libraries(cxx_experimental cxx_shared) 347*58b9f456SAndroid Build Coastguard Worker else() 348*58b9f456SAndroid Build Coastguard Worker target_link_libraries(cxx_experimental cxx_static) 349*58b9f456SAndroid Build Coastguard Worker endif() 350*58b9f456SAndroid Build Coastguard Worker 351*58b9f456SAndroid Build Coastguard Worker set(experimental_flags "${LIBCXX_COMPILE_FLAGS}") 352*58b9f456SAndroid Build Coastguard Worker check_flag_supported(-std=c++14) 353*58b9f456SAndroid Build Coastguard Worker if (NOT MSVC AND LIBCXX_SUPPORTS_STD_EQ_CXX14_FLAG) 354*58b9f456SAndroid Build Coastguard Worker string(REPLACE "-std=c++11" "-std=c++14" experimental_flags "${LIBCXX_COMPILE_FLAGS}") 355*58b9f456SAndroid Build Coastguard Worker endif() 356*58b9f456SAndroid Build Coastguard Worker set_target_properties(cxx_experimental 357*58b9f456SAndroid Build Coastguard Worker PROPERTIES 358*58b9f456SAndroid Build Coastguard Worker COMPILE_FLAGS "${experimental_flags}" 359*58b9f456SAndroid Build Coastguard Worker OUTPUT_NAME "c++experimental" 360*58b9f456SAndroid Build Coastguard Worker ) 361*58b9f456SAndroid Build Coastguard Workerendif() 362*58b9f456SAndroid Build Coastguard Worker 363*58b9f456SAndroid Build Coastguard Workerif (LIBCXX_BUILD_EXTERNAL_THREAD_LIBRARY) 364*58b9f456SAndroid Build Coastguard Worker file(GLOB LIBCXX_EXTERNAL_THREADING_SUPPORT_SOURCES ../test/support/external_threads.cpp) 365*58b9f456SAndroid Build Coastguard Worker 366*58b9f456SAndroid Build Coastguard Worker if (LIBCXX_ENABLE_SHARED) 367*58b9f456SAndroid Build Coastguard Worker add_library(cxx_external_threads SHARED ${LIBCXX_EXTERNAL_THREADING_SUPPORT_SOURCES}) 368*58b9f456SAndroid Build Coastguard Worker else() 369*58b9f456SAndroid Build Coastguard Worker add_library(cxx_external_threads STATIC ${LIBCXX_EXTERNAL_THREADING_SUPPORT_SOURCES}) 370*58b9f456SAndroid Build Coastguard Worker endif() 371*58b9f456SAndroid Build Coastguard Worker 372*58b9f456SAndroid Build Coastguard Worker set_target_properties(cxx_external_threads 373*58b9f456SAndroid Build Coastguard Worker PROPERTIES 374*58b9f456SAndroid Build Coastguard Worker LINK_FLAGS "${LIBCXX_LINK_FLAGS}" 375*58b9f456SAndroid Build Coastguard Worker COMPILE_FLAGS "${LIBCXX_COMPILE_FLAGS}" 376*58b9f456SAndroid Build Coastguard Worker OUTPUT_NAME "c++external_threads" 377*58b9f456SAndroid Build Coastguard Worker ) 378*58b9f456SAndroid Build Coastguard Workerendif() 379*58b9f456SAndroid Build Coastguard Worker 380*58b9f456SAndroid Build Coastguard Worker# Generate a linker script inplace of a libc++.so symlink. Rerun this command 381*58b9f456SAndroid Build Coastguard Worker# after cxx builds. 382*58b9f456SAndroid Build Coastguard Workerif (LIBCXX_ENABLE_SHARED AND LIBCXX_ENABLE_ABI_LINKER_SCRIPT) 383*58b9f456SAndroid Build Coastguard Worker # Get the name of the ABI library and handle the case where CXXABI_LIBNAME 384*58b9f456SAndroid Build Coastguard Worker # is a target name and not a library. Ex cxxabi_shared. 385*58b9f456SAndroid Build Coastguard Worker set(LIBCXX_INTERFACE_LIBRARY_NAMES) 386*58b9f456SAndroid Build Coastguard Worker foreach(lib ${LIBCXX_INTERFACE_LIBRARIES}) 387*58b9f456SAndroid Build Coastguard Worker # FIXME: Handle cxxabi_static and unwind_static. 388*58b9f456SAndroid Build Coastguard Worker if (TARGET ${lib} OR 389*58b9f456SAndroid Build Coastguard Worker (${lib} MATCHES "cxxabi(_static|_shared)?" AND HAVE_LIBCXXABI) OR 390*58b9f456SAndroid Build Coastguard Worker (${lib} MATCHES "unwind(_static|_shared)?" AND HAVE_LIBUNWIND)) 391*58b9f456SAndroid Build Coastguard Worker list(APPEND LIBCXX_INTERFACE_LIBRARY_NAMES "$<TARGET_PROPERTY:${lib},OUTPUT_NAME>") 392*58b9f456SAndroid Build Coastguard Worker else() 393*58b9f456SAndroid Build Coastguard Worker list(APPEND LIBCXX_INTERFACE_LIBRARY_NAMES "${lib}") 394*58b9f456SAndroid Build Coastguard Worker endif() 395*58b9f456SAndroid Build Coastguard Worker endforeach() 396*58b9f456SAndroid Build Coastguard Worker #split_list(LIBCXX_INTERFACE_LIBRARY_NAMES) 397*58b9f456SAndroid Build Coastguard Worker # Generate a linker script inplace of a libc++.so symlink. Rerun this command 398*58b9f456SAndroid Build Coastguard Worker # after cxx builds. 399*58b9f456SAndroid Build Coastguard Worker add_custom_command(TARGET cxx_shared POST_BUILD 400*58b9f456SAndroid Build Coastguard Worker COMMAND 401*58b9f456SAndroid Build Coastguard Worker ${PYTHON_EXECUTABLE} ${LIBCXX_SOURCE_DIR}/utils/gen_link_script.py 402*58b9f456SAndroid Build Coastguard Worker ARGS 403*58b9f456SAndroid Build Coastguard Worker "$<TARGET_LINKER_FILE:cxx_shared>" 404*58b9f456SAndroid Build Coastguard Worker ${LIBCXX_INTERFACE_LIBRARY_NAMES} 405*58b9f456SAndroid Build Coastguard Worker WORKING_DIRECTORY ${LIBCXX_BUILD_DIR} 406*58b9f456SAndroid Build Coastguard Worker ) 407*58b9f456SAndroid Build Coastguard Workerendif() 408*58b9f456SAndroid Build Coastguard Worker 409*58b9f456SAndroid Build Coastguard Workerif (LIBCXX_INSTALL_LIBRARY) 410*58b9f456SAndroid Build Coastguard Worker if (LIBCXX_INSTALL_FILESYSTEM_LIBRARY) 411*58b9f456SAndroid Build Coastguard Worker set(filesystem_lib cxx_filesystem) 412*58b9f456SAndroid Build Coastguard Worker endif() 413*58b9f456SAndroid Build Coastguard Worker if (LIBCXX_INSTALL_EXPERIMENTAL_LIBRARY) 414*58b9f456SAndroid Build Coastguard Worker set(experimental_lib cxx_experimental) 415*58b9f456SAndroid Build Coastguard Worker endif() 416*58b9f456SAndroid Build Coastguard Worker install(TARGETS ${LIBCXX_INSTALL_TARGETS} ${filesystem_lib} ${experimental_lib} 417*58b9f456SAndroid Build Coastguard Worker LIBRARY DESTINATION ${LIBCXX_INSTALL_PREFIX}lib${LIBCXX_LIBDIR_SUFFIX} COMPONENT cxx 418*58b9f456SAndroid Build Coastguard Worker ARCHIVE DESTINATION ${LIBCXX_INSTALL_PREFIX}lib${LIBCXX_LIBDIR_SUFFIX} COMPONENT cxx 419*58b9f456SAndroid Build Coastguard Worker ) 420*58b9f456SAndroid Build Coastguard Worker # NOTE: This install command must go after the cxx install command otherwise 421*58b9f456SAndroid Build Coastguard Worker # it will not be executed after the library symlinks are installed. 422*58b9f456SAndroid Build Coastguard Worker if (LIBCXX_ENABLE_SHARED AND LIBCXX_ENABLE_ABI_LINKER_SCRIPT) 423*58b9f456SAndroid Build Coastguard Worker # Replace the libc++ filename with $<TARGET_LINKER_FILE:cxx> 424*58b9f456SAndroid Build Coastguard Worker # after we required CMake 3.0. 425*58b9f456SAndroid Build Coastguard Worker install(FILES "${LIBCXX_LIBRARY_DIR}/libc++${CMAKE_SHARED_LIBRARY_SUFFIX}" 426*58b9f456SAndroid Build Coastguard Worker DESTINATION ${LIBCXX_INSTALL_PREFIX}lib${LIBCXX_LIBDIR_SUFFIX} 427*58b9f456SAndroid Build Coastguard Worker COMPONENT libcxx) 428*58b9f456SAndroid Build Coastguard Worker endif() 429*58b9f456SAndroid Build Coastguard Workerendif() 430*58b9f456SAndroid Build Coastguard Worker 431*58b9f456SAndroid Build Coastguard Workerif (NOT CMAKE_CONFIGURATION_TYPES AND (LIBCXX_INSTALL_LIBRARY OR 432*58b9f456SAndroid Build Coastguard Worker LIBCXX_INSTALL_HEADERS)) 433*58b9f456SAndroid Build Coastguard Worker if(LIBCXX_INSTALL_LIBRARY) 434*58b9f456SAndroid Build Coastguard Worker set(lib_install_target cxx) 435*58b9f456SAndroid Build Coastguard Worker endif() 436*58b9f456SAndroid Build Coastguard Worker if (LIBCXX_INSTALL_FILESYSTEM_LIBRARY) 437*58b9f456SAndroid Build Coastguard Worker set(filesystem_lib_install_target cxx_filesystem) 438*58b9f456SAndroid Build Coastguard Worker endif() 439*58b9f456SAndroid Build Coastguard Worker if (LIBCXX_INSTALL_EXPERIMENTAL_LIBRARY) 440*58b9f456SAndroid Build Coastguard Worker set(experimental_lib_install_target cxx_experimental) 441*58b9f456SAndroid Build Coastguard Worker endif() 442*58b9f456SAndroid Build Coastguard Worker if(LIBCXX_INSTALL_HEADERS) 443*58b9f456SAndroid Build Coastguard Worker set(header_install_target install-cxx-headers) 444*58b9f456SAndroid Build Coastguard Worker endif() 445*58b9f456SAndroid Build Coastguard Worker add_custom_target(install-cxx 446*58b9f456SAndroid Build Coastguard Worker DEPENDS ${lib_install_target} 447*58b9f456SAndroid Build Coastguard Worker ${experimental_lib_install_target} 448*58b9f456SAndroid Build Coastguard Worker ${filesystem_lib_install_target} 449*58b9f456SAndroid Build Coastguard Worker ${header_install_target} 450*58b9f456SAndroid Build Coastguard Worker COMMAND "${CMAKE_COMMAND}" 451*58b9f456SAndroid Build Coastguard Worker -DCMAKE_INSTALL_COMPONENT=cxx 452*58b9f456SAndroid Build Coastguard Worker -P "${LIBCXX_BINARY_DIR}/cmake_install.cmake") 453*58b9f456SAndroid Build Coastguard Worker add_custom_target(install-cxx-stripped 454*58b9f456SAndroid Build Coastguard Worker DEPENDS ${lib_install_target} 455*58b9f456SAndroid Build Coastguard Worker ${experimental_lib_install_target} 456*58b9f456SAndroid Build Coastguard Worker ${filesystem_lib_install_target} 457*58b9f456SAndroid Build Coastguard Worker ${header_install_target} 458*58b9f456SAndroid Build Coastguard Worker COMMAND "${CMAKE_COMMAND}" 459*58b9f456SAndroid Build Coastguard Worker -DCMAKE_INSTALL_COMPONENT=cxx 460*58b9f456SAndroid Build Coastguard Worker -DCMAKE_INSTALL_DO_STRIP=1 461*58b9f456SAndroid Build Coastguard Worker -P "${LIBCXX_BINARY_DIR}/cmake_install.cmake") 462*58b9f456SAndroid Build Coastguard Worker add_custom_target(install-libcxx DEPENDS install-cxx) 463*58b9f456SAndroid Build Coastguard Workerendif() 464