# 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) {
    include_dirs += [ "mac" ]
  } else if (!crashpad_is_ios) {
    include_dirs += [ "non_mac" ]
  }

  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) {
    sources += [
      "mac/AvailabilityMacros.h",
      "mac/kern/exc_resource.h",
      "mac/mach-o/loader.h",
      "mac/mach/mach.h",
      "mac/sys/resource.h",
    ]
  } else if (!crashpad_is_ios) {
    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_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" ]
  }
}
