# 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",
      "//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/blink/*",
    ]
  }

  # 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
  }
}
