Hi Daniel, I applied the patch and build libcxxabi with it on linux64 Ubuntu.
A couple of notes and questions: - It seems gmail bungled the patch for me. I had to manually fix it (just an FYI) - The cmake invocation in the documentation should have -D in front of LIBCXXABI_LIBCXX_PATH. - How does LIBCXXABI_LIBCXX_PATH work when you want to include an installed version of the libc++ headers? (/include/<headers> vs /include/c++/v1/<headers>) Eric On Sun, Jun 29, 2014 at 1:27 PM, Nico Weber <[email protected]> wrote: > +Nick and Logan > > I think this is a good start, and it'd be great if libcxxabi could be > built like the rest of llvm :-) > > A few notes (note that I'm not terribly familiar with cmake); I don't > think they all need to be addressed before landing this: > * It'd be nice if LIBCXXABI_LIBCXX_PATH was set automatically when > libcxxabi is in llvm/projects/libcxxabi and libcxx is in > llvm/projects/libcxx > * This doesn't include libUnwind yet > * llvm's toplevel cmake only asks for cmake 2.8.8, this needs 2.8.11 (I > guess this is for target_include_directories – I don't know if not using > target_include_directories would make things much more complicated, and > requiring a more recent cmake doesn't seem like a big deal but it'd be nice > if all the llvm projects had similar requirements.) > * It'd probably be good if this had the target_ mechanisms that > compiler-rt's cmakefiles have, so that libcxxabi can be built for various > targets > * Eventually, some check- target for running tests too would be awesome > * I'd have the docs recommend doing in-llvm-tree builds if that means that > things Just Work with llvm's regular cmake build > > > On Thu, Jun 26, 2014 at 11:45 PM, Dan Albert <[email protected]> wrote: > >> I've tested that this builds both in the tree and standalone on Linux and >> OS X. >> >> >> On Thu Jun 26 2014 at 11:43:25 PM, Dan Albert <[email protected]> >> wrote: >> >>> No longer have to perform a full rebuild every time. This also makes >>> building on Linux simpler, and allows building libcxxabi to be built >>> from within the llvm tree (under projects/). >>> >>> This does not yet support building the unwinder in src/Unwind. That will >>> be added in a later patch. Will also add support for tests with lit in a >>> later patch. >>> --- >>> CMakeLists.txt | 214 ++++++++++++++++++++++++++++++ >>> ++++++++++++++++++++ >>> cmake/config-ix.cmake | 27 +++++++ >>> src/CMakeLists.txt | 74 +++++++++++++++++ >>> www/index.html | 10 +++ >>> 4 files changed, 325 insertions(+) >>> create mode 100644 CMakeLists.txt >>> create mode 100644 cmake/config-ix.cmake >>> create mode 100644 src/CMakeLists.txt >>> >>> diff --git a/CMakeLists.txt b/CMakeLists.txt >>> new file mode 100644 >>> index 0000000..26c4d91 >>> --- /dev/null >>> +++ b/CMakeLists.txt >>> @@ -0,0 +1,214 @@ >>> +#========================================================== >>> ===================== >>> +# Setup Project >>> +#========================================================== >>> ===================== >>> + >>> +cmake_minimum_required(VERSION 2.8.11) >>> + >>> +if (CMAKE_SOURCE_DIR STREQUAL CMAKE_CURRENT_SOURCE_DIR) >>> + project(libcxxabi) >>> + >>> + # Rely on llvm-config. >>> + set(CONFIG_OUTPUT) >>> + find_program(LLVM_CONFIG "llvm-config") >>> + if(LLVM_CONFIG) >>> + message(STATUS "Found LLVM_CONFIG as ${LLVM_CONFIG}") >>> + set(CONFIG_COMMAND ${LLVM_CONFIG} >>> + "--bindir" >>> + "--libdir" >>> + "--prefix" >>> + "--src-root") >>> + execute_process( >>> + COMMAND ${CONFIG_COMMAND} >>> + RESULT_VARIABLE HAD_ERROR >>> + OUTPUT_VARIABLE CONFIG_OUTPUT >>> + ) >>> + if(NOT HAD_ERROR) >>> + string(REGEX REPLACE >>> + "[ \t]*[\r\n]+[ \t]*" ";" >>> + CONFIG_OUTPUT ${CONFIG_OUTPUT}) >>> + else() >>> + string(REPLACE ";" " " CONFIG_COMMAND_STR "${CONFIG_COMMAND}") >>> + message(STATUS "${CONFIG_COMMAND_STR}") >>> + message(FATAL_ERROR "llvm-config failed with status ${HAD_ERROR}") >>> + endif() >>> + else() >>> + message(FATAL_ERROR "llvm-config not found -- ${LLVM_CONFIG}") >>> + endif() >>> + >>> + list(GET CONFIG_OUTPUT 0 TOOLS_BINARY_DIR) >>> + list(GET CONFIG_OUTPUT 1 LIBRARY_DIR) >>> + list(GET CONFIG_OUTPUT 2 LLVM_OBJ_ROOT) >>> + list(GET CONFIG_OUTPUT 3 MAIN_SRC_DIR) >>> + >>> + set(LLVM_TOOLS_BINARY_DIR ${TOOLS_BINARY_DIR} CACHE PATH "Path to >>> llvm/bin") >>> + set(LLVM_LIBRARY_DIR ${LIBRARY_DIR} CACHE PATH "Path to llvm/lib") >>> + set(LLVM_BINARY_DIR ${LLVM_OBJ_ROOT} CACHE PATH "Path to LLVM build >>> tree") >>> + set(LLVM_MAIN_SRC_DIR ${MAIN_SRC_DIR} CACHE PATH "Path to LLVM source >>> tree") >>> + >>> + set(LLVM_CMAKE_PATH "${LLVM_BINARY_DIR}/share/llvm/cmake") >>> + set(LLVMCONFIG_FILE "${LLVM_CMAKE_PATH}/LLVMConfig.cmake") >>> + if(EXISTS ${LLVMCONFIG_FILE}) >>> + list(APPEND CMAKE_MODULE_PATH "${LLVM_CMAKE_PATH}") >>> + include(${LLVMCONFIG_FILE}) >>> + else() >>> + message(FATAL_ERROR "Not found: ${LLVMCONFIG_FILE}") >>> + endif() >>> + >>> + set(PACKAGE_NAME libcxxabi) >>> + set(PACKAGE_VERSION "${LLVM_PACKAGE_VERSION}") >>> + set(PACKAGE_STRING "${PACKAGE_NAME} ${PACKAGE_VERSION}") >>> + set(PACKAGE_BUGREPORT "[email protected]") >>> + >>> + if(EXISTS ${LLVM_MAIN_SRC_DIR}/utils/lit/lit.py) >>> + set(LLVM_LIT ${LLVM_MAIN_SRC_DIR}/utils/lit/lit.py) >>> + else() >>> + # Seek installed Lit. >>> + find_program(LLVM_LIT "lit.py" ${LLVM_MAIN_SRC_DIR}/utils/lit >>> + DOC "Path to lit.py") >>> + endif() >>> + >>> + if(LLVM_LIT) >>> + # Define the default arguments to use with 'lit', and an option for >>> the user >>> + # to override. >>> + set(LIT_ARGS_DEFAULT "-sv") >>> + if (MSVC OR XCODE) >>> + set(LIT_ARGS_DEFAULT "${LIT_ARGS_DEFAULT} --no-progress-bar") >>> + endif() >>> + set(LLVM_LIT_ARGS "${LIT_ARGS_DEFAULT}" CACHE STRING "Default >>> options for lit") >>> + >>> + # On Win32 hosts, provide an option to specify the path to the >>> GnuWin32 tools. >>> + if( WIN32 AND NOT CYGWIN ) >>> + set(LLVM_LIT_TOOLS_DIR "" CACHE PATH "Path to GnuWin32 tools") >>> + endif() >>> + else() >>> + set(LLVM_INCLUDE_TESTS OFF) >>> + endif() >>> + >>> + set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib) >>> + set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib) >>> + >>> + set(LIBCXXABI_BUILT_STANDALONE 1) >>> +endif() >>> + >>> +#========================================================== >>> ===================== >>> +# Setup CMake Options >>> +#========================================================== >>> ===================== >>> + >>> +# Define options. >>> +option(LIBCXXABI_ENABLE_RTTI "Use run time type information." ON) >>> +option(LIBCXXABI_ENABLE_ASSERTIONS "Enable assertions independent of >>> build mode." ON) >>> +option(LIBCXXABI_ENABLE_PEDANTIC "Compile with pedantic enabled." ON) >>> +option(LIBCXXABI_ENABLE_WERROR "Fail and stop if a warning is >>> triggered." OFF) >>> +option(LIBCXXABI_ENABLE_CXX11 "Enable -std=c++11 and use of c++11 >>> language features if the compiler supports it." ON) >>> +option(LIBCXXABI_ENABLE_SHARED "Build libc++abi as a shared library." >>> ON) >>> + >>> +#========================================================== >>> ===================== >>> +# Configure System >>> +#========================================================== >>> ===================== >>> + >>> +# Add path for custom modules >>> +set(CMAKE_MODULE_PATH >>> + "${CMAKE_CURRENT_SOURCE_DIR}/cmake" >>> + "${CMAKE_CURRENT_SOURCE_DIR}/cmake/Modules" >>> + ${CMAKE_MODULE_PATH} >>> + ) >>> + >>> +# Configure compiler. >>> +include(config-ix) >>> + >>> +#========================================================== >>> ===================== >>> +# Setup Compiler Flags >>> +#========================================================== >>> ===================== >>> + >>> +# Get required flags. >>> +macro(append_if list condition var) >>> + if (${condition}) >>> + list(APPEND ${list} ${var}) >>> + endif() >>> +endmacro() >>> + >>> +if (LIBCXXABI_HAS_NOSTDINCXX_FLAG) >>> + list(APPEND LIBCXXABI_CXX_REQUIRED_FLAGS -nostdinc++) >>> +endif() >>> +if (LIBCXXABI_ENABLE_CXX11 AND LIBCXXABI_HAS_STDCXX11_FLAG) >>> + list(APPEND LIBCXXABI_CXX_REQUIRED_FLAGS -std=c++11) >>> +endif() >>> + >>> +# Get warning flags >>> +if (NOT MSVC) >>> + append_if(LIBCXXABI_CXX_WARNING_FLAGS LIBCXXABI_HAS_WALL_FLAG -Wall) >>> + append_if(LIBCXXABI_CXX_WARNING_FLAGS >>> LIBCXXABI_HAS_WNO_UNUSED_FUNCTION_FLAG >>> -Wno-unused-function) >>> + list(APPEND LIBCXXABI_CXX_REQUIRED_FLAGS -Werror=return-type) >>> +endif() >>> + >>> +append_if(LIBCXXABI_CXX_WARNING_FLAGS LIBCXXABI_HAS_W_FLAG -W) >>> +append_if(LIBCXXABI_CXX_WARNING_FLAGS >>> LIBCXXABI_HAS_WNO_UNUSED_PARAMETER_FLAG >>> -Wno-unused-parameter) >>> +append_if(LIBCXXABI_CXX_WARNING_FLAGS LIBCXXABI_HAS_WWRITE_STRINGS_FLAG >>> -Wwrite-strings) >>> +append_if(LIBCXXABI_CXX_WARNING_FLAGS LIBCXXABI_HAS_WNO_LONG_LONG_FLAG >>> -Wno-long-long) >>> +if (LIBCXXABI_ENABLE_WERROR) >>> + append_if(LIBCXXABI_CXX_WARNING_FLAGS LIBCXXABI_HAS_WERROR_FLAG >>> -Werror) >>> + append_if(LIBCXXABI_CXX_WARNING_FLAGS LIBCXXABI_HAS_WX_FLAG -WX) >>> +else() >>> + append_if(LIBCXXABI_CXX_WARNING_FLAGS LIBCXXABI_HAS_WNO_ERROR_FLAG >>> -Wno-error) >>> + append_if(LIBCXXABI_CXX_WARNING_FLAGS LIBCXXABI_HAS_NO_WX_FLAG -WX-) >>> +endif() >>> +if (LIBCXXABI_ENABLE_PEDANTIC) >>> + append_if(LIBCXXABI_CXX_WARNING_FLAGS LIBCXXABI_HAS_PEDANTIC_FLAG >>> -pedantic) >>> +endif() >>> + >>> +# Get feature flags. >>> +# Exceptions >>> +# Catches C++ exceptions only and tells the compiler to assume that >>> extern C >>> +# functions never throw a C++ exception. >>> +append_if(LIBCXXABI_CXX_FEATURE_FLAGS LIBCXXABI_HAS_EHSC_FLAG -EHsc) >>> +# RTTI >>> +if (NOT LIBCXXABI_ENABLE_RTTI) >>> + list(APPEND LIBCXXABI_CXX_FEATURE_FLAGS -D_LIBCPP_NO_RTTI) >>> + append_if(LIBCXXABI_CXX_FEATURE_FLAGS LIBCXXABI_HAS_NO_GR_FLAG -GR-) >>> + append_if(LIBCXXABI_CXX_FEATURE_FLAGS LIBCXXABI_HAS_FNO_RTTI_FLAG >>> -fno-rtti) >>> +endif() >>> +# Assert >>> +string(TOUPPER "${CMAKE_BUILD_TYPE}" uppercase_CMAKE_BUILD_TYPE) >>> +if (LIBCXXABI_ENABLE_ASSERTIONS) >>> + # MSVC doesn't like _DEBUG on release builds. See PR 4379. >>> + if (NOT MSVC) >>> + list(APPEND LIBCXXABI_CXX_FEATURE_FLAGS -D_DEBUG) >>> + endif() >>> + # On Release builds cmake automatically defines NDEBUG, so we >>> + # explicitly undefine it: >>> + if (uppercase_CMAKE_BUILD_TYPE STREQUAL "RELEASE") >>> + list(APPEND LIBCXXABI_CXX_FEATURE_FLAGS -UNDEBUG) >>> + endif() >>> +else() >>> + if (NOT uppercase_CMAKE_BUILD_TYPE STREQUAL "RELEASE") >>> + list(APPEND LIBCXXABI_CXX_FEATURE_FLAGS -DNDEBUG) >>> + endif() >>> +endif() >>> +# Static library >>> +if (NOT LIBCXXABI_ENABLE_SHARED) >>> + list(APPEND LIBCXXABI_CXX_FEATURE_FLAGS -D_LIBCPP_BUILD_STATIC) >>> +endif() >>> + >>> +# This is the _ONLY_ place where add_definitions is called. >>> +if (MSVC) >>> + add_definitions(-D_CRT_SECURE_NO_WARNINGS) >>> +endif() >>> + >>> +string(REPLACE ";" " " LIBCXXABI_CXX_REQUIRED_FLAGS >>> "${LIBCXXABI_CXX_REQUIRED_FLAGS}") >>> +set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${LIBCXXABI_CXX_REQUIRED_ >>> FLAGS}") >>> + >>> +string(REPLACE ";" " " LIBCXXABI_CXX_WARNING_FLAGS >>> "${LIBCXXABI_CXX_WARNING_FLAGS}") >>> +set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${LIBCXXABI_CXX_WARNING_FLAGS} >>> ") >>> + >>> +string(REPLACE ";" " " LIBCXXABI_CXX_FEATURE_FLAGS >>> "${LIBCXXABI_CXX_FEATURE_FLAGS}") >>> +set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${LIBCXXABI_CXX_FEATURE_FLAGS} >>> ") >>> + >>> +#========================================================== >>> ===================== >>> +# Setup Source Code >>> +#========================================================== >>> ===================== >>> + >>> +include_directories(include) >>> + >>> +# Add source code. This also contains all of the logic for deciding >>> linker flags >>> +# soname, etc... >>> +add_subdirectory(src) >>> diff --git a/cmake/config-ix.cmake b/cmake/config-ix.cmake >>> new file mode 100644 >>> index 0000000..96da3f5 >>> --- /dev/null >>> +++ b/cmake/config-ix.cmake >>> @@ -0,0 +1,27 @@ >>> +include(CheckLibraryExists) >>> +include(CheckCXXCompilerFlag) >>> + >>> +# Check compiler flags >>> +check_cxx_compiler_flag(-std=c++11 >>> LIBCXXABI_HAS_STDCXX11_FLAG) >>> +check_cxx_compiler_flag(-fPIC LIBCXXABI_HAS_FPIC_FLAG) >>> +check_cxx_compiler_flag(-nodefaultlibs >>> LIBCXXABI_HAS_NODEFAULTLIBS_FLAG) >>> +check_cxx_compiler_flag(-nostdinc++ >>> LIBCXXABI_HAS_NOSTDINCXX_FLAG) >>> +check_cxx_compiler_flag(-Wall LIBCXXABI_HAS_WALL_FLAG) >>> +check_cxx_compiler_flag(-W LIBCXXABI_HAS_W_FLAG) >>> +check_cxx_compiler_flag(-Wno-unused-function LIBCXXABI_HAS_WNO_UNUSED_ >>> FUNCTION_FLAG) >>> +check_cxx_compiler_flag(-Wno-unused-parameter LIBCXXABI_HAS_WNO_UNUSED_ >>> PARAMETER_FLAG) >>> +check_cxx_compiler_flag(-Wwrite-strings >>> LIBCXXABI_HAS_WWRITE_STRINGS_FLAG) >>> +check_cxx_compiler_flag(-Wno-long-long >>> LIBCXXABI_HAS_WNO_LONG_LONG_FLAG) >>> +check_cxx_compiler_flag(-pedantic >>> LIBCXXABI_HAS_PEDANTIC_FLAG) >>> +check_cxx_compiler_flag(-Werror >>> LIBCXXABI_HAS_WERROR_FLAG) >>> +check_cxx_compiler_flag(-Wno-error >>> LIBCXXABI_HAS_WNO_ERROR_FLAG) >>> +check_cxx_compiler_flag(-fno-rtti >>> LIBCXXABI_HAS_FNO_RTTI_FLAG) >>> +check_cxx_compiler_flag(/WX LIBCXXABI_HAS_WX_FLAG) >>> +check_cxx_compiler_flag(/WX- LIBCXXABI_HAS_NO_WX_FLAG) >>> +check_cxx_compiler_flag(/EHsc LIBCXXABI_HAS_EHSC_FLAG) >>> +check_cxx_compiler_flag(/EHs- LIBCXXABI_HAS_NO_EHS_FLAG) >>> +check_cxx_compiler_flag(/EHa- LIBCXXABI_HAS_NO_EHA_FLAG) >>> +check_cxx_compiler_flag(/GR- LIBCXXABI_HAS_NO_GR_FLAG) >>> + >>> +# Check libraries >>> +check_library_exists(c printf "" LIBCXXABI_HAS_C_LIB) >>> diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt >>> new file mode 100644 >>> index 0000000..416f433 >>> --- /dev/null >>> +++ b/src/CMakeLists.txt >>> @@ -0,0 +1,74 @@ >>> +# Get sources >>> +file(GLOB LIBCXXABI_SOURCES *.cpp) >>> + >>> +# Add all the headers to the project for IDEs. >>> +if (MSVC_IDE OR XCODE) >>> + file(GLOB_RECURSE LIBCXXABI_HEADERS ${CMAKE_CURRENT_SOURCE_DIR}/.. >>> /include/*) >>> + # Force them all into the headers dir on MSVC, otherwise they end up >>> at >>> + # project scope because they don't have extensions. >>> + if (MSVC_IDE) >>> + source_group("Header Files" FILES ${LIBCXXABI_HEADERS}) >>> + endif() >>> +endif() >>> + >>> +if (LIBCXXABI_ENABLE_SHARED) >>> + add_library(cxxabi SHARED >>> + ${LIBCXXABI_SOURCES} >>> + ${LIBCXXABI_HEADERS} >>> + ) >>> +else() >>> + add_library(cxxabi STATIC >>> + ${LIBCXXABI_SOURCES} >>> + ${LIBCXXABI_HEADERS} >>> + ) >>> +endif() >>> + >>> +if (LIBCXXABI_LIBCXX_PATH) >>> + target_include_directories(cxxabi PRIVATE "${LIBCXXABI_LIBCXX_PATH}/ >>> include") >>> +elseif (NOT LIBCXXABI_BUILT_STANDALONE) >>> + target_include_directories(cxxabi PRIVATE >>> + "${LLVM_MAIN_SRC_DIR}/ >>> projects/libcxx/include") >>> +elseif (NOT APPLE) >>> + message(FATAL_ERROR "LIBCXXABI_LIBCXX_PATH is not set.") >>> +endif() >>> + >>> +# Generate library list. >>> +set(libraries ${LIBCXXABI_CXX_ABI_LIBRARIES}) >>> +append_if(libraries LIBCXXABI_HAS_C_LIB c) >>> + >>> +target_link_libraries(cxxabi ${libraries}) >>> + >>> +# Setup flags. >>> +append_if(compile_flags LIBCXXABI_HAS_FPIC_FLAG -fPIC) >>> +append_if(link_flags LIBCXXABI_HAS_NODEFAULTLIBS_FLAG -nodefaultlibs) >>> + >>> +if ( APPLE ) >>> + if ( CMAKE_OSX_DEPLOYMENT_TARGET STREQUAL "10.6" ) >>> + list(APPEND compile_flags "-U__STRICT_ANSI__") >>> + list(APPEND link_flags >>> + "-compatibility_version 1" >>> + "-current_version ${LIBCXXABI_VERSION}" >>> + "-install_name /usr/lib/libc++abi.1.dylib" >>> + "/usr/lib/libSystem.B.dylib") >>> + else() >>> + list(APPEND link_flags >>> + "-compatibility_version 1" >>> + "-install_name /usr/lib/libc++abi.1.dylib") >>> + endif() >>> +endif() >>> + >>> +string(REPLACE ";" " " link_flags "${link_flags}") >>> + >>> +set_target_properties(cxxabi >>> + PROPERTIES >>> + COMPILE_FLAGS "${compile_flags}" >>> + LINK_FLAGS "${link_flags}" >>> + OUTPUT_NAME "c++abi" >>> + VERSION "1.0" >>> + SOVERSION "1" >>> + ) >>> + >>> +install(TARGETS cxxabi >>> + LIBRARY DESTINATION lib >>> + ARCHIVE DESTINATION lib >>> + ) >>> diff --git a/www/index.html b/www/index.html >>> index a174afd..4960b95 100644 >>> --- a/www/index.html >>> +++ b/www/index.html >>> @@ -79,6 +79,16 @@ >>> <li><code>svn co http://llvm.org/svn/llvm-project/libcxxabi/trunk >>> libcxxabi</code></li> >>> </ul> >>> >>> + <p>To build on Linux:</p> >>> + <ul> >>> + <li><code>cd libcxxabi</code></li> >>> + <li><code>mkdir build && cd build</code></li> >>> + <li><code>CC=clang CXX=clang++ cmake LIBCXXABI_LIBCXX_PATH=path/to/libcxx >>> ..</code></li> >>> + <li><code>make</code></li> >>> + </ul> >>> + >>> + <p>You can also checkout libcxxabi to llvm/projects to build in >>> tree.<p> >>> + >>> <p>Send discussions to the >>> (<a href="http://lists.cs.uiuc.edu/mailman/listinfo/cfe-dev">clang >>> mailing list</a>).</p> >>> >>> -- >>> 2.0.0.526.g5318336 >>> >>> >> _______________________________________________ >> cfe-commits mailing list >> [email protected] >> http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits >> >> > > _______________________________________________ > cfe-commits mailing list > [email protected] > http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits > >
_______________________________________________ cfe-commits mailing list [email protected] http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits
