# Copyright (c) 2017, the Dart project authors.  Please see the AUTHORS file
# for details. All rights reserved. Use of this source code is governed by a
# BSD-style license that can be found in the LICENSE file.

# This GN file contains build rules for assembling the Dart SDK. There are
# two possible variants: the "Full" SDK, and the "Platform" SDK. If you want
# to make a new subset of the Full SDK, make it the same way we make
# the Platform SDK.
#
# Warning:
# If you need to copy something into dart-sdk/lib/foo in addition to the stuff
# copied there by :copy_libraries_nnbd, then you must depend on ":copy_libraries_nnbd",
# or ":copy_libraries_nnbd" may delete/overwrite your addition, and the build will
# fail.

import("../build/dart/copy_tree.gni")
import("../runtime/runtime_args.gni")

declare_args() {
  # Build a SDK with less stuff. It excludes dart2js, ddc, and web libraries.
  dart_platform_sdk_nnbd = true

  # Path to stripped dart binaries relative to build output directory.
  # TODO(rnystrom): These should use different filenames once the runtime's
  # BUILD.gn file has additional rules to generate the NNBD versions of these
  # executables.
  dart_stripped_binary_nnbd = "dart"
  dartaotruntime_stripped_binary_nnbd = "dartaotruntime"
  gen_snapshot_stripped_binary_nnbd = "gen_snapshot"
}

# The directory layout of the SDK is as follows:
#
# ..dart-sdk/
# ....bin/
# ......dart or dart.exe (executable)
# ......dart.lib (import library for VM native extensions on Windows)
# ......dartaotruntime or dartaotruntime.exe (executable)
# ......dartdoc
# ......dartfmt
# ......dart2aot
# ......dart2js
# ......dartanalyzer
# ......dartdevc
# ......utils/gen_snapshot or utils/gen_snapshot.exe (executable)
# ......pub
# ......snapshots/
# ........analysis_server.dart.snapshot
# ........dart2js.dart.snapshot
# ........dartanalyzer.dart.snapshot
# ........dartdoc.dart.snapshot
# ........dartfmt.dart.snapshot
# ........dartdevc.dart.snapshot
# ........gen_kernel.dart.snapshot
# ........kernel_worker.dart.snapshot
# ........pub.dart.snapshot
#.........resources/
#...........dartdoc/
#..............packages
#.............resources/
#.............templates/
# ....include/
# ......dart_api.h
# ......dart_native_api.h
# ......dart_tools_api.h
# ....lib/
# ......libraries.json
# ......_internal/
#.........strong.sum
#.........dart2js_platform.dill
#.........dart2js_server_platform.dill
#.........dart2js_platform_strong.dill
#.........dart2js_server_platform_strong.dill
#.........vm_platform_strong.dill
#.........dev_compiler/
# ......async/
# ......collection/
# ......convert/
# ......core/
# ......html/
# ......_http/
# ......internal/
# ......io/
# ......isolate/
# ......js/
# ......js_util/
# ......math/
# ......mirrors/
# ......typed_data/
# ......wasm/
# ......api_readme.md
# ....model/
# ......lexeme/
# ........idx2word.json
# ........model.tflite
# ........word2idx.json

# Scripts that go under bin/
_platform_sdk_scripts = [
  "dartanalyzer",
  "dartfmt",
  "pub",
]

_full_sdk_scripts = [
  "dart2js",
  "dartanalyzer",
  "dartdevc",
  "dartfmt",
  "pub",
]

# Scripts not ending in _sdk that go under bin/
_scripts = [ "dartdoc" ]

# Snapshots that go under bin/snapshots
_platform_sdk_snapshots = [
  [
    "dartanalyzer",
    "../utils/dartanalyzer:generate_dartanalyzer_snapshot",
  ],
  [
    "dart2native",
    "../utils/dart2native:generate_dart2native_snapshot",
  ],
  [
    "dartdoc",
    "../utils/dartdoc",
  ],
  [
    "dartfmt",
    "../utils/dartfmt",
  ],
  [
    "pub",
    "../utils/pub",
  ],
]
if (create_kernel_service_snapshot) {
  _platform_sdk_snapshots += [ [
        "kernel-service",
        "../utils/kernel-service:kernel-service_snapshot",
      ] ]
}
if (dart_target_arch != "arm") {
  _platform_sdk_snapshots += [ [
        "analysis_server",
        "../utils/analysis_server",
      ] ]
}

