# 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.intl",
        "$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.intl",
        "$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 = [
        "//sdk/fidl/fuchsia.intl",
        "//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",
      "--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 = [ ".." ]
}
