diff options
author | Michael J. Spencer <bigcheesegs@gmail.com> | 2012-11-30 21:02:29 +0000 |
---|---|---|
committer | Michael J. Spencer <bigcheesegs@gmail.com> | 2012-11-30 21:02:29 +0000 |
commit | 299fc29a59f7f301a1f33092c2ffab1ab22b67dc (patch) | |
tree | 8c34ee7e5ad8a84b065722627845dd00a6f23d7d /libcxx | |
parent | c5917d9a38ce0e4ad0a8f888f759de382dbe8f2d (diff) | |
download | bcm5719-llvm-299fc29a59f7f301a1f33092c2ffab1ab22b67dc.tar.gz bcm5719-llvm-299fc29a59f7f301a1f33092c2ffab1ab22b67dc.zip |
[CMake] Add support for selecting which c++ abi library to use.
llvm-svn: 169036
Diffstat (limited to 'libcxx')
-rw-r--r-- | libcxx/CMakeLists.txt | 53 | ||||
-rw-r--r-- | libcxx/lib/CMakeLists.txt | 3 | ||||
-rw-r--r-- | libcxx/src/exception.cpp | 6 |
3 files changed, 59 insertions, 3 deletions
diff --git a/libcxx/CMakeLists.txt b/libcxx/CMakeLists.txt index ca8ad57d6c4..0f7941c4884 100644 --- a/libcxx/CMakeLists.txt +++ b/libcxx/CMakeLists.txt @@ -39,6 +39,11 @@ option(LIBCXX_ENABLE_WERROR "Fail and stop if a warning is triggered." OFF) option(LIBCXX_ENABLE_CXX0X "Enable -std=c++0x and use of c++0x language features if the compiler supports it." ON) option(LIBCXX_ENABLE_SHARED "Build libc++ as a shared library." ON) +set(CXXABIS none libcxxabi libcxxrt libsupc++) +set(LIBCXX_CXX_ABI "${LIBCXX_CXX_ABI}" CACHE STRING + "Specify C++ ABI library to use." FORCE) +set_property(CACHE LIBCXX_CXX_ABI PROPERTY STRINGS "";${CXXABIS}) + #=============================================================================== # Configure System #=============================================================================== @@ -58,6 +63,54 @@ get_target_triple(LIBCXX_TARGET_TRIPLE ) set(LIBCXX_TARGET_TRIPLE ${LIBCXX_TARGET_TRIPLE} CACHE STRING "Target triple.") +if (${LIBCXX_CXX_ABI} STREQUAL "libsupc++") + set(LIBCXX_LIBSUPCXX_INCLUDE_PATHS "" CACHE STRINGS + "Paths to libsupc++ include directories. Separate by system separator") + set(LIBCXX_CXX_ABI_LIBRARIES stdc++) + set(LIBCXX_LIBSUPCXX_FILES + cxxabi.h + bits/c++config.h + bits/os_defines.h + bits/cpu_defines.h + bits/cxxabi_tweaks.h + bits/cxxabi_forced.h + ) + set(LIBCXX_LIBSUPCXX_FILE_PATHS) + foreach(path ${LIBCXX_LIBSUPCXX_FILES}) + set(found FALSE) + foreach(incpath ${LIBCXX_LIBSUPCXX_INCLUDE_PATHS}) + if (EXISTS "${incpath}/${path}") + set(found TRUE) + get_filename_component(dstdir ${path} PATH) + get_filename_component(file ${path} NAME) + add_custom_command( + OUTPUT "${CMAKE_BINARY_DIR}/include/${dstdir}/${file}" + COMMAND ${CMAKE_COMMAND} -E copy_if_different + "${incpath}/${path}" + "${CMAKE_BINARY_DIR}/include/${dstdir}" + MAIN_DEPENDENCY "${incpath}/${path}" + ) + list(APPEND LIBCXX_CXX_ABI_DEPS + "${CMAKE_BINARY_DIR}/include/${dstdir}/${file}") + endif() + endforeach() + if (NOT found) + message(FATAL_ERROR "Failed to find ${path}") + endif() + endforeach() + add_custom_target(supcxx_headers DEPENDS ${LIBCXX_CXX_ABI_DEPS}) + set(LIBCXX_CXX_ABI_DEPS supcxx_headers) + include_directories("${CMAKE_BINARY_DIR}/include") + install(DIRECTORY "${CMAKE_BINARY_DIR}/include/" + DESTINATION include/c++/v1 + FILES_MATCHING + PATTERN "*" + ) +elseif (${LIBCXX_CXX_ABI} NOT STREQUAL "none") + message(FATAL_ERROR + "Currently only none and libsupc++ are supported for c++ abi.") +endif () + # Configure compiler. include(config-ix) diff --git a/libcxx/lib/CMakeLists.txt b/libcxx/lib/CMakeLists.txt index 0418b1c9117..e0f94ca67bd 100644 --- a/libcxx/lib/CMakeLists.txt +++ b/libcxx/lib/CMakeLists.txt @@ -31,7 +31,10 @@ else() ) endif() +add_dependencies(cxx ${LIBCXX_CXX_ABI_DEPS}) + # Generate library list. +set(libraries ${LIBCXX_CXX_ABI_LIBRARIES}) append_if(libraries LIBCXX_HAS_PTHREAD_LIB pthread) append_if(libraries LIBCXX_HAS_C_LIB c) append_if(libraries LIBCXX_HAS_M_LIB m) diff --git a/libcxx/src/exception.cpp b/libcxx/src/exception.cpp index 0dbb6604a56..f5e6d2259da 100644 --- a/libcxx/src/exception.cpp +++ b/libcxx/src/exception.cpp @@ -41,7 +41,7 @@ namespace std { -#if !defined(LIBCXXRT) && !defined(_LIBCPPABI_VERSION) +#if !defined(LIBCXXRT) && !defined(_LIBCPPABI_VERSION) && !defined(__GLIBCXX__) // libcxxrt provides implementations of these functions itself. unexpected_handler @@ -99,7 +99,7 @@ terminate() _NOEXCEPT } #endif // !defined(LIBCXXRT) && !defined(_LIBCPPABI_VERSION) -#ifndef LIBCXXRT +#if !defined(LIBCXXRT) && !defined(__GLIBCXX__) bool uncaught_exception() _NOEXCEPT { #if __APPLE__ || defined(_LIBCPPABI_VERSION) @@ -124,7 +124,7 @@ const char* exception::what() const _NOEXCEPT #endif // _LIBCPPABI_VERSION #endif //LIBCXXRT -#ifndef _LIBCPPABI_VERSION +#if !defined(_LIBCPPABI_VERSION) && !defined(__GLIBCXX__) bad_exception::~bad_exception() _NOEXCEPT { |