_full_sdk_snapshots = [
  [
    "dart2js",
    "../utils/compiler:dart2js",
  ],
  [
    "dartanalyzer",
    "../utils/dartanalyzer:generate_dartanalyzer_snapshot",
  ],
  [
    "dart2native",
    "../utils/dart2native:generate_dart2native_snapshot",
  ],
  [
    "dartdevc",
    "../utils/dartdevc",
  ],
  [
    "dartdoc",
    "../utils/dartdoc",
  ],
  [
    "dartfmt",
    "../utils/dartfmt",
  ],
  [
    "kernel_worker",
    "../utils/bazel:kernel_worker",
  ],
  [
    "pub",
    "../utils/pub",
  ],
]
if (create_kernel_service_snapshot) {
  _full_sdk_snapshots += [ [
        "kernel-service",
        "../utils/kernel-service:kernel-service_snapshot",
      ] ]
}
if (dart_target_arch != "arm") {
  _full_sdk_snapshots += [ [
        "analysis_server",
        "../utils/analysis_server",
      ] ]
}

# Libraries that go under lib/
_full_sdk_libraries = [
  "_chrome",
  "_internal",
  "async",
  "cli",
  "collection",
  "convert",
  "core",
  "developer",
  "ffi",
  "html",
  "_http",
  "indexed_db",
  "internal",
  "io",
  "isolate",
  "js",
  "js_util",
  "math",
  "mirrors",
  "svg",
  "typed_data",
  "wasm",
  "web_audio",
  "web_gl",
  "web_sql",
]

# Apps running on the platform SDK shouldn't be using Dart4Web libraries, but
# the analyzer and dartdoc expect all the library sources to be present.
#
# _platform_sdk_libraries = [
#   "_internal",
#   "async",
#   "cli",
#   "collection",
#   "convert",
#   "core",
#   "developer",
#   "html",
#   "_http",
#   "internal",
#   "io",
#   "isolate",
#   "math",
#   "mirrors",
#   "typed_data",
# ]
_platform_sdk_libraries = _full_sdk_libraries

# From here down to the copy_trees() invocation, we collect all the information
# about trees that need to be copied in the list of scopes, copy_tree_specs.
copy_tree_specs = []

# This rule copies dartdoc templates to
# bin/resources/dartdoc/templates
copy_tree_specs += [
  {
    target = "copy_dartdoc_templates_nnbd"
    visibility = [ ":copy_dartdoc_files_nnbd" ]
    source = "../third_party/pkg/dartdoc/lib/templates"
    dest = "$root_out_dir/dart-sdk-nnbd/bin/resources/dartdoc/templates"
    ignore_patterns = "{}"
  },
]

# This rule copies dartdoc resources to
# bin/resources/dartdoc/resources
copy_tree_specs += [
  {
    target = "copy_dartdoc_resources_nnbd"
    visibility = [ ":copy_dartdoc_files_nnbd" ]
    source = "../third_party/pkg/dartdoc/lib/resources"
    dest = "$root_out_dir/dart-sdk-nnbd/bin/resources/dartdoc/resources"
    ignore_patterns = "{}"
  },
]

# This loop generates rules to copy libraries to lib/
foreach(library, _full_sdk_libraries) {
  copy_tree_specs += [
    {
      target = "copy_${library}_library_nnbd"
      visibility = [
        ":copy_platform_sdk_libraries_nnbd",
        ":copy_full_sdk_libraries_nnbd",
      ]
      source = "lib/$library"
      dest = "$root_out_dir/dart-sdk-nnbd/lib/$library"
      ignore_patterns = "*.svn,doc,*.py,*.gypi,*.sh,.gitignore"
    },
  ]
}

if (is_win) {
  copy_tree_specs += [
    {
      target = "copy_7zip_nnbd"
      visibility = [ ":create_common_sdk_nnbd" ]
      deps = [
        ":copy_libraries_nnbd",
      ]
      source = "../third_party/7zip"
      dest = "$root_out_dir/dart-sdk-nnbd/lib/_internal/pub/asset/7zip"
      ignore_patterns = ".svn"
    },
  ]
}

if (target_cpu == "x64") {
  copy_tree_specs += [
    {
      target = "copy_language_model_nnbd"
      visibility = [ ":create_common_sdk_nnbd" ]
      deps = [
        ":copy_libraries_nnbd",
      ]
      source = "../pkg/analysis_server/language_model"
      dest = "$root_out_dir/dart-sdk-nnbd/model"
      ignore_patterns = "{}"
    },
    {
      target = "copy_libtensorflowlite_c_nnbd"
      visibility = [ ":create_common_sdk_nnbd" ]
      deps = [
        ":copy_libraries_nnbd",
      ]
      source = "../third_party/pkg/tflite_native/lib/src/blobs"
      dest = "$root_out_dir/dart-sdk-nnbd/bin/snapshots"
      ignore_patterns = "{}"
    },
  ]
}

