import("//clang/runtimes.gni")
import("//compiler-rt/target.gni")
declare_args() {
# Build libunwind as a shared library.
libunwind_enable_shared = true
# Build libunwind as a static library.
libunwind_enable_static = true
}
unwind_headers = [
"../include/libunwind.h",
"../include/unwind.h",
]
if (current_os == "mac") {
unwind_headers += [
# Make `gn format` not collapse this, for sync_source_lists_from_cmake.py.
"../include/mach-o/compact_unwind_encoding.h",
]
}
unwind_sources = [
"../include/unwind_arm_ehabi.h",
"../include/unwind_itanium.h",
"AddressSpace.hpp",
"CompactUnwinder.hpp",
"DwarfInstructions.hpp",
"DwarfParser.hpp",
"RWMutex.hpp",
"Registers.hpp",
"Unwind-EHABI.cpp",
"Unwind-EHABI.h",
"Unwind-seh.cpp",
"Unwind-sjlj.c",
"Unwind-wasm.c",
"UnwindCursor.hpp",
"UnwindLevel1-gcc-ext.c",
"UnwindLevel1.c",
"UnwindRegistersRestore.S",
"UnwindRegistersSave.S",
"assembly.h",
"cet_unwind.h",
"config.h",
"dwarf2.h",
"libunwind.cpp",
"libunwind_ext.h",
]
if (current_os == "aix") {
unwind_sources += [ "Unwind_AIXExtras.cpp" ]
}
if (current_os == "android") {
if (current_cpu == "arm64") {
unwind_output_dir = "$crt_current_out_dir/aarch64"
} else if (current_cpu == "arm") {
unwind_output_dir = "$crt_current_out_dir/arm"
} else if (current_cpu == "x64") {
unwind_output_dir = "$crt_current_out_dir/x86_64"
} else if (current_cpu == "x86") {
unwind_output_dir = "$crt_current_out_dir/i386"
}
} else {
unwind_output_dir = runtimes_dir
}
config("unwind_config") {
cflags = []
cflags_c = [ "-std=c99" ]
cflags_cc = [ "-fno-rtti" ]
defines = [ "_LIBUNWIND_IS_NATIVE_ONLY" ]
include_dirs = [ "//libunwind/include" ]
if (current_os == "mac") {
cflags += [ "-U__STRICT_ANSI__" ]
}
if (current_os == "android") {
defines += [ "_LIBUNWIND_USE_DLADDR=0" ]
}
}
if (libunwind_enable_shared && current_os != "android") {
shared_library("unwind_shared") {
output_dir = unwind_output_dir
output_name = "unwind"
if (current_os == "linux" || current_os == "mac") {
cflags = [ "-fPIC" ]
ldflags = [ "-nostdlib++" ]
libs = [
"dl",
"pthread",
]
}
if (current_os == "mac") {
cflags += [ "-fno-stack-protector" ]
ldflags += [
"-Wl,-compatibility_version,1",
"-Wl,-install_name,/usr/lib/libunwind.1.dylib",
]
}
sources = unwind_sources
public = unwind_headers
deps = [ "//compiler-rt/lib/builtins" ]
configs += [ ":unwind_config" ]
configs -= [
"//llvm/utils/gn/build:no_exceptions",
"//llvm/utils/gn/build:no_rtti",
]
}
}
if (libunwind_enable_static) {
template("libunwind_static_library") {
static_library(target_name) {
output_dir = unwind_output_dir
output_name = invoker.output_name
complete_static_lib = true
configs -= [ "//llvm/utils/gn/build:thin_archive" ]
sources = unwind_sources
public = unwind_headers
if (!invoker.export) {
cflags = [ "-fvisibility=hidden" ]
cflags_cc = [ "-fvisibility-global-new-delete=force-hidden" ]
defines = [ "_LIBUNWIND_HIDE_SYMBOLS" ]
}
deps = [ "//compiler-rt/lib/builtins" ]
configs += [ ":unwind_config" ]
configs -= [
"//llvm/utils/gn/build:no_exceptions",
"//llvm/utils/gn/build:no_rtti",
]
}
}
libunwind_static_library("unwind_static_exported") {
output_name = "unwind-exported"
export = true
}
libunwind_static_library("unwind_static") {
output_name = "unwind"
export = false
}
}
group("src") {
deps = []
if (libunwind_enable_shared && current_os != "android") {
deps += [ ":unwind_shared" ]
}
if (libunwind_enable_static) {
deps += [
":unwind_static",
":unwind_static_exported",
]
}
}