# 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("regexp/regexp_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/") +
            rebase_path(regexp_sources, ".", "./regexp/")
  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" ]
  }
  if (!is_win) {
    sources += [ "simulator_arm64_trampolines.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",
    ]
    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_aotruntime") {
  # 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_aotruntime_config",
    "..:dart_maybe_product_config",
    ":libdart_vm_config",
  ]
  sources = [ "compiler/offsets_extractor.cc" ]
  include_dirs = [ ".." ]
}