# This generates targets for everything in copy_tree_specs. The targets have the
# same name as the "target" fields in the scopes of copy_tree_specs.
copy_trees("copy_trees_nnbd") {
  sources = copy_tree_specs
}

# Copies the Dart VM binary into bin/
if (target_os != current_os && target_os == "fuchsia") {
  # In the Fuchsia build, this has to use a symlink for two reasons.
  # First, it makes the lookup of shared libraries relative to $ORIGIN
  # (Linux) or @loader_path (macOS) find the libraries where they are,
  # since those lookups use the directory of the symlink target rather
  # than of the link itself (as they would for a copy or hard link).
  # Second, when the dart binary is built as a "variant" (e.g. with a
  # sanitizer), then $root_out_dir/dart is itself a symlink to the real
  # binary in the selected variant toolchain's $root_out_dir and since
  # the "copy" tool is actually a hard link rather than a copy, it will
  # make a link to the symlink rather than the symlink's target, and the
  # relative symlink interpreted from a different containing directory
  # will not find the actual binary.
  action("copy_dart_nnbd") {
    visibility = [ ":create_common_sdk_nnbd" ]
    # TODO(rnystrom): This probably needs to be forked for NNBD.
    dart_label = "../runtime/bin:dart"
    deps = [
      dart_label,
    ]
    dart_out = get_label_info(dart_label, "root_out_dir")
    sources = [
      "$dart_out/$dart_stripped_binary_nnbd",
    ]
    outputs = [
      "$root_out_dir/dart-sdk-nnbd/bin/$dart_stripped_binary_nnbd",
    ]
    script = "/bin/ln"
    args = [
      "-snf",
      rebase_path(sources[0], get_path_info(outputs[0], "dir")),
      rebase_path(outputs[0]),
    ]
  }
} else {
  copy("copy_dart_nnbd") {
    visibility = [ ":create_common_sdk_nnbd" ]
    deps = [
      # TODO(rnystrom): This probably needs to be forked for NNBD.
      "../runtime/bin:dart",
    ]
    dart_out = get_label_info("../runtime/bin:dart", "root_out_dir")
    if (is_win) {
      sources = [
        # TODO(rnystrom): This probably needs to be forked for NNBD.
        "$dart_out/dart.exe",
      ]
    } else {
      sources = [
        "$dart_out/$dart_stripped_binary_nnbd",
      ]
    }
    if (is_win) {
      sources += [ "$dart_out/dart.lib" ]
    }
    outputs = [
      "$root_out_dir/dart-sdk-nnbd/bin/{{source_file_part}}",
    ]
  }
}

copy("copy_dartaotruntime_nnbd") {
  deps = [
    "../runtime/bin:dartaotruntime",
  ]
  dartaotruntime_out =
      get_label_info("../runtime/bin:dartaotruntime", "root_out_dir")
  if (is_win) {
    sources = [
      "$dartaotruntime_out/dartaotruntime.exe",
    ]
  } else {
    sources = [
      "$dartaotruntime_out/$dartaotruntime_stripped_binary_nnbd",
    ]
  }
  if (is_win) {
    sources += [ "$dartaotruntime_out/dartaotruntime.lib" ]
  }
  outputs = [
    "$root_out_dir/dart-sdk-nnbd/bin/{{source_file_part}}",
  ]
}

copy("copy_gen_snapshot_nnbd") {
  deps = [
    # TODO(rnystrom): This probably needs to be forked for NNBD.
    "../runtime/bin:gen_snapshot",
  ]
  gen_snapshot_out =
      get_label_info("../runtime/bin:gen_snapshot", "root_out_dir")
  if (is_win) {
    sources = [
      # TODO(rnystrom): This probably needs to be forked for NNBD.
      "$gen_snapshot_out/gen_snapshot.exe",
    ]
  } else {
    sources = [
      "$gen_snapshot_out/$gen_snapshot_stripped_binary_nnbd",
    ]
  }
  outputs = [
    "$root_out_dir/dart-sdk-nnbd/bin/utils/{{source_file_part}}",
  ]
}

copy("copy_dart2aot_nnbd") {
  ext = ""
  if (is_win) {
    ext = ".bat"
  }
  sources = [
    "bin/dart2aot$ext",
  ]
  outputs = [
    "$root_out_dir/dart-sdk-nnbd/bin/{{source_file_part}}",
  ]
}

