summaryrefslogtreecommitdiffstats
path: root/llvm/utils
diff options
context:
space:
mode:
authorPetr Hosek <phosek@chromium.org>2019-05-02 17:29:41 +0000
committerPetr Hosek <phosek@chromium.org>2019-05-02 17:29:41 +0000
commitfa3c328c510419ce475facfe3eb8e6d0cd91fb51 (patch)
treeaa94d9d77eda59045e61e4dd3323ed5b9c453a01 /llvm/utils
parent4fe63c70c7ed8da1c66d82cd6dd0021b40923165 (diff)
downloadbcm5719-llvm-fa3c328c510419ce475facfe3eb8e6d0cd91fb51.tar.gz
bcm5719-llvm-fa3c328c510419ce475facfe3eb8e6d0cd91fb51.zip
[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 llvm-svn: 359806
Diffstat (limited to 'llvm/utils')
-rw-r--r--llvm/utils/gn/secondary/BUILD.gn1
-rw-r--r--llvm/utils/gn/secondary/libcxx/BUILD.gn6
-rw-r--r--llvm/utils/gn/secondary/libcxx/include/BUILD.gn276
-rw-r--r--llvm/utils/gn/secondary/libcxx/src/BUILD.gn301
4 files changed, 584 insertions, 0 deletions
diff --git a/llvm/utils/gn/secondary/BUILD.gn b/llvm/utils/gn/secondary/BUILD.gn
index faefc371ffe..aa0c6b82c4c 100644
--- a/llvm/utils/gn/secondary/BUILD.gn
+++ b/llvm/utils/gn/secondary/BUILD.gn
@@ -13,6 +13,7 @@ group("default") {
if (current_os == "linux") {
deps += [
"//compiler-rt",
+ "//libcxx",
"//libcxxabi",
"//libunwind",
]
diff --git a/llvm/utils/gn/secondary/libcxx/BUILD.gn b/llvm/utils/gn/secondary/libcxx/BUILD.gn
new file mode 100644
index 00000000000..aaba4d543a9
--- /dev/null
+++ b/llvm/utils/gn/secondary/libcxx/BUILD.gn
@@ -0,0 +1,6 @@
+group("libcxx") {
+ deps = [
+ "include",
+ "src(//llvm/utils/gn/build/toolchain:stage2_unix)",
+ ]
+}
diff --git a/llvm/utils/gn/secondary/libcxx/include/BUILD.gn b/llvm/utils/gn/secondary/libcxx/include/BUILD.gn
new file mode 100644
index 00000000000..f387426b555
--- /dev/null
+++ b/llvm/utils/gn/secondary/libcxx/include/BUILD.gn
@@ -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/llvm/utils/gn/secondary/libcxx/src/BUILD.gn b/llvm/utils/gn/secondary/libcxx/src/BUILD.gn
new file mode 100644
index 00000000000..4b819ffe4c0
--- /dev/null
+++ b/llvm/utils/gn/secondary/libcxx/src/BUILD.gn
@@ -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" ]
+ }
+}
OpenPOWER on IntegriCloud