# 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

  # TODO(zra, jamesr): Remove this check once we start building boringssl for
  # the fuchsia port.
  if (!defined(is_fuchsia) || !is_fuchsia) {
    dart_boringssl_path = "../../third_party/boringssl"
  }
}


resources_sources_gypi =
    exec_script("../../tools/gypi_to_gn.py",
                [rebase_path("vmservice/vmservice_sources.gypi")],
                "scope",
                ["vmservice/vmservice_sources.gypi"])

# Generate a resources.cc file for the service isolate without Observatory.
action("gen_resources_cc") {
  visibility = [ ":*" ] # Only targets in this file can see this.
  script = "../tools/create_resources.py"
  inputs = [
    "../tools/create_resources.py",
  ]
  # The path below is hard coded for the Mojo and Flutter trees. When moving
  # the Dart runtime to gn, this path might need to be updated.
  sources = rebase_path(resources_sources_gypi.sources,
                        "",
                        "//dart/runtime/bin/vmservice/")
  outputs = [ "$target_gen_dir/resources_gen.cc" ]
  args = [
    "--output",
    rebase_path("$target_gen_dir/resources_gen.cc", root_build_dir),
    "--outer_namespace", "dart",
    "--inner_namespace", "bin",
    "--table_name", "service_bin",
    "--root_prefix", rebase_path(".", root_build_dir) + "/",
  ] + rebase_path(sources, root_build_dir)
}


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"
}


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

gen_library_src_path("generate_io_cc_file") {
  name = "io"
  kind = "source"
  sources = ["../../sdk/lib/io/io.dart"] + sdk_io_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", "..:dart_product_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_fuchsia.cc",
    "log_linux.cc",
    "log_macos.cc",
    "log_win.cc",
  ] + builtin_impl_sources_gypi.sources
}


static_library("libdart_nosnapshot") {
  configs += ["..:dart_config",
              "..:dart_product_config",
              "..:dart_precompiled_runtime_config"]
  deps = [
    "../vm:libdart_lib_nosnapshot",
    "../vm:libdart_vm_nosnapshot",
    "../vm:libdart_platform",
    "../third_party/double-conversion/src:libdouble_conversion",
    "..:generate_version_cc_file",
  ]

  sources = [
    "../include/dart_api.h",
    "../include/dart_mirrors_api.h",
    "../include/dart_native_api.h",
    "../include/dart_tools_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",
  ]
}


static_library("libdart_nosnapshot_with_precompiler") {
  configs += ["..:dart_config",
              "..:dart_product_config",
              "..:dart_precompiler_config"]
  deps = [
    "../vm:libdart_lib_nosnapshot_with_precompiler",
    "../vm:libdart_vm_nosnapshot_with_precompiler",
    "../vm:libdart_platform",
    "../third_party/double-conversion/src:libdouble_conversion",
    "..:generate_version_cc_file",
  ]

  sources = [
    "../include/dart_api.h",
    "../include/dart_mirrors_api.h",
    "../include/dart_native_api.h",
    "../include/dart_tools_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",
  ]
}

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

if (!defined(is_fuchsia) || (current_toolchain == host_toolchain)) {

executable("gen_snapshot") {
  configs += ["..:dart_config",
              "..:dart_product_config",
              "..:dart_precompiler_config"]
  deps = [
    ":gen_resources_cc",
    ":gen_snapshot_dart_io",
    ":generate_builtin_cc_file",
    ":generate_io_cc_file",
    ":generate_io_patch_cc_file",
    ":libdart_builtin",
    ":libdart_nosnapshot_with_precompiler",
  ]

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

  include_dirs = [
    "..",
  ]
}

# A source set for the implementation of 'dart:io' library
# (without secure sockets) suitable for linking with gen_snapshot.
source_set("gen_snapshot_dart_io") {
  configs += ["..:dart_config",
              "..:dart_product_config",
              "..:dart_precompiler_config"]

  deps = [
    "//third_party/zlib",
  ]

  custom_sources_filter = [
    "*_test.cc",
    "*_test.h",
    "builtin.cc",
    "builtin_common.cc",
    "builtin_gen_snapshot.cc",
  ]
  if (!is_mac && !is_ios) {
    # Dart tree uses *_macos.* instead of *_mac.*
    custom_sources_filter += [
      "*_macos.h",
      "*_macos.cc",
    ]
  }
  set_sources_assignment_filter(custom_sources_filter)

  defines = [ "DART_IO_SECURE_SOCKET_DISABLED" ]

  sources = io_impl_sources_gypi.sources + builtin_impl_sources_gypi.sources
  sources += [
    "io_natives.cc",
    "io_natives.h",
  ]

  include_dirs = [
    "..",
    "//third_party"
  ]
}

}  # current_toolchain == host_toolchain

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