copy("copy_dart2native_nnbd") {
  deps = [
    ":copy_gen_kernel_snapshot_nnbd",
    ":copy_gen_snapshot_nnbd",
  ]
  ext = ""
  if (is_win) {
    ext = ".bat"
  }
  sources = [
    "bin/dart2native$ext",
  ]
  outputs = [
    "$root_out_dir/dart-sdk-nnbd/bin/{{source_file_part}}",
  ]
}

copy("copy_gen_kernel_snapshot_nnbd") {
  deps = [
    "../utils/gen_kernel",
  ]
  sources = [
    # TODO(rnystrom): This probably needs to be forked for NNBD.
    "$root_gen_dir/gen_kernel.dart.snapshot",
  ]
  outputs = [
    "$root_out_dir/dart-sdk-nnbd/bin/snapshots/{{source_file_part}}",
  ]
}

# A template for copying the things in _platform_sdk_scripts and
# _full_sdk_scripts into bin/
template("copy_sdk_script_nnbd") {
  assert(defined(invoker.name), "copy_sdk_script_nnbd must define 'name'")
  name = invoker.name
  ext = ""
  if (is_win) {
    ext = ".bat"
  }
  copy(target_name) {
    visibility = [
      ":copy_platform_sdk_scripts_nnbd",
      ":copy_full_sdk_scripts_nnbd",
    ]
    sources = [
      "bin/${name}_sdk$ext",
    ]
    outputs = [
      "$root_out_dir/dart-sdk-nnbd/bin/$name$ext",
    ]
  }
}

foreach(sdk_script, _full_sdk_scripts) {
  copy_sdk_script_nnbd("copy_${sdk_script}_script_nnbd") {
    name = sdk_script
  }
}

foreach(script, _scripts) {
  copy("copy_${script}_script_nnbd") {
    visibility = [
      ":copy_platform_sdk_scripts_nnbd",
      ":copy_full_sdk_scripts_nnbd",
    ]
    ext = ""
    if (is_win) {
      ext = ".bat"
    }
    sources = [
      "bin/$script$ext",
    ]
    outputs = [
      "$root_out_dir/dart-sdk-nnbd/bin/{{source_file_part}}",
    ]
  }
}

# This is the main target for copying scripts in _platform_sdk_scripts to bin/
group("copy_platform_sdk_scripts_nnbd") {
  visibility = [ ":create_platform_sdk_nnbd" ]
  public_deps = []
  foreach(sdk_script, _platform_sdk_scripts) {
    public_deps += [ ":copy_${sdk_script}_script_nnbd" ]
  }
  foreach(script, _scripts) {
    public_deps += [ ":copy_${script}_script_nnbd" ]
  }
}

# This is the main target for copying scripts in _full_sdk_scripts to bin/
group("copy_full_sdk_scripts_nnbd") {
  visibility = [ ":create_full_sdk_nnbd" ]
  public_deps = []
  foreach(sdk_script, _full_sdk_scripts) {
    public_deps += [ ":copy_${sdk_script}_script_nnbd" ]
  }
  foreach(script, _scripts) {
    public_deps += [ ":copy_${script}_script_nnbd" ]
  }
}

# This loop generates "copy" targets that put snapshots into bin/snapshots
foreach(snapshot, _full_sdk_snapshots) {
  copy("copy_${snapshot[0]}_snapshot_nnbd") {
    visibility = [
      ":copy_platform_sdk_snapshots_nnbd",
      ":copy_full_sdk_snapshots_nnbd",
    ]
    deps = [
      snapshot[1],
    ]
    sources = [
      # TODO(rnystrom): This probably needs to be forked for NNBD.
      "$root_gen_dir/${snapshot[0]}.dart.snapshot",
    ]
    outputs = [
      "$root_out_dir/dart-sdk-nnbd/bin/snapshots/{{source_file_part}}",
    ]
  }
}

# This is the main rule for copying snapshots from _platform_sdk_snapshots to
# bin/snapshots
group("copy_platform_sdk_snapshots_nnbd") {
  visibility = [ ":create_platform_sdk_nnbd" ]
  public_deps = []
  foreach(snapshot, _platform_sdk_snapshots) {
    public_deps += [ ":copy_${snapshot[0]}_snapshot_nnbd" ]
  }
}

