# 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, "*")
    }
  } else {
    static_library(target_name) {
      forward_variables_from(invoker, "*")
    }
  }
}

compat_target("compat") {
  if (crashpad_is_in_starboard || crashpad_is_in_native_target_build) {
    check_includes = false
  }

  sources = []

  if (crashpad_is_mac || crashpad_is_ios) {
    sources += [
      "mac/AvailabilityMacros.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.cc",
      "linux/sys/mman.h",
      "linux/sys/ptrace.h",
      "linux/sys/user.h",
    ]
  }

  if (!crashpad_is_in_starboard && !crashpad_is_in_native_target_build && crashpad_is_android) {
    sources += [
      "android/android/api-level.cc",
      "android/android/api-level.h",
      "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.cc",
      "android/sys/mman.h",
      "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",
  ]

  deps = []

  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" ]
  }
}
