# Copyright 2015 The Chromium Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.

import("//build/toolchain/toolchain.gni")

if (is_mac) {
  import("//build/config/sysroot.gni")
}

# Allows the source set to inject ldflags for targets that link to it.
config("util_link_config") {
  if (is_mac) {
    libs = [ "bsm" ]
  }
}

if (is_mac) {
  action_foreach("mig") {
    script = "mach/mig.py"
    sources = [
      "$sysroot/usr/include/mach/exc.defs",
      "$sysroot/usr/include/mach/mach_exc.defs",
      "$sysroot/usr/include/mach/notify.defs",
      "mach/child_port.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 (!use_system_xcode) {
      args += [ hermetic_xcode_path ]
    }
  }
}

static_library("util") {
  sources = [
    "file/file_io.cc",
    "file/file_io.h",
    "file/file_io_posix.cc",
    "file/file_io_win.cc",
    "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/string_file.cc",
    "file/string_file.h",
    "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",
    "mac/xattr.cc",
    "mac/xattr.h",
    "misc/address_sanitizer.h",
    "misc/arraysize_unsafe.h",
    "misc/clock.h",
    "misc/clock_mac.cc",
    "misc/clock_posix.cc",
    "misc/clock_win.cc",
    "misc/implicit_cast.h",
    "misc/initialization_state.h",
    "misc/initialization_state_dcheck.cc",
    "misc/initialization_state_dcheck.h",
    "misc/metrics.cc",
    "misc/metrics.h",
    "misc/pdb_structures.cc",
    "misc/pdb_structures.h",
    "misc/random_string.cc",
    "misc/random_string.h",
    "misc/scoped_forbid_return.cc",
    "misc/scoped_forbid_return.h",
    "misc/symbolic_constants_common.h",
    "misc/tri_state.h",
    "misc/uuid.cc",
    "misc/uuid.h",
    "net/http_body.cc",
    "net/http_body.h",
    "net/http_headers.cc",
    "net/http_headers.h",
    "net/http_multipart_builder.cc",
    "net/http_multipart_builder.h",
    "net/http_transport.cc",
    "net/http_transport.h",
    "net/http_transport_mac.mm",
    "net/http_transport_win.cc",
    "numeric/checked_address_range.cc",
    "numeric/checked_address_range.h",
    "numeric/checked_range.h",
    "numeric/in_range_cast.h",
    "numeric/int128.h",
    "numeric/safe_assignment.h",
    "posix/close_multiple.cc",
    "posix/close_multiple.h",
    "posix/close_stdio.cc",
    "posix/close_stdio.h",
    "posix/drop_privileges.cc",
    "posix/drop_privileges.h",
    "posix/process_info.h",
    "posix/process_info_mac.cc",
    "posix/symbolic_constants_posix.cc",
    "posix/symbolic_constants_posix.h",
    "stdlib/aligned_allocator.cc",
    "stdlib/aligned_allocator.h",
    "stdlib/cxx.h",
    "stdlib/map_insert.h",
    "stdlib/objc.h",
    "stdlib/pointer_container.h",
    "stdlib/string_number_conversion.cc",
    "stdlib/string_number_conversion.h",
    "stdlib/strlcpy.cc",
    "stdlib/strlcpy.h",
    "stdlib/strnlen.cc",
    "stdlib/strnlen.h",
    "string/split_string.cc",
    "string/split_string.h",
    "synchronization/semaphore.h",
    "synchronization/semaphore_mac.cc",
    "synchronization/semaphore_posix.cc",
    "synchronization/semaphore_win.cc",
    "thread/thread.cc",
    "thread/thread.h",
    "thread/thread_log_messages.cc",
    "thread/thread_log_messages.h",
    "thread/thread_posix.cc",
    "thread/thread_win.cc",
    "thread/worker_thread.cc",
    "thread/worker_thread.h",
    "win/address_types.h",
    "win/capture_context.asm",
    "win/capture_context.h",
    "win/checked_win_address_range.h",
    "win/command_line.cc",
    "win/command_line.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/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/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/termination_codes.h",
    "win/time.cc",
    "win/time.h",
    "win/xp_compat.h",
  ]

  if (is_mac) {
    # mach/ are not globally filtered.
    sources += [
      "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/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/exception_types.cc",
      "mach/exception_types.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/notify_server.cc",
      "mach/notify_server.h",
      "mach/scoped_task_suspend.cc",
      "mach/scoped_task_suspend.h",
      "mach/symbolic_constants_mach.cc",
      "mach/symbolic_constants_mach.h",
      "mach/task_for_pid.cc",
      "mach/task_for_pid.h",
      "mach/task_memory.cc",
      "mach/task_memory.h",
    ]
  }

  # Include files from here and generated files starting with "util".
  include_dirs = [
    "..",
    "$root_gen_dir/third_party/crashpad/crashpad",
  ]

  all_dependent_configs = [ ":util_link_config" ]

  deps = [
    "//base",
    "//third_party/crashpad/crashpad/compat",
  ]

  if (is_win) {
    libs = [ "winhttp.lib" ]
    cflags = [
      "/wd4201",  # nonstandard extension used : nameless struct/union.
      "/wd4577",  # 'noexcept' used with no exception handling mode specified.
    ]

    if (current_cpu == "x86") {
      asmflags = [ "/safeseh" ]
    }
  } else if (is_mac) {
    sources += get_target_outputs(":mig")
    deps += [ ":mig" ]
    libs = [
      "CoreFoundation.framework",
      "Foundation.framework",
      "IOKit.framework",
    ]
  }
}
