# Copyright (c) 2014, 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.

import("../../build/executable_suffix.gni")
import("../../sdk/lib/async/async_sources.gni")
import("../../sdk/lib/collection/collection_sources.gni")
import("../../sdk/lib/convert/convert_sources.gni")
import("../../sdk/lib/core/core_sources.gni")
import("../../sdk/lib/developer/developer_sources.gni")
import("../../sdk/lib/ffi/ffi_sources.gni")
import("../../sdk/lib/internal/internal_sources.gni")
import("../../sdk/lib/isolate/isolate_sources.gni")
import("../../sdk/lib/math/math_sources.gni")
import("../../sdk/lib/mirrors/mirrors_sources.gni")
import("../../sdk/lib/typed_data/typed_data_sources.gni")
import("../../sdk/lib/vmservice/vmservice_sources.gni")
import("../../sdk_args.gni")
import("../../utils/compile_platform.gni")
import("../bin/cli_sources.gni")
import("../bin/io_sources.gni")
import("../configs.gni")
import("../lib/async_sources.gni")
import("../lib/collection_sources.gni")
import("../lib/convert_sources.gni")
import("../lib/core_sources.gni")
import("../lib/developer_sources.gni")
import("../lib/ffi_sources.gni")
import("../lib/internal_sources.gni")
import("../lib/isolate_sources.gni")
import("../lib/math_sources.gni")
import("../lib/mirrors_sources.gni")
import("../lib/profiler_sources.gni")
import("../lib/typed_data_sources.gni")
import("../lib/vmservice_sources.gni")
import("../runtime_args.gni")
import("compiler/compiler_sources.gni")
import("heap/heap_sources.gni")
import("vm_sources.gni")

if (is_fuchsia) {
  import("//build/fuchsia/sdk.gni")
}

config("libdart_vm_config") {
  if (is_fuchsia) {
    libs = [ "zircon" ]
  } else if (is_win) {
    libs = [
      "advapi32.lib",
      "shell32.lib",
    ]
    if (target_os != "winuwp") {
      libs += [ "dbghelp.lib" ]
    }
  } else {
    libs = [ "dl" ]
    if (!is_android) {
      libs += [ "pthread" ]
    }
  }
}

library_for_all_configs("libdart_vm") {
  target_type = "source_set"
  extra_product_deps = [
    "//third_party/icu:icui18n_hidden_visibility",
    "//third_party/icu:icuuc_hidden_visibility",
  ]
  extra_nonproduct_deps = [
    "//third_party/icu:icui18n",
    "//third_party/icu:icuuc",
  ]
  if (is_fuchsia) {
    if (using_fuchsia_gn_sdk) {
      extra_deps = [
        "$fuchsia_sdk_root/fidl/fuchsia.deprecatedtimezone",
        "$fuchsia_sdk_root/pkg/async",
        "$fuchsia_sdk_root/pkg/async-default",
        "$fuchsia_sdk_root/pkg/async-loop",
        "$fuchsia_sdk_root/pkg/async-loop-default",
        "$fuchsia_sdk_root/pkg/inspect",
        "$fuchsia_sdk_root/pkg/inspect_service_cpp",
        "$fuchsia_sdk_root/pkg/sys_cpp",
        "$fuchsia_sdk_root/pkg/sys_inspect_cpp",
        "$fuchsia_sdk_root/pkg/trace-engine",
      ]
    } else if (using_fuchsia_sdk) {
      extra_deps = [
        "$fuchsia_sdk_root/fidl:fuchsia.deprecatedtimezone",
        "$fuchsia_sdk_root/pkg:async-loop",
        "$fuchsia_sdk_root/pkg:async-loop-default",
        "$fuchsia_sdk_root/pkg:inspect",
        "$fuchsia_sdk_root/pkg:inspect_service_cpp",
        "$fuchsia_sdk_root/pkg:sys_cpp",
        "$fuchsia_sdk_root/pkg:sys_inspect_cpp",
        "$fuchsia_sdk_root/pkg:trace-engine",
      ]
    } else {
      extra_deps = [
        # TODO(US-399): Remove time_service specific code when it is no longer
        # necessary.
        "//sdk/fidl/fuchsia.deprecatedtimezone",
        "//sdk/lib/sys/cpp",
        "//sdk/lib/sys/inspect/cpp",
        "//zircon/public/lib/fbl",
        "//zircon/system/ulib/trace-engine",
      ]
    }
  }
  public_configs = [ ":libdart_vm_config" ]
  sources = vm_sources + rebase_path(compiler_api_sources, ".", "./compiler/") +
            rebase_path(disassembler_sources, ".", "./compiler/") +
            rebase_path(heap_sources, ".", "./heap/")
  include_dirs = [ ".." ]
}

