Hi mclow.lists, danalbert, jroelofs,

This patch change the  libc++' standalone build so that it requires LLVM. 
Previously LLVM was only required to run the test suite. 
libc++ now uses LLVM's CMake modules to handle shared options like 
`LLVM_USE_SANITIZER` and `LLVM_ENABLE_32_BITS`.

This patch fixes the following bugs:
* PR23670 - https://llvm.org/bugs/show_bug.cgi?id=23670
* PR23671 - https://llvm.org/bugs/show_bug.cgi?id=23671

http://reviews.llvm.org/D10055

Files:
  CMakeLists.txt
  cmake/Modules/FindLLVM.cmake
  test/CMakeLists.txt
  test/lit.site.cfg.in
  www/index.html

EMAIL PREFERENCES
  http://reviews.llvm.org/settings/panel/emailpreferences/
Index: CMakeLists.txt
===================================================================
--- CMakeLists.txt
+++ CMakeLists.txt
@@ -30,17 +30,7 @@
  build directory and run 'cmake /path/to/${PROJECT_NAME} [options]' there."
  )
 
-if(CMAKE_SOURCE_DIR STREQUAL CMAKE_CURRENT_SOURCE_DIR)
-  set(LIBCXX_LIBDIR_SUFFIX "" CACHE STRING
-      "Define suffix of library directory name (32/64)")
-
-  set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib${LIBCXX_LIBDIR_SUFFIX})
-  set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib${LIBCXX_LIBDIR_SUFFIX})
-
-  set(LIBCXX_BUILT_STANDALONE 1)
-else()
-  set(LIBCXX_LIBDIR_SUFFIX ${LLVM_LIBDIR_SUFFIX})
-endif()
+include(FindLLVM)
 
 #===============================================================================
 # Setup CMake Options
@@ -58,7 +48,6 @@
 option(LIBCXX_ENABLE_STDIN "Build libc++ with support for stdin/std::cin." ON)
 option(LIBCXX_ENABLE_STDOUT "Build libc++ with support for stdout/std::cout." ON)
 option(LIBCXX_ENABLE_THREADS "Build libc++ with support for threads." ON)
-option(LIBCXX_BUILD_32_BITS "Build 32 bit libc++" OFF)
 option(LIBCXX_ENABLE_MONOTONIC_CLOCK
   "Build libc++ with support for a monotonic clock.
    This option may only be used when LIBCXX_ENABLE_THREADS=OFF." ON)
@@ -70,10 +59,6 @@
 option(LIBCXX_ENABLE_STATIC_ABI_LIBRARY "Statically link the ABI library" OFF)
 set(LIBCXX_SYSROOT "" CACHE STRING "Use alternate sysroot.")
 set(LIBCXX_GCC_TOOLCHAIN "" CACHE STRING "Use alternate GCC toolchain.")
-if (LIBCXX_BUILT_STANDALONE)
-  set(LLVM_USE_SANITIZER "" CACHE STRING
-      "Define the sanitizer used to build the library and tests")
-endif()
 
 if (LIBCXX_ENABLE_STATIC_ABI_LIBRARY)
   if (APPLE)
@@ -255,14 +240,6 @@
   list(APPEND LIBCXX_COMPILE_FLAGS -D_LIBCPP_BUILD_STATIC)
 endif()
 
-if (CMAKE_SIZEOF_VOID_P EQUAL 8 AND NOT WIN32)
-  if (LIBCXX_BUILD_32_BITS)
-    message(STATUS "Building 32 bits executables and libraries.")
-    list(APPEND LIBCXX_CXX_FLAGS "-m32")
-  endif()
-elseif(LIBCXX_BUILD_32_BITS)
-  message(FATAL_ERROR "LIBCXX_BUILD_32_BITS=ON is not supported on this platform.")
-endif()
 # This is the _ONLY_ place where add_definitions is called.
 if (MSVC)
   add_definitions(-D_CRT_SECURE_NO_WARNINGS)
@@ -295,39 +272,6 @@
                       " when LIBCXX_ENABLE_THREADS is also set to OFF.")
 endif()
 
