# Copyright 2015 The Crashpad Authors. All rights reserved. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. import("../build/crashpad_buildconfig.gni") import("net/tls.gni") if (crashpad_is_in_chromium) { import("//build/config/sanitizers/sanitizers.gni") # Prevent Chromium source assignment filters from being inherited. set_sources_assignment_filter([]) } if (crashpad_is_mac || crashpad_is_ios) { if (crashpad_is_in_chromium || crashpad_is_in_fuchsia) { import("//build/config/sysroot.gni") } else { import("//third_party/mini_chromium/mini_chromium/build/sysroot.gni") } action_foreach("mig") { script = "mach/mig.py" inputs = [ "mach/mig_fix.py", "mach/mig_gen.py", ] if (crashpad_is_mac) { sources = [ "$sysroot/usr/include/mach/exc.defs", "$sysroot/usr/include/mach/mach_exc.defs", "$sysroot/usr/include/mach/notify.defs", "mach/child_port.defs", ] } else if (crashpad_is_ios) { sources = [ # The iOS SDK doesn’t have any .defs files. Get them directly from xnu. "../third_party/xnu/osfmk/mach/exc.defs", "../third_party/xnu/osfmk/mach/mach_exc.defs", ] } outputs = [ "$target_gen_dir/mach/{{source_name_part}}User.c", "$target_gen_dir/mach/{{source_name_part}}Server.c", "$target_gen_dir/mach/{{source_name_part}}.h", "$target_gen_dir/mach/{{source_name_part}}Server.h", ] args = [ "{{source}}" ] args += rebase_path(outputs, root_build_dir) if (crashpad_is_in_chromium) { if (!use_system_xcode) { import("//build/config/clang/clang.gni") import("//build/config/mac/mac_sdk.gni") clang_path = rebase_path("$clang_base_path/bin/", root_build_dir) + "clang" mig_path = "$mac_bin_path" + "mig" migcom_path = "$mac_bin_path" + "../libexec/migcom" args += [ "--clang-path", clang_path, "--mig-path", mig_path, "--migcom-path", migcom_path, ] } } if (sysroot != "") { if (crashpad_is_in_chromium) { # Chromium often brings along its own SDK and wants to keep paths # relative… args += [ "--sdk", rebase_path(sysroot, root_build_dir), ] } else { # …but that’s not an option in the standalone Crashpad build, where the # SDK is installed on the system and is absolute. (But use rebase_path # just to be sure.) args += [ "--sdk", rebase_path(sysroot, ""), ] } } args += [ "--include", rebase_path("..", root_build_dir), "--include", rebase_path("../compat/mac", root_build_dir), ] if (crashpad_is_ios) { args += [ "--include", rebase_path("../compat/ios", root_build_dir), ] } if (current_cpu == "x86") { args += [ "--arch", "i386", ] } else if (current_cpu == "x64") { args += [ "--arch", "x86_64", ] } else if (current_cpu == "arm") { args += [ "--arch", "armv7", ] } else if (current_cpu == "arm64") { args += [ "--arch", "arm64", ] } } static_library("mig_output") { deps = [ ":mig" ] sources = get_target_outputs(":mig") if (crashpad_is_in_chromium) { # mig output contains unreachable code, which irks -Wunreachable-code. configs -= [ "//build/config/compiler:chromium_code" ] configs += [ "//build/config/compiler:no_chromium_code" ] } public_configs = [ "..:crashpad_config" ] } } static_library("util") { sources = [ "file/delimited_file_reader.cc", "file/delimited_file_reader.h", "file/directory_reader.h", "file/file_helper.cc", "file/file_helper.h", "file/file_io.cc", "file/file_io.h", "file/file_reader.cc", "file/file_reader.h", "file/file_seeker.cc", "file/file_seeker.h", "file/file_writer.cc", "file/file_writer.h", "file/filesystem.h", "file/output_stream_file_writer.cc", "file/output_stream_file_writer.h", "file/scoped_remove_file.cc", "file/scoped_remove_file.h", "file/string_file.cc", "file/string_file.h", "misc/address_sanitizer.h", "misc/address_types.h", "misc/arraysize.h", "misc/as_underlying_type.h", "misc/capture_context.h", "misc/clock.h", "misc/elf_note_types.h", "misc/from_pointer_cast.h", "misc/implicit_cast.h", "misc/initialization_state.h", "misc/initialization_state_dcheck.cc", "misc/initialization_state_dcheck.h", "misc/lexing.cc", "misc/lexing.h", "misc/memory_sanitizer.h", "misc/metrics.cc", "misc/metrics.h", "misc/paths.h", "misc/pdb_structures.cc", "misc/pdb_structures.h", "misc/random_string.cc", "misc/random_string.h", "misc/range_set.cc", "misc/range_set.h", "misc/reinterpret_bytes.cc", "misc/reinterpret_bytes.h", "misc/scoped_forbid_return.cc", "misc/scoped_forbid_return.h", "misc/symbolic_constants_common.h", "misc/time.cc", "misc/time.h", "misc/tri_state.h", "misc/uuid.cc", "misc/uuid.h", "misc/zlib.cc", "misc/zlib.h", "net/http_body.cc", "net/http_body.h", "net/http_body_gzip.cc", "net/http_body_gzip.h", "net/http_headers.h", "net/http_multipart_builder.cc", "net/http_multipart_builder.h", "net/http_transport.cc", "net/http_transport.h", "net/url.cc", "net/url.h", "numeric/checked_address_range.cc", "numeric/checked_address_range.h", "numeric/checked_range.h", "numeric/checked_vm_address_range.h", "numeric/in_range_cast.h", "numeric/int128.h", "numeric/safe_assignment.h", "process/process_id.h", "process/process_memory.cc", "process/process_memory.h", "process/process_memory_native.h", "process/process_memory_range.cc", "process/process_memory_range.h", "stdlib/aligned_allocator.cc", "stdlib/aligned_allocator.h", "stdlib/map_insert.h", "stdlib/objc.h", "stdlib/string_number_conversion.cc", "stdlib/string_number_conversion.h", "stdlib/strlcpy.cc", "stdlib/strlcpy.h", "stdlib/strnlen.cc", "stdlib/strnlen.h", "stdlib/thread_safe_vector.h", "stream/base94_output_stream.cc", "stream/base94_output_stream.h", "stream/file_encoder.cc", "stream/file_encoder.h", "stream/file_output_stream.cc", "stream/file_output_stream.h", "stream/log_output_stream.cc", "stream/log_output_stream.h", "stream/output_stream_interface.h", "stream/zlib_output_stream.cc", "stream/zlib_output_stream.h", "string/split_string.cc", "string/split_string.h", "synchronization/semaphore.h", "thread/stoppable.h", "thread/thread.cc", "thread/thread.h", "thread/thread_log_messages.cc", "thread/thread_log_messages.h", "thread/worker_thread.cc", "thread/worker_thread.h", ] defines = [ "ZLIB_CONST" ] if (crashpad_is_posix || crashpad_is_fuchsia) { sources += [ "file/directory_reader_posix.cc", "file/file_io_posix.cc", "file/filesystem_posix.cc", "misc/clock_posix.cc", "posix/close_stdio.cc", "posix/close_stdio.h", "posix/scoped_dir.cc", "posix/scoped_dir.h", "posix/scoped_mmap.cc", "posix/scoped_mmap.h", "posix/signals.cc", "posix/signals.h", "synchronization/semaphore_posix.cc", "thread/thread_posix.cc", ] if (!crashpad_is_fuchsia) { sources += [ "posix/close_multiple.cc", "posix/close_multiple.h", "posix/double_fork_and_exec.cc", "posix/double_fork_and_exec.h", "posix/drop_privileges.cc", "posix/drop_privileges.h", "posix/process_info.h", # These map signals to and from strings. While Fuchsia defines some of # the common SIGx defines, signals are never raised on Fuchsia, so # there's need to include this mapping code. "posix/symbolic_constants_posix.cc", "posix/symbolic_constants_posix.h", ] } } if (crashpad_is_mac || crashpad_is_ios) { sources += [ "mac/xattr.cc", "mac/xattr.h", "mach/composite_mach_message_server.cc", "mach/composite_mach_message_server.h", "mach/exc_client_variants.cc", "mach/exc_client_variants.h", "mach/exc_server_variants.cc", "mach/exc_server_variants.h", "mach/exception_behaviors.cc", "mach/exception_behaviors.h", "mach/exception_ports.cc", "mach/exception_ports.h", "mach/mach_extensions.cc", "mach/mach_extensions.h", "mach/mach_message.cc", "mach/mach_message.h", "mach/mach_message_server.cc", "mach/mach_message_server.h", "mach/symbolic_constants_mach.cc", "mach/symbolic_constants_mach.h", "misc/capture_context_mac.S", "misc/clock_mac.cc", "misc/paths_mac.cc", "synchronization/semaphore_mac.cc", ] } if (crashpad_is_mac) { sources += [ "mac/checked_mach_address_range.h", "mac/launchd.h", "mac/launchd.mm", "mac/mac_util.cc", "mac/mac_util.h", "mac/service_management.cc", "mac/service_management.h", "mach/bootstrap.cc", "mach/bootstrap.h", "mach/child_port_handshake.cc", "mach/child_port_handshake.h", "mach/child_port_server.cc", "mach/child_port_server.h", "mach/child_port_types.h", "mach/exception_types.cc", "mach/exception_types.h", "mach/notify_server.cc", "mach/notify_server.h", "mach/scoped_task_suspend.cc", "mach/scoped_task_suspend.h", "mach/task_for_pid.cc", "mach/task_for_pid.h", "net/http_transport_mac.mm", "posix/process_info_mac.cc", "process/process_memory_mac.cc", "process/process_memory_mac.h", ] } if (crashpad_is_ios) { sources += [ "ios/exception_processor.h", "ios/exception_processor.mm", "ios/ios_system_data_collector.h", "ios/ios_system_data_collector.mm", ] } deps = [] if (crashpad_is_linux || crashpad_is_fuchsia || crashpad_is_android) { sources += [ "net/http_transport_socket.cc" ] if (crashpad_use_boringssl_for_http_transport_socket) { defines += [ "CRASHPAD_USE_BORINGSSL" ] if (crashpad_is_in_chromium || crashpad_is_in_fuchsia) { deps += [ "//third_party/boringssl" ] } else { libs = [ "crypto", "ssl", ] } } } if (crashpad_is_android) { sources += [ "linux/initial_signal_dispositions.cc", "linux/initial_signal_dispositions.h", ] } if (crashpad_is_linux || crashpad_is_android) { sources += [ "linux/address_types.h", "linux/auxiliary_vector.cc", "linux/auxiliary_vector.h", "linux/checked_linux_address_range.h", "linux/direct_ptrace_connection.cc", "linux/direct_ptrace_connection.h", "linux/exception_handler_client.cc", "linux/exception_handler_client.h", "linux/exception_handler_protocol.cc", "linux/exception_handler_protocol.h", "linux/exception_information.h", "linux/memory_map.cc", "linux/memory_map.h", "linux/proc_stat_reader.cc", "linux/proc_stat_reader.h", "linux/proc_task_reader.cc", "linux/proc_task_reader.h", "linux/ptrace_broker.cc", "linux/ptrace_broker.h", "linux/ptrace_client.cc", "linux/ptrace_client.h", "linux/ptrace_connection.h", "linux/ptracer.cc", "linux/ptracer.h", "linux/scoped_pr_set_dumpable.cc", "linux/scoped_pr_set_dumpable.h", "linux/scoped_pr_set_ptracer.cc", "linux/scoped_pr_set_ptracer.h", "linux/scoped_ptrace_attach.cc", "linux/scoped_ptrace_attach.h", "linux/socket.cc", "linux/socket.h", "linux/thread_info.cc", "linux/thread_info.h", "linux/traits.h", "misc/capture_context_linux.S", "misc/paths_linux.cc", "misc/time_linux.cc", "posix/process_info_linux.cc", "process/process_memory_linux.cc", "process/process_memory_linux.h", "process/process_memory_sanitized.cc", "process/process_memory_sanitized.h", ] } if (crashpad_is_win) { sources += [ "file/directory_reader_win.cc", "file/file_io_win.cc", "file/filesystem_win.cc", "misc/clock_win.cc", "misc/paths_win.cc", "misc/time_win.cc", "net/http_transport_win.cc", "process/process_memory_win.cc", "process/process_memory_win.h", "synchronization/semaphore_win.cc", "thread/thread_win.cc", "win/address_types.h", "win/checked_win_address_range.h", "win/command_line.cc", "win/command_line.h", "win/context_wrappers.h", "win/critical_section_with_debug_info.cc", "win/critical_section_with_debug_info.h", "win/exception_handler_server.cc", "win/exception_handler_server.h", "win/get_function.cc", "win/get_function.h", "win/get_module_information.cc", "win/get_module_information.h", "win/handle.cc", "win/handle.h", "win/initial_client_data.cc", "win/initial_client_data.h", "win/loader_lock.cc", "win/loader_lock.h", "win/module_version.cc", "win/module_version.h", "win/nt_internals.cc", "win/nt_internals.h", "win/ntstatus_logging.cc", "win/ntstatus_logging.h", "win/process_info.cc", "win/process_info.h", "win/process_structs.h", "win/registration_protocol_win.cc", "win/registration_protocol_win.h", "win/safe_terminate_process.h", "win/scoped_handle.cc", "win/scoped_handle.h", "win/scoped_local_alloc.cc", "win/scoped_local_alloc.h", "win/scoped_process_suspend.cc", "win/scoped_process_suspend.h", "win/scoped_registry_key.h", "win/scoped_set_event.cc", "win/scoped_set_event.h", "win/session_end_watcher.cc", "win/session_end_watcher.h", "win/termination_codes.h", "win/traits.h", "win/xp_compat.h", ] # There's no ml.exe yet in cross builds, so provide broken-but-not-asm # versions of the functions defined in .asm files. # # CaptureContext() in capture_context_broken.cc just calls CHECK(false). # SafeTerminateProcess() in safe_terminate_process.cc just calls regular # TerminateProcess() without the protection against broken third-party # patching of TerminateProcess(). # # TODO(thakis): Use the .asm file in cross builds somehow, # https://crbug.com/762167. if (host_os == "win") { if (current_cpu != "arm64") { sources += [ "misc/capture_context_win.asm", "win/safe_terminate_process.asm", ] } else { # Most Crashpad builds use Microsoft's armasm64.exe macro assembler for # .asm source files. When building in Chromium, clang-cl is used as the # assembler instead. Since the two assemblers recognize different # assembly dialects, the same .asm file can't be used for each. As a # workaround, use a prebuilt .obj file when the Microsoft-dialect # assembler isn't available. if (crashpad_is_in_chromium) { sources += [ "misc/capture_context_win_arm64.obj" ] } else { sources += [ "misc/capture_context_win_arm64.asm" ] } } } else { sources += [ "misc/capture_context_broken.cc", "win/safe_terminate_process_broken.cc", ] } } if (crashpad_is_fuchsia) { sources += [ "fuchsia/koid_utilities.cc", "fuchsia/koid_utilities.h", "fuchsia/scoped_task_suspend.cc", "fuchsia/scoped_task_suspend.h", "fuchsia/traits.h", "misc/capture_context_fuchsia.S", "misc/paths_fuchsia.cc", "process/process_memory_fuchsia.cc", "process/process_memory_fuchsia.h", ] } public_configs = [ "..:crashpad_config" ] # Include generated files starting with "util". if (crashpad_is_in_fuchsia) { include_dirs = [ "$root_gen_dir/third_party/crashpad" ] } else { include_dirs = [ "$root_gen_dir/third_party/crashpad/crashpad" ] } public_deps = [ "../compat", "../third_party/zlib", ] deps += [ "../third_party/mini_chromium:base" ] if (crashpad_is_mac || crashpad_is_ios) { include_dirs += [ "$root_build_dir/gen" ] deps += [ ":mig_output" ] } if (crashpad_is_mac) { libs = [ "bsm" ] frameworks = [ "CoreFoundation.framework", "Foundation.framework", "IOKit.framework", ] deps += [ "../third_party/apple_cf:apple_cf" ] } if (crashpad_is_win) { libs = [ "user32.lib", # TODO(jperaza): version.lib is needed for Windows 7 compatibility. # mincore.lib may be linked against instead when targeting Windows 8+. "version.lib", "winhttp.lib", ] cflags = [ "/wd4201" ] # nonstandard extension used: nameless struct/union. if (current_cpu == "x86") { asmflags = [ "/safeseh" ] } } if (crashpad_is_fuchsia) { public_deps += [ "../third_party/fuchsia" ] } if (crashpad_is_android || crashpad_is_linux) { deps += [ "../third_party/lss" ] } configs += [ "..:disable_ubsan" ] } if (!crashpad_is_android && !crashpad_is_ios) { crashpad_executable("http_transport_test_server") { testonly = true sources = [ "net/http_transport_test_server.cc" ] deps = [ ":util", "../third_party/cpp-httplib", "../third_party/mini_chromium:base", "../third_party/zlib", "../tools:tool_support", ] if (crashpad_is_standalone) { remove_configs = [ "//third_party/mini_chromium/mini_chromium/build:Wexit_time_destructors" ] } if (crashpad_is_win) { libs = [ "ws2_32.lib" ] } if (crashpad_use_boringssl_for_http_transport_socket) { defines = [ "CRASHPAD_USE_BORINGSSL" ] if (crashpad_is_in_chromium || crashpad_is_in_fuchsia) { deps += [ "//third_party/boringssl" ] } else { libs = [ "crypto", "ssl", ] } } } } source_set("util_test") { testonly = true sources = [ "file/delimited_file_reader_test.cc", "file/directory_reader_test.cc", "file/file_io_test.cc", "file/file_reader_test.cc", "file/filesystem_test.cc", "file/string_file_test.cc", "misc/arraysize_test.cc", "misc/capture_context_test.cc", "misc/capture_context_test_util.h", "misc/clock_test.cc", "misc/from_pointer_cast_test.cc", "misc/initialization_state_dcheck_test.cc", "misc/initialization_state_test.cc", "misc/paths_test.cc", "misc/random_string_test.cc", "misc/range_set_test.cc", "misc/reinterpret_bytes_test.cc", "misc/scoped_forbid_return_test.cc", "misc/time_test.cc", "misc/uuid_test.cc", "net/http_body_gzip_test.cc", "net/http_body_test.cc", "net/http_body_test_util.cc", "net/http_body_test_util.h", "net/http_multipart_builder_test.cc", "net/url_test.cc", "numeric/checked_address_range_test.cc", "numeric/checked_range_test.cc", "numeric/in_range_cast_test.cc", "numeric/int128_test.cc", "process/process_memory_range_test.cc", "process/process_memory_test.cc", "stdlib/aligned_allocator_test.cc", "stdlib/map_insert_test.cc", "stdlib/string_number_conversion_test.cc", "stdlib/strlcpy_test.cc", "stdlib/strnlen_test.cc", "stdlib/thread_safe_vector_test.cc", "stream/base94_output_stream_test.cc", "stream/file_encoder_test.cc", "stream/log_output_stream_test.cc", "stream/test_output_stream.cc", "stream/test_output_stream.h", "stream/zlib_output_stream_test.cc", "string/split_string_test.cc", "synchronization/semaphore_test.cc", "thread/thread_log_messages_test.cc", "thread/thread_test.cc", "thread/worker_thread_test.cc", ] if (!crashpad_is_android && !crashpad_is_ios) { # Android requires an HTTPTransport implementation. sources += [ "net/http_transport_test.cc" ] } if (crashpad_is_posix || crashpad_is_fuchsia) { if (!crashpad_is_fuchsia && !crashpad_is_ios) { sources += [ "posix/process_info_test.cc", "posix/signals_test.cc", "posix/symbolic_constants_posix_test.cc", ] } sources += [ "posix/scoped_mmap_test.cc" ] } if (crashpad_is_mac || crashpad_is_ios) { sources += [ "mac/xattr_test.cc", "mach/composite_mach_message_server_test.cc", "mach/exc_server_variants_test.cc", "mach/exception_behaviors_test.cc", "mach/mach_extensions_test.cc", "mach/mach_message_test.cc", "mach/symbolic_constants_mach_test.cc", "misc/capture_context_test_util_mac.cc", ] } if (crashpad_is_mac) { sources += [ "mac/launchd_test.mm", "mac/mac_util_test.mm", "mac/service_management_test.mm", "mach/bootstrap_test.cc", "mach/child_port_handshake_test.cc", "mach/child_port_server_test.cc", "mach/exc_client_variants_test.cc", "mach/exception_ports_test.cc", "mach/exception_types_test.cc", "mach/mach_message_server_test.cc", "mach/notify_server_test.cc", "mach/scoped_task_suspend_test.cc", "process/process_memory_mac_test.cc", ] } if (crashpad_is_ios) { sources += [ "ios/exception_processor_test.mm" ] sources -= [ "process/process_memory_range_test.cc", "process/process_memory_test.cc", ] } if (crashpad_is_linux || crashpad_is_android) { sources += [ "linux/auxiliary_vector_test.cc", "linux/memory_map_test.cc", "linux/proc_stat_reader_test.cc", "linux/proc_task_reader_test.cc", "linux/ptrace_broker_test.cc", "linux/ptracer_test.cc", "linux/scoped_ptrace_attach_test.cc", "linux/socket_test.cc", "misc/capture_context_test_util_linux.cc", "process/process_memory_sanitized_test.cc", ] } if (crashpad_is_fuchsia) { sources += [ "misc/capture_context_test_util_fuchsia.cc" ] } if (crashpad_is_win) { sources += [ "misc/capture_context_test_util_win.cc", "win/command_line_test.cc", "win/critical_section_with_debug_info_test.cc", "win/exception_handler_server_test.cc", "win/get_function_test.cc", "win/handle_test.cc", "win/initial_client_data_test.cc", "win/loader_lock_test.cc", "win/process_info_test.cc", "win/registration_protocol_win_test.cc", "win/safe_terminate_process_test.cc", "win/scoped_process_suspend_test.cc", "win/session_end_watcher_test.cc", ] if (crashpad_is_in_chromium && is_asan && is_component_build) { # TODO(crbug.com/856174): Re-enable these once Windows ASan is fixed. sources -= [ "stdlib/string_number_conversion_test.cc" ] } } data = [ "net/testdata/ascii_http_body.txt", "net/testdata/binary_http_body.dat", "net/testdata/crashpad_util_test_cert.pem", "net/testdata/crashpad_util_test_key.pem", ] deps = [ ":util", "../client", "../compat", "../test", "../third_party/googletest:googlemock", "../third_party/googletest:googletest", "../third_party/mini_chromium:base", "../third_party/zlib", ] if (!crashpad_is_android && !crashpad_is_ios) { data_deps = [ ":http_transport_test_server" ] if (crashpad_use_boringssl_for_http_transport_socket) { defines = [ "CRASHPAD_USE_BORINGSSL" ] } } if (crashpad_is_mac) { frameworks = [ "Foundation.framework" ] } if (crashpad_is_ios) { deps += [ ":util_test_bundle_data" ] } if (crashpad_is_android || crashpad_is_linux) { deps += [ "../third_party/lss" ] } if (crashpad_is_win) { libs = [ "rpcrt4.lib", "dbghelp.lib", ] data_deps += [ ":crashpad_util_test_loader_lock_test", ":crashpad_util_test_process_info_test_child", ":crashpad_util_test_safe_terminate_process_test_child", ] } } if (crashpad_is_ios) { bundle_data("util_test_bundle_data") { testonly = true sources = [ "net/testdata/ascii_http_body.txt", "net/testdata/binary_http_body.dat", ] outputs = [ "{{bundle_resources_dir}}/crashpad_test_data/" + "{{source_root_relative_dir}}/{{source_file_part}}" ] } } if (crashpad_is_win) { crashpad_executable("crashpad_util_test_process_info_test_child") { testonly = true sources = [ "win/process_info_test_child.cc" ] } crashpad_executable("crashpad_util_test_safe_terminate_process_test_child") { testonly = true sources = [ "win/safe_terminate_process_test_child.cc" ] } crashpad_loadable_module("crashpad_util_test_loader_lock_test") { testonly = true sources = [ "win/loader_lock_test_dll.cc" ] deps = [ ":util" ] } }