# 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/convert_sources.gni")
import("../lib/core_sources.gni")
import("../lib/developer_sources.gni")
import("../lib/ffi_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/")
  if (is_android) {
    # Android specific workaround for a kernel bug. This source file can't
    # go into vm_sources list because it will break Windows build which
    # uses different assembler syntax.
    sources += [ "thread_interrupter_android_arm.S" ]
  }
  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 + core_runtime_cc_files +
               developer_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 = [ ".." ]
}