# This is the main rule for copying snapshots from _full_sdk_snapshots to
# bin/snapshots
group("copy_full_sdk_snapshots_nnbd") {
  visibility = [ ":create_full_sdk_nnbd" ]
  public_deps = []
  foreach(snapshot, _full_sdk_snapshots) {
    public_deps += [ ":copy_${snapshot[0]}_snapshot_nnbd" ]
  }
}

# This rule writes the .packages file for dartdoc resources.
write_file("$root_out_dir/dart-sdk-nnbd/bin/resources/dartdoc/.packages",
           "dartdoc:.")

# This is the main rule for copying the files that dartdoc needs.
group("copy_dartdoc_files_nnbd") {
  visibility = [ ":create_common_sdk_nnbd" ]
  public_deps = [
    ":copy_dartdoc_resources_nnbd",
    ":copy_dartdoc_templates_nnbd",
  ]
}

# This rule copies analyzer summaries to lib/_internal
copy("copy_analysis_summaries_nnbd") {
  visibility = [ ":create_common_sdk_nnbd" ]
  deps = [
    ":copy_libraries_nnbd",
    "../utils/dartanalyzer:generate_summary_strong",
  ]
  sources = [
    "$root_gen_dir/strong.sum",
  ]
  outputs = [
    "$root_out_dir/dart-sdk-nnbd/lib/_internal/{{source_file_part}}",
  ]
}

# This rule copies dill files to lib/_internal.
copy("copy_vm_dill_files_nnbd") {
  visibility = [ ":create_common_sdk_nnbd" ]
  deps = [
    ":copy_libraries_nnbd",
    "../runtime/vm:kernel_platform_files",
  ]
  sources = [
    # TODO(rnystrom): This probably needs to be forked for NNBD.
    "$root_out_dir/vm_platform_strong.dill",
  ]
  outputs = [
    "$root_out_dir/dart-sdk-nnbd/lib/_internal/{{source_file_part}}",
  ]
}

copy("copy_abi_dill_files_nnbd") {
  visibility = [ ":create_sdk_with_abi_versions_nnbd" ]
  sources = [
    # TODO(rnystrom): This probably needs to be forked for NNBD.
    "../tools/abiversions",
  ]
  outputs = [
    "$root_out_dir/dart-sdk-nnbd/lib/_internal/abiversions",
  ]
}

copy("copy_dart2js_dill_files_nnbd") {
  visibility = [ ":create_full_sdk_nnbd" ]
  deps = [
    ":copy_libraries_nnbd",
    "../utils/compiler:compile_dart2js_platform",
    "../utils/compiler:compile_dart2js_server_platform",
  ]
  sources = [
    # TODO(rnystrom): This probably needs to be forked for NNBD.
    "$root_out_dir/dart2js_platform.dill",
    "$root_out_dir/dart2js_server_platform.dill",
  ]
  outputs = [
    "$root_out_dir/dart-sdk-nnbd/lib/_internal/{{source_file_part}}",
  ]
}

# This rule copies ddc summaries to lib/_internal
copy("copy_dev_compiler_summary_nnbd") {
  visibility = [ ":copy_dev_compiler_sdk_nnbd" ]
  deps = [
    ":copy_libraries_nnbd",
    "../utils/dartdevc:dartdevc_kernel_sdk_outline",
    "../utils/dartdevc:dartdevc_sdk",
  ]
  gen_dir = get_label_info("../utils/dartdevc:dartdevc_sdk", "target_gen_dir")
  sources = [
    # TODO(rnystrom): This probably needs to be forked for NNBD.
    # TODO(vsm): Remove post CFE.
    "$gen_dir/ddc_sdk.sum",
    "$gen_dir/kernel/ddc_sdk.dill",
  ]
  outputs = [
    "$root_out_dir/dart-sdk-nnbd/lib/_internal/{{source_file_part}}",
  ]
}

# TODO(vsm): Remove the old non-CFE versions of the SDK once we've completed
# DDC to Kernel (DDK) migration.

# This rule copies DDC's JS SDK and require.js to lib/dev_compiler/amd.
copy("copy_dev_compiler_js_amd_nnbd") {
  visibility = [ ":copy_dev_compiler_js_nnbd" ]
  deps = [
    "../utils/dartdevc:dartdevc_sdk",
  ]
  gen_dir = get_label_info("../utils/dartdevc:dartdevc_sdk", "target_gen_dir")
  sources = [
    # TODO(rnystrom): This probably needs to be forked for NNBD.
    "$gen_dir/js/amd/dart_sdk.js",
    "$gen_dir/js/amd/dart_sdk.js.map",
    "../third_party/requirejs/require.js",
  ]
  outputs = [
    "$root_out_dir/dart-sdk-nnbd/lib/dev_compiler/amd/{{source_file_part}}",
  ]
}

