# 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")

config("compat_config") {
  include_dirs = []

  if (crashpad_is_mac || crashpad_is_ios) {
    include_dirs += [ "mac" ]
  } else {
    include_dirs += [ "non_mac" ]
  }

  if (crashpad_is_ios) {
    include_dirs += [ "ios" ]
  }

  if (crashpad_is_linux || crashpad_is_android) {
    include_dirs += [ "linux" ]
  }

  if (crashpad_is_android) {
    include_dirs += [ "android" ]
  }

  if (crashpad_is_win) {
    include_dirs += [ "win" ]
  } else {
    include_dirs += [ "non_win" ]
  }

  if (!crashpad_is_linux && !crashpad_is_android && !crashpad_is_fuchsia) {
    include_dirs += [ "non_elf" ]
  }
}

template("compat_target") {
  if (crashpad_is_mac || crashpad_is_ios) {
    # There are no sources to compile, which doesn’t mix will with a
    # static_library.
    group(target_name) {
      forward_variables_from(invoker, "*")
      not_needed([ "configs" ])
    }
  } else {
    crashpad_static_library(target_name) {
      forward_variables_from(invoker, "*", [ "configs" ])
      if (!defined(configs)) {
        configs = []
      }
      if (defined(invoker.configs)) {
        configs += invoker.configs
      }
    }
  }
}

compat_target("compat") {
  sources = []

  if (crashpad_is_mac || crashpad_is_ios) {
    sources += [
      "mac/Availability.h",
      "mac/AvailabilityVersions.h",
      "mac/kern/exc_resource.h",
      "mac/mach-o/loader.h",
      "mac/mach/i386/thread_state.h",
      "mac/mach/mach.h",
      "mac/sys/resource.h",
    ]
  } else {
    sources += [
      "non_mac/mach-o/loader.h",
      "non_mac/mach/mach.h",
      "non_mac/mach/machine.h",
      "non_mac/mach/vm_prot.h",
    ]
  }

  if (crashpad_is_ios) {
    sources += [
      "ios/mach/exc.defs",
      "ios/mach/mach_exc.defs",
      "ios/mach/mach_types.defs",
      "ios/mach/machine/machine_types.defs",
      "ios/mach/std_types.defs",
    ]
  }

  if (crashpad_is_linux || crashpad_is_android) {
    sources += [
      "linux/signal.h",
      "linux/sys/mman.h",
      "linux/sys/mman_memfd_create.cc",
      "linux/sys/ptrace.h",
      "linux/sys/user.h",
    ]
  }

  if (crashpad_is_android) {
    sources += [
      "android/dlfcn_internal.cc",
      "android/dlfcn_internal.h",
      "android/elf.h",
      "android/linux/elf.h",
      "android/linux/prctl.h",
      "android/linux/ptrace.h",
      "android/sched.h",
      "android/sys/epoll.cc",
      "android/sys/epoll.h",
      "android/sys/mman.h",
      "android/sys/mman_mmap.cc",
      "android/sys/syscall.h",
      "android/sys/user.h",
    ]
  }

  if (crashpad_is_win) {
    sources += [
      "win/getopt.h",
      "win/strings.cc",
      "win/strings.h",
      "win/sys/types.h",
      "win/time.cc",
      "win/time.h",
      "win/winbase.h",
      "win/winnt.h",
      "win/winternl.h",
    ]
  } else {
    sources += [
      "non_win/dbghelp.h",
      "non_win/minwinbase.h",
      "non_win/timezoneapi.h",
      "non_win/verrsrc.h",
      "non_win/windows.h",
      "non_win/winnt.h",
    ]
  }

  if (!crashpad_is_linux && !crashpad_is_android && !crashpad_is_fuchsia) {
    sources += [ "non_elf/elf.h" ]
  }

  public_configs = [
    ":compat_config",
    "..:crashpad_config",
  ]

  if (!crashpad_is_win) {
    public_deps = [ "../third_party/mini_chromium:base" ]
  }

  deps = [ "../util:no_cfi_icall" ]

  if (!crashpad_is_mac) {
    deps += [ "../third_party/xnu" ]
  }

  if (crashpad_is_win) {
    deps += [ "../third_party/getopt" ]
  }

  if (!crashpad_is_linux && !crashpad_is_android && !crashpad_is_fuchsia) {
    deps += [ "../third_party/glibc" ]
  }
}
