From bb8cfd0fec3dcd4be6134350ac1da052473266fe Mon Sep 17 00:00:00 2001
From: "Michael J. Spencer" <bigcheesegs@gmail.com>
Date: Mon, 31 Dec 2012 19:34:21 +0000
Subject: [PATCH] [CMake] Fix c++ abi library configuration on Linux.

You can now configure from the command line using:
-DLIBCXX_CXX_ABI=libsupc++
-DLIBCXX_LIBSUPCXX_INCLUDE_PATHS="path;path

Also documents how to build on Linux.

llvm-svn: 171316
---
 libcxx/CMakeLists.txt     | 15 ++++++++---
 libcxx/lib/CMakeLists.txt |  4 ++-
 libcxx/www/index.html     | 55 +++++++++++++++++++++++++++++++++++++++
 3 files changed, 69 insertions(+), 5 deletions(-)

diff --git a/libcxx/CMakeLists.txt b/libcxx/CMakeLists.txt
index 0f7941c48841..663467e7867d 100644
--- a/libcxx/CMakeLists.txt
+++ b/libcxx/CMakeLists.txt
@@ -40,6 +40,9 @@ option(LIBCXX_ENABLE_CXX0X "Enable -std=c++0x and use of c++0x language features
 option(LIBCXX_ENABLE_SHARED "Build libc++ as a shared library." ON)
 
 set(CXXABIS none libcxxabi libcxxrt libsupc++)
+if (NOT DEFINED LIBCXX_CXX_ABI)
+  set(LIBCXX_CXX_ABI "none")
+endif()
 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})
@@ -63,9 +66,10 @@ 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")
+if ("${LIBCXX_CXX_ABI}" STREQUAL "libsupc++")
+  set(LIBCXX_LIBSUPCXX_INCLUDE_PATHS "${LIBCXX_LIBSUPCXX_INCLUDE_PATHS}"
+      CACHE STRINGS
+      "Paths to libsupc++ include directories separate by ';'.")
   set(LIBCXX_CXX_ABI_LIBRARIES stdc++)
   set(LIBCXX_LIBSUPCXX_FILES
       cxxabi.h
@@ -75,6 +79,9 @@ if (${LIBCXX_CXX_ABI} STREQUAL "libsupc++")
       bits/cxxabi_tweaks.h
       bits/cxxabi_forced.h
       )
+  # Create include directories.
+  file(MAKE_DIRECTORY "${CMAKE_BINARY_DIR}/include")
+  file(MAKE_DIRECTORY "${CMAKE_BINARY_DIR}/include/bits")
   set(LIBCXX_LIBSUPCXX_FILE_PATHS)
   foreach(path ${LIBCXX_LIBSUPCXX_FILES})
     set(found FALSE)
@@ -106,7 +113,7 @@ if (${LIBCXX_CXX_ABI} STREQUAL "libsupc++")
     FILES_MATCHING
     PATTERN "*"
     )
-elseif (${LIBCXX_CXX_ABI} NOT STREQUAL "none")
+elseif (NOT "${LIBCXX_CXX_ABI}" STREQUAL "none")
   message(FATAL_ERROR
           "Currently only none and libsupc++ are supported for c++ abi.")
 endif ()
diff --git a/libcxx/lib/CMakeLists.txt b/libcxx/lib/CMakeLists.txt
index e0f94ca67bd1..4ee1f4d08058 100644
--- a/libcxx/lib/CMakeLists.txt
+++ b/libcxx/lib/CMakeLists.txt
@@ -31,7 +31,9 @@ else()
     )
 endif()
 
-add_dependencies(cxx ${LIBCXX_CXX_ABI_DEPS})
+if (DEFINED LIBCXX_CXX_ABI_DEPS)
+  add_dependencies(cxx ${LIBCXX_CXX_ABI_DEPS})
+endif()
 
 # Generate library list.
 set(libraries ${LIBCXX_CXX_ABI_LIBRARIES})
diff --git a/libcxx/www/index.html b/libcxx/www/index.html
index 5d6fa27e6925..091b0bace5dc 100644
--- a/libcxx/www/index.html
+++ b/libcxx/www/index.html
@@ -116,6 +116,7 @@
   <!--=====================================================================-->
 
    <p>libc++ is a 100% complete C++11 implementation on Apple's OS X. </p>
+   <p>LLVM and Clang can self host in C++ and C++11 mode with libc++ on Linux.</p>
 
    <p>
    Ports to other platforms are underway. Here are recent test
@@ -204,6 +205,60 @@ against it with <code>-fno-rtti</code> is supported.
   <p>Send discussions to the
   (<a href="http://lists.cs.uiuc.edu/mailman/listinfo/cfe-dev">clang mailing list</a>).</p>
 
+  <!--=====================================================================-->
+  <h2>Build on Linux using CMake and libsupc++.</h2>
+  <!--=====================================================================-->
+
+  <p>
+     You will need libstdc++ in order to provide libsupc++.
+  </p>
+  
+  <p>
+     Figure out where the libsupc++ headers are on your system. On Ubuntu this
+     is <code>/usr/include/c++/&lt;version&gt;</code> and
+     <code>/usr/include/c++/&lt;version&gt;/&lt;target-triple&gt;</code>
+  </p>
+  
+  <p>
+     You can also figure this out by running
+     <pre>
+$ echo | g++ -Wp,-v -x c++ - -fsyntax-only
+ignoring nonexistent directory "/usr/local/include/x86_64-linux-gnu"
+ignoring nonexistent directory "/usr/lib/gcc/x86_64-linux-gnu/4.7/../../../../x86_64-linux-gnu/include"
+#include "..." search starts here:
+#include &lt;...&gt; search starts here:
+ /usr/include/c++/4.7
+ /usr/include/c++/4.7/x86_64-linux-gnu
+ /usr/include/c++/4.7/backward
+ /usr/lib/gcc/x86_64-linux-gnu/4.7/include
+ /usr/local/include
+ /usr/lib/gcc/x86_64-linux-gnu/4.7/include-fixed
+ /usr/include/x86_64-linux-gnu
+ /usr/include
+End of search list.
+     </pre>
+
+      Note the first two entries happen to be what we are looking for. This
+      may not be correct on other platforms.
+  </p>
+  
+  <p>
+     We can now run CMake:
+     <ul>
+       <li><code>CC=clang CXX=clang++ cmake -G "Unix Makefiles"
+                -DLIBCXX_CXX_ABI=libsupc++
+                -DLIBCXX_LIBSUPCXX_INCLUDE_PATHS="/usr/include/c++/4.7/;/usr/include/c++/4.7/x86_64-linux-gnu/"
+                -DCMAKE_BUILD_TYPE=Release
+                -DCMAKE_INSTALL_PREFIX=/usr
+                &lt;libc++-source-dir&gt;</code></li>
+       <li><code>make</code></li>
+       <li><code>sudo make install</code></li>
+     </ul>
+     <p>
+        You can now run clang with -stdlib=libc++.
+     </p>
+  </p>
+
   <!--=====================================================================-->
   <h2>Design Documents</h2>
   <!--=====================================================================-->