# Copyright 2016 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/compiler/compiler.gni")
import("//components/nacl/features.gni")

# This file builds nacl64.exe, which is a 64-bit x86 Windows executable
# used only in the 32-bit x86 Windows build.  The :broker code runs both
# in nacl64.exe and in the 32-bit chrome executable, to launch
# nacl64.exe and communicate with it.

assert(enable_nacl)
assert(is_win)
assert(target_cpu == "x86")

source_set("broker") {
  sources = [
    "nacl_broker_listener.cc",
    "nacl_broker_listener.h",
  ]

  deps = [
    "//base",
    "//components/nacl/common:debug_exception_handler",
    "//components/nacl/common:minimal",
    "//components/nacl/common:switches",
    "//content/public/common:static_switches",
    "//ipc",
    "//mojo/public/cpp/platform",
    "//mojo/public/cpp/system",
    "//sandbox",
    "//services/service_manager/public/cpp",
    "//services/service_manager/zygote:zygote_buildflags",
  ]

  if (current_cpu == target_cpu) {
    deps += [ "//content/public/common" ]
  } else {
    deps += [ ":content_dummy" ]
  }
}

# This exists just to make 'gn check' happy with :broker.  It can't depend
# on //content/public/common or anything like that, because that would
# bring in lots more stuff that should not be in the nacl64.exe build.
source_set("content_dummy") {
  check_includes = false
  sources = [
    "//content/public/common/sandbox_init.h",
    "//content/public/common/sandboxed_process_launcher_delegate.h",
  ]
}

if (current_cpu == "x86") {
  # Tests, packaging rules, etc. will expect to find nacl64.exe in the root
  # of the output directory.  It gets built in a non-default toolchain and
  # so will be delivered in the toolchain output subdirectory.  So this
  # just copies it to the expected place.  Having this target also makes
  # it simpler for things to depend on nacl64, since they don't have to
  # use a toolchain qualifier.
  copy("nacl64") {
    # NOTE: This must match what //build/config/BUILDCONFIG.gn uses
    # as default toolchain for the corresponding x64 build.
    if (is_clang) {
      x64_toolchain = "//build/toolchain/win:win_clang_nacl_win64"
    } else {
      x64_toolchain = "//build/toolchain/win:nacl_win64"
    }
    nacl64_label = ":nacl64($x64_toolchain)"
    nacl64_out_dir = get_label_info(nacl64_label, "root_out_dir")
    sources = [
      "$nacl64_out_dir/nacl64.exe",
    ]
    if (symbol_level != 0) {
      sources += [ "$nacl64_out_dir/nacl64.exe.pdb" ]
    }
    outputs = [
      "$root_out_dir/{{source_file_part}}",
    ]
    deps = [
      nacl64_label,
    ]
  }
} else if (current_cpu == "x64") {
  # In the x64 toolchain context, build nacl64.exe for real.
  executable("nacl64") {
    configs += [ "//build/config/win:windowed" ]

    # //build/config/compiler:optimize{,_max} adds this for official builds
    # only, as it only reduces binary size and is not necessary for
    # correctness.  But for nacl64.exe, it makes more than a six-fold
    # difference in the binary size, so always use it in release builds.
    # Note that using this flag disables incremental linking.  In debug
    # builds, incremental rebuild time is usually of more concern than
    # binary size, so incremental linking is preferable to size reduction.
    if (!is_debug) {
      ldflags = [ "/OPT:REF" ]
    }

    sources = [
      "//chrome/nacl/nacl_exe_win_64.cc",
    ]

    deps = [
      ":broker",
      ":nacl64_content",
      ":nacl64_crash_reporter_client",
      "//base",
      "//build/win:default_exe_manifest",
      "//chrome:nacl64_exe_version",
      "//chrome/install_static:install_static_util",
      "//components/crash/content/app:deprecated_breakpad_win",
      "//components/nacl/loader:nacl_helper_win_64",
      "//content/public/common:static_features",
      "//content/public/common:static_switches",
      "//ppapi/proxy:ipc",
      "//sandbox",
      "//third_party/breakpad:breakpad_handler",
    ]
  }

  # This is a tiny subset of //content built specially for nacl64.exe.
  # There are no subcomponents of //content small enough to get just
  # what nacl64.exe needs without bringing in other stuff that causes
  # problems for the build.
  source_set("nacl64_content") {
    sources = [
      "//content/app/sandbox_helper_win.cc",
      "//content/common/sandbox_init_win.cc",
      "//content/public/common/sandboxed_process_launcher_delegate.cc",
      "//services/service_manager/sandbox/win/sandbox_win.cc",
    ]

    defines = [
      "COMPILE_CONTENT_STATICALLY",
      "NACL_WIN64",
    ]

    # This defangs 'gn check', which does not like this cherry-picking.
    # All the source files here are part of other proper components
    # under //content, where their #include discipline will be checked.
    check_includes = false

    deps = [
      "//base",
      "//content/public/common:static_switches",
      "//sandbox",
      "//services/service_manager/sandbox",
      "//services/service_manager/zygote:zygote_buildflags",
    ]
  }

  source_set("nacl64_crash_reporter_client") {
    sources = [
      "//chrome/app/chrome_crash_reporter_client_win.cc",
      "//chrome/common/crash_keys.cc",
    ]

    defines = [ "NACL_WIN64" ]

    check_includes = false

    deps = [
      "//chrome/common:constants",
      "//chrome/install_static:install_static_util",
      "//chrome/installer/util:with_no_strings",
      "//components/browser_watcher:browser_watcher_client",
      "//components/flags_ui:switches",
      "//components/policy:generated",
      "//content/public/common:static_switches",
      "//ipc",
    ]
  }
}

source_set("nacl_broker_manifest") {
  sources = [
    "nacl_broker_manifest.cc",
    "nacl_broker_manifest.h",
  ]

  deps = [
    "//base",
    "//components/nacl/common",
    "//services/service_manager/public/cpp",
  ]
}
