blob: 1c52d341ec8222aedf92a800287f10aec1f4b453 [file] [log] [blame]
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++" ]
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_new_delete_definitions) {
defines += [ "_LIBCPP_DISABLE_NEW_DELETE_DEFINITIONS" ]
}
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" ]
}
}
if (!libcxx_enable_rtti) {
if (current_os == "win") {
cflags_cc += [ "/GR-" ]
} else {
cflags_cc += [ "-fno-rtti" ]
}
defines += [ "_LIBCPP_NO_RTTI" ]
}
}
cxx_sources = [
"algorithm.cpp",
"any.cpp",
"atomic.cpp",
"barrier.cpp",
"bind.cpp",
"charconv.cpp",
"chrono.cpp",
"condition_variable.cpp",
"condition_variable_destructor.cpp",
"debug.cpp",
"exception.cpp",
"functional.cpp",
"future.cpp",
"hash.cpp",
"include/apple_availability.h",
"include/atomic_support.h",
"include/config_elast.h",
"include/refstring.h",
"ios.cpp",
"iostream.cpp",
"locale.cpp",
"memory.cpp",
"mutex.cpp",
"mutex_destructor.cpp",
"new.cpp",
"optional.cpp",
"random.cpp",
"random_shuffle.cpp",
"regex.cpp",
"shared_mutex.cpp",
"stdexcept.cpp",
"string.cpp",
"strstream.cpp",
"support/runtime/exception_fallback.ipp",
"support/runtime/exception_glibcxx.ipp",
"support/runtime/exception_libcxxabi.ipp",
"support/runtime/exception_libcxxrt.ipp",
"support/runtime/exception_msvc.ipp",
"support/runtime/exception_pointer_cxxabi.ipp",
"support/runtime/exception_pointer_glibcxx.ipp",
"support/runtime/exception_pointer_msvc.ipp",
"support/runtime/exception_pointer_unimplemented.ipp",
"support/runtime/new_handler_fallback.ipp",
"support/runtime/stdexcept_default.ipp",
"support/runtime/stdexcept_vcruntime.ipp",
"system_error.cpp",
"thread.cpp",
"typeinfo.cpp",
"utility.cpp",
"valarray.cpp",
"variant.cpp",
"vector.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 += [
# Make `gn format` not collapse this, 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 += [
# Make `gn format` not collapse this, 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 = "//llvm/utils/gn/secondary/libcxx/utils/gen_link_script.py"
outputs = [ "$runtimes_dir/libc++.so" ]
args = [
"--input",
rebase_path("$runtimes_dir/libc++.so.0", root_build_dir),
"--output",
rebase_path("$runtimes_dir/libc++.so", root_build_dir),
"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" ]
if (libcxx_enable_new_delete_definitions) {
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"
sources = [
# Make `gn format` not collapse this, for sync_source_lists_from_cmake.py.
"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" ]
}
}