forked from OSchip/llvm-project
[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
This commit is contained in:
parent
4fe63c70c7
commit
fa3c328c51
|
@ -138,8 +138,7 @@ set_property(CACHE LIBCXX_CXX_ABI PROPERTY STRINGS ;${CXXABIS})
|
|||
# Setup the default options if LIBCXX_CXX_ABI is not specified.
|
||||
if (LIBCXX_CXX_ABI STREQUAL "default")
|
||||
find_path(
|
||||
LIBCXX_LIBCXXABI_INCLUDES_INTERNAL
|
||||
cxxabi.h
|
||||
LIBCXX_LIBCXXABI_INCLUDES_INTERNAL cxxabi.h
|
||||
PATHS ${LLVM_MAIN_SRC_DIR}/projects/libcxxabi/include
|
||||
${LLVM_MAIN_SRC_DIR}/runtimes/libcxxabi/include
|
||||
${LLVM_MAIN_SRC_DIR}/../libcxxabi/include
|
||||
|
|
|
@ -13,6 +13,7 @@ group("default") {
|
|||
if (current_os == "linux") {
|
||||
deps += [
|
||||
"//compiler-rt",
|
||||
"//libcxx",
|
||||
"//libcxxabi",
|
||||
"//libunwind",
|
||||
]
|
||||
|
|
|
@ -0,0 +1,6 @@
|
|||
group("libcxx") {
|
||||
deps = [
|
||||
"include",
|
||||
"src(//llvm/utils/gn/build/toolchain:stage2_unix)",
|
||||
]
|
||||
}
|
|
@ -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}}",
|
||||
]
|
||||
}
|
|
@ -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" ]
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue