# 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("//third_party/protobuf/proto_library.gni")
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("ffi/ffi_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",
      "ntdll.lib",
    ]
    if (target_os != "winuwp") {
      libs += [ "dbghelp.lib" ]
    }
  } else {
    libs = [ "dl" ]
    if (!is_android) {
      libs += [ "pthread" ]
    }

    # Clang with libc++ does not require an explicit atomic library reference.
    # (similar to https://github.com/flutter/buildroot/blob/master/build/config/compiler/BUILD.gn#L562)
    if (!is_clang) {
      libs += [ "atomic" ]
    }
  }
}

# This is a modified copy of Perfetto's template of the same name defined in
# //third_party/perfetto/gn/proto_library.gni.
# This is equivalent to the proto_library template (generation of .h/.cc from
# .proto files) but enables generation using the protozero plugin.
# The generated files will have the .pbzero.{cc,h} suffix, as opposed to the
# .pb.{cc,h} of the official proto library.
template("protozero_library") {
  proto_library(target_name) {
    perfetto_root_path = "//third_party/perfetto/"

    generate_cc = false
    generate_python = false
    generator_plugin_label =
        perfetto_root_path + "src/protozero/protoc_plugin:protozero_plugin"
    generator_plugin_suffix = ".pbzero"

    if (defined(invoker.deps)) {
      deps = invoker.deps
    } else {
      deps = []
    }

    forward_variables_from(invoker,
                           [
                             "defines",
                             "generator_plugin_options",
                             "include_dirs",
                             "proto_in_dir",
                             "proto_out_dir",
                             "sources",
                             "testonly",
                             "visibility",
                             "generate_descriptor",
                             "propagate_imports_configs",
                             "import_dirs",
                           ])
  }
}

_perfetto_proto_definition_sources = [
  "protos/perfetto/common/builtin_clock.proto",
  "protos/perfetto/trace/clock_snapshot.proto",
  "protos/perfetto/trace/interned_data/interned_data.proto",
  "protos/perfetto/trace/profiling/profile_common.proto",
  "protos/perfetto/trace/profiling/profile_packet.proto",
  "protos/perfetto/trace/trace.proto",
  "protos/perfetto/trace/trace_packet.proto",
  "protos/perfetto/trace/track_event/debug_annotation.proto",
  "protos/perfetto/trace/track_event/process_descriptor.proto",
  "protos/perfetto/trace/track_event/thread_descriptor.proto",
  "protos/perfetto/trace/track_event/track_descriptor.proto",
  "protos/perfetto/trace/track_event/track_event.proto",
]

# This target is not a dependency of any other GN target. It is required to make
# ./protos/tools/compile_perfetto_protos.dart work though.
protozero_library("perfetto_protos_protozero") {
  proto_in_dir = "."
  proto_out_dir = "//runtime/vm"
  generator_plugin_options = "wrapper_namespace=pbzero"
  sources = _perfetto_proto_definition_sources
}

proto_library("perfetto_protos_dart") {
  generate_cc = false
  generate_python = false
  generator_plugin_script = "protos/tools/protoc_gen_dart_wrapper"
  generator_plugin_suffixes = [ ".pb.dart" ]

  proto_in_dir = "."
  proto_out_dir = "//pkg/vm_service_protos/lib/src"

  sources = _perfetto_proto_definition_sources
}

# This config needs to be propagated to all targets that depend on
# ":libprotozero".
config("libprotozero_config") {
  include_dirs = [
    "//third_party/perfetto/include",
    "$root_gen_dir/third_party/perfetto/build_config",
  ]
}

# This target includes Perfetto's protozero target, which we need to serialize
# proto messages. This target also propagates ":libprotozero_config".
source_set("libprotozero") {
  public_configs = [ ":libprotozero_config" ]
  deps = [ "//third_party/perfetto/src/protozero:protozero" ]
}

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 = [
    ":libprotozero",
    "//third_party/icu:icui18n",
    "//third_party/icu:icuuc",
  ]
  extra_deps = []
  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(ffi_sources, ".", "./ffi/") +
            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 = [ ".." ]
  extra_nonproduct_deps = [ ":libprotozero" ]
  extra_deps = []
  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"
  extra_nonproduct_deps = [ ":libprotozero" ]
  extra_deps = []
  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") {
  # The timeline cannot be accessed from the generated executable, so we define
  # DART_DISABLE_TIMELINE to strip out the timeline source code. The precise
  # reason why we do this is to avoid missing header errors, as the Perfetto
  # proto headers are not built as a dependency of this target, but are
  # transitively included in this target when DART_DISABLE_TIMELINE is not
  # defined.
  defines = [ "DART_DISABLE_TIMELINE" ]
  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") {
  # The timeline cannot be accessed from the generated executable, so we define
  # DART_DISABLE_TIMELINE to strip out the timeline source code. The precise
  # reason why we do this is to avoid missing header errors, as the Perfetto
  # proto headers are not built as a dependency of this target, but are
  # transitively included in this target when DART_DISABLE_TIMELINE is not
  # defined.
  defines = [ "DART_DISABLE_TIMELINE" ]
  configs += [
    "..:dart_arch_config",
    "..:dart_config",
    "..:dart_precompiled_runtime_config",
    "..:dart_maybe_product_config",
    ":libdart_vm_config",
  ]
  sources = [ "compiler/offsets_extractor.cc" ]
  include_dirs = [ ".." ]
}
