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++/<version></code> and + <code>/usr/include/c++/<version>/<target-triple></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 <...> 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 + <libc++-source-dir></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> <!--=====================================================================-->