blob: 3b42ebec89ed72900b46669fce2891c1b3f5e1ec [file] [log] [blame]
# Copyright 2014 The Chromium Authors
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
# TODO(crbug.com/40188745): Complete crash reporting integration on Fuchsia.
assert(!is_fuchsia)
import("//base/debug/debug.gni")
import("//components/gwp_asan/buildflags/buildflags.gni")
if (is_android) {
import("//build/config/android/config.gni")
}
source_set("lib") {
visibility = [ ":*" ]
sources = [
"crash_reporter_client.cc",
"crash_reporter_client.h",
]
deps = [
"//base",
"//build:branding_buildflags",
]
}
source_set("crashpad_handler_main") {
sources = [ "crashpad_handler_main.cc" ]
deps = [
"//base:debugging_buildflags",
"//components/gwp_asan/buildflags",
"//third_party/crashpad/crashpad/handler",
]
if (is_linux || is_chromeos || is_mac) {
deps += [ "//components/stability_report" ]
}
if (enable_gwp_asan) {
deps += [ "//components/gwp_asan/crash_handler" ]
}
if (build_allocation_stack_trace_recorder) {
# The allocation stack trace report will be included only if the
# recorder was enabled.
deps += [ "//components/allocation_recorder/crash_handler" ]
}
}
static_library("app") {
sources = [
"client_upload_info.cc",
"client_upload_info.h",
"crash_export_thunks.h",
"crash_switches.cc",
"crash_switches.h",
"crashpad.cc",
"crashpad.h",
]
if (is_castos) {
sources += [
"breakpad_linux.cc",
"breakpad_linux.h",
"breakpad_linux_impl.cc",
"breakpad_linux_impl.h",
]
}
defines = [ "CRASH_IMPLEMENTATION" ]
public_deps = [ ":lib" ]
deps = [
"//base",
"//build:branding_buildflags",
"//build:chromeos_buildflags",
"//components/crash/core/common:crash_key",
"//content/public/common:content_descriptors",
"//third_party/crashpad/crashpad/client",
"//third_party/crashpad/crashpad/util",
]
if (is_linux || is_chromeos) {
sources += [ "crashpad_linux.cc" ]
data_deps = [ ":chrome_crashpad_handler" ]
}
if (is_ios) {
deps -= [ "//content/public/common:content_descriptors" ]
deps += [ "//third_party/crashpad/crashpad/handler:common" ]
public_deps += [ "//third_party/crashpad/crashpad/client" ]
}
if (is_android) {
sources += [ "crashpad_android.cc" ]
deps += [
":crashpad_handler_main",
"//components/crash/android:package_paths_jni",
"//third_party/crashpad/crashpad/handler",
"//third_party/crashpad/crashpad/snapshot",
]
libs = [ "log" ]
}
if (is_android || is_linux || is_chromeos) {
deps += [
"//base:base_static",
"//components/crash/core/common",
"//sandbox",
]
}
if (is_castos) {
deps += [ "//third_party/breakpad:client" ]
}
if (is_win) {
sources += [
"crashpad_win.cc",
"dump_hung_process_with_ptype.cc",
"dump_hung_process_with_ptype.h",
"minidump_with_crashpad_info.cc",
"minidump_with_crashpad_info.h",
]
deps += [
"//components/app_launch_prefetch",
"//third_party/crashpad/crashpad/client",
"//third_party/crashpad/crashpad/handler",
"//third_party/crashpad/crashpad/minidump",
"//third_party/crashpad/crashpad/util",
]
}
if (is_mac) {
sources += [ "crashpad_mac.mm" ]
deps += [
"//third_party/crashpad/crashpad/minidump",
"//third_party/crashpad/crashpad/snapshot",
]
}
if (is_ios) {
sources += [ "crashpad_ios.mm" ]
deps += [ "//third_party/crashpad/crashpad/minidump" ]
}
# TODO(crbug.com/40031409): Fix code that adds exit-time destructors and
# enable the diagnostic by removing this line.
configs += [ "//build/config/compiler:no_exit_time_destructors" ]
}
if (is_win) {
static_library("run_as_crashpad_handler") {
sources = [
"crash_switches.cc",
"crash_switches.h",
"fallback_crash_handler_launcher_win.cc",
"fallback_crash_handler_launcher_win.h",
"fallback_crash_handler_win.cc",
"fallback_crash_handler_win.h",
"fallback_crash_handling_win.cc",
"fallback_crash_handling_win.h",
"minidump_with_crashpad_info.cc",
"minidump_with_crashpad_info.h",
"run_as_crashpad_handler_win.cc",
"run_as_crashpad_handler_win.h",
]
deps = [
"//base",
"//components/app_launch_prefetch",
"//components/gwp_asan/buildflags",
"//components/stability_report",
"//third_party/crashpad/crashpad/client",
"//third_party/crashpad/crashpad/handler",
"//third_party/crashpad/crashpad/minidump",
"//third_party/crashpad/crashpad/util",
]
if (enable_gwp_asan) {
deps += [ "//components/gwp_asan/crash_handler" ]
}
}
# This source set contains the include file that declares the export thunks.
# Any target that gets compiled into both test and release code needs to
# depend on this for the include alone. The binary it's linked into then needs
# to depend on either :crash_export_thunks or :test_support, or in the case of
# release binaries, on //chrome_elf, which re-exports the thunks.
source_set("crash_export_thunk_include") {
sources = [ "crash_export_thunks.h" ]
}
# This source set contains a set of functions that allow using the crashpad
# handler across a module boundary. The intent is for these functions to be
# built into a dynamic library, which the user of the crashpad handler then
# has a link-time dependency on. This will result in an import dependency
# from the user to the dynamic library that will be bound at load time.
# In a single-module project, this source set can alternatively be included in
# the sole module, in which case the implementation will be bound at link
# time.
source_set("crash_export_thunks") {
sources = [
"crash_export_thunks.cc",
"crash_export_thunks.h",
]
defines = [ "CRASH_IMPLEMENTATION" ]
deps = [
":app",
"//base",
"//third_party/crashpad/crashpad/client",
]
}
# This source set contains a set of test stubs for the functions above.
# time.
source_set("crash_export_stubs") {
testonly = true
defines = [ "CRASH_IMPLEMENTATION" ]
sources = [
"crash_export_stubs.cc",
"crash_export_thunks.h",
]
deps = [
":app",
"//base",
]
}
}
if (is_mac || is_android || is_linux || is_chromeos) {
# We build a chromium-specific crashpad_handler executable so that we can
# define custom UserStreamDataSources.
executable("chrome_crashpad_handler") {
sources = [ "chrome_crashpad_handler.cc" ]
deps = [
":crashpad_handler_main",
"//third_party/crashpad/crashpad/handler",
]
if (is_mac && (is_component_build || is_asan || is_ubsan_any)) {
ldflags = [
# The handler is in
# Chromium.app/Contents/Frameworks/Chromium Framework.framework/Versions/A/Helpers/
# or
# Content Shell.app/Contents/Frameworks/Content Shell Framework.framework/Versions/C/Helpers/
# so set rpath up to the base. This is the only case needed for is_asan.
"-Wl,-rpath,@loader_path/../../../../../../..",
# The handler can also be executed in an unbundled framework at
# Chromium Framework.framework/Versions/A/Helpers/
"-Wl,-rpath,@loader_path/../../../..",
# The handler can be executed from headless_browsertests in Helpers/
"-Wl,-rpath,@loader_path/..",
]
}
if (build_allocation_stack_trace_recorder) {
# The allocation stack trace report will be included only if the
# recorder was enabled.
deps += [ "//components/allocation_recorder/crash_client" ]
}
}
}
if (is_android) {
# There is not any normal way to package native executables in an Android APK.
# It is normal to package native code as a loadable module but Android's APK
# installer will ignore files not named like a shared object, so give the
# handler executable an acceptable name.
copy("chrome_crashpad_handler_named_as_so") {
deps = [ ":chrome_crashpad_handler" ]
sources = [ "$root_out_dir/chrome_crashpad_handler" ]
outputs = [ "$root_out_dir/libchrome_crashpad_handler.so" ]
}
}
# This source set provides the functionality required for tests, which on Windows
# link the export thunks directly into the test binary.
source_set("test_support") {
testonly = true
deps = [ ":lib" ]
if (is_win) {
deps += [ ":crash_export_stubs" ]
}
}
source_set("unit_tests") {
testonly = true
sources = []
deps = [
":lib",
"//base",
"//base/test:test_support",
"//testing/gmock",
"//testing/gtest",
]
if (is_win) {
sources += [
"fallback_crash_handler_launcher_win_unittest.cc",
"fallback_crash_handler_win_unittest.cc",
"fallback_crash_handling_win_unittest.cc",
]
deps += [
":run_as_crashpad_handler",
"//components/crash/win:unit_tests",
"//third_party/breakpad:client",
"//third_party/crashpad/crashpad/client",
"//third_party/crashpad/crashpad/snapshot",
"//third_party/crashpad/crashpad/util",
]
}
if (is_ios) {
sources += [ "crashpad_ios_unittest.mm" ]
deps += [
":app",
"//components/crash/core/common:reporter_running_ios",
"//third_party/crashpad/crashpad/client:common",
"//third_party/crashpad/crashpad/test",
]
}
}