# 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_overrides/build.gni")
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/concurrent/concurrent_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/concurrent_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")

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) {
    if (!defined(perfetto_root_path)) {
      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") {
  if (!defined(perfetto_root_path)) {
    perfetto_root_path = "//third_party/perfetto/"
  }

  include_dirs = [
    "$perfetto_root_path/include",
    "$root_gen_dir/$perfetto_root_path/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") {
  if (!defined(perfetto_root_path)) {
    perfetto_root_path = "//third_party/perfetto/"
  }

  public_configs = [ ":libprotozero_config" ]
  deps = [ "$perfetto_root_path/src/protozero:protozero" ]
}

library_for_all_configs("libdart_vm") {
  target_type = "source_set"
  extra_product_deps = []
  extra_nonproduct_deps = [ ":libprotozero" ]
  extra_deps = [
    "//third_party/icu:icui18n",
    "//third_party/icu:icuuc",
  ]
  if (is_fuchsia) {
    extra_deps += [
      "$fuchsia_sdk/fidl/fuchsia.intl",
      "$fuchsia_sdk/pkg/async",
      "$fuchsia_sdk/pkg/async-default",
      "$fuchsia_sdk/pkg/async-loop",
      "$fuchsia_sdk/pkg/async-loop-default",
      "$fuchsia_sdk/pkg/inspect",
      "$fuchsia_sdk/pkg/inspect_component_cpp",
      "$fuchsia_sdk/pkg/sys_cpp",
      "$fuchsia_sdk/pkg/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) {
    extra_deps += [ "$fuchsia_sdk/pkg/trace-engine" ]
  }
}

library_for_all_configs("libdart_lib") {
  target_type = "source_set"
  extra_nonproduct_deps = [ ":libprotozero" ]
  extra_deps = []
  if (is_fuchsia) {
    extra_deps += [ "$fuchsia_sdk/pkg/trace-engine" ]
  }
  include_dirs = [ ".." ]
  allsources = async_runtime_cc_files + concurrent_runtime_cc_files +
               core_runtime_cc_files + developer_runtime_cc_files +
               ffi_runtime_cc_files + isolate_runtime_cc_files +
               math_runtime_cc_files + mirrors_runtime_cc_files +
               typed_data_runtime_cc_files + vmservice_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-strong",
    ]
    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 = [ ".." ]
}
