]> granicus.if.org Git - llvm/commitdiff
[gn] Support for building libc++
authorPetr Hosek <phosek@chromium.org>
Thu, 2 May 2019 17:29:41 +0000 (17:29 +0000)
committerPetr Hosek <phosek@chromium.org>
Thu, 2 May 2019 17:29:41 +0000 (17:29 +0000)
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

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@359806 91177308-0d34-0410-b5e6-96231b3b80d8

utils/gn/secondary/BUILD.gn
utils/gn/secondary/libcxx/BUILD.gn [new file with mode: 0644]
utils/gn/secondary/libcxx/include/BUILD.gn [new file with mode: 0644]
utils/gn/secondary/libcxx/src/BUILD.gn [new file with mode: 0644]

index faefc371ffeff8787f9cd473a9ceefffcdd1a73a..aa0c6b82c4c1ece712d08422e2746f1367e41bea 100644 (file)
@@ -13,6 +13,7 @@ group("default") {
   if (current_os == "linux") {
     deps += [
       "//compiler-rt",
+      "//libcxx",
       "//libcxxabi",
       "//libunwind",
     ]
diff --git a/utils/gn/secondary/libcxx/BUILD.gn b/utils/gn/secondary/libcxx/BUILD.gn
new file mode 100644 (file)
index 0000000..aaba4d5
--- /dev/null
@@ -0,0 +1,6 @@
+group("libcxx") {
+  deps = [
+    "include",
+    "src(//llvm/utils/gn/build/toolchain:stage2_unix)",
+  ]
+}
diff --git a/utils/gn/secondary/libcxx/include/BUILD.gn b/utils/gn/secondary/libcxx/include/BUILD.gn
new file mode 100644 (file)
index 0000000..f387426
--- /dev/null
@@ -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}}",
+  ]
+}
diff --git a/utils/gn/secondary/libcxx/src/BUILD.gn b/utils/gn/secondary/libcxx/src/BUILD.gn
new file mode 100644 (file)
index 0000000..4b819ff
--- /dev/null
@@ -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" ]
+  }
+}