# 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("//components/nacl/features.gni")
import("//services/service_manager/public/service_manifest.gni")
import("//testing/test.gni")

assert(enable_nacl)

# This is separate so it can be used by ../broker:nacl64.
source_set("minimal") {
  sources = [
    "nacl_ipc_adapter.cc",
    "nacl_ipc_adapter.h",
    "nacl_listener.cc",
    "nacl_listener.h",
    "nacl_main.cc",
    "nacl_main_platform_delegate.h",
    "nacl_main_platform_delegate_linux.cc",
    "nacl_main_platform_delegate_mac.mm",
    "nacl_main_platform_delegate_win.cc",
    "nacl_trusted_listener.cc",
    "nacl_trusted_listener.h",
    "nacl_validation_db.h",
    "nacl_validation_query.cc",
    "nacl_validation_query.h",
  ]

  deps = [
    ":minimal_content_dummy",
    "//base",
    "//components/nacl/common:minimal",
    "//components/nacl/common:mojo_bindings",
    "//crypto",
    "//ipc",
    "//mojo/edk/system",
    "//native_client/src/trusted/service_runtime:sel_main_chrome",
    "//ppapi/c",
    "//ppapi/proxy:ipc",
    "//sandbox",
    "//services/service_manager/public/cpp",
  ]
}

# This exists just to make 'gn check' happy with :minimal and
# :nacl_helper_win_64 (below).  They can't depend on //content/public/common
# or anything like that, because that would bring in lots more than counts
# as "minimal" (stuff that should not be in the nacl64.exe build).
source_set("minimal_content_dummy") {
  check_includes = false
  sources = [
    "//content/public/common/common_sandbox_support_linux.h",
    "//content/public/common/main_function_params.h",
    "//content/public/common/sandbox_init.h",
  ]

  # Deps required by the above headers.
  deps = [
    "//media:media_features",
  ]
}

source_set("loader") {
  public_deps = [
    ":minimal",
  ]
  deps = [
    "//components/nacl/common",
    "//content/public/common",
    "//ppapi/shared_impl",
    "//services/service_manager/public/cpp",
  ]

  data_deps = [
    "//ppapi/native_client:irt",
    "//ppapi/native_client/src/untrusted/pnacl_support_extension",
  ]
}

test("nacl_loader_unittests") {
  sources = [
    "nacl_ipc_adapter_unittest.cc",
    "nacl_validation_query_unittest.cc",
    "run_all_unittests.cc",
  ]

  deps = [
    ":loader",
    "//base/test:test_support",
    "//ipc:test_support",
    "//ppapi/c",
    "//testing/gtest",
  ]

  if (is_nacl_nonsfi) {
    sources += [
      # TODO(hamaji): Currently, we build them twice. Stop building
      # them for components_unittests. See crbug.com/364751
      "nonsfi/nonsfi_sandbox_sigsys_unittest.cc",
      "nonsfi/nonsfi_sandbox_unittest.cc",
    ]

    deps += [
      ":nacl_linux",
      "//sandbox/linux:sandbox_linux_test_utils",
    ]
  }
}

if (is_linux) {
  executable("nacl_helper") {
    sources = [
      "nacl_helper_linux.cc",
      "nacl_helper_linux.h",
    ]

    deps = [
      ":loader",
      "//base",
      "//build/config:exe_and_shlib_deps",
      "//components/nacl/common:switches",
      "//components/nacl/loader/sandbox_linux",
      "//content/public/common",
      "//crypto",
      "//ipc",
      "//mojo/edk/system",
      "//sandbox/linux:sandbox_services",
      "//services/service_manager/sandbox",
      "//url/ipc:url_ipc",
    ]

    cflags = [ "-fPIE" ]

    ldflags = [ "-pie" ]

    if (is_chromeos) {
      # NaCl is not working with compiler-rt in ChromeOS.
      # Force libgcc as a workaround. See https://crbug.com/761103
      ldflags += [ "-rtlib=libgcc" ]
    }

    data_deps = [
      "//native_client/src/trusted/service_runtime/linux:bootstrap",
    ]
  }

  # For setting up nacl_helper.
  source_set("nacl_helper_integration") {
    public = [
      "nacl_helper_linux.h",
    ]
    data_deps = [
      ":nacl_helper",
    ]
  }

  if (enable_nacl_nonsfi) {
    test("nacl_helper_nonsfi_unittests") {
      sources = [
        "nonsfi/nacl_helper_nonsfi_unittests.cc",
      ]
      deps = [
        "//base",
        "//base/test:test_launcher_nacl_nonsfi",
      ]
      data_deps = [
        ":nacl_helper_nonsfi_unittests_main_copy(//build/toolchain/nacl:newlib_pnacl_nonsfi)",
      ]
    }

    group("helper_nonsfi") {
      data_deps = [
        ":nacl_helper_nonsfi_copy(//build/toolchain/nacl:newlib_pnacl_nonsfi)",
      ]
    }
  }
}

