[PATCH] Support building libc++ using an in-tree libc++abi

This adds a new LIBCXX_CXX_ABI called "libcxxabi-in-tree", which will add
"${CMAKE_SOURCE_DIR}/projects/libcxxabi/include" to
LIBCXX_LIBCXXABI_INCLUDE_PATHS and will add "cxxabi" as a proper dependency.

This has been a change I’ve been meaning to make for a while. I think a better approach would be to still use ‘libcxxabi’ for LIBCXX_CXX_ABI, but automatically use the headers in projects/libcxxabi/include in the case of an in-tree build. I might even go as far as saying that libcxxabi is the the default cxx abi for an in-tree build. As it is now, libc++ defaults to cxxabi=none, which means you can’t run the tests iirc. As a side note, LIT_EXECUTABLE should also be picked up automatically for an in-tree build.

https://github.com/llvm-mirror/libcxxabi/blob/master/CMakeLists.txt#L118 shows how I tackled the reverse of this (automatically finding libc++ headers for libc++abi). Essentially, take the first available of the user defined path, the in tree path, or the system headers (the ${CMAKE_BINARY_DIR}/${LIBCXXABI_LIBCXX_INCLUDES} bit is to ensure that the user provided path works as an abspath or a relative path).

Awesome! I’ll change it up to implement your suggestions.

It looks like LIT_EXECUTABLE will already be set correctly. See https://github.com/llvm-mirror/libcxx/blob/master/test/CMakeLists.txt#L14 which depends on LIBCXX_BUILT_STANDALONE not being set, which it won’t via the check in https://github.com/llvm-mirror/libcxx/blob/master/CMakeLists.txt#L29

This will detect if you are building libcxx in-tree and libcxxabi is available.
If so, it will default to using the in-tree libcxxabi by setting LIBCXX_CXX_ABI
to "libcxxabi", LIBCXX_LIBCXXABI_INCLUDE_PATHS to
"${CMAKE_SOURCE_DIR}/projects/libcxxabi/include" and will add "cxxabi" as a
proper dependency.

From: Russell Harmon <eatnumber1@google.com>

This will detect if you are building libcxx in-tree and libcxxabi is
available.
If so, it will default to using the in-tree libcxxabi by setting
LIBCXX_CXX_ABI
to "libcxxabi", LIBCXX_LIBCXXABI_INCLUDE_PATHS to
"${CMAKE_SOURCE_DIR}/projects/libcxxabi/include" and will add "cxxabi" as a
proper dependency.
---
CMakeLists.txt | 19 ++++++++++++++++++-
1 file changed, 18 insertions(+), 1 deletion(-)

diff --git a/CMakeLists.txt b/CMakeLists.txt
index c20e5d1..a6253fa 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -28,6 +28,11 @@ MACRO_ENSURE_OUT_OF_SOURCE_BUILD(

if(CMAKE_SOURCE_DIR STREQUAL CMAKE_CURRENT_SOURCE_DIR)
   set(LIBCXX_BUILT_STANDALONE 1)
+else ()
+ set(libcxxabi_intree_path "${CMAKE_SOURCE_DIR}/projects/libcxxabi")
+ if (NOT IS_DIRECTORY ${libcxxabi_intree_path})
+ unset (libcxxabi_intree_path)
+ endif ()
endif()

#===============================================================================
@@ -46,7 +51,11 @@ option(LIBCXX_INSTALL_SUPPORT_HEADERS "Install libc++
support headers." ON)

set(CXXABIS none libcxxabi libcxxrt libstdc++ libsupc++)
if (NOT DEFINED LIBCXX_CXX_ABI)
- set(LIBCXX_CXX_ABI "none")
+ if (DEFINED libcxxabi_intree_path)
+ set(LIBCXX_CXX_ABI "libcxxabi")
+ else ()
+ set(LIBCXX_CXX_ABI "none")
+ endif ()

endif()

set(LIBCXX_CXX_ABI "${LIBCXX_CXX_ABI}" CACHE STRING
     "Specify C++ ABI library to use." FORCE)
@@ -146,9 +155,17 @@ if ("${LIBCXX_CXX_ABI}" STREQUAL "libstdc++" OR
     "${_LIBSUPCXX_LIBNAME}" "${_LIBSUPCXX_INCLUDE_FILES}" "bits"
     )
elseif ("${LIBCXX_CXX_ABI}" STREQUAL "libcxxabi")
+ if (DEFINED libcxxabi_intree_path)
+ set(LIBCXX_LIBCXXABI_INCLUDE_PATHS "${libcxxabi_intree_path}/include")
+ endif ()
+

I think the above three changes could be merged. The second block could be
replaced by something like:

if (NOT DEFINED LIBCXX_CXX_ABI)
  if (NOT DEFINED LIBCXX_BUILT_STANDALONE AND IS_DIRECTORY
"${CMAKE_SOURCE_DIR}/projects/libcxxabi")
    set(LIBCXX_CXX_ABI "libcxxabi")

set(LIBCXX_LIBCXXABI_INCLUDE_PATHS "${CMAKE_SOURCE_DIR}/projects/libcxxabi")
  else()
    set(LIBCXX_CXX_ABI "none")
  endif()
endif()

Or something similar. I haven't tested it though.

    setup_abi_lib("LIBCXX_LIBCXXABI_INCLUDE_PATHS" ""
     "c++abi" "cxxabi.h" ""
     )
+
+ if (DEFINED libcxxabi_intree_path)
+ add_dependencies(LIBCXX_CXX_ABI_DEPS cxxabi)
+ endif ()

Good call. I had forgotten to mention this gripe.

Please send patches to cfe-commits.

Ok, I’ll send my follow ups to cfe-commits.