-# Configure for sanitizers. If LIBCXX_BUILT_STANDALONE then we have to do
-# the flag translation ourselves. Othewise LLVM's CMakeList.txt will handle it.
-if (LIBCXX_BUILT_STANDALONE)
-  # NOTE: LLVM_USE_SANITIZER checks for a UNIX like system instead of MSVC.
-  # But we don't have LLVM_ON_UNIX so checking for MSVC is the best we can do.
-  if (LLVM_USE_SANITIZER AND NOT MSVC)
-    append_if(LIBCXX_CXX_FLAGS LIBCXX_HAS_FNO_OMIT_FRAME_POINTER_FLAG
-              "-fno-omit-frame-pointer")
-    if (NOT uppercase_CMAKE_BUILD_TYPE STREQUAL "DEBUG" AND
-        NOT uppercase_CMAKE_BUILD_TYPE STREQUAL "RELWITHDEBINFO")
-      append_if(LIBCXX_CXX_FLAGS LIBCXX_HAS_GLINE_TABLES_ONLY_FLAG
-                "-gline-tables-only")
-    endif()
-    if (LLVM_USE_SANITIZER STREQUAL "Address")
-      list(APPEND LIBCXX_CXX_FLAGS "-fsanitize=address")
-    elseif (LLVM_USE_SANITIZER MATCHES "Memory(WithOrigins)?")
-      list(APPEND LIBCXX_CXX_FLAGS "-fsanitize=memory")
-      if (LLVM_USE_SANITIZER STREQUAL "MemoryWithOrigins")
-        list(APPEND LIBCXX_CXX_FLAGS "-fsanitize-memory-track-origins")
-      endif()
-    elseif (LLVM_USE_SANITIZER STREQUAL "Undefined")
-      list(APPEND LIBCXX_CXX_FLAGS
-          "-fsanitize=undefined -fno-sanitize=vptr,function -fno-sanitize-recover")
-    elseif (LLVM_USE_SANITIZER STREQUAL "Thread")
-      list(APPEND LIBCXX_CXX_FLAGS "-fsanitize=thread")
-    else()
-      message(WARNING "Unsupported value of LLVM_USE_SANITIZER: ${LLVM_USE_SANITIZER}")
-    endif()
-  elseif(MSVC)
-    message(WARNING "LLVM_USE_SANITIZER is not supported with MSVC")
-  endif()
-endif()
-
 append_if(LIBCXX_CXX_FLAGS LIBCXX_TARGET_TRIPLE
           "-target ${LIBCXX_TARGET_TRIPLE}")
 
