# 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.


declare_args() {
  dart_io_support = false
}


template("gen_library_src_path") {
  assert(defined(invoker.sources), "Need sources in $target_name")
  assert(defined(invoker.output), "Need output in $target_name")
  action(target_name) {
    visibility = [ ":*" ]  # Only targets in this file can see this.
    script = "../tools/gen_library_src_paths.py"
    inputs = [
      "../tools/gen_library_src_paths.py",
      "builtin_in.cc",
    ]
    outputs = [ invoker.output, ]
    name = invoker.name
    kind = invoker.kind
    args = [
      "--output", rebase_path(invoker.output, root_build_dir),
      "--input_cc", rebase_path("builtin_in.cc", root_build_dir),
      "--include", "bin/builtin.h",
      "--var_name", "dart::bin::Builtin::${name}_${kind}_paths_",
      "--library_name", "dart:${name}",] +
      rebase_path(invoker.sources, root_build_dir)
  }
}


builtin_sources_gypi =
    exec_script("../../tools/gypi_to_gn.py",
                [rebase_path("builtin_sources.gypi")],
                "scope",
                ["builtin_sources.gypi"])

gen_library_src_path("generate_builtin_cc_file") {
  name = "_builtin"
  kind = "source"
  sources = builtin_sources_gypi.sources
  output = "$target_gen_dir/builtin_gen.cc"
}


iolib_sources_gypi =
    exec_script("../../tools/gypi_to_gn.py",
                [rebase_path("../../sdk/lib/io/iolib_sources.gypi")],
                "scope",
                ["../../sdk/lib/io/iolib_sources.gypi"])
iolib_sources = rebase_path(iolib_sources_gypi.sources, ".", "../../sdk/lib/io")

gen_library_src_path("generate_io_cc_file") {
  name = "io"
  kind = "source"
  sources = ["../../sdk/lib/io/io.dart"] + iolib_sources
  output = "$target_gen_dir/io_gen.cc"
}

io_sources_gypi =
    exec_script("../../tools/gypi_to_gn.py",
                [rebase_path("io_sources.gypi")],
                "scope",
                ["io_sources.gypi"])

gen_library_src_path("generate_io_patch_cc_file") {
  name = "io"
  kind = "patch"
  sources = io_sources_gypi.sources
  output = "$target_gen_dir/io_patch_gen.cc"
}


config("libdart_builtin_config") {
  libs = [
    "dl",
  ]
}


builtin_impl_sources_gypi =
    exec_script("../../tools/gypi_to_gn.py",
                [rebase_path("builtin_impl_sources.gypi")],
                "scope",
                ["builtin_impl_sources.gypi"])

static_library("libdart_builtin") {
  configs += ["..:dart_config"]
  public_configs = [":libdart_builtin_config"]
  deps = [
    ":generate_builtin_cc_file",
    ":generate_io_cc_file",
    ":generate_io_patch_cc_file",
  ]
  include_dirs = [
    "..",
  ]
  set_sources_assignment_filter(["*_test.cc", "*_test.h"])
  sources = [
    "log_android.cc",
    "log_linux.cc",
    "log_macos.cc",
    "log_win.cc",
  ] + builtin_impl_sources_gypi.sources
}


static_library("libdart_withcore") {
  configs += ["..:dart_config"]
  deps = [
    "../vm:libdart_lib_withcore",
    "../vm:libdart_vm",
    "../vm:libdart_platform",
    "../third_party/jscre:libjscre",
    "../third_party/double-conversion/src:libdouble_conversion",
    "..:generate_version_cc_file",
  ]

  sources = [
    "../include/dart_api.h",
    "../include/dart_debugger_api.h",
    "../include/dart_mirrors_api.h",
    "../include/dart_native_api.h",
    "../vm/dart_api_impl.cc",
    "../vm/debugger_api_impl.cc",
    "../vm/mirrors_api_impl.cc",
    "../vm/native_api_impl.cc",
    "$target_gen_dir/../version.cc",
  ]

  include_dirs = [
    "..",
  ]

  defines = [
    "DART_SHARED_LIB",
  ]
}


executable("gen_snapshot") {
  configs += ["..:dart_config"]
  deps = [
    ":libdart_withcore",
    ":libdart_builtin",
  ]

  sources = [
    "gen_snapshot.cc",
    # Very limited native resolver provided.
    "builtin_gen_snapshot.cc",
    "builtin.cc",
    "builtin.h",
    # Include generated source files.
    "$target_gen_dir/builtin_gen.cc",
    "$target_gen_dir/io_gen.cc",
    "$target_gen_dir/io_patch_gen.cc",
  ]

  include_dirs = [
    "..",
  ]
}


static_library("libdart_embedder_noio") {
  configs += ["..:dart_config",]
  deps = [
    "..:libdart",
    "../vm:libdart_platform",
  ]
}
