# 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/config/features.gni")
import("//build/config/nacl/config.gni")

if (is_nacl) {
  group("ppapi_lib") {
    deps = [
      "//ppapi/native_client/src/untrusted/irt_stub:ppapi_stub_lib",
    ]
  }

  executable("nacl_irt") {
    deps = [
      "//base",
      "//components/tracing",
      "//gpu/command_buffer/client",
      "//gpu/command_buffer/client:gles2_implementation",
      "//gpu/command_buffer/common",
      "//gpu/ipc/common:command_buffer_traits",
      "//ipc",
      "//media:shared_memory_support",
      "//native_client/src/shared/gio",
      "//native_client/src/shared/platform",
      "//native_client/src/tools/tls_edit($host_toolchain)",
      "//native_client/src/untrusted/irt:irt_core_lib",
      "//native_client/src/untrusted/nacl:imc_syscalls",
      "//ppapi/native_client/src/untrusted/pnacl_irt_shim:irt",
      "//ppapi/proxy",
      "//ppapi/proxy:ipc",
      "//ppapi/shared_impl",
    ]

    assert_no_deps = [
      # Skia is one of the easiest dependencies to accidentally add since a
      # bunch of graphics and GPU code uses it.
      "//skia/*",
      "//third_party/WebKit/*",
    ]
  }

  # TODO(phosek): We can remove this ugliness if we change the
  # IRT file name in components/nacl/browser/nacl_browser.cc
  if (current_cpu == "x86") {
    irt_cpu = "x86_32"
  } else if (current_cpu == "x64") {
    irt_cpu = "x86_64"
  } else if (current_cpu == "mipsel") {
    irt_cpu = "mips32"
  } else {
    irt_cpu = current_cpu
  }
  irt_name = "nacl_irt_" + irt_cpu + ".nexe"

  copy("nacl_irt_debug") {
    sources = [
      "${root_out_dir}/exe.unstripped/nacl_irt.nexe",
    ]
    outputs = [
      "${root_build_dir}/${irt_name}.debug",
    ]
    deps = [
      ":nacl_irt",
    ]
  }

  action("nacl_irt_debuglink") {
    deps = [
      ":nacl_irt",
      ":nacl_irt_debug",
    ]

    objcopy = "${nacl_toolprefix}objcopy"
    if (host_os == "win") {
      objcopy += ".exe"
    }

    irt_stripped = "${root_out_dir}/nacl_irt.nexe"
    irt_debug = get_target_outputs(":nacl_irt_debug")
    irt_debug = irt_debug[0]
    irt_final = "${root_build_dir}/${irt_name}"

    inputs = [
      objcopy,
    ]
    sources = [
      irt_debug,
      irt_stripped,
    ]
    outputs = [
      irt_final,
    ]

    script = "irt_debuglink.py"
    args = [
      rebase_path(objcopy, root_build_dir),
      rebase_path(irt_debug, root_build_dir),
      rebase_path(irt_stripped, root_build_dir),
      rebase_path(irt_final, root_build_dir),
    ]
  }
}

group("irt") {
  # The nacl_irt needs to be marked as data dependency so that it's
  # properly resolved as runtime dependency. However, some target
  # use nacl_irt as input for actions which require it to be marked
  # as public dependency as well.
  irt_deps = [
    ":nacl_irt_debug(//build/toolchain/nacl:irt_${target_cpu})",
    ":nacl_irt_debuglink(//build/toolchain/nacl:irt_${target_cpu})",
  ]
  public_deps = irt_deps
  data_deps = irt_deps

  # On 32-bit Windows, we also ship the 64-bit IRT.
  if (is_win && target_cpu == "x86") {
    irt_x64_deps = [
      ":nacl_irt_debug(//build/toolchain/nacl:irt_x64)",
      ":nacl_irt_debuglink(//build/toolchain/nacl:irt_x64)",
    ]
    public_deps += irt_x64_deps
    data_deps += irt_x64_deps
  }
}