if (is_win && target_cpu == "x86" && current_cpu == "x64") {
  source_set("nacl_helper_win_64") {
    sources = [
      "nacl_helper_win_64.cc",
      "nacl_helper_win_64.h",
    ]

    deps = [
      ":minimal",
      ":minimal_content_dummy",
      "//base",
      "//components/nacl/broker",
      "//components/nacl/common:switches",
      "//content/public/common:static_switches",
      "//mojo/edk/system",
      "//sandbox",
      "//services/service_manager/sandbox:sandbox",
    ]
  }
}

if (is_nacl_nonsfi) {
  executable("nacl_helper_nonsfi_nexe") {
    output_name = "nacl_helper_nonsfi"
    set_sources_assignment_filter([])
    sources = [
      "nacl_helper_linux.cc",
      "nacl_helper_linux.h",
      "nacl_trusted_listener.cc",
      "nacl_trusted_listener.h",
      "nonsfi/nonsfi_listener.cc",
      "nonsfi/nonsfi_listener.h",
      "nonsfi/nonsfi_main.cc",
      "nonsfi/nonsfi_main.h",
    ]
    deps = [
      ":nacl_helper_nonsfi_sandbox",
      "//base",
      "//components/nacl/common:minimal",
      "//components/nacl/common:mojo_bindings",
      "//components/nacl/common:switches",
      "//components/tracing",
      "//content",
      "//ipc",
      "//mojo/edk/system",
      "//native_client/src/nonsfi/irt:nacl_sys_private",
      "//native_client/src/nonsfi/loader:elf_loader",

      # Normally libnacl is included implicitly by libc and is part of the
      # toolchain. But //build/config/nacl:compiler uses -nodefaultlibs and so
      # omits the default libnacl. When the nonsfi toolchain is more complete
      # and that kludge is no longer required, this dependency should be
      # removed.
      "//native_client/src/untrusted/nacl",
      "//ppapi/proxy",
      "//sandbox/linux:sandbox",
      "//services/service_manager/public/cpp",
      "//services/service_manager/sandbox",
    ]
  }

  source_set("nacl_helper_nonsfi_sandbox") {
    set_sources_assignment_filter([])
    sources = [
      "nonsfi/nonsfi_sandbox.cc",
      "nonsfi/nonsfi_sandbox.h",
      "sandbox_linux/nacl_sandbox_linux.cc",
      "sandbox_linux/nacl_sandbox_linux.h",
    ]
    deps = [
      "//base",
      "//components/nacl/common:minimal",
      "//components/nacl/common:switches",
      "//content",
      "//sandbox/linux:sandbox",
      "//sandbox/linux:sandbox_services_headers",
    ]
  }

  copy("nacl_helper_nonsfi_copy") {
    sources = [
      "${root_out_dir}/nacl_helper_nonsfi",
    ]
    outputs = [
      "${root_build_dir}/{{source_file_part}}",
    ]
    deps = [
      ":nacl_helper_nonsfi_nexe",
    ]
  }

  test("nacl_helper_nonsfi_unittests_main") {
    sources = [
      "nonsfi/nonsfi_sandbox_sigsys_unittest.cc",
      "nonsfi/nonsfi_sandbox_unittest.cc",
      "nonsfi/run_all_unittests.cc",
    ]
    deps = [
      ":nacl_helper_nonsfi_sandbox",
      "//base",
      "//base/test:test_support",
      "//content",
      "//native_client/src/nonsfi/irt:nacl_sys_private",
      "//native_client/src/untrusted/nacl:nacl",
      "//sandbox/linux:sandbox",
      "//sandbox/linux:sandbox_linux_test_utils",
      "//sandbox/linux:sandbox_services_headers",
      "//testing/gtest",
    ]
  }

  copy("nacl_helper_nonsfi_unittests_main_copy") {
    testonly = true
    sources = [
      "${root_out_dir}/nacl_helper_nonsfi_unittests_main",
    ]
    outputs = [
      "${root_build_dir}/{{source_file_part}}",
    ]
    deps = [
      ":nacl_helper_nonsfi_unittests_main",
    ]
  }
}

service_manifest("nacl_loader_manifest") {
  name = "nacl_loader"
  source = "nacl_loader_manifest.json"
}
