# 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,
                        "",
                        "../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",
    ] + invoker.sources
    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" ])

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 = [
    "..",
  ]

  if (is_mac) {
    libs = [
      "CoreFoundation.framework",
      "CoreServices.framework"
    ]
  }
}

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

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) {
  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",
      "../../pkg:pkg",  # Pull this out to top-level for a real SDK build.
      "//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",
    ]
  }

  action("generate_snapshot_test_dat_file") {
    snapshot_test_dat_file = "$root_gen_dir/snapshot_test.dat"
    snapshot_test_in_dat_file = "../vm/snapshot_test_in.dat"
    snapshot_test_dart_file = "../vm/snapshot_test.dart"
    inputs = [
      "../tools/create_string_literal.py",
      snapshot_test_in_dat_file,
      snapshot_test_dart_file,
    ]

    outputs = [
      snapshot_test_dat_file,
    ]

    script = "../tools/create_string_literal.py"
    args = [
      "--output",
      rebase_path(snapshot_test_dat_file),
      "--input_cc",
      rebase_path(snapshot_test_in_dat_file),
      "--include",
      "INTENTIONALLY_LEFT_BLANK",
      "--var_name",
      "INTENTIONALLY_LEFT_BLANK_TOO",
      rebase_path(snapshot_test_dart_file),
    ]
  }

  executable("run_vm_tests") {
    testonly = true
    configs += ["..:dart_config",
                "..:dart_product_config",
                "..:dart_precompiled_runtime_config",]
    deps = [
      "..:libdart",
      ":libdart_builtin",
      ":embedded_dart_io",
      ":dart_snapshot_cc",
      ":generate_snapshot_test_dat_file",
      "../vm:libdart_platform",
      "//third_party/zlib",
    ]
    include_dirs = [
      "..",
      "$target_gen_dir",
    ]
    defines = [
      "TESTING",
    ]

    vm_tests_list = exec_script("../../tools/gypi_to_gn.py",
                                  [rebase_path("../vm/vm_sources.gypi"),
                                   "--keep_only=_test.cc",
                                   "--keep_only=_test.h",],
                                  "scope",
                                  ["../vm/vm_sources.gypi"])
    vm_tests = rebase_path(vm_tests_list.sources, ".", "../vm")

    builtin_impl_tests_list =
        exec_script("../../tools/gypi_to_gn.py",
                    [rebase_path("builtin_impl_sources.gypi"),
                     "--keep_only=_test.cc",
                     "--keep_only=_test.h",],
                    "scope",
                    ["builtin_impl_sources.gypi"])

    sources = [
      "run_vm_tests.cc",
    ] + builtin_impl_tests_list.sources + vm_tests
  }

  executable("run_vm_tests_fuchsia") {
    testonly = true
    configs += ["..:dart_config"]
    sources = [
      "run_vm_tests_fuchsia.cc"
    ]
    libs = [
      "launchpad",
      "magenta",
      "runtime",
    ]
  }
}  # defined(is_fuchsia) && is_fuchsia
