# 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/clang/clang.gni")
import("//build/config/sanitizers/sanitizers.gni")
import("//build/config/win/manifest.gni")

# Depending on this target will cause the manifests for Chrome's default
# Windows and common control compatibility and elevation for executables.
windows_manifest("default_exe_manifest") {
  sources = [
    as_invoker_manifest,
    common_controls_manifest,
    default_compatibility_manifest,
  ]
}

if (is_win) {
  action("copy_cdb_to_output") {
    script = "//build/win/copy_cdb_to_output.py"
    inputs = [
      script,
      "//build/vs_toolchain.py",
    ]
    outputs = [
      "$root_out_dir/cdb/cdb.exe",
      "$root_out_dir/cdb/dbgeng.dll",
      "$root_out_dir/cdb/dbghelp.dll",
      "$root_out_dir/cdb/dbgmodel.dll",
      "$root_out_dir/cdb/winext/ext.dll",
      "$root_out_dir/cdb/winext/uext.dll",
      "$root_out_dir/cdb/winxp/exts.dll",
      "$root_out_dir/cdb/winxp/ntsdexts.dll",
    ]
    if (current_cpu != "arm64") {
      # The UCRT files are not redistributable for ARM64 Win32.
      outputs += [
        "$root_out_dir/cdb/api-ms-win-core-console-l1-1-0.dll",
        "$root_out_dir/cdb/api-ms-win-core-datetime-l1-1-0.dll",
        "$root_out_dir/cdb/api-ms-win-core-debug-l1-1-0.dll",
        "$root_out_dir/cdb/api-ms-win-core-errorhandling-l1-1-0.dll",
        "$root_out_dir/cdb/api-ms-win-core-file-l1-1-0.dll",
        "$root_out_dir/cdb/api-ms-win-core-file-l1-2-0.dll",
        "$root_out_dir/cdb/api-ms-win-core-file-l2-1-0.dll",
        "$root_out_dir/cdb/api-ms-win-core-handle-l1-1-0.dll",
        "$root_out_dir/cdb/api-ms-win-core-heap-l1-1-0.dll",
        "$root_out_dir/cdb/api-ms-win-core-interlocked-l1-1-0.dll",
        "$root_out_dir/cdb/api-ms-win-core-libraryloader-l1-1-0.dll",
        "$root_out_dir/cdb/api-ms-win-core-localization-l1-2-0.dll",
        "$root_out_dir/cdb/api-ms-win-core-memory-l1-1-0.dll",
        "$root_out_dir/cdb/api-ms-win-core-namedpipe-l1-1-0.dll",
        "$root_out_dir/cdb/api-ms-win-core-processenvironment-l1-1-0.dll",
        "$root_out_dir/cdb/api-ms-win-core-processthreads-l1-1-0.dll",
        "$root_out_dir/cdb/api-ms-win-core-processthreads-l1-1-1.dll",
        "$root_out_dir/cdb/api-ms-win-core-profile-l1-1-0.dll",
        "$root_out_dir/cdb/api-ms-win-core-rtlsupport-l1-1-0.dll",
        "$root_out_dir/cdb/api-ms-win-core-string-l1-1-0.dll",
        "$root_out_dir/cdb/api-ms-win-core-synch-l1-1-0.dll",
        "$root_out_dir/cdb/api-ms-win-core-synch-l1-2-0.dll",
        "$root_out_dir/cdb/api-ms-win-core-sysinfo-l1-1-0.dll",
        "$root_out_dir/cdb/api-ms-win-core-timezone-l1-1-0.dll",
        "$root_out_dir/cdb/api-ms-win-core-util-l1-1-0.dll",
        "$root_out_dir/cdb/api-ms-win-crt-conio-l1-1-0.dll",
        "$root_out_dir/cdb/api-ms-win-crt-convert-l1-1-0.dll",
        "$root_out_dir/cdb/api-ms-win-crt-environment-l1-1-0.dll",
        "$root_out_dir/cdb/api-ms-win-crt-filesystem-l1-1-0.dll",
        "$root_out_dir/cdb/api-ms-win-crt-heap-l1-1-0.dll",
        "$root_out_dir/cdb/api-ms-win-crt-locale-l1-1-0.dll",
        "$root_out_dir/cdb/api-ms-win-crt-math-l1-1-0.dll",
        "$root_out_dir/cdb/api-ms-win-crt-multibyte-l1-1-0.dll",
        "$root_out_dir/cdb/api-ms-win-crt-private-l1-1-0.dll",
        "$root_out_dir/cdb/api-ms-win-crt-process-l1-1-0.dll",
        "$root_out_dir/cdb/api-ms-win-crt-runtime-l1-1-0.dll",
        "$root_out_dir/cdb/api-ms-win-crt-stdio-l1-1-0.dll",
        "$root_out_dir/cdb/api-ms-win-crt-string-l1-1-0.dll",
        "$root_out_dir/cdb/api-ms-win-crt-time-l1-1-0.dll",
        "$root_out_dir/cdb/api-ms-win-crt-utility-l1-1-0.dll",
        "$root_out_dir/cdb/api-ms-win-eventing-provider-l1-1-0.dll",
        "$root_out_dir/cdb/ucrtbase.dll",
      ]
    }
    args = [
      rebase_path("$root_out_dir/cdb", root_out_dir),
      current_cpu,
    ]
  }

  group("runtime_libs") {
    data = []
    if (is_component_build) {
      # Copy the VS runtime DLLs into the isolate so that they don't have to be
      # preinstalled on the target machine. The debug runtimes have a "d" at
      # the end.
      if (is_debug) {
        vcrt_suffix = "d"
      } else {
        vcrt_suffix = ""
      }

      # These runtime files are copied to the output directory by the
      # vs_toolchain script that runs as part of toolchain configuration.
      data += [
        "$root_out_dir/msvcp140${vcrt_suffix}.dll",
        "$root_out_dir/vccorlib140${vcrt_suffix}.dll",
        "$root_out_dir/vcruntime140${vcrt_suffix}.dll",
      ]
      if (is_debug) {
        data += [ "$root_out_dir/ucrtbased.dll" ]
      }
      if (is_asan) {
        assert(target_cpu == "x64",
               "ASan is only supported in 64-bit builds on Windows.")
        data += [ "$clang_base_path/lib/clang/$clang_version/lib/windows/clang_rt.asan_dynamic-x86_64.dll" ]
      }
      if (current_cpu != "arm64") {
        data += [
          # Universal Windows 10 CRT files
          "$root_out_dir/api-ms-win-core-console-l1-1-0.dll",
          "$root_out_dir/api-ms-win-core-datetime-l1-1-0.dll",
          "$root_out_dir/api-ms-win-core-debug-l1-1-0.dll",
          "$root_out_dir/api-ms-win-core-errorhandling-l1-1-0.dll",
          "$root_out_dir/api-ms-win-core-file-l1-1-0.dll",
          "$root_out_dir/api-ms-win-core-file-l1-2-0.dll",
          "$root_out_dir/api-ms-win-core-file-l2-1-0.dll",
          "$root_out_dir/api-ms-win-core-handle-l1-1-0.dll",
          "$root_out_dir/api-ms-win-core-heap-l1-1-0.dll",
          "$root_out_dir/api-ms-win-core-interlocked-l1-1-0.dll",
          "$root_out_dir/api-ms-win-core-libraryloader-l1-1-0.dll",
          "$root_out_dir/api-ms-win-core-localization-l1-2-0.dll",
          "$root_out_dir/api-ms-win-core-memory-l1-1-0.dll",
          "$root_out_dir/api-ms-win-core-namedpipe-l1-1-0.dll",
          "$root_out_dir/api-ms-win-core-processenvironment-l1-1-0.dll",
          "$root_out_dir/api-ms-win-core-processthreads-l1-1-0.dll",
          "$root_out_dir/api-ms-win-core-processthreads-l1-1-1.dll",
          "$root_out_dir/api-ms-win-core-profile-l1-1-0.dll",
          "$root_out_dir/api-ms-win-core-rtlsupport-l1-1-0.dll",
          "$root_out_dir/api-ms-win-core-string-l1-1-0.dll",
          "$root_out_dir/api-ms-win-core-synch-l1-1-0.dll",
          "$root_out_dir/api-ms-win-core-synch-l1-2-0.dll",
          "$root_out_dir/api-ms-win-core-sysinfo-l1-1-0.dll",
          "$root_out_dir/api-ms-win-core-timezone-l1-1-0.dll",
          "$root_out_dir/api-ms-win-core-util-l1-1-0.dll",
          "$root_out_dir/api-ms-win-crt-conio-l1-1-0.dll",
          "$root_out_dir/api-ms-win-crt-convert-l1-1-0.dll",
          "$root_out_dir/api-ms-win-crt-environment-l1-1-0.dll",
          "$root_out_dir/api-ms-win-crt-filesystem-l1-1-0.dll",
          "$root_out_dir/api-ms-win-crt-heap-l1-1-0.dll",
          "$root_out_dir/api-ms-win-crt-locale-l1-1-0.dll",
          "$root_out_dir/api-ms-win-crt-math-l1-1-0.dll",
          "$root_out_dir/api-ms-win-crt-multibyte-l1-1-0.dll",
          "$root_out_dir/api-ms-win-crt-private-l1-1-0.dll",
          "$root_out_dir/api-ms-win-crt-process-l1-1-0.dll",
          "$root_out_dir/api-ms-win-crt-runtime-l1-1-0.dll",
          "$root_out_dir/api-ms-win-crt-stdio-l1-1-0.dll",
          "$root_out_dir/api-ms-win-crt-string-l1-1-0.dll",
          "$root_out_dir/api-ms-win-crt-time-l1-1-0.dll",
          "$root_out_dir/api-ms-win-crt-utility-l1-1-0.dll",
        ]
        if (!is_debug) {
          data += [ "$root_out_dir/ucrtbase.dll" ]
        }
      }
    }
  }
}
