--- /dev/null
+import("//clang/runtimes.gni")
+
+declare_args() {
+ # Use exceptions.
+ libcxxabi_enable_exceptions = true
+
+ # Build libc++abi with definitions for operator new/delete.
+ libcxxabi_enable_new_delete_definitions = true
+
+ # Build libcxxabi as a shared library.
+ libcxxabi_enable_shared = true
+
+ # Build libcxxabi as a static library.
+ libcxxabi_enable_static = true
+
+ # Do not export any symbols from the static library.
+ libcxxabi_hermetic_static_library = true
+}
+
+cxxabi_headers = [
+ # This comment prevents `gn format` from putting the file on the same line
+ # as `sources +=`, for sync_source_lists_from_cmake.py.
+ "../include/cxxabi.h",
+]
+
+cxxabi_sources = [
+ # C++ABI files
+ "cxa_aux_runtime.cpp",
+ "cxa_default_handlers.cpp",
+ "cxa_demangle.cpp",
+ "cxa_exception_storage.cpp",
+ "cxa_guard.cpp",
+ "cxa_handlers.cpp",
+ "cxa_unexpected.cpp",
+ "cxa_vector.cpp",
+ "cxa_virtual.cpp",
+
+ # C++ STL files
+ "stdlib_exception.cpp",
+ "stdlib_stdexcept.cpp",
+ "stdlib_typeinfo.cpp",
+
+ # Internal files
+ "abort_message.cpp",
+ "fallback_malloc.cpp",
+ "private_typeinfo.cpp",
+]
+if (libcxxabi_enable_new_delete_definitions) {
+ cxxabi_sources += [ "stdlib_new_delete.cpp" ]
+}
+if (libcxxabi_enable_exceptions) {
+ cxxabi_sources += [
+ "cxa_exception.cpp",
+ "cxa_personality.cpp",
+ ]
+} else {
+ cxxabi_sources += [
+ # This comment prevents `gn format` from putting the file on the same line
+ # as `sources +=`, for sync_source_lists_from_cmake.py.
+ "cxa_noexception.cpp",
+ ]
+}
+if (target_os == "linux" || target_os == "fuchsia") {
+ cxxabi_sources += [
+ # This comment prevents `gn format` from putting the file on the same line
+ # as `sources +=`, for sync_source_lists_from_cmake.py.
+ "cxa_thread_atexit.cpp"
+ ]
+}
+
+config("cxxabi_config") {
+ include_dirs = [
+ "//libcxxabi/include",
+ "//libcxx/include",
+ ]
+ cflags_cc = [ "-nostdinc++" ]
+ defines = [ "_LIBCXXABI_BUILDING_LIBRARY" ]
+ if (target_os == "win") {
+ defines += [ "_LIBCXXABI_DISABLE_VISIBILITY_ANNOTATIONS" ]
+ }
+}
+
+if (libcxxabi_enable_shared) {
+ shared_library("cxxabi_shared") {
+ output_dir = runtimes_dir
+ output_name = "c++abi"
+ if (target_os == "linux" || target_os == "mac") {
+ cflags = [ "-fPIC" ]
+ ldflags = [ "-nostdlib++" ]
+ libs = [
+ "dl",
+ "pthread",
+ ]
+ }
+ sources = cxxabi_sources
+ public = cxxabi_headers
+ deps = [
+ "//compiler-rt/lib/builtins",
+ "//libunwind/src:unwind_shared",
+ ]
+ configs += [ ":cxxabi_config" ]
+ configs -= [
+ "//llvm/utils/gn/build:no_exceptions",
+ "//llvm/utils/gn/build:no_rtti",
+ ]
+ }
+}
+
+if (libcxxabi_enable_static) {
+ static_library("cxxabi_static") {
+ output_dir = runtimes_dir
+ output_name = "c++abi"
+ complete_static_lib = true
+ configs -= [ "//llvm/utils/gn/build:thin_archive" ]
+ sources = cxxabi_sources
+ public = cxxabi_headers
+ if (libcxxabi_hermetic_static_library) {
+ cflags = [ "-fvisibility=hidden" ]
+ cflags_cc = [ "-fvisibility-global-new-delete-hidden" ]
+ defines = [
+ "_LIBCXXABI_DISABLE_VISIBILITY_ANNOTATIONS",
+ "_LIBCPP_DISABLE_VISIBILITY_ANNOTATIONS",
+ ]
+ }
+ deps = [
+ "//compiler-rt/lib/builtins",
+ "//libunwind/src:unwind_static",
+ ]
+ configs += [ ":cxxabi_config" ]
+ configs -= [
+ "//llvm/utils/gn/build:no_exceptions",
+ "//llvm/utils/gn/build:no_rtti",
+ ]
+ }
+}
+
+group("src") {
+ deps = []
+ if (libcxxabi_enable_shared) {
+ deps += [ ":cxxabi_shared" ]
+ }
+ if (libcxxabi_enable_static) {
+ deps += [ ":cxxabi_static" ]
+ }
+}