Index: cmake/Modules/FindLLVM.cmake
===================================================================
--- /dev/null
+++ cmake/Modules/FindLLVM.cmake
@@ -0,0 +1,90 @@
+
+if (CMAKE_SOURCE_DIR STREQUAL CMAKE_CURRENT_SOURCE_DIR)
+  # Rely on llvm-config.
+  set(CONFIG_OUTPUT)
+  find_program(LLVM_CONFIG "llvm-config")
+  if(DEFINED LLVM_PATH)
+    set(LLVM_INCLUDE_DIR ${LLVM_INCLUDE_DIR} CACHE PATH "Path to llvm/include")
+    set(LLVM_PATH ${LLVM_PATH} CACHE PATH "Path to LLVM source tree")
+    set(LLVM_MAIN_SRC_DIR ${LLVM_PATH})
+    set(LLVM_CMAKE_PATH "${LLVM_PATH}/cmake/modules")
+  elseif(LLVM_CONFIG)
+    message(STATUS "Found LLVM_CONFIG as ${LLVM_CONFIG}")
+    set(CONFIG_COMMAND ${LLVM_CONFIG}
+      "--includedir"
+      "--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()
+
+    list(GET CONFIG_OUTPUT 0 INCLUDE_DIR)
+    list(GET CONFIG_OUTPUT 1 LLVM_OBJ_ROOT)
+    list(GET CONFIG_OUTPUT 2 MAIN_SRC_DIR)
+
+    set(LLVM_INCLUDE_DIR ${INCLUDE_DIR} CACHE PATH "Path to llvm/include")
+    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")
+  else()
+    message(FATAL_ERROR "llvm-config not found and LLVM_MAIN_SRC_DIR not defined. "
+                        "Reconfigure with -DLLVM_CONFIG=path/to/llvm-config "
+                        "or -DLLVM_PATH=path/to/llvm-source-root.")
+  endif()
+
+  if(EXISTS ${LLVM_CMAKE_PATH})
+    list(APPEND CMAKE_MODULE_PATH "${LLVM_CMAKE_PATH}")
+    include("${LLVM_CMAKE_PATH}/AddLLVM.cmake")
+    include("${LLVM_CMAKE_PATH}/HandleLLVMOptions.cmake")
+  else()
+    message(FATAL_ERROR "Not found: ${LLVM_CMAKE_PATH}")
+  endif()
+
+  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 --show-xfail --show-unsupported")
+    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(LIBCXX_LIBDIR_SUFFIX "" CACHE STRING
+      "Define suffix of library directory name (32/64)")
+
+  set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib${LIBCXX_LIBDIR_SUFFIX})
+  set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib${LIBCXX_LIBDIR_SUFFIX})
+
+  set(LIBCXX_BUILT_STANDALONE 1)
+else()
+  set(LLVM_MAIN_SRC_DIR "${CMAKE_SOURCE_DIR}" CACHE PATH "Path to LLVM source tree")
+  set(LLVM_LIT "${CMAKE_SOURCE_DIR}/utils/lit/lit.py")
+  set(LIBCXX_LIBDIR_SUFFIX ${LLVM_LIBDIR_SUFFIX})
+endif()
Index: test/CMakeLists.txt
===================================================================
--- test/CMakeLists.txt
+++ test/CMakeLists.txt
@@ -6,83 +6,47 @@
   endif()
 endmacro()
 
-set(LIT_EXECUTABLE "" CACHE FILEPATH "Path to LLVM's llvm-lit.")
-
-if(LIBCXX_BUILT_STANDALONE)
-  # Make sure we can use the console pool for recent cmake and ninja > 1.5
-  if(CMAKE_VERSION VERSION_LESS 3.1.20141117)
-    set(cmake_3_2_USES_TERMINAL)
-  else()
-    set(cmake_3_2_USES_TERMINAL USES_TERMINAL)
-  endif()
-else()
-  include(FindPythonInterp)
-  if(PYTHONINTERP_FOUND)
-    set(LIT_EXECUTABLE
-        ${PYTHON_EXECUTABLE} ${CMAKE_SOURCE_DIR}/utils/lit/lit.py)
-  else()
-    message(WARNING "Could not find Python, cannot set LIT_EXECUTABLE.")
-  endif()
+set(LIBCXX_LIT_VARIANT "libcxx" CACHE STRING
+    "Configuration variant to use for LIT.")
+
+pythonize_bool(LIBCXX_ENABLE_EXCEPTIONS)
+pythonize_bool(LIBCXX_ENABLE_RTTI)
+pythonize_bool(LIBCXX_ENABLE_SHARED)
+pythonize_bool(LLVM_BUILD_32_BITS)
+pythonize_bool(LIBCXX_ENABLE_GLOBAL_FILESYSTEM_NAMESPACE)
+pythonize_bool(LIBCXX_ENABLE_STDIN)
+pythonize_bool(LIBCXX_ENABLE_STDOUT)
+pythonize_bool(LIBCXX_ENABLE_THREADS)
+pythonize_bool(LIBCXX_ENABLE_MONOTONIC_CLOCK)
+pythonize_bool(LIBCXX_GENERATE_COVERAGE)
+pythonize_bool(LIBCXXABI_USE_LLVM_UNWINDER)
+
+# The tests shouldn't link to any ABI library when it has been linked into
+# libc++ statically.
+if (LIBCXX_ENABLE_STATIC_ABI_LIBRARY)
+  set(LIBCXX_CXX_ABI_LIBNAME "none")
 endif()
 
-if (LIT_EXECUTABLE)
-  set(LIT_ARGS_DEFAULT "-sv --show-unsupported --show-xfail")
-  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")
-  set(LIT_ARGS "${LLVM_LIT_ARGS}")
-  separate_arguments(LIT_ARGS)
+set(LIBCXX_TARGET_INFO "libcxx.test.target_info.LocalTI" CACHE STRING
+    "TargetInfo to use when setting up test environment.")
+set(LIBCXX_EXECUTOR "None" CACHE STRING
+    "Executor to use when running tests.")
 
-  set(LIBCXX_LIT_VARIANT "libcxx" CACHE STRING
-      "Configuration variant to use for LIT.")
+set(AUTO_GEN_COMMENT "## Autogenerated by libcxx configuration.\n# Do not edit!")
 
-  pythonize_bool(LIBCXX_ENABLE_EXCEPTIONS)
-  pythonize_bool(LIBCXX_ENABLE_RTTI)
-  pythonize_bool(LIBCXX_ENABLE_SHARED)
-  pythonize_bool(LIBCXX_BUILD_32_BITS)
-  pythonize_bool(LIBCXX_ENABLE_GLOBAL_FILESYSTEM_NAMESPACE)
-  pythonize_bool(LIBCXX_ENABLE_STDIN)
-  pythonize_bool(LIBCXX_ENABLE_STDOUT)
-  pythonize_bool(LIBCXX_ENABLE_THREADS)
-  pythonize_bool(LIBCXX_ENABLE_MONOTONIC_CLOCK)
-  pythonize_bool(LIBCXX_GENERATE_COVERAGE)
-  pythonize_bool(LIBCXXABI_USE_LLVM_UNWINDER)
+configure_file(
+  ${CMAKE_CURRENT_SOURCE_DIR}/lit.site.cfg.in
+  ${CMAKE_CURRENT_BINARY_DIR}/lit.site.cfg
+  @ONLY)
 
-  # The tests shouldn't link to any ABI library when it has been linked into
-  # libc++ statically.
-  if (LIBCXX_ENABLE_STATIC_ABI_LIBRARY)
-    set(LIBCXX_CXX_ABI_LIBNAME "none")
-  endif()
-  set(LIBCXX_TARGET_INFO "libcxx.test.target_info.LocalTI" CACHE STRING
-      "TargetInfo to use when setting up test environment.")
-  set(LIBCXX_EXECUTOR "None" CACHE STRING
-      "Executor to use when running tests.")
-
-  set(AUTO_GEN_COMMENT "## Autogenerated by libcxx configuration.\n# Do not edit!")
-
-  configure_file(
-    ${CMAKE_CURRENT_SOURCE_DIR}/lit.site.cfg.in
-    ${CMAKE_CURRENT_BINARY_DIR}/lit.site.cfg
-    @ONLY)
+add_lit_testsuite(check-libcxx "Running libcxx tests"
+  ${CMAKE_CURRENT_BINARY_DIR}
+  DEPENDS cxx)
 
-  add_custom_target(check-libcxx
-    COMMAND ${LIT_EXECUTABLE}
-            ${LIT_ARGS}
-            ${CMAKE_CURRENT_BINARY_DIR}
-    DEPENDS cxx
-    COMMENT "Running libcxx tests"
-    ${cmake_3_2_USES_TERMINAL})
-
-  if (LIBCXX_GENERATE_COVERAGE)
-    include(CodeCoverage)
-    set(output_dir "${CMAKE_CURRENT_BINARY_DIR}/coverage")
-    set(capture_dirs "${LIBCXX_LIB_CMAKEFILES_DIR}/cxx.dir/;${CMAKE_CURRENT_BINARY_DIR}")
-    set(extract_dirs "${LIBCXX_SOURCE_DIR}/include;${LIBCXX_SOURCE_DIR}/src")
-    setup_lcov_test_target_coverage("cxx" "${output_dir}" "${capture_dirs}" "${extract_dirs}")
-  endif()
-else()
-  message(WARNING
-          "LIT_EXECUTABLE not set, no check-libcxx target will be available!")
+if (LIBCXX_GENERATE_COVERAGE)
+  include(CodeCoverage)
+  set(output_dir "${CMAKE_CURRENT_BINARY_DIR}/coverage")
+  set(capture_dirs "${LIBCXX_LIB_CMAKEFILES_DIR}/cxx.dir/;${CMAKE_CURRENT_BINARY_DIR}")
+  set(extract_dirs "${LIBCXX_SOURCE_DIR}/include;${LIBCXX_SOURCE_DIR}/src")
+  setup_lcov_test_target_coverage("cxx" "${output_dir}" "${capture_dirs}" "${extract_dirs}")
 endif()