# This rule copies DDC's JS SDK and run.js to lib/dev_compiler/common.
copy("copy_dev_compiler_js_common_nnbd") {
  visibility = [ ":copy_dev_compiler_js_nnbd" ]
  deps = [
    "../utils/dartdevc:dartdevc_sdk",
  ]
  gen_dir = get_label_info("../utils/dartdevc:dartdevc_sdk", "target_gen_dir")
  sources = [
    # TODO(rnystrom): This probably needs to be forked for NNBD.
    "$gen_dir/js/common/dart_sdk.js",
    "$gen_dir/js/common/dart_sdk.js.map",
    "../pkg/dev_compiler/lib/js/common/run.js",
  ]
  outputs = [
    "$root_out_dir/dart-sdk-nnbd/lib/dev_compiler/common/{{source_file_part}}",
  ]
}

# This rule copies DDC's JS SDK to lib/dev_compiler/es6.
copy("copy_dev_compiler_js_es6_nnbd") {
  visibility = [ ":copy_dev_compiler_js_nnbd" ]
  deps = [
    "../utils/dartdevc:dartdevc_sdk",
  ]
  gen_dir = get_label_info("../utils/dartdevc:dartdevc_sdk", "target_gen_dir")
  sources = [
    # TODO(rnystrom): This probably needs to be forked for NNBD.
    "$gen_dir/js/es6/dart_sdk.js",
    "$gen_dir/js/es6/dart_sdk.js.map",
  ]
  outputs = [
    "$root_out_dir/dart-sdk-nnbd/lib/dev_compiler/es6/{{source_file_part}}",
  ]
}

# This rule copies DDK's JS SDK and require.js to lib/dev_compiler/kernel/amd.
copy("copy_dev_compiler_js_amd_kernel_nnbd") {
  visibility = [ ":copy_dev_compiler_js_nnbd" ]
  deps = [
    "../utils/dartdevc:dartdevc_kernel_sdk",
  ]
  gen_dir =
      get_label_info("../utils/dartdevc:dartdevc_kernel_sdk", "target_gen_dir")
  sources = [
    # TODO(rnystrom): This probably needs to be forked for NNBD.
    "$gen_dir/kernel/amd/dart_sdk.js",
    "$gen_dir/kernel/amd/dart_sdk.js.map",
    "../third_party/requirejs/require.js",
  ]
  outputs = [
    "$root_out_dir/dart-sdk-nnbd/lib/dev_compiler/kernel/amd/{{source_file_part}}",
  ]
}

# This rule copies DDK's JS SDK to lib/dev_compiler/kernel/common.
copy("copy_dev_compiler_js_common_kernel_nnbd") {
  visibility = [ ":copy_dev_compiler_js_nnbd" ]
  deps = [
    "../utils/dartdevc:dartdevc_kernel_sdk",
  ]
  gen_dir =
      get_label_info("../utils/dartdevc:dartdevc_kernel_sdk", "target_gen_dir")
  sources = [
    # TODO(rnystrom): This probably needs to be forked for NNBD.
    "$gen_dir/kernel/common/dart_sdk.js",
    "$gen_dir/kernel/common/dart_sdk.js.map",
    "../pkg/dev_compiler/lib/js/common/run.js",
  ]
  outputs = [
    "$root_out_dir/dart-sdk-nnbd/lib/dev_compiler/kernel/common/{{source_file_part}}",
  ]
}

# This rule copies DDK's JS SDK to lib/dev_compiler/kernel/es6.
copy("copy_dev_compiler_js_es6_kernel_nnbd") {
  visibility = [ ":copy_dev_compiler_js_nnbd" ]
  deps = [
    "../utils/dartdevc:dartdevc_kernel_sdk",
  ]
  gen_dir =
      get_label_info("../utils/dartdevc:dartdevc_kernel_sdk", "target_gen_dir")
  sources = [
    # TODO(rnystrom): This probably needs to be forked for NNBD.
    "$gen_dir/kernel/es6/dart_sdk.js",
    "$gen_dir/kernel/es6/dart_sdk.js.map",
  ]
  outputs = [
    "$root_out_dir/dart-sdk-nnbd/lib/dev_compiler/kernel/es6/{{source_file_part}}",
  ]
}

