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

assert(enable_nacl)

if (current_cpu == "pnacl") {
  if (is_nacl_nonsfi) {
    nacl_toolchain_variant = "nonsfi"
  } else {
    nacl_toolchain_variant = "pnacl"
  }
} else if (is_nacl_glibc) {
  nacl_toolchain_variant = "glibc"
} else {
  nacl_toolchain_variant = "newlib"
}

# Assemble data for Native Client based test
#
# Build a Native Client based test, including any additional support files
# and copy them over to a toolchain-specific target directory.
#
# Variables:
#   output_name: name of the ouput file other than the default
#   sources: source files for a target
#   generate_nmf: whether to generate a manifest (default true)
#   pretranslate_pexe: whether to pre-translate pexe to nexe during build
#     (default true for Non-SFI, otherwise false)
#   nonstable_pexe: use non-finalized pexe (default false)
#   debug_pexe: copy both non-finalized and finalized pexe (default false)
#   destination_dir: the output directory relative to the $root_build_dir,
#     if ommitted the output directory is $root_build_dir and the manifest
#     will be suffixed with the name of the toolchain (optional)
#   test_files: additional test files to copy to $destination_dir (optional)
#   nmfflags: additional flags for the nmf generator (optional)
template("nacl_test_data") {
  assert(defined(invoker.sources))
  forward_variables_from(invoker, [ "destination_dir" ])

  if (defined(invoker.output_name)) {
    output_name = invoker.output_name
  } else {
    output_name = target_name
  }

  if (current_cpu == "x64") {
    nmf_cpu = "x86_64"
  } else if (current_cpu == "x86") {
    nmf_cpu = "x86_32"
  } else {
    nmf_cpu = current_cpu
  }

  if (current_cpu == "pnacl") {
    if (defined(invoker.pretranslate_pexe)) {
      pretranslate_pexe = invoker.pretranslate_pexe
    } else {
      pretranslate_pexe = is_nacl_nonsfi
    }
  } else {
    pretranslate_pexe = false
  }

  # Note this can't test "is_win" because it's evaluated in the NaCl
  # toolchain context where is_win==false because current_os=="nacl".
  # It tests target_cpu rather than current_cpu because it's also
  # needed in the current_cpu=="pnacl" && pretranslate_pexe case.
  if (target_os == "win" && target_cpu == "x86" && !is_nacl_nonsfi &&
      (current_cpu == "x86" || pretranslate_pexe)) {
    # x86 Windows builds of Chrome run on both x86 Windows and x64
    # Windows.  On x64 Windows, only x64 NaCl is supported, so those
    # tests are needed too.
    extra_tc_cpu = "x64"
    if (current_cpu == "x86") {
      extra_nmf_cpu = "x86_64"
    }
  }

  if (is_nacl_glibc) {
    suffix = "glibc_${nmf_cpu}"
    if (defined(extra_nmf_cpu)) {
      extra_suffix = "glibc_${extra_nmf_cpu}"
      glibc_tc = "//build/toolchain/nacl:glibc"
      assert(current_toolchain == "${glibc_tc}_${current_cpu}")
      extra_toolchain = "${glibc_tc}_${extra_tc_cpu}"
    }
  } else {
    suffix = "newlib_${nmf_cpu}"
    if (defined(extra_nmf_cpu)) {
      extra_suffix = "newlib_${extra_nmf_cpu}"
      newlib_tc = "//build/toolchain/nacl:clang_newlib"
      assert(current_toolchain == "${newlib_tc}_${current_cpu}")
      extra_toolchain = "${newlib_tc}_${extra_tc_cpu}"
    }
  }
  suffixed_output_name = "${output_name}_${suffix}"
  if (defined(extra_nmf_cpu)) {
    extra_suffixed_output_name = "${output_name}_${extra_suffix}"
  }
  if (pretranslate_pexe) {
    pexe_translate_target_name = target_name + "_translate_pexe_"
    if (defined(extra_tc_cpu)) {
      # There will be an extra pretranslation done below for the
      # extra CPU (i.e. for x64 on x86 Windows).
      extra_pexe_translate_target_name =
          pexe_translate_target_name + extra_tc_cpu
    }
    pexe_translate_target_name += target_cpu
  }
  if (defined(invoker.generate_nmf)) {
    generate_nmf = invoker.generate_nmf
  } else {
    generate_nmf = true
  }
  nexe_target_name = target_name + "_nexe"
  nexe_copy_target_name = target_name + "_copy_nexe"
  if (current_cpu == "pnacl" && !is_nacl_nonsfi) {
    if (defined(invoker.debug_pexe) && invoker.debug_pexe) {
      pexe_copy_debug_target_name = target_name + "_copy_pexe_debug"
    }
  }
  if (generate_nmf) {
    nmf_target_name = target_name + "_nmf"
  }
  if (defined(invoker.test_files)) {
    test_files_target_name = target_name + "_test_files"
  }
  final_target_name = target_name

  # When the destination_dir is specified, the build artifacts end up
  # in the that directory and the manifest is the same as the target name.
  # When the destination_dir is not specified, the artifacts end up
  # in the root build directory and the manifests are suffixed to ensure
  # they do not overlap in case when we build the same test using multiple
  # different toolchains.
  if (defined(invoker.destination_dir)) {
    target_dir =
        "${root_build_dir}/${destination_dir}/${nacl_toolchain_variant}"
    if (generate_nmf) {
      nmf_name = output_name
    }
  } else {
    target_dir = root_build_dir
    if (generate_nmf) {
      if (is_nacl_nonsfi) {
        nacl_toolchain_name = "pnacl_${nacl_toolchain_variant}"
      } else {
        nacl_toolchain_name = nacl_toolchain_variant
      }
      nmf_name = "${output_name}_${nacl_toolchain_name}"
    }
  }

  executable(nexe_target_name) {
    visibility = [ ":*" ]
    output_name = suffixed_output_name
    sources = invoker.sources
    forward_variables_from(invoker,
                           [
                             "cflags",
                             "defines",
                             "include_dirs",
                             "ldflags",
                             "libs",
                           ])
    deps = [
      "//build/config/nacl:nacl_base",
      "//ppapi/native_client:ppapi_lib",
    ]
    ldflags = [ "-pthread" ]
    if (defined(invoker.deps)) {
      deps += invoker.deps
    }
  }

  if (current_cpu == "pnacl" && pretranslate_pexe) {
    # This is a template so it can be invoked twice in the
    # defined(extra_tc_cpu) case below.
    template("nacl_test_data_pretranslate_pexe") {
      action(target_name) {
        translate_cpu = invoker.translate_cpu

        visibility = [ ":$nexe_copy_target_name" ]

        # We specify the toolchain explicitly because in the Non-SFI case, we
        # still want to use the pexe built using the newlib_pnacl toolchain.
        tests = ":ppapi_nacl_tests_nexe(//build/toolchain/nacl:newlib_pnacl)"

        pexe = get_label_info(tests, "root_out_dir") +
               "/${suffixed_output_name}.pexe"
        if (translate_cpu == "x86" ||
            (is_nacl_nonsfi &&
             (translate_cpu == "x86" || translate_cpu == "x64"))) {
          nmf_cpu = "x32"
        } else {
          nmf_cpu = translate_cpu
        }
        if (is_nacl_nonsfi) {
          suffix = "pnacl_newlib_${nmf_cpu}_nonsfi"
        } else {
          suffix = "pnacl_newlib_${nmf_cpu}"
        }
        nexe = "${root_out_dir}/${output_name}_${suffix}.nexe"

        script = "${nacl_toolchain_bindir}/pydir/loader.py"
        sources = [
          pexe,
        ]
        outputs = [
          nexe,
        ]

        if (is_nacl_nonsfi) {
          if (translate_cpu == "x86" || translate_cpu == "x64") {
            arch = "x86-32-nonsfi"
          } else if (translate_cpu == "arm") {
            arch = "arm-nonsfi"
          }
        } else {
          # TODO(phosek): remove the following once change 1360243003 is rolled
          # into Chrome and use translate_cpu directly.
          if (translate_cpu == "x86") {
            arch = "i686"
          } else if (translate_cpu == "x64") {
            arch = "x86-64"
          } else if (translate_cpu == "arm") {
            arch = "armv7"
          } else if (translate_cpu == "mipsel") {
            arch = "mipsel"
          }
        }

        # The pre-translated object file has to be linked with an IRT shim to
        # get a runnable nexe. This is handled by pnacl-translate, which passes
        # -l:libpnacl_irt_shim.a to native linker, and we need to ensure the
        # linker can find the correct library.
        if (is_nacl_nonsfi) {
          pnacl_irt_shim = "//ppapi/native_client/src/untrusted/pnacl_irt_shim:aot(//build/toolchain/nacl:newlib_pnacl_nonsfi)"
        } else {
          pnacl_irt_shim = "//ppapi/native_client/src/untrusted/pnacl_irt_shim:aot(//build/toolchain/nacl:clang_newlib_${translate_cpu})"
        }

        args = [
          "pnacl-translate",
          rebase_path(pexe, root_build_dir),
          "-o",
          rebase_path(nexe, root_build_dir),
          "-arch",
          arch,
          "-Wl,-L" +
              rebase_path(get_label_info(pnacl_irt_shim, "target_out_dir"),
                          root_build_dir),
        ]
        deps = [
          ":$nexe_target_name(//build/toolchain/nacl:newlib_pnacl)",
        ]
        data_deps = [
          pnacl_irt_shim,
        ]
      }
    }

    nacl_test_data_pretranslate_pexe(pexe_translate_target_name) {
      translate_cpu = target_cpu
    }
    if (defined(extra_tc_cpu)) {
      nacl_test_data_pretranslate_pexe(extra_pexe_translate_target_name) {
        translate_cpu = extra_tc_cpu
      }
    }
  }

  copy(nexe_copy_target_name) {
    visibility = [ ":$final_target_name" ]
    if (generate_nmf) {
      visibility += [ ":$nmf_target_name" ]
    }
    if (current_cpu == "pnacl") {
      if (pretranslate_pexe) {
        sources = get_target_outputs(":${pexe_translate_target_name}")
        if (defined(extra_tc_cpu)) {
          sources += get_target_outputs(":${extra_pexe_translate_target_name}")
        }
      } else if (defined(invoker.nonstable_pexe) && invoker.nonstable_pexe) {
        sources = [
          "${root_out_dir}/exe.unstripped/${suffixed_output_name}.pexe",
        ]
      } else {
        sources = [
          "${root_out_dir}/${suffixed_output_name}.pexe",
        ]
      }
    } else {
      sources = [
        "${root_out_dir}/${suffixed_output_name}.nexe",
      ]
      if (defined(extra_nmf_cpu)) {
        extra_root_out_dir =
            get_label_info(":${nexe_target_name}(${extra_toolchain})",
                           "root_out_dir")
        sources +=
            [ "${extra_root_out_dir}/${extra_suffixed_output_name}.nexe" ]
      }
    }
    outputs = [
      "${target_dir}/{{source_file_part}}",
    ]
    if (current_cpu == "pnacl" && pretranslate_pexe) {
      deps = [
        ":$pexe_translate_target_name",
      ]
      if (defined(extra_tc_cpu)) {
        deps += [ ":$extra_pexe_translate_target_name" ]
      }
    } else {
      deps = [
        ":$nexe_target_name",
      ]
      if (defined(extra_nmf_cpu)) {
        deps += [ ":${nexe_target_name}(${extra_toolchain})" ]
      }
    }
  }

  if (current_cpu == "pnacl" && !is_nacl_nonsfi) {
    if (defined(invoker.debug_pexe) && invoker.debug_pexe) {
      copy(pexe_copy_debug_target_name) {
        visibility = [ ":$final_target_name" ]
        sources = [
          "${root_out_dir}/exe.unstripped/${suffixed_output_name}.pexe",
        ]
        outputs = [
          "${target_dir}/{{source_name_part}}.pexe.debug",
        ]
        deps = [
          ":$nexe_target_name",
        ]
      }
    }
  }

  if (generate_nmf) {
    if (is_nacl_nonsfi) {
      generate_nonsfi_test_nmf(nmf_target_name) {
        visibility = [ ":$final_target_name" ]
        forward_variables_from(invoker, [ "nmfflags" ])
        nmf = "${target_dir}/${nmf_name}.nmf"
        files = get_target_outputs(":$nexe_copy_target_name")
        executable = files[0]
        deps = [
          ":$nexe_copy_target_name",
        ]
      }
    } else {
      generate_nmf(nmf_target_name) {
        visibility = [ ":$final_target_name" ]
        forward_variables_from(invoker, [ "nmfflags" ])
        nmf = "${target_dir}/${nmf_name}.nmf"
        executables = get_target_outputs(":$nexe_copy_target_name")
        if (is_nacl_glibc) {
          lib_prefix = "${output_name}_libs"
          stage_dependencies = target_dir
        }
        deps = [
          ":$nexe_copy_target_name",
        ]
      }
    }
  }

  if (defined(invoker.test_files)) {
    copy(test_files_target_name) {
      visibility = [ ":$final_target_name" ]
      sources = invoker.test_files
      outputs = [
        "${target_dir}/{{source_file_part}}",
      ]
    }
  }

  group(final_target_name) {
    data_deps = [
      ":$nexe_copy_target_name",
    ]
    if (current_cpu == "pnacl" && !is_nacl_nonsfi) {
      if (defined(invoker.debug_pexe) && invoker.debug_pexe) {
        data_deps += [ ":$pexe_copy_debug_target_name" ]
      }
    }
    if (generate_nmf) {
      data_deps += [ ":$nmf_target_name" ]
    }
    if (defined(invoker.test_files)) {
      data_deps += [ ":$test_files_target_name" ]
    }
  }
}
