# 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("//mojo/public/mojo_application.gni")
import("//mojo/public/tools/bindings/mojom.gni")
import("//mojo/tools/embed/rules.gni")

# Trusted code
if (!is_nacl) {
  if (current_cpu == "x86" || current_cpu == "arm") {
    # Non-SFI NaCl can only be executed by a 32-bit process, so our
    # content handler must be built and launched as a 32-bit process as well.
    mojo_native_application("content_handler_nexe_32_bit") {
      output_name = "content_handler_nonsfi_nexe"
      sources = [
        "content_handler_main_nexe.cc",
      ]

      deps = [
        "//base",
        "//mojo/application:application",
        "//mojo/application:content_handler",
        "//mojo/data_pipe_utils",
        "//mojo/message_pump",
        "//mojo/nacl/nonsfi:irt_mojo",
        "//mojo/public/cpp/application:application",
        "//native_client/src/nonsfi/loader:elf_loader",
      ]
    }
    mojo_native_application("content_handler_pexe_32_bit") {
      output_name = "content_handler_nonsfi_pexe"
      sources = [
        "content_handler_main_pexe.cc",
      ]

      deps = [
        ":pnacl_translator_bindings",
        "//base",
        "//mojo/application:application",
        "//mojo/application:content_handler",
        "//mojo/data_pipe_utils",
        "//mojo/file_utils",
        "//mojo/message_pump",
        "//mojo/nacl/nonsfi:irt_mojo",
        "//native_client/src/nonsfi/loader:elf_loader",
      ]
    }
    mojo_native_application("pnacl_compile_32_bit") {
      output_name = "pnacl_compile"
      sources = [
        "pnacl_compile.cc",
      ]

      deps = [
        ":pnacl_translator_bindings",
        ":pnacl_translator_compile_file",
        "//base",
        "//mojo/nacl/nonsfi:irt_mojo",
        "//mojo/public/cpp/application:standalone",
        "//native_client/src/nonsfi/loader:elf_loader",
      ]
    }
    mojo_native_application("pnacl_link_32_bit") {
      output_name = "pnacl_link"
      sources = [
        "pnacl_link.cc",
      ]

      deps = [
        ":ld_file",
        ":pnacl_translator_bindings",
        "//base",
        "//mojo/nacl/nonsfi:irt_mojo",
        "//mojo/public/cpp/application:standalone",
        "//native_client/src/nonsfi/loader:elf_loader",
      ]
    }

    # Copy to the root build directory so that the '#!' prefix line for invoking
    # our content handler can simply be "mojo:content_handler_nonsfi".
    # Either way, build the same dependencies.
    shared_deps = [
      ":content_handler_nexe_32_bit",
      ":content_handler_pexe_32_bit",
      ":pnacl_compile_32_bit",
      ":pnacl_link_32_bit",
    ]
    if (root_out_dir != root_build_dir) {
      copy("content_handler_copy") {
        sources = [
          "${root_out_dir}/content_handler_nonsfi_nexe.mojo",
          "${root_out_dir}/content_handler_nonsfi_pexe.mojo",
          "${root_out_dir}/pnacl_compile.mojo",
          "${root_out_dir}/pnacl_link.mojo",
        ]
        outputs = [
          "${root_build_dir}/{{source_file_part}}",
        ]
        deps = shared_deps
      }
    } else {
      group("content_handler_copy") {
        deps = shared_deps
      }
    }
  }
}

# This group serves as a 64 to 32 bit transformation for Linux. If we are
# using a 64 bit toolchain, build the nonsfi nacl content handler as 32 bit.
group("content_handler") {
  deps = []
  if ((target_cpu == "x64" || target_cpu == "x86") && is_linux) {
    # The toolchain is hardcoded as 32-bit clang here -- although it must
    # be 32 bit (for nonsfi), it assumes clang. Ideally, the toolchain would
    # be defined as the 32 bit variant of whatever is being used (be it clang,
    # gcc, or something else).
    deps += [ ":content_handler_copy(//build/toolchain/linux:clang_x86)" ]
  } else {
    deps += [ ":content_handler_copy" ]
  }
}

# Create embedded files usable by the PNaCl translation services.
if (current_cpu == "x86" || current_cpu == "x64") {
  pnacl_file_location_prefix = "//native_client/toolchain/linux_x86/pnacl_translator/translator/x86-32-nonsfi"
} else if (current_cpu == "arm") {
  pnacl_file_location_prefix = "//native_client/toolchain/linux_x86/pnacl_translator/translator/arm-nonsfi"
} else {
  assert(false, "Architecture not recognized by Non-SFI NaCl")
}

embed_file("ld_file") {
  source = "${pnacl_file_location_prefix}/bin/ld.nexe"
  namespace = "nacl"
  variable = "kLdNexe"
}

embed_file("pnacl_translator_compile_file") {
  if (current_cpu == "arm") {
    source = "${pnacl_file_location_prefix}/bin/pnacl-llc.nexe"
  } else if (current_cpu == "x86" || current_cpu == "x64") {
    source = "${pnacl_file_location_prefix}/bin/pnacl-sz.nexe"
  } else {
    assert(false, "Architecture not recognized by Non-SFI NaCl")
  }
  namespace = "nacl"
  variable = "kPnaclTranslatorCompile"
}

# Create embedded files usable by the PNaCl translation IRT.
embed_file("crtbegin_file") {
  source = "${pnacl_file_location_prefix}/lib/crtbegin.o"
  namespace = "nacl"
  variable = "kCrtbegin"
}
embed_file("crtbegin_for_eh_file") {
  source = "${pnacl_file_location_prefix}/lib/crtbegin_for_eh.o"
  namespace = "nacl"
  variable = "kCrtbeginForEh"
}
embed_file("crtend_file") {
  source = "${pnacl_file_location_prefix}/lib/crtend.o"
  namespace = "nacl"
  variable = "kCrtend"
}
embed_file("libcrt_platform_file") {
  source = "${pnacl_file_location_prefix}/lib/libcrt_platform.a"
  namespace = "nacl"
  variable = "kLibcrtPlatform"
}
embed_file("libgcc_file") {
  source = "${pnacl_file_location_prefix}/lib/libgcc.a"
  namespace = "nacl"
  variable = "kLibgcc"
}
embed_file("libpnacl_irt_shim_dummy_file") {
  source = "${pnacl_file_location_prefix}/lib/libpnacl_irt_shim_dummy.a"
  namespace = "nacl"
  variable = "kLibpnaclIrtShimDummy"
}

# Collection of mojom bindings and files necessary for pnacl translation by the
# IRT.
group("pnacl_translator_irt") {
  public_deps = [
    ":pnacl_translator_bindings",
    ":pnacl_translator_irt_files",
  ]
}

group("pnacl_translator_irt_files") {
  public_deps = [
    ":crtbegin_file",
    ":crtbegin_for_eh_file",
    ":crtend_file",
    ":libcrt_platform_file",
    ":libgcc_file",
    ":libpnacl_irt_shim_dummy_file",
  ]
}

mojom("pnacl_translator_bindings") {
  sources = [
    "pnacl_compile.mojom",
    "pnacl_link.mojom",
  ]
}