# Copies all of the JS artifacts needed by DDC.
group("copy_dev_compiler_js_nnbd") {
  visibility = [
    ":copy_dev_compiler_sdk_nnbd",
    ":copy_dev_compiler_tools_nnbd",
  ]
  public_deps = [
    ":copy_dev_compiler_js_amd_nnbd",
    ":copy_dev_compiler_js_amd_kernel_nnbd",
    ":copy_dev_compiler_js_common_nnbd",
    ":copy_dev_compiler_js_common_kernel_nnbd",
    ":copy_dev_compiler_js_es6_nnbd",
    ":copy_dev_compiler_js_es6_kernel_nnbd",
  ]
}

# This rule copies tools to go along with ddc.
copy("copy_dev_compiler_tools_nnbd") {
  visibility = [ ":copy_dev_compiler_sdk_nnbd" ]
  deps = [
    ":copy_dev_compiler_js_nnbd",
    "../utils/dartdevc:dartdevc_web",
    "../utils/dartdevc:stack_trace_mapper",
  ]
  dart_out = get_label_info("../utils/dartdevc:dartdevc_web", "root_out_dir")
  sources = [
    "$dart_out/dev_compiler/build/web/dart_stack_trace_mapper.js",
    "$dart_out/dev_compiler/build/web/ddc_web_compiler.js",
  ]
  outputs = [
    "$root_out_dir/dart-sdk-nnbd/lib/dev_compiler/web/{{source_file_part}}",
  ]
}

# This is the main rule for copying ddc's dependencies to lib/
group("copy_dev_compiler_sdk_nnbd") {
  visibility = [ ":create_full_sdk_nnbd" ]
  public_deps = [
    ":copy_dev_compiler_js_nnbd",
    ":copy_dev_compiler_summary_nnbd",
    ":copy_dev_compiler_tools_nnbd",
  ]
}

# This rule copies header files to include/
copy("copy_headers_nnbd") {
  visibility = [ ":create_common_sdk_nnbd" ]
  sources = [
    "../runtime/include/dart_api.h",
    "../runtime/include/dart_native_api.h",
    "../runtime/include/dart_tools_api.h",
  ]
  outputs = [
    "$root_out_dir/dart-sdk-nnbd/include/{{source_file_part}}",
  ]
}

# This rule copies libraries.json files to lib/
copy("copy_libraries_specification_nnbd") {
  visibility = [ ":create_common_sdk_nnbd" ]
  sources = [
    "lib/libraries.json",
  ]
  deps = [
    ":copy_libraries_nnbd",
  ]
  outputs = [
    "$root_out_dir/dart-sdk-nnbd/lib/{{source_file_part}}",
  ]
}

# This is the main rule to copy libraries in _platform_sdk_libraries to lib/
group("copy_platform_sdk_libraries_nnbd") {
  visibility = [
    ":create_platform_sdk_nnbd",
    ":copy_libraries_nnbd",
  ]
  public_deps = []
  foreach(library, _platform_sdk_libraries) {
    public_deps += [ ":copy_${library}_library_nnbd" ]
  }
}

# This is the main rule to copy libraries in _full_sdk_libraries to lib/
group("copy_full_sdk_libraries_nnbd") {
  visibility = [
    ":create_full_sdk_nnbd",
    ":copy_libraries_nnbd",
  ]
  public_deps = []
  foreach(library, _full_sdk_libraries) {
    public_deps += [ ":copy_${library}_library_nnbd" ]
  }
}

group("copy_libraries_nnbd") {
  if (dart_platform_sdk_nnbd) {
    public_deps = [
      ":copy_platform_sdk_libraries_nnbd",
    ]
  } else {
    public_deps = [
      ":copy_full_sdk_libraries_nnbd",
    ]
  }
}

# This rule writes the version file.
action("write_version_file_nnbd") {
  visibility = [ ":create_common_sdk_nnbd" ]
  inputs = [
    "../tools/VERSION",
    "../.git/logs/HEAD",
  ]
  output = "$root_out_dir/dart-sdk-nnbd/version"
  outputs = [
    output,
  ]
  script = "../tools/write_version_file.py"
  args = [
    "--output",
    rebase_path(output),
  ]
}

# This rule writes the revision file.
action("write_revision_file_nnbd") {
  visibility = [ ":create_common_sdk_nnbd" ]
  inputs = [
    "../.git/logs/HEAD",
  ]
  output = "$root_out_dir/dart-sdk-nnbd/revision"
  outputs = [
    output,
  ]
  script = "../tools/write_revision_file.py"
  args = [
    "--output",
    rebase_path(output),
  ]
}

