On Thu, Feb 7, 2013 at 7:27 AM, Howard Hinnant <[email protected]> wrote: > Author: hhinnant > Date: Thu Feb 7 09:27:39 2013 > New Revision: 174623 > > URL: http://llvm.org/viewvc/llvm-project?rev=174623&view=rev > Log: > Michael van der Westhuizen: The attached patch add support for building > against libc++abi and libcxxrt to CMake builds of libc++. > > Usage (with the appropriate CC and CXX environment variables) is: > $ cmake -DLIBCXX_CXX_ABI=libcxxabi > '-DLIBCXX_LIBCXXABI_INCLUDE_PATHS=/home/michael/libcxxabi/include' ../libcxx > and: > $ cmake -DLIBCXX_CXX_ABI=libcxxrt > '-DLIBCXX_LIBCXXRT_INCLUDE_PATHS=/home/michael/libcxxrt/src' ../libcxx > > Modified: > libcxx/trunk/CMakeLists.txt > libcxx/trunk/include/__split_buffer > libcxx/trunk/include/functional > libcxx/trunk/include/string > libcxx/trunk/include/vector > > Modified: libcxx/trunk/CMakeLists.txt > URL: > http://llvm.org/viewvc/llvm-project/libcxx/trunk/CMakeLists.txt?rev=174623&r1=174622&r2=174623&view=diff > ============================================================================== > --- libcxx/trunk/CMakeLists.txt (original) > +++ libcxx/trunk/CMakeLists.txt Thu Feb 7 09:27:39 2013 > @@ -114,6 +114,89 @@ if ("${LIBCXX_CXX_ABI}" STREQUAL "libsup > FILES_MATCHING > PATTERN "*" > ) > +elseif ("${LIBCXX_CXX_ABI}" STREQUAL "libcxxabi") > + set(LIBCXX_LIBCXXABI_INCLUDE_PATHS "${LIBCXX_LIBCXXABI_INCLUDE_PATHS}" > + CACHE STRINGS > + "Paths to libc++abi include directories separate by ';'.") > + set(LIBCXX_CXX_ABI_LIBRARIES c++abi) > + set(LIBCXX_LIBCXXABI_FILES > + cxxabi.h > + cxa_demangle.h > + ) > + file(MAKE_DIRECTORY "${CMAKE_BINARY_DIR}/include") > + set(LIBCXX_LIBCXXABI_FILE_PATHS) > + foreach(path ${LIBCXX_LIBCXXABI_FILES}) > + set(found FALSE) > + foreach(incpath ${LIBCXX_LIBCXXABI_INCLUDE_PATHS}) > + if (EXISTS "${incpath}/${path}") > + set(found TRUE) > + get_filename_component(file ${path} NAME) > + add_custom_command( > + OUTPUT "${CMAKE_BINARY_DIR}/include/${file}" > + COMMAND ${CMAKE_COMMAND} -E copy_if_different > + "${incpath}/${path}" > + "${CMAKE_BINARY_DIR}/include" > + MAIN_DEPENDENCY "${incpath}/${path}" > + ) > + list(APPEND LIBCXX_CXX_ABI_DEPS > + "${CMAKE_BINARY_DIR}/include/${file}") > + endif() > + endforeach() > + if (NOT found) > + message(FATAL_ERROR "Failed to find ${path}") > + endif() > + endforeach() > + add_custom_target(cxxabi_headers DEPENDS ${LIBCXX_CXX_ABI_DEPS}) > + set(LIBCXX_CXX_ABI_DEPS cxxabi_headers) > + include_directories("${CMAKE_BINARY_DIR}/include") > + install(DIRECTORY "${CMAKE_BINARY_DIR}/include/" > + DESTINATION include/c++/v1 > + FILES_MATCHING > + PATTERN "*" > + ) > +elseif ("${LIBCXX_CXX_ABI}" STREQUAL "libcxxrt") > + set(LIBCXX_LIBCXXRT_INCLUDE_PATHS "${LIBCXX_LIBCXXRT_INCLUDE_PATHS}" > + CACHE STRINGS > + "Paths to libcxxrt include directories separate by ';'.") > + set(LIBCXX_CXX_ABI_LIBRARIES cxxrt) > + set(LIBCXX_LIBCXXRT_FILES > + cxxabi.h > + unwind.h > + unwind-arm.h > + unwind-itanium.h > + ) > + file(MAKE_DIRECTORY "${CMAKE_BINARY_DIR}/include") > + set(LIBCXX_LIBCXXRT_FILE_PATHS) > + foreach(path ${LIBCXX_LIBCXXRT_FILES}) > + set(found FALSE) > + foreach(incpath ${LIBCXX_LIBCXXRT_INCLUDE_PATHS}) > + if (EXISTS "${incpath}/${path}") > + set(found TRUE) > + get_filename_component(file ${path} NAME) > + add_custom_command( > + OUTPUT "${CMAKE_BINARY_DIR}/include/${file}" > + COMMAND ${CMAKE_COMMAND} -E copy_if_different > + "${incpath}/${path}" > + "${CMAKE_BINARY_DIR}/include" > + MAIN_DEPENDENCY "${incpath}/${path}" > + ) > + list(APPEND LIBCXX_CXX_ABI_DEPS > + "${CMAKE_BINARY_DIR}/include/${file}") > + endif() > + endforeach() > + if (NOT found) > + message(FATAL_ERROR "Failed to find ${path}") > + endif() > + endforeach() > + add_custom_target(cxxrt_headers DEPENDS ${LIBCXX_CXX_ABI_DEPS}) > + set(LIBCXX_CXX_ABI_DEPS cxxrt_headers) > + include_directories("${CMAKE_BINARY_DIR}/include") > + install(DIRECTORY "${CMAKE_BINARY_DIR}/include/" > + DESTINATION include/c++/v1 > + FILES_MATCHING > + PATTERN "*" > + ) > + list(APPEND LIBCXX_CXX_FEATURE_FLAGS -DLIBCXXRT) > elseif (NOT "${LIBCXX_CXX_ABI}" STREQUAL "none") > message(FATAL_ERROR > "Currently only none and libsupc++ are supported for c++ abi.") >
This should go into a function/macro, as it's pretty much identical between the supported ABIs. - Michael Spencer _______________________________________________ cfe-commits mailing list [email protected] http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits
