[llvm] r359806 - [gn] Support for building libc++

Petr Hosek via llvm-commits llvm-commits at lists.llvm.org
Thu May 2 10:29:41 PDT 2019


Author: phosek
Date: Thu May  2 10:29:41 2019
New Revision: 359806

URL: http://llvm.org/viewvc/llvm-project?rev=359806&view=rev
Log:
[gn] Support for building libc++

This change introduces support for building libc++. The library
build should be complete, but not all CMake options have been
replicated in GN. We also don't support tests yet.

We only support two stage build at the moment.

Differential Revision: https://reviews.llvm.org/D61143

Added:
    llvm/trunk/utils/gn/secondary/libcxx/
    llvm/trunk/utils/gn/secondary/libcxx/BUILD.gn
    llvm/trunk/utils/gn/secondary/libcxx/include/
    llvm/trunk/utils/gn/secondary/libcxx/include/BUILD.gn
    llvm/trunk/utils/gn/secondary/libcxx/src/
    llvm/trunk/utils/gn/secondary/libcxx/src/BUILD.gn
Modified:
    llvm/trunk/utils/gn/secondary/BUILD.gn

Modified: llvm/trunk/utils/gn/secondary/BUILD.gn
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/utils/gn/secondary/BUILD.gn?rev=359806&r1=359805&r2=359806&view=diff
==============================================================================
--- llvm/trunk/utils/gn/secondary/BUILD.gn (original)
+++ llvm/trunk/utils/gn/secondary/BUILD.gn Thu May  2 10:29:41 2019
@@ -13,6 +13,7 @@ group("default") {
   if (current_os == "linux") {
     deps += [
       "//compiler-rt",
+      "//libcxx",
       "//libcxxabi",
       "//libunwind",
     ]

Added: llvm/trunk/utils/gn/secondary/libcxx/BUILD.gn
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/utils/gn/secondary/libcxx/BUILD.gn?rev=359806&view=auto
==============================================================================
--- llvm/trunk/utils/gn/secondary/libcxx/BUILD.gn (added)
+++ llvm/trunk/utils/gn/secondary/libcxx/BUILD.gn Thu May  2 10:29:41 2019
@@ -0,0 +1,6 @@
+group("libcxx") {
+  deps = [
+    "include",
+    "src(//llvm/utils/gn/build/toolchain:stage2_unix)",
+  ]
+}

Added: llvm/trunk/utils/gn/secondary/libcxx/include/BUILD.gn
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/utils/gn/secondary/libcxx/include/BUILD.gn?rev=359806&view=auto
==============================================================================
--- llvm/trunk/utils/gn/secondary/libcxx/include/BUILD.gn (added)
+++ llvm/trunk/utils/gn/secondary/libcxx/include/BUILD.gn Thu May  2 10:29:41 2019
@@ -0,0 +1,276 @@
+import("//clang/resource_dir.gni")
+import("//libcxx/config.gni")
+import("//llvm/utils/gn/build/write_cmake_config.gni")
+
+declare_args() {
+  # Install libc++ support headers.
+  libcxx_install_support_headers = true
+}
+
+libcxx_needs_site_config =
+    libcxx_abi_version != 1 || libcxx_abi_namespace != "" || libcxx_abi_unstable
+
+if (libcxx_needs_site_config) {
+  write_cmake_config("write_config") {
+    input = "__config_site.in"
+    output = "$target_gen_dir/__config_site"
+
+    values = []
+    if (libcxx_abi_version != 1) {
+      values += [ "_LIBCPP_ABI_VERSION=$libcxx_abi_version" ]
+    }
+    if (libcxx_abi_namespace != "") {
+      values += [ "_LIBCPP_ABI_NAMESPACE=$libcxx_abi_namespace" ]
+    }
+    if (libcxx_abi_unstable) {
+      values += [ "_LIBCPP_ABI_UNSTABLE=" ]
+    }
+  }
+
+  # Generate a custom __config header. The new header is created
+  # by prepending __config_site to the current __config header.
+  action("concat_config") {
+    script = "//libcxx/utils/cat_files.py"
+    inputs = [
+      "$target_gen_dir/__config_site",
+      "__config",
+    ]
+    outputs = [
+      "$target_gen_dir/__config",
+    ]
+    args = [
+      "$target_gen_dir/__config_site",
+      "__config",
+      "-o",
+      "$target_gen_dir/__config",
+    ]
+    deps = [
+      ":write_config",
+    ]
+  }
+
+  copy("copy_config") {
+    sources = [
+      "$target_gen_dir/__config",
+    ]
+    outputs = [
+      "$clang_resource_dir/include/c++/v1/{{source_file_part}}",
+    ]
+    deps = [
+      ":concat_config",
+    ]
+  }
+}
+
+copy("include") {
+  sources = [
+    "__bit_reference",
+    "__bsd_locale_defaults.h",
+    "__bsd_locale_fallbacks.h",
+    "__debug",
+    "__errc",
+    "__functional_03",
+    "__functional_base",
+    "__functional_base_03",
+    "__hash_table",
+    "__libcpp_version",
+    "__locale",
+    "__mutex_base",
+    "__node_handle",
+    "__nullptr",
+    "__split_buffer",
+    "__sso_allocator",
+    "__std_stream",
+    "__string",
+    "__threading_support",
+    "__tree",
+    "__tuple",
+    "__undef_macros",
+    "algorithm",
+    "any",
+    "array",
+    "atomic",
+    "bit",
+    "bitset",
+    "cassert",
+    "ccomplex",
+    "cctype",
+    "cerrno",
+    "cfenv",
+    "cfloat",
+    "charconv",
+    "chrono",
+    "cinttypes",
+    "ciso646",
+    "climits",
+    "clocale",
+    "cmath",
+    "codecvt",
+    "compare",
+    "complex",
+    "complex.h",
+    "condition_variable",
+    "csetjmp",
+    "csignal",
+    "cstdarg",
+    "cstdbool",
+    "cstddef",
+    "cstdint",
+    "cstdio",
+    "cstdlib",
+    "cstring",
+    "ctgmath",
+    "ctime",
+    "ctype.h",
+    "cwchar",
+    "cwctype",
+    "deque",
+    "errno.h",
+    "exception",
+    "experimental/__config",
+    "experimental/__memory",
+    "experimental/algorithm",
+    "experimental/any",
+    "experimental/chrono",
+    "experimental/coroutine",
+    "experimental/deque",
+    "experimental/filesystem",
+    "experimental/forward_list",
+    "experimental/functional",
+    "experimental/iterator",
+    "experimental/list",
+    "experimental/map",
+    "experimental/memory_resource",
+    "experimental/numeric",
+    "experimental/optional",
+    "experimental/propagate_const",
+    "experimental/ratio",
+    "experimental/regex",
+    "experimental/set",
+    "experimental/simd",
+    "experimental/string",
+    "experimental/string_view",
+    "experimental/system_error",
+    "experimental/tuple",
+    "experimental/type_traits",
+    "experimental/unordered_map",
+    "experimental/unordered_set",
+    "experimental/utility",
+    "experimental/vector",
+    "ext/__hash",
+    "ext/hash_map",
+    "ext/hash_set",
+    "fenv.h",
+    "filesystem",
+    "float.h",
+    "forward_list",
+    "fstream",
+    "functional",
+    "future",
+    "initializer_list",
+    "inttypes.h",
+    "iomanip",
+    "ios",
+    "iosfwd",
+    "iostream",
+    "istream",
+    "iterator",
+    "limits",
+    "limits.h",
+    "list",
+    "locale",
+    "locale.h",
+    "map",
+    "math.h",
+    "memory",
+    "module.modulemap",
+    "mutex",
+    "new",
+    "numeric",
+    "optional",
+    "ostream",
+    "queue",
+    "random",
+    "ratio",
+    "regex",
+    "scoped_allocator",
+    "set",
+    "setjmp.h",
+    "shared_mutex",
+    "span",
+    "sstream",
+    "stack",
+    "stdbool.h",
+    "stddef.h",
+    "stdexcept",
+    "stdint.h",
+    "stdio.h",
+    "stdlib.h",
+    "streambuf",
+    "string",
+    "string.h",
+    "string_view",
+    "strstream",
+    "system_error",
+    "tgmath.h",
+    "thread",
+    "tuple",
+    "type_traits",
+    "typeindex",
+    "typeinfo",
+    "unordered_map",
+    "unordered_set",
+    "utility",
+    "valarray",
+    "variant",
+    "vector",
+    "version",
+    "wchar.h",
+    "wctype.h",
+  ]
+  deps = [
+    "//libcxxabi/include",
+  ]
+  if (!libcxx_needs_site_config) {
+    sources += [ "__config" ]
+  } else {
+    deps += [ ":copy_config" ]
+  }
+  if (libcxx_install_support_headers) {
+    sources += [
+      "support/android/locale_bionic.h",
+      "support/fuchsia/xlocale.h",
+      "support/ibm/limits.h",
+      "support/ibm/locale_mgmt_aix.h",
+      "support/ibm/support.h",
+      "support/ibm/xlocale.h",
+      "support/musl/xlocale.h",
+      "support/newlib/xlocale.h",
+      "support/solaris/floatingpoint.h",
+      "support/solaris/wchar.h",
+      "support/solaris/xlocale.h",
+      "support/xlocale/__nop_locale_mgmt.h",
+      "support/xlocale/__posix_l_fallback.h",
+      "support/xlocale/__strtonum_fallback.h",
+    ]
+    if (target_os == "win") {
+      sources += [
+        "support/win32/limits_msvc_win32.h",
+        "support/win32/locale_win32.h",
+      ]
+    }
+  }
+  outputs = [
+    "$clang_resource_dir/include/c++/v1/{{source_target_relative}}",
+  ]
+}
+
+copy("cxxabi_include") {
+  sources = [
+    "//libcxxabi/include/__cxxabi_config.h",  # ignore for sync script
+    "//libcxxabi/include/cxxabi.h",  # ignore for sync script
+  ]
+  outputs = [
+    "$clang_resource_dir/include/c++/v1/{{source_target_relative}}",
+  ]
+}

Added: llvm/trunk/utils/gn/secondary/libcxx/src/BUILD.gn
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/utils/gn/secondary/libcxx/src/BUILD.gn?rev=359806&view=auto
==============================================================================
--- llvm/trunk/utils/gn/secondary/libcxx/src/BUILD.gn (added)
+++ llvm/trunk/utils/gn/secondary/libcxx/src/BUILD.gn Thu May  2 10:29:41 2019
@@ -0,0 +1,301 @@
+import("//clang/runtimes.gni")
+import("//llvm/utils/gn/build/symlink_or_copy.gni")
+
+declare_args() {
+  # Build libc++ with definitions for operator new/delete.
+  libcxx_enable_new_delete_definitions = true
+
+  # Build libc++ as a shared library.
+  libcxx_enable_shared = true
+
+  # Build libc++ as a static library.
+  libcxx_enable_static = true
+
+  # Build filesystem as part of libc++fs.a.
+  libcxx_enable_filesystem = target_os != "win"
+
+  # Build libc++experimental.a.
+  libcxx_enable_experimental = true
+
+  # Use compiler-rt builtins.
+  libcxx_use_compiler_rt = true
+
+  # Use exceptions.
+  libcxx_enable_exceptions = true
+
+  # Use run time type information.
+  libcxx_enable_rtti = true
+
+  # Do not export any symbols from the static library.
+  libcxx_hermetic_static_library = true
+
+  # Use and install a linker script for the given ABI library.
+  libcxx_enable_abi_linker_script = true
+}
+
+config("cxx_config") {
+  include_dirs = [
+    "//libcxxabi/include",
+    "//libcxx/include",
+  ]
+  cflags = [
+    "-Wall",
+    "-Wextra",
+    "-W",
+    "-Wwrite-strings",
+    "-Wno-unused-parameter",
+    "-Wno-long-long",
+    "-Werror=return-type",
+    "-Wextra-semi",
+    "-Wno-user-defined-literals",
+    "-Wno-covered-switch-default",
+  ]
+  cflags_cc = [ "-nostdinc++" ]
+  if (target_os == "win") {
+    cflags_cc += [ "/std:c++11" ]
+  } else {
+    cflags_cc += [ "-std=c++11" ]
+  }
+  defines = [ "_LIBCPP_BUILDING_LIBRARY" ]
+  if (target_os == "win") {
+    cflags += [ "/Zl" ]
+    defines += [
+      # Ignore the -MSC_VER mismatch, as we may build
+      # with a different compatibility version.
+      "_ALLOW_MSC_VER_MISMATCH",
+
+      # Don't check the msvcprt iterator debug levels
+      # as we will define the iterator types; libc++
+      # uses a different macro to identify the debug
+      # level.
+      "_ALLOW_ITERATOR_DEBUG_LEVEL_MISMATCH",
+
+      # We are building the c++ runtime, don't pull in
+      # msvcprt.
+      "_CRTBLD",
+
+      # Don't warn on the use of "deprecated"
+      # "insecure" functions which are standards
+      # specified.
+      "_CRT_SECURE_NO_WARNINGS",
+
+      # Use the ISO conforming behaviour for conversion
+      # in printf, scanf.
+      "_CRT_STDIO_ISO_WIDE_SPECIFIERS",
+    ]
+  }
+  if (libcxx_enable_exceptions) {
+    if (current_os == "win") {
+      cflags_cc += [ "/EHsc" ]
+    }
+  } else {
+    if (current_os == "win") {
+      cflags_cc += [
+        "/EHs-",
+        "/EHa-",
+      ]
+    } else {
+      cflags_cc += [ "-fno-exceptions" ]
+    }
+    defines += [ "-D_LIBCPP_NO_EXCEPTIONS" ]
+  }
+  if (!libcxx_enable_rtti) {
+    if (current_os == "win") {
+      cflags_cc += [ "/GR-" ]
+    } else {
+      cflags_cc += [ "-fno-rtti" ]
+    }
+    defines += [ "-D_LIBCPP_NO_RTTI" ]
+  }
+}
+
+cxx_sources = [
+  "algorithm.cpp",
+  "string.cpp",
+  "ios.cpp",
+  "condition_variable.cpp",
+  "hash.cpp",
+  "random.cpp",
+  "new.cpp",
+  "functional.cpp",
+  "exception.cpp",
+  "support/runtime/exception_msvc.ipp",
+  "support/runtime/exception_libcxxabi.ipp",
+  "support/runtime/exception_glibcxx.ipp",
+  "support/runtime/new_handler_fallback.ipp",
+  "support/runtime/exception_libcxxrt.ipp",
+  "support/runtime/exception_pointer_unimplemented.ipp",
+  "support/runtime/exception_pointer_cxxabi.ipp",
+  "support/runtime/exception_pointer_msvc.ipp",
+  "support/runtime/exception_fallback.ipp",
+  "support/runtime/exception_pointer_glibcxx.ipp",
+  "variant.cpp",
+  "shared_mutex.cpp",
+  "optional.cpp",
+  "strstream.cpp",
+  "include/apple_availability.h",
+  "include/refstring.h",
+  "include/config_elast.h",
+  "include/atomic_support.h",
+  "future.cpp",
+  "system_error.cpp",
+  "bind.cpp",
+  "iostream.cpp",
+  "stdexcept.cpp",
+  "valarray.cpp",
+  "chrono.cpp",
+  "typeinfo.cpp",
+  "locale.cpp",
+  "debug.cpp",
+  "charconv.cpp",
+  "utility.cpp",
+  "regex.cpp",
+  "mutex.cpp",
+  "any.cpp",
+  "thread.cpp",
+  "vector.cpp",
+  "memory.cpp",
+]
+if (target_os == "win") {
+  cxx_sources += [
+    "support/win32/locale_win32.cpp",
+    "support/win32/support.cpp",
+    "support/win32/thread_win32.cpp",
+  ]
+}
+if (target_os == "solaris") {
+  cxx_sources += [
+    # This comment prevents `gn format` from putting the file on the same line
+    # as `sources +=`, for sync_source_lists_from_cmake.py.
+    "support/solaris/xlocale.cpp",
+  ]
+}
+if (libcxx_enable_filesystem) {
+  cxx_sources += [
+    "filesystem/directory_iterator.cpp",
+    "filesystem/filesystem_common.h",
+    "filesystem/operations.cpp",
+  ]
+  if (libcxx_use_compiler_rt) {
+    cxx_sources += [
+      # This comment prevents `gn format` from putting the file on the same line
+      # as `sources +=`, for sync_source_lists_from_cmake.py.
+      "filesystem/int128_builtins.cpp",
+    ]
+  }
+}
+
+if (libcxx_enable_shared) {
+  shared_library("cxx_shared") {
+    output_dir = runtimes_dir
+    output_name = "c++"
+    if (libcxx_enable_abi_linker_script) {
+      output_extension = "so.0"
+    }
+    if (target_os == "linux" || target_os == "mac") {
+      cflags = [ "-fPIC" ]
+      ldflags = [ "-nostdlib++" ]
+      libs = [
+        "dl",
+        "pthread",
+      ]
+    }
+    sources = cxx_sources
+    deps = [
+      "//compiler-rt/lib/builtins",
+      "//libcxxabi/src:cxxabi_shared",
+      "//libunwind/src:unwind_shared",
+    ]
+    configs += [ ":cxx_config" ]
+    configs -= [
+      "//llvm/utils/gn/build:no_exceptions",
+      "//llvm/utils/gn/build:no_rtti",
+    ]
+  }
+
+  symlink_or_copy("cxx_symlink") {
+    deps = [
+      ":cxx_shared",
+    ]
+    source = "libc++.so.0"
+    output = "$runtimes_dir/libc++.so"
+  }
+
+  if (libcxx_enable_abi_linker_script) {
+    action("cxx_linker_script") {
+      script = "//libcxx/utils/gen_link_script.py"
+      outputs = [
+        "$runtimes_dir/libc++.so",
+      ]
+      args = [
+        "--input",
+        "$runtimes_dir/libc++.so.0",
+        "--output",
+        "$runtimes_dir/libc++.so",
+        "c++abi",
+        "unwind",
+      ]
+      deps = [
+        ":cxx_symlink",
+      ]
+    }
+  }
+}
+
+if (libcxx_enable_static) {
+  static_library("cxx_static") {
+    output_dir = runtimes_dir
+    output_name = "c++"
+    complete_static_lib = true
+    configs -= [ "//llvm/utils/gn/build:thin_archive" ]
+    sources = cxx_sources
+    if (libcxx_hermetic_static_library) {
+      cflags = [ "-fvisibility=hidden" ]
+      cflags_cc = [ "-fvisibility-global-new-delete-hidden" ]
+      defines = [ "_LIBCPP_DISABLE_VISIBILITY_ANNOTATIONS" ]
+    }
+    deps = [
+      "//compiler-rt/lib/builtins",
+      "//libcxxabi/src:cxxabi_static",
+      "//libunwind/src:unwind_static",
+    ]
+    configs += [ ":cxx_config" ]
+    configs -= [
+      "//llvm/utils/gn/build:no_exceptions",
+      "//llvm/utils/gn/build:no_rtti",
+    ]
+  }
+}
+
+if (libcxx_enable_experimental) {
+  static_library("cxx_experimental") {
+    output_dir = runtimes_dir
+    output_name = "c++experimental"
+    cflags_cc = [ "-std=c++14" ]
+    sources = [
+      "experimental/memory_resource.cpp",
+    ]
+    configs += [ ":cxx_config" ]
+    configs -= [
+      "//llvm/utils/gn/build:no_exceptions",
+      "//llvm/utils/gn/build:no_rtti",
+    ]
+  }
+}
+
+group("src") {
+  deps = []
+  if (libcxx_enable_shared) {
+    if (libcxx_enable_abi_linker_script) {
+      deps += [ ":cxx_linker_script" ]
+    } else {
+      deps += [ ":cxx_shared" ]
+    }
+  }
+  if (libcxx_enable_static) {
+    deps += [ ":cxx_static" ]
+  }
+  if (libcxx_enable_experimental) {
+    deps += [ ":cxx_experimental" ]
+  }
+}




More information about the llvm-commits mailing list