[CMake] Add support for selecting which c++ abi library to use.

git-svn-id: https://llvm.org/svn/llvm-project/libcxx/trunk@169036 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Michael J. Spencer 2012-11-30 21:02:29 +00:00
parent 53008d8b0c
commit a358fbe504
3 changed files with 59 additions and 3 deletions

View File

@ -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)

View File

@ -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)

View File

@ -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
{