library_for_all_configs_with_compiler("libdart_compiler") {
  target_type = "source_set"
  public_configs = [ ":libdart_vm_config" ]
  sources = rebase_path(compiler_sources, ".", "./compiler/")
  include_dirs = [ ".." ]
  if (is_fuchsia) {
    if (using_fuchsia_gn_sdk) {
      extra_deps = [ "$fuchsia_sdk_root/pkg/trace-engine" ]
    } else if (using_fuchsia_sdk) {
      extra_deps = [ "$fuchsia_sdk_root/pkg:trace-engine" ]
    } else {
      extra_deps = [
        "//zircon/public/lib/fbl",
        "//zircon/system/ulib/trace-engine",
      ]
    }
  }
}

library_for_all_configs("libdart_lib") {
  target_type = "source_set"
  if (is_fuchsia) {
    if (using_fuchsia_gn_sdk) {
      extra_deps = [ "$fuchsia_sdk_root/pkg/trace-engine" ]
    } else if (using_fuchsia_sdk) {
      extra_deps = [ "$fuchsia_sdk_root/pkg:trace-engine" ]
    } else {
      extra_deps = [
        "//zircon/public/lib/fbl",
        "//zircon/system/ulib/trace-engine",
      ]
    }
  }
  include_dirs = [ ".." ]
  allsources = async_runtime_cc_files + collection_runtime_cc_files +
               core_runtime_cc_files + developer_runtime_cc_files +
               internal_runtime_cc_files + isolate_runtime_cc_files +
               math_runtime_cc_files + mirrors_runtime_cc_files +
               typed_data_runtime_cc_files + vmservice_runtime_cc_files +
               ffi_runtime_cc_files
  sources = [ "bootstrap.cc" ] + rebase_path(allsources, ".", "../lib")
  snapshot_sources = []
}

template("gen_vm_platform") {
  assert(defined(invoker.output_postfix),
         "Must define output postfix (e.g., '_strong'")
  is_product_flag = dart_runtime_mode == "release"
  if (defined(invoker.product_mode)) {
    is_product_flag = invoker.product_mode
  }
  compile_platform(target_name) {
    output_postfix = invoker.output_postfix
    if (defined(invoker.add_implicit_vm_platform_dependency)) {
      add_implicit_vm_platform_dependency =
          invoker.add_implicit_vm_platform_dependency
    }
    single_root_scheme = "org-dartlang-sdk"
    single_root_base = rebase_path("../../")
    libraries_specification_uri = "org-dartlang-sdk:///sdk/lib/libraries.json"
    outputs = [
      "$root_out_dir/vm_platform" + output_postfix + ".dill",
      "$root_out_dir/vm_outline" + output_postfix + ".dill",
    ]
    args = [ "dart:core" ]
    args += [
      "-Ddart.vm.product=$is_product_flag",
      "-Ddart.isVM=true",
      "--enable-experiment=non-nullable",
      "--nnbd-agnostic",
    ]
    if (defined(invoker.exclude_source) && invoker.exclude_source) {
      args += [ "--exclude-source" ]
    }
    outline = "vm_outline" + output_postfix + ".dill"
  }
}

gen_vm_platform("vm_platform") {
  add_implicit_vm_platform_dependency = false
  exclude_source = false
  output_postfix = "_strong"
}

gen_vm_platform("vm_platform_product") {
  add_implicit_vm_platform_dependency = false
  exclude_source = false
  output_postfix = "_strong_product"

  # In Debug mode we use debug binaries for dart2native.
  # (see also the "dart_product_config" config)
  product_mode = !is_debug
}

gen_vm_platform("vm_platform_stripped") {
  add_implicit_vm_platform_dependency = false
  exclude_source = true
  output_postfix = "_strong_stripped"
}

group("kernel_platform_files") {
  public_deps = [
    ":vm_platform",
    ":vm_platform_stripped",
  ]
}

executable("offsets_extractor") {
  configs += [
    "..:dart_arch_config",
    "..:dart_config",
    "..:dart_maybe_product_config",
    ":libdart_vm_config",
  ]
  sources = [ "compiler/offsets_extractor.cc" ]
  include_dirs = [ ".." ]
}

executable("offsets_extractor_precompiled_runtime") {
  configs += [
    "..:dart_arch_config",
    "..:dart_config",
    "..:dart_precompiled_runtime_config",
    "..:dart_maybe_product_config",
    ":libdart_vm_config",
  ]
  sources = [ "compiler/offsets_extractor.cc" ]
  include_dirs = [ ".." ]
}