# A source set for the implementation of 'dart:io' library
# (without secure sockets).
source_set("embedded_dart_io") {
  configs += ["..:dart_config",
              "..:dart_product_config",
              "..:dart_precompiled_runtime_config"]

  custom_sources_filter = [
    "*_test.cc",
    "*_test.h",
    "builtin.cc",
    "builtin_gen_snapshot.cc",
  ]
  if (!is_mac && !is_ios) {
    # Dart tree uses *_macos.* instead of *_mac.*
    custom_sources_filter += [
      "*_macos.h",
      "*_macos.cc",
    ]
  }
  set_sources_assignment_filter(custom_sources_filter)

  if (is_mac || is_ios) {
    libs = [
      "Security.framework",
    ]
  } else if (defined(is_fuchsia) && is_fuchsia) {
    defines = [
      "DART_IO_SECURE_SOCKET_DISABLED"
    ]
  } else {
    deps = [
      rebase_path(dart_boringssl_path, "."),
    ]
  }

  sources = io_impl_sources_gypi.sources + builtin_impl_sources_gypi.sources
  sources += [
    "builtin_nolib.cc",
    "builtin_natives.cc",
    "io_natives.cc",
    "io_natives.h",
    "embedded_dart_io.cc",
    "embedded_dart_io.h",
    "log_android.cc",
    "log_linux.cc",
    "log_macos.cc",
    "log_win.cc",
    "log.h",
  ]
  if (is_linux) {
    sources += [ "../../third_party/root_certificates/root_certificates.cc"]
  }

  include_dirs = [
    "..",
    "//third_party"
  ]
}


action("generate_snapshot_bin") {
  deps = [
    "../bin:gen_snapshot($host_toolchain)",
  ]

  vm_isolate_snapshot = "$target_gen_dir/vm_isolate_snapshot.bin"
  isolate_snapshot = "$target_gen_dir/isolate_snapshot.bin"
  gen_snapshot_stamp_file = "$target_gen_dir/gen_snapshot.stamp"
  outputs = [
    vm_isolate_snapshot,
    isolate_snapshot,
    gen_snapshot_stamp_file,
  ]

  gen_snapshot_dir =
      get_label_info("../bin:gen_snapshot($host_toolchain)", "root_out_dir")

  script = rebase_path("../tools/create_snapshot_bin.py")
  args = [
    "--executable",
    rebase_path("$gen_snapshot_dir/gen_snapshot"),
    "--vm_output_bin",
    rebase_path(vm_isolate_snapshot, root_build_dir),
    "--output_bin",
    rebase_path(isolate_snapshot, root_build_dir),
    "--target_os",
    current_os,
    "--timestamp_file",
    rebase_path(gen_snapshot_stamp_file, root_build_dir),
  ]
}


action("generate_snapshot_file") {
  deps = [
    ":generate_snapshot_bin",
  ]

  snapshot_in_cc_file = "snapshot_in.cc"
  inputs = [
    "../tools/create_snapshot_file.py",
    snapshot_in_cc_file,
    "$target_gen_dir/vm_isolate_snapshot.bin",
    "$target_gen_dir/isolate_snapshot.bin",
  ]
  output = "$root_gen_dir/dart_snapshot.cc"
  outputs = [
    output,
  ]

  script = "../tools/create_snapshot_file.py"
  args = [
    "--vm_input_bin",
    rebase_path("$target_gen_dir/vm_isolate_snapshot.bin"),
    "--input_bin",
    rebase_path("$target_gen_dir/isolate_snapshot.bin"),
    "--input_cc",
    rebase_path(snapshot_in_cc_file),
    "--output",
    rebase_path(output),
  ]
}


source_set("dart_snapshot_cc") {
  sources = [
    "$root_gen_dir/dart_snapshot.cc",
  ]

  deps = [
    ":generate_snapshot_file",
  ]
}

if (defined(is_fuchsia) && is_fuchsia) {
  executable("fuchsia_test") {
    configs += ["..:dart_config",
                "..:dart_product_config",
                "..:dart_precompiled_runtime_config"]
    sources = [
      "fuchsia_test.cc",
      "log_fuchsia.cc",
    ]

    include_dirs = [
      "..",
      "../include"
    ]

    deps = [
      ":dart_snapshot_cc",
      ":libdart_embedder_noio",
    ]
  }

  copy("hello_fuchsia") {
    sources = [ "../tests/vm/dart/hello_fuchsia_test.dart" ]
    outputs = [ "$root_out_dir/hello_fuchsia.dart" ]
  }

  executable("dart_no_observatory") {
    configs += ["..:dart_config",
                "..:dart_product_config",
                "..:dart_precompiled_runtime_config",]
    deps = [
      ":hello_fuchsia",
      ":gen_resources_cc",
      ":embedded_dart_io",
      ":libdart_builtin",
      "../vm:libdart_platform",
      "..:libdart",
      ":dart_snapshot_cc",
      "//third_party/zlib",
    ]

    defines = [
      "NO_OBSERVATORY",
    ]

    sources = [
      "main.cc",
      "observatory_assets_empty.cc",
      "vmservice_impl.cc",
      "vmservice_impl.h",
      "$target_gen_dir/resources_gen.cc",
    ]

    include_dirs = [
      "..",
      "//third_party",
    ]
  }
}  # defined(is_fuchsia) && is_fuchsia
