# Copyright 2017 The Fuchsia 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/package.gni")

# Set manually to true to compile the zxdb_test_app.cc file for manual debugger
# testing of various conditions.
include_test_app = false

static_library("lib") {
  sources = [
    "arch.cc",
    "arch.h",
    "breakpoint.cc",
    "breakpoint.h",
    "debug_agent.cc",
    "debug_agent.h",
    "debugged_job.cc",
    "debugged_job.h",
    "debugged_process.cc",
    "debugged_process.h",
    "debugged_thread.cc",
    "debugged_thread.h",
    "launcher.cc",
    "launcher.h",
    "object_util.cc",
    "object_util.h",
    "process_breakpoint.cc",
    "process_breakpoint.h",
    "process_info.cc",
    "process_info.h",
    "process_memory_accessor.h",
    "remote_api.h",
    "remote_api_adapter.cc",
    "remote_api_adapter.h",
    "system_info.cc",
    "system_info.h",
    "unwind.cc",
    "unwind.h",
  ]

  if (current_cpu == "x64") {
    sources += [
      "arch_x64.cc",
      "arch_x64.h",
      "arch_x64_helpers.cc",
      "arch_x64_helpers.h",
    ]
  } else if (current_cpu == "arm64") {
    sources += [
      "arch_arm64.cc",
      "arch_arm64.h",
      "arch_arm64_helpers.cc",
      "arch_arm64_helpers.h",
    ]
  } else {
    assert(false, "Un-supported CPU: ${current_cpu}")
  }

  public_deps = [
    "//garnet/lib/debug_ipc:agent",
    "//garnet/lib/debug_ipc/helper",
    "//garnet/lib/elflib",
    "//garnet/lib/process",
    "//garnet/public/lib/fxl",
    "//garnet/public/lib/svc/cpp",
    "//garnet/third_party/libunwindstack",
    "//zircon/public/fidl/fuchsia-sysinfo:fuchsia-sysinfo_c",
    "//zircon/public/lib/ngunwind",
  ]
}

if (include_test_app) {
  executable("zxdb_test_app") {
    if (is_debug) {
      # Force no optimization in debug builds.
      configs -= [ "//build/config:debug" ]
      cflags = [ "-O0" ]
    }

    sources = [
      "zxdb_test_app.cc",
    ]
    deps = [
      "//zircon/public/lib/zx",
    ]
  }
}

executable("bin") {
  output_name = "debug_agent"
  sources = [
    "main.cc",
  ]

  deps = [
    ":lib",
    "//garnet/public/lib/component/cpp:environment_services",
  ]
}

package("debug_agent") {
  deprecated_bare_package_url = "//build"

  deps = [
    ":bin",
  ]

  meta = [
    {
      path = rebase_path("meta/debug_agent.cmx")
      dest = "debug_agent.cmx"
    },
  ]

  binary = "debug_agent"
}

executable("tests") {
  testonly = true
  output_name = "debug_agent_tests"

  sources = [
    "breakpoint_unittest.cc",
    "debugged_job_unittest.cc",
    "debugged_thread_unittest.cc",
    "process_breakpoint_unittest.cc",
    "process_info_unittests.cc",
    "system_info_unittests.cc",
  ]

  if (current_cpu == "x64") {
    sources += [ "arch_x64_helpers_unittest.cc" ]
  } else if (current_cpu == "arm64") {
    sources += [ "arch_arm64_helpers_unittest.cc" ]
  } else {
    assert(false, "Un-supported CPU: ${current_cpu}")
  }

  deps = [
    ":lib",
    "//garnet/lib/debug_ipc:tests",
    # TODO(DX-879): Some HW capabilities (like HW breakpoints) are not well
    #               emulated by QEMU without KVM. This will sometimes make tests
    #               fail or even crash QEMU.
    #               The tests will be re-enabled when there is way to express
    #               that these test must not run on QEMU.
    # "//garnet/bin/debug_agent/integration_tests",
    "//garnet/public/lib/component/cpp:environment_services",
    "//garnet/public/lib/fxl/test:gtest_main",
    "//third_party/googletest:gmock",
    "//third_party/googletest:gtest",
  ]
}

package("debug_agent_tests") {
  deprecated_bare_package_url = "//build"

  testonly = true

  package_name = "debug_agent_tests"

  deps = [
    ":tests",
    "//garnet/bin/debug_agent/test_data:debug_agent_so_test_exe",
    "//garnet/bin/debug_agent/test_data:debug_agent_test_so",
    "//garnet/bin/debug_agent/test_data:process_loop",
    "//garnet/bin/debug_agent/test_data:process_spawner",
  ]

  # Test binaries
  binaries = [{
      shell = true
      name = "debug_agent_so_test"
    }, {
      name = "process_loop"
    }, {
      name = "process_spawner"
   }]

  # Add the platform specific test binaries

  if (current_cpu == "x64") {
    deps += [
      "//garnet/bin/debug_agent/test_data:write_register_test_exe",
    ]
    binaries += [{
      name = "write_register_test_exe"
    }]
  }

  loadable_modules = [{
    name = "debug_agent_test_so.so"
  }]

  tests = [{
    name = "debug_agent_tests"
  }]

  meta = [{
    path = "meta/debug_agent_tests.cmx"
    dest = "debug_agent_tests.cmx"
  }]

  if (include_test_app) {
    deps += [ ":zxdb_test_app" ]
    tests += [
      {
        name = "zxdb_test_app"
      },
    ]
  }
}
