I've tested that this builds both in the tree and standalone on Linux and OS X.<br><br><div>On Thu Jun 26 2014 at 11:43:25 PM, Dan Albert <<a href="mailto:danalbert@google.com">danalbert@google.com</a>> wrote:</div>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">No longer have to perform a full rebuild every time. This also makes<br>
building on Linux simpler, and allows building libcxxabi to be built<br>
from within the llvm tree (under projects/).<br>
<br>
This does not yet support building the unwinder in src/Unwind. That will<br>
be added in a later patch. Will also add support for tests with lit in a<br>
later patch.<br>
---<br>
 CMakeLists.txt        | 214 ++++++++++++++++++++++++++++++<u></u>++++++++++++++++++++<br>
 cmake/config-ix.cmake |  27 +++++++<br>
 src/CMakeLists.txt    |  74 +++++++++++++++++<br>
 www/index.html        |  10 +++<br>
 4 files changed, 325 insertions(+)<br>
 create mode 100644 CMakeLists.txt<br>
 create mode 100644 cmake/config-ix.cmake<br>
 create mode 100644 src/CMakeLists.txt<br>
<br>
diff --git a/CMakeLists.txt b/CMakeLists.txt<br>
new file mode 100644<br>
index 0000000..26c4d91<br>
--- /dev/null<br>
+++ b/CMakeLists.txt<br>
@@ -0,0 +1,214 @@<br>
+#============================<u></u>==============================<u></u>=====================<br>
+# Setup Project<br>
+#============================<u></u>==============================<u></u>=====================<br>
+<br>
+cmake_minimum_required(<u></u>VERSION 2.8.11)<br>
+<br>
+if (CMAKE_SOURCE_DIR STREQUAL CMAKE_CURRENT_SOURCE_DIR)<br>
+  project(libcxxabi)<br>
+<br>
+  # Rely on llvm-config.<br>
+  set(CONFIG_OUTPUT)<br>
+  find_program(LLVM_CONFIG "llvm-config")<br>
+  if(LLVM_CONFIG)<br>
+    message(STATUS "Found LLVM_CONFIG as ${LLVM_CONFIG}")<br>
+    set(CONFIG_COMMAND ${LLVM_CONFIG}<br>
+      "--bindir"<br>
+      "--libdir"<br>
+      "--prefix"<br>
+      "--src-root")<br>
+    execute_process(<br>
+      COMMAND ${CONFIG_COMMAND}<br>
+      RESULT_VARIABLE HAD_ERROR<br>
+      OUTPUT_VARIABLE CONFIG_OUTPUT<br>
+    )<br>
+    if(NOT HAD_ERROR)<br>
+      string(REGEX REPLACE<br>
+        "[ \t]*[\r\n]+[ \t]*" ";"<br>
+        CONFIG_OUTPUT ${CONFIG_OUTPUT})<br>
+    else()<br>
+      string(REPLACE ";" " " CONFIG_COMMAND_STR "${CONFIG_COMMAND}")<br>
+      message(STATUS "${CONFIG_COMMAND_STR}")<br>
+      message(FATAL_ERROR "llvm-config failed with status ${HAD_ERROR}")<br>
+    endif()<br>
+  else()<br>
+    message(FATAL_ERROR "llvm-config not found -- ${LLVM_CONFIG}")<br>
+  endif()<br>
+<br>
+  list(GET CONFIG_OUTPUT 0 TOOLS_BINARY_DIR)<br>
+  list(GET CONFIG_OUTPUT 1 LIBRARY_DIR)<br>
+  list(GET CONFIG_OUTPUT 2 LLVM_OBJ_ROOT)<br>
+  list(GET CONFIG_OUTPUT 3 MAIN_SRC_DIR)<br>
+<br>
+  set(LLVM_TOOLS_BINARY_DIR ${TOOLS_BINARY_DIR} CACHE PATH "Path to llvm/bin")<br>
+  set(LLVM_LIBRARY_DIR ${LIBRARY_DIR} CACHE PATH "Path to llvm/lib")<br>
+  set(LLVM_BINARY_DIR ${LLVM_OBJ_ROOT} CACHE PATH "Path to LLVM build tree")<br>
+  set(LLVM_MAIN_SRC_DIR ${MAIN_SRC_DIR} CACHE PATH "Path to LLVM source tree")<br>
+<br>
+  set(LLVM_CMAKE_PATH "${LLVM_BINARY_DIR}/share/<u></u>llvm/cmake")<br>
+  set(LLVMCONFIG_FILE "${LLVM_CMAKE_PATH}/<u></u>LLVMConfig.cmake")<br>
+  if(EXISTS ${LLVMCONFIG_FILE})<br>
+    list(APPEND CMAKE_MODULE_PATH "${LLVM_CMAKE_PATH}")<br>
+    include(${LLVMCONFIG_FILE})<br>
+  else()<br>
+    message(FATAL_ERROR "Not found: ${LLVMCONFIG_FILE}")<br>
+  endif()<br>
+<br>
+  set(PACKAGE_NAME libcxxabi)<br>
+  set(PACKAGE_VERSION "${LLVM_PACKAGE_VERSION}")<br>
+  set(PACKAGE_STRING "${PACKAGE_NAME} ${PACKAGE_VERSION}")<br>
+  set(PACKAGE_BUGREPORT "<a href="mailto:llvmbugs@cs.uiuc.edu" target="_blank">llvmbugs@cs.uiuc.edu</a>")<br>
+<br>
+  if(EXISTS ${LLVM_MAIN_SRC_DIR}/utils/<u></u>lit/lit.py)<br>
+    set(LLVM_LIT ${LLVM_MAIN_SRC_DIR}/utils/<u></u>lit/lit.py)<br>
+  else()<br>
+    # Seek installed Lit.<br>
+    find_program(LLVM_LIT "lit.py" ${LLVM_MAIN_SRC_DIR}/utils/lit<br>
+      DOC "Path to lit.py")<br>
+  endif()<br>
+<br>
+  if(LLVM_LIT)<br>
+    # Define the default arguments to use with 'lit', and an option for the user<br>
+    # to override.<br>
+    set(LIT_ARGS_DEFAULT "-sv")<br>
+    if (MSVC OR XCODE)<br>
+      set(LIT_ARGS_DEFAULT "${LIT_ARGS_DEFAULT} --no-progress-bar")<br>
+    endif()<br>
+    set(LLVM_LIT_ARGS "${LIT_ARGS_DEFAULT}" CACHE STRING "Default options for lit")<br>
+<br>
+    # On Win32 hosts, provide an option to specify the path to the GnuWin32 tools.<br>
+    if( WIN32 AND NOT CYGWIN )<br>
+      set(LLVM_LIT_TOOLS_DIR "" CACHE PATH "Path to GnuWin32 tools")<br>
+    endif()<br>
+  else()<br>
+    set(LLVM_INCLUDE_TESTS OFF)<br>
+  endif()<br>
+<br>
+  set(CMAKE_ARCHIVE_OUTPUT_<u></u>DIRECTORY ${CMAKE_BINARY_DIR}/lib)<br>
+  set(CMAKE_LIBRARY_OUTPUT_<u></u>DIRECTORY ${CMAKE_BINARY_DIR}/lib)<br>
+<br>
+  set(LIBCXXABI_BUILT_STANDALONE 1)<br>
+endif()<br>
+<br>
+#============================<u></u>==============================<u></u>=====================<br>
+# Setup CMake Options<br>
+#============================<u></u>==============================<u></u>=====================<br>
+<br>
+# Define options.<br>
+option(LIBCXXABI_ENABLE_RTTI "Use run time type information." ON)<br>
+option(LIBCXXABI_ENABLE_<u></u>ASSERTIONS "Enable assertions independent of build mode." ON)<br>
+option(LIBCXXABI_ENABLE_<u></u>PEDANTIC "Compile with pedantic enabled." ON)<br>
+option(LIBCXXABI_ENABLE_<u></u>WERROR "Fail and stop if a warning is triggered." OFF)<br>
+option(LIBCXXABI_ENABLE_CXX11 "Enable -std=c++11 and use of c++11 language features if the compiler supports it." ON)<br>
+option(LIBCXXABI_ENABLE_<u></u>SHARED "Build libc++abi as a shared library." ON)<br>
+<br>
+#============================<u></u>==============================<u></u>=====================<br>
+# Configure System<br>
+#============================<u></u>==============================<u></u>=====================<br>
+<br>
+# Add path for custom modules<br>
+set(CMAKE_MODULE_PATH<br>
+  "${CMAKE_CURRENT_SOURCE_DIR}/<u></u>cmake"<br>
+  "${CMAKE_CURRENT_SOURCE_DIR}/<u></u>cmake/Modules"<br>
+  ${CMAKE_MODULE_PATH}<br>
+  )<br>
+<br>
+# Configure compiler.<br>
+include(config-ix)<br>
+<br>
+#============================<u></u>==============================<u></u>=====================<br>
+# Setup Compiler Flags<br>
+#============================<u></u>==============================<u></u>=====================<br>
+<br>
+# Get required flags.<br>
+macro(append_if list condition var)<br>
+  if (${condition})<br>
+    list(APPEND ${list} ${var})<br>
+  endif()<br>
+endmacro()<br>
+<br>
+if (LIBCXXABI_HAS_NOSTDINCXX_<u></u>FLAG)<br>
+  list(APPEND LIBCXXABI_CXX_REQUIRED_FLAGS -nostdinc++)<br>
+endif()<br>
+if (LIBCXXABI_ENABLE_CXX11 AND LIBCXXABI_HAS_STDCXX11_FLAG)<br>
+  list(APPEND LIBCXXABI_CXX_REQUIRED_FLAGS -std=c++11)<br>
+endif()<br>
+<br>
+# Get warning flags<br>
+if (NOT MSVC)<br>
+  append_if(LIBCXXABI_CXX_<u></u>WARNING_FLAGS LIBCXXABI_HAS_WALL_FLAG -Wall)<br>
+  append_if(LIBCXXABI_CXX_<u></u>WARNING_FLAGS LIBCXXABI_HAS_WNO_UNUSED_<u></u>FUNCTION_FLAG -Wno-unused-function)<br>
+  list(APPEND LIBCXXABI_CXX_REQUIRED_FLAGS -Werror=return-type)<br>
+endif()<br>
+<br>
+append_if(LIBCXXABI_CXX_<u></u>WARNING_FLAGS LIBCXXABI_HAS_W_FLAG -W)<br>
+append_if(LIBCXXABI_CXX_<u></u>WARNING_FLAGS LIBCXXABI_HAS_WNO_UNUSED_<u></u>PARAMETER_FLAG -Wno-unused-parameter)<br>
+append_if(LIBCXXABI_CXX_<u></u>WARNING_FLAGS LIBCXXABI_HAS_WWRITE_STRINGS_<u></u>FLAG -Wwrite-strings)<br>
+append_if(LIBCXXABI_CXX_<u></u>WARNING_FLAGS LIBCXXABI_HAS_WNO_LONG_LONG_<u></u>FLAG -Wno-long-long)<br>
+if (LIBCXXABI_ENABLE_WERROR)<br>
+  append_if(LIBCXXABI_CXX_<u></u>WARNING_FLAGS LIBCXXABI_HAS_WERROR_FLAG -Werror)<br>
+  append_if(LIBCXXABI_CXX_<u></u>WARNING_FLAGS LIBCXXABI_HAS_WX_FLAG -WX)<br>
+else()<br>
+  append_if(LIBCXXABI_CXX_<u></u>WARNING_FLAGS LIBCXXABI_HAS_WNO_ERROR_FLAG -Wno-error)<br>
+  append_if(LIBCXXABI_CXX_<u></u>WARNING_FLAGS LIBCXXABI_HAS_NO_WX_FLAG -WX-)<br>
+endif()<br>
+if (LIBCXXABI_ENABLE_PEDANTIC)<br>
+  append_if(LIBCXXABI_CXX_<u></u>WARNING_FLAGS LIBCXXABI_HAS_PEDANTIC_FLAG -pedantic)<br>
+endif()<br>
+<br>
+# Get feature flags.<br>
+# Exceptions<br>
+# Catches C++ exceptions only and tells the compiler to assume that extern C<br>
+# functions never throw a C++ exception.<br>
+append_if(LIBCXXABI_CXX_<u></u>FEATURE_FLAGS LIBCXXABI_HAS_EHSC_FLAG -EHsc)<br>
+# RTTI<br>
+if (NOT LIBCXXABI_ENABLE_RTTI)<br>
+  list(APPEND LIBCXXABI_CXX_FEATURE_FLAGS -D_LIBCPP_NO_RTTI)<br>
+  append_if(LIBCXXABI_CXX_<u></u>FEATURE_FLAGS LIBCXXABI_HAS_NO_GR_FLAG -GR-)<br>
+  append_if(LIBCXXABI_CXX_<u></u>FEATURE_FLAGS LIBCXXABI_HAS_FNO_RTTI_FLAG -fno-rtti)<br>
+endif()<br>
+# Assert<br>
+string(TOUPPER "${CMAKE_BUILD_TYPE}" uppercase_CMAKE_BUILD_TYPE)<br>
+if (LIBCXXABI_ENABLE_ASSERTIONS)<br>
+  # MSVC doesn't like _DEBUG on release builds. See PR 4379.<br>
+  if (NOT MSVC)<br>
+    list(APPEND LIBCXXABI_CXX_FEATURE_FLAGS -D_DEBUG)<br>
+  endif()<br>
+  # On Release builds cmake automatically defines NDEBUG, so we<br>
+  # explicitly undefine it:<br>
+  if (uppercase_CMAKE_BUILD_TYPE STREQUAL "RELEASE")<br>
+    list(APPEND LIBCXXABI_CXX_FEATURE_FLAGS -UNDEBUG)<br>
+  endif()<br>
+else()<br>
+  if (NOT uppercase_CMAKE_BUILD_TYPE STREQUAL "RELEASE")<br>
+    list(APPEND LIBCXXABI_CXX_FEATURE_FLAGS -DNDEBUG)<br>
+  endif()<br>
+endif()<br>
+# Static library<br>
+if (NOT LIBCXXABI_ENABLE_SHARED)<br>
+  list(APPEND LIBCXXABI_CXX_FEATURE_FLAGS -D_LIBCPP_BUILD_STATIC)<br>
+endif()<br>
+<br>
+# This is the _ONLY_ place where add_definitions is called.<br>
+if (MSVC)<br>
+  add_definitions(-D_CRT_SECURE_<u></u>NO_WARNINGS)<br>
+endif()<br>
+<br>
+string(REPLACE ";" " " LIBCXXABI_CXX_REQUIRED_FLAGS "${LIBCXXABI_CXX_REQUIRED_<u></u>FLAGS}")<br>
+set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${LIBCXXABI_CXX_REQUIRED_<u></u>FLAGS}")<br>
+<br>
+string(REPLACE ";" " " LIBCXXABI_CXX_WARNING_FLAGS "${LIBCXXABI_CXX_WARNING_<u></u>FLAGS}")<br>
+set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${LIBCXXABI_CXX_WARNING_FLAGS}<u></u>")<br>
+<br>
+string(REPLACE ";" " " LIBCXXABI_CXX_FEATURE_FLAGS "${LIBCXXABI_CXX_FEATURE_<u></u>FLAGS}")<br>
+set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${LIBCXXABI_CXX_FEATURE_FLAGS}<u></u>")<br>
+<br>
+#============================<u></u>==============================<u></u>=====================<br>
+# Setup Source Code<br>
+#============================<u></u>==============================<u></u>=====================<br>
+<br>
+include_directories(include)<br>
+<br>
+# Add source code. This also contains all of the logic for deciding linker flags<br>
+# soname, etc...<br>
+add_subdirectory(src)<br>
diff --git a/cmake/config-ix.cmake b/cmake/config-ix.cmake<br>
new file mode 100644<br>
index 0000000..96da3f5<br>
--- /dev/null<br>
+++ b/cmake/config-ix.cmake<br>
@@ -0,0 +1,27 @@<br>
+include(CheckLibraryExists)<br>
+include(CheckCXXCompilerFlag)<br>
+<br>
+# Check compiler flags<br>
+check_cxx_compiler_flag(-std=<u></u>c++11            LIBCXXABI_HAS_STDCXX11_FLAG)<br>
+check_cxx_compiler_flag(-fPIC                 LIBCXXABI_HAS_FPIC_FLAG)<br>
+check_cxx_compiler_flag(-<u></u>nodefaultlibs        LIBCXXABI_HAS_NODEFAULTLIBS_<u></u>FLAG)<br>
+check_cxx_compiler_flag(-<u></u>nostdinc++           LIBCXXABI_HAS_NOSTDINCXX_FLAG)<br>
+check_cxx_compiler_flag(-Wall                 LIBCXXABI_HAS_WALL_FLAG)<br>
+check_cxx_compiler_flag(-W                    LIBCXXABI_HAS_W_FLAG)<br>
+check_cxx_compiler_flag(-Wno-<u></u>unused-function  LIBCXXABI_HAS_WNO_UNUSED_<u></u>FUNCTION_FLAG)<br>
+check_cxx_compiler_flag(-Wno-<u></u>unused-parameter LIBCXXABI_HAS_WNO_UNUSED_<u></u>PARAMETER_FLAG)<br>
+check_cxx_compiler_flag(-<u></u>Wwrite-strings       LIBCXXABI_HAS_WWRITE_STRINGS_<u></u>FLAG)<br>
+check_cxx_compiler_flag(-Wno-<u></u>long-long        LIBCXXABI_HAS_WNO_LONG_LONG_<u></u>FLAG)<br>
+check_cxx_compiler_flag(-<u></u>pedantic             LIBCXXABI_HAS_PEDANTIC_FLAG)<br>
+check_cxx_compiler_flag(-<u></u>Werror               LIBCXXABI_HAS_WERROR_FLAG)<br>
+check_cxx_compiler_flag(-Wno-<u></u>error            LIBCXXABI_HAS_WNO_ERROR_FLAG)<br>
+check_cxx_compiler_flag(-fno-<u></u>rtti             LIBCXXABI_HAS_FNO_RTTI_FLAG)<br>
+check_cxx_compiler_flag(/WX                   LIBCXXABI_HAS_WX_FLAG)<br>
+check_cxx_compiler_flag(/WX-                  LIBCXXABI_HAS_NO_WX_FLAG)<br>
+check_cxx_compiler_flag(/EHsc                 LIBCXXABI_HAS_EHSC_FLAG)<br>
+check_cxx_compiler_flag(/EHs-                 LIBCXXABI_HAS_NO_EHS_FLAG)<br>
+check_cxx_compiler_flag(/EHa-                 LIBCXXABI_HAS_NO_EHA_FLAG)<br>
+check_cxx_compiler_flag(/GR-                  LIBCXXABI_HAS_NO_GR_FLAG)<br>
+<br>
+# Check libraries<br>
+check_library_exists(c printf "" LIBCXXABI_HAS_C_LIB)<br>
diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt<br>
new file mode 100644<br>
index 0000000..416f433<br>
--- /dev/null<br>
+++ b/src/CMakeLists.txt<br>
@@ -0,0 +1,74 @@<br>
+# Get sources<br>
+file(GLOB LIBCXXABI_SOURCES *.cpp)<br>
+<br>
+# Add all the headers to the project for IDEs.<br>
+if (MSVC_IDE OR XCODE)<br>
+  file(GLOB_RECURSE LIBCXXABI_HEADERS ${CMAKE_CURRENT_SOURCE_DIR}/..<u></u>/include/*)<br>
+  # Force them all into the headers dir on MSVC, otherwise they end up at<br>
+  # project scope because they don't have extensions.<br>
+  if (MSVC_IDE)<br>
+    source_group("Header Files" FILES ${LIBCXXABI_HEADERS})<br>
+  endif()<br>
+endif()<br>
+<br>
+if (LIBCXXABI_ENABLE_SHARED)<br>
+  add_library(cxxabi SHARED<br>
+    ${LIBCXXABI_SOURCES}<br>
+    ${LIBCXXABI_HEADERS}<br>
+    )<br>
+else()<br>
+  add_library(cxxabi STATIC<br>
+    ${LIBCXXABI_SOURCES}<br>
+    ${LIBCXXABI_HEADERS}<br>
+    )<br>
+endif()<br>
+<br>
+if (LIBCXXABI_LIBCXX_PATH)<br>
+  target_include_directories(<u></u>cxxabi PRIVATE "${LIBCXXABI_LIBCXX_PATH}/<u></u>include")<br>
+elseif (NOT LIBCXXABI_BUILT_STANDALONE)<br>
+  target_include_directories(<u></u>cxxabi PRIVATE<br>
+                             "${LLVM_MAIN_SRC_DIR}/<u></u>projects/libcxx/include")<br>
+elseif (NOT APPLE)<br>
+  message(FATAL_ERROR "LIBCXXABI_LIBCXX_PATH is not set.")<br>
+endif()<br>
+<br>
+# Generate library list.<br>
+set(libraries ${LIBCXXABI_CXX_ABI_LIBRARIES}<u></u>)<br>
+append_if(libraries LIBCXXABI_HAS_C_LIB c)<br>
+<br>
+target_link_libraries(cxxabi ${libraries})<br>
+<br>
+# Setup flags.<br>
+append_if(compile_flags LIBCXXABI_HAS_FPIC_FLAG -fPIC)<br>
+append_if(link_flags LIBCXXABI_HAS_NODEFAULTLIBS_<u></u>FLAG -nodefaultlibs)<br>
+<br>
+if ( APPLE )<br>
+  if ( CMAKE_OSX_DEPLOYMENT_TARGET STREQUAL "10.6" )<br>
+    list(APPEND compile_flags "-U__STRICT_ANSI__")<br>
+    list(APPEND link_flags<br>
+      "-compatibility_version 1"<br>
+      "-current_version ${LIBCXXABI_VERSION}"<br>
+      "-install_name /usr/lib/libc++abi.1.dylib"<br>
+      "/usr/lib/libSystem.B.dylib")<br>
+  else()<br>
+    list(APPEND link_flags<br>
+      "-compatibility_version 1"<br>
+      "-install_name /usr/lib/libc++abi.1.dylib")<br>
+  endif()<br>
+endif()<br>
+<br>
+string(REPLACE ";" " " link_flags "${link_flags}")<br>
+<br>
+set_target_properties(cxxabi<br>
+  PROPERTIES<br>
+    COMPILE_FLAGS "${compile_flags}"<br>
+    LINK_FLAGS    "${link_flags}"<br>
+    OUTPUT_NAME   "c++abi"<br>
+    VERSION       "1.0"<br>
+    SOVERSION     "1"<br>
+  )<br>
+<br>
+install(TARGETS cxxabi<br>
+  LIBRARY DESTINATION lib<br>
+  ARCHIVE DESTINATION lib<br>
+  )<br>
diff --git a/www/index.html b/www/index.html<br>
index a174afd..4960b95 100644<br>
--- a/www/index.html<br>
+++ b/www/index.html<br>
@@ -79,6 +79,16 @@<br>
   <li><code>svn co <a href="http://llvm.org/svn/llvm-project/libcxxabi/trunk" target="_blank">http://llvm.org/svn/llvm-<u></u>project/libcxxabi/trunk</a> libcxxabi</code></li><br>
   </ul><br>
<br>
+  <p>To build on Linux:</p><br>
+  <ul><br>
+  <li><code>cd libcxxabi</code></li><br>
+  <li><code>mkdir build &amp;&amp; cd build</code></li><br>
+  <li><code>CC=clang CXX=clang++ cmake LIBCXXABI_LIBCXX_PATH=path/to/<u></u>libcxx ..</code></li><br>
+  <li><code>make</code></li><br>
+  </ul><br>
+<br>
+  <p>You can also checkout libcxxabi to llvm/projects to build in tree.<p><br>
+<br>
   <p>Send discussions to the<br>
   (<a href="<a href="http://lists.cs.uiuc.edu/mailman/listinfo/cfe-dev" target="_blank">http://lists.cs.uiuc.<u></u>edu/mailman/listinfo/cfe-dev</a>"><u></u>clang mailing list</a>).</p><br>
<br>
--<br>
2.0.0.526.g5318336<br>
<br>
</blockquote>