Index: test/lit.site.cfg.in
===================================================================
--- test/lit.site.cfg.in
+++ test/lit.site.cfg.in
@@ -7,7 +7,7 @@
 config.enable_exceptions        = "@LIBCXX_ENABLE_EXCEPTIONS@"
 config.enable_rtti              = "@LIBCXX_ENABLE_RTTI@"
 config.enable_shared            = "@LIBCXX_ENABLE_SHARED@"
-config.enable_32bit             = "@LIBCXX_BUILD_32_BITS@"
+config.enable_32bit             = "@LLVM_BUILD_32_BITS@"
 config.enable_global_filesystem_namespace = "@LIBCXX_ENABLE_GLOBAL_FILESYSTEM_NAMESPACE@"
 config.enable_stdin             = "@LIBCXX_ENABLE_STDIN@"
 config.enable_stdout            = "@LIBCXX_ENABLE_STDOUT@"
Index: www/index.html
===================================================================
--- www/index.html
+++ www/index.html
@@ -184,26 +184,30 @@
 
   <p>In-tree build:</p>
   <ul>
+    <li><code>cd where-you-want-to-live</code></li>
     <li>Check out libcxx and <a href="http://libcxxabi.llvm.org/";>libcxxabi</a>
       into llvm/projects</li>
-    <li><code>cd llvm</code></li>
+    <li><code>cd where-you-want-to-build</code></li>
     <li><code>mkdir build &amp;&amp; cd build</code></li>
-    <li><code>cmake .. # Linux may require -DCMAKE_C_COMPILER=clang
+    <li><code>cmake path/to/llvm # Linux may require -DCMAKE_C_COMPILER=clang
         -DCMAKE_CXX_COMPILER=clang++</code></li>
     <li><code>make cxx</code></li>
   </ul>
 
   <p>Out-of-tree build:</p>
   <ul>
-    <li>Check out libcxx</li>
+    <li><code>cd where-you-want-to-live</code></li>
+    <li>Check out libcxx and llvm</li>
     <li>If not on a Mac, also check out
       <a href="http://libcxxabi.llvm.org/";>libcxxabi</a></li>
-    <li><code>cd libcxx</code></li>
+    <li><code>cd where-you-want-to-build</code></li>
     <li><code>mkdir build &amp;&amp; cd build</code></li>
-    <li><code>cmake -DLIBCXX_CXX_ABI=libcxxabi
+    <li><code>cmake -DLLVM_PATH=path/to/llvm
+        -DLIBCXX_CXX_ABI=libcxxabi
         -DLIBCXX_CXX_ABI_INCLUDE_PATHS=path/to/libcxxabi/include
-        -DLIT_EXECUTABLE=path/to/llvm/utils/lit/lit.py .. # Linux may require
-        -DCMAKE_C_COMPILER=clang -DCMAKE_CXX_COMPILER=clang++</code></li>
+        -DCMAKE_C_COMPILER=clang -DCMAKE_CXX_COMPILER=clang++
+        path/to/libcxx
+    </code></li>
     <li><code>make</code></li>
   </ul>
 
_______________________________________________
cfe-commits mailing list
[email protected]
http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits

Reply via email to