# Copy libraries.dart to lib/_internal/libraries.dart for backwards
# compatibility.
#
# TODO(sigmund): stop copying libraries.dart. Old versions (<=0.25.1-alpha.4)
# of the analyzer package do not support the new location of this file. We
# should be able to remove the old file once we release a newer version of
# analyzer and popular frameworks have migrated to use it.
copy("copy_libraries_dart_nnbd") {
  visibility = [ ":create_common_sdk_nnbd" ]
  deps = [
    ":copy_libraries_nnbd",
  ]
  sources = [
    "lib/_internal/sdk_library_metadata/lib/libraries.dart",
  ]
  outputs = [
    "$root_out_dir/dart-sdk-nnbd/lib/_internal/{{source_file_part}}",
  ]
}

# This rule copies the README file.
copy("copy_readme_nnbd") {
  visibility = [ ":create_common_sdk_nnbd" ]
  sources = [
    "../README.dart-sdk",
  ]
  outputs = [
    "$root_out_dir/dart-sdk-nnbd/README",
  ]
}

# This rule copies the LICENSE file.
copy("copy_license_nnbd") {
  visibility = [ ":create_common_sdk_nnbd" ]
  sources = [
    "../LICENSE",
  ]
  outputs = [
    "$root_out_dir/dart-sdk-nnbd/LICENSE",
  ]
}

# This rule generates a custom dartdoc_options.yaml file.
action("write_dartdoc_options_nnbd") {
  visibility = [ ":create_common_sdk_nnbd" ]
  inputs = [
    "../.git/logs/HEAD",
  ]
  output = "$root_out_dir/dart-sdk-nnbd/dartdoc_options.yaml"
  outputs = [
    output,
  ]
  script = "../tools/write_dartdoc_options_file.py"
  args = [
    "--output",
    rebase_path(output),
  ]
}

# This rule copies the API readme file to lib/
copy("copy_api_readme_nnbd") {
  visibility = [ ":create_common_sdk_nnbd" ]
  sources = [
    "api_readme.md",
  ]
  outputs = [
    "$root_out_dir/dart-sdk-nnbd/lib/api_readme.md",
  ]
}

# Parts common to both platform and full SDKs.
group("create_common_sdk_nnbd") {
  visibility = [ ":create_sdk_nnbd" ]
  public_deps = [
    ":copy_analysis_summaries_nnbd",
    ":copy_api_readme_nnbd",
    ":copy_dart_nnbd",
    ":copy_dart2native_nnbd",
    ":copy_dartdoc_files_nnbd",
    ":copy_headers_nnbd",
    ":copy_libraries_dart_nnbd",
    ":copy_libraries_specification_nnbd",
    ":copy_license_nnbd",
    ":copy_readme_nnbd",
    ":copy_vm_dill_files_nnbd",
    ":write_dartdoc_options_nnbd",
    ":write_revision_file_nnbd",
    ":write_version_file_nnbd",
  ]
  if (is_win) {
    public_deps += [ ":copy_7zip_nnbd" ]
  }
  if (target_cpu == "x64") {
    public_deps += [
      ":copy_language_model_nnbd",
      ":copy_libtensorflowlite_c_nnbd",
    ]
  }
}

# Parts specific to the platform SDK.
group("create_platform_sdk_nnbd") {
  visibility = [ ":create_sdk_nnbd" ]
  public_deps = [
    ":copy_platform_sdk_libraries_nnbd",
    ":copy_platform_sdk_scripts_nnbd",
    ":copy_platform_sdk_snapshots_nnbd",
  ]
}

# Parts specific to the full SDK.
group("create_full_sdk_nnbd") {
  visibility = [ ":create_sdk_nnbd" ]

  public_deps = [
    ":copy_dart2js_dill_files_nnbd",
    ":copy_dev_compiler_sdk_nnbd",
    ":copy_full_sdk_libraries_nnbd",
    ":copy_full_sdk_scripts_nnbd",
    ":copy_full_sdk_snapshots_nnbd",
  ]
}

# The main target to depend on from ../BUILD.gn
group("create_sdk_nnbd") {
  public_deps = [
    ":create_common_sdk_nnbd",
  ]
  if (dart_platform_sdk_nnbd) {
    public_deps += [ ":create_platform_sdk_nnbd" ]
  } else {
    public_deps += [ ":create_full_sdk_nnbd" ]
  }
}

# Same as create_sdk, but with abi version files.
group("create_sdk_with_abi_versions_nnbd") {
  public_deps = [
    ":copy_abi_dill_files_nnbd",
    ":create_sdk_nnbd",
  ]
}