# 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("gypi_contents.gni")

declare_args() {
  # Whether to fall back to built-in root certificates when they cannot be
  # verified at the operating system level.
  dart_use_fallback_root_certificates = false

  # The BUILD.gn file that we pull from chromium as part of zlib has a
  # dependence on //base, which we don't pull in. In a standalone build of the
  # VM, we set this to //runtime/bin/zlib where we have a BUILD.gn file without
  # a dependence on //base.
  dart_zlib_path = "//third_party/zlib"

  # Whether to link the standalone VM against tcmalloc. The standalone build of
  # the VM enables this only for Linux builds.
  dart_use_tcmalloc = false
}

# TODO(zra): Remove this when Fuchsia has a root cert cache on the filesystem.
if (defined(is_fuchsia) && is_fuchsia) {
  dart_use_fallback_root_certificates = true
}

# 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, "", "../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
    library_name = "dart:${name}"
    if (defined(invoker.library_name)) {
      library_name = invoker.library_name
    }
    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",
             library_name,
           ] + rebase_path(invoker.sources, root_build_dir)
  }
}

gen_library_src_path("generate_builtin_cc_file") {
  name = "_builtin"
  kind = "source"
  sources = builtin_sources_gypi
  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"
}

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

gen_library_src_path("generate_html_cc_file") {
  name = "html"
  kind = "source"
  sources = [
    "../../sdk/lib/html/dartium/html_dartium.dart",
  ]
  output = "$target_gen_dir/html_gen.cc"
}

gen_library_src_path("generate_html_common_cc_file") {
  name = "html_common"
  kind = "source"
  sources = [
    "../../sdk/lib/html/html_common/conversions.dart",
    "../../sdk/lib/html/html_common/conversions_dartium.dart",
    "../../sdk/lib/html/html_common/css_class_set.dart",
    "../../sdk/lib/html/html_common/device.dart",
    "../../sdk/lib/html/html_common/filtered_element_list.dart",
    "../../sdk/lib/html/html_common/html_common.dart",
    "../../sdk/lib/html/html_common/lists.dart",
  ]
  output = "$target_gen_dir/html_common_gen.cc"
}

gen_library_src_path("generate_js_cc_file") {
  name = "js"
  kind = "source"
  sources = [
    "../../sdk/lib/js/dartium/js_dartium.dart",
  ]
  output = "$target_gen_dir/js_gen.cc"
}

gen_library_src_path("generate_js_util_cc_file") {
  name = "js_util"
  kind = "source"
  sources = [
    "../../sdk/lib/js_util/dartium/js_util_dartium.dart",
  ]
  output = "$target_gen_dir/js_util_gen.cc"
}

gen_library_src_path("generate_blink_cc_file") {
  name = "_blink"
  kind = "source"
  sources = [
    "../../sdk/lib/_blink/dartium/_blink_dartium.dart",
  ]
  output = "$target_gen_dir/blink_gen.cc"
}

gen_library_src_path("generate_indexed_db_cc_file") {
  name = "indexed_db"
  kind = "source"
  sources = [
    "../../sdk/lib/indexed_db/dartium/indexed_db_dartium.dart",
  ]
  output = "$target_gen_dir/indexed_db_gen.cc"
}

gen_library_src_path("generate_cached_patches_cc_file") {
  name = "cached_patches"
  library_name = "cached_patches.dart"
  kind = "source"
  sources = [
    "../../sdk/lib/js/dartium/cached_patches.dart",
  ]
  output = "$target_gen_dir/cached_patches_gen.cc"
}

gen_library_src_path("generate_web_gl_cc_file") {
  name = "web_gl"
  kind = "source"
  sources = [
    "../../sdk/lib/web_gl/dartium/web_gl_dartium.dart",
  ]
  output = "$target_gen_dir/web_gl_gen.cc"
}

gen_library_src_path("generate_metadata_cc_file") {
  name = "metadata"
  library_name = "metadata.dart"
  kind = "source"
  sources = [
    "../../sdk/lib/html/html_common/metadata.dart",
  ]
  output = "$target_gen_dir/metadata_gen.cc"
}

gen_library_src_path("generate_web_sql_cc_file") {
  name = "web_sql"
  kind = "source"
  sources = [
    "../../sdk/lib/web_sql/dartium/web_sql_dartium.dart",
  ]
  output = "$target_gen_dir/web_sql_gen.cc"
}

gen_library_src_path("generate_svg_cc_file") {
  name = "svg"
  kind = "source"
  sources = [
    "../../sdk/lib/svg/dartium/svg_dartium.dart",
  ]
  output = "$target_gen_dir/svg_gen.cc"
}

gen_library_src_path("generate_web_audio_cc_file") {
  name = "web_audio"
  kind = "source"
  sources = [
    "../../sdk/lib/web_audio/dartium/web_audio_dartium.dart",
  ]
  output = "$target_gen_dir/web_audio_gen.cc"
}

config("libdart_builtin_config") {
  if (!is_win) {
    libs = [ "dl" ]
  }
  if (is_android) {
    libs += [
      "android",
      "log",
    ]
  }
}

static_library("libdart_builtin") {
  configs += [
    "..:dart_config",
    "..:dart_maybe_product_config",
  ]
  public_configs = [ ":libdart_builtin_config" ]
  deps = [
    ":generate_blink_cc_file",
    ":generate_builtin_cc_file",
    ":generate_cached_patches_cc_file",
    ":generate_html_cc_file",
    ":generate_html_common_cc_file",
    ":generate_indexed_db_cc_file",
    ":generate_io_cc_file",
    ":generate_io_patch_cc_file",
    ":generate_js_cc_file",
    ":generate_js_util_cc_file",
    ":generate_metadata_cc_file",
    ":generate_svg_cc_file",
    ":generate_web_audio_cc_file",
    ":generate_web_gl_cc_file",
    ":generate_web_sql_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
}

executable("gen_snapshot") {
  configs += [
    "..:dart_config",
    "..:dart_maybe_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 = [
    # 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",
    "address_sanitizer.cc",
    "builtin.cc",
    "builtin.h",

    # Very limited native resolver provided.
    "builtin_common.cc",
    "builtin_gen_snapshot.cc",
    "gen_snapshot.cc",
    "vmservice_impl.cc",
    "vmservice_impl.h",
  ]

  include_dirs = [ ".." ]

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

  if (is_win) {
    libs = [
      "iphlpapi.lib",
      "psapi.lib",
      "ws2_32.lib",
      "Rpcrt4.lib",
      "winmm.lib",
    ]
  }
}

# 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_maybe_product_config",
    "..:dart_precompiler_config",
  ]

  deps = [
    "$dart_zlib_path",
  ]

  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 + builtin_impl_sources_gypi
  sources += [
    "io_natives.cc",
    "io_natives.h",
  ]

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

source_set("libdart_embedder_noio") {
  configs += [
    "..:dart_config",
    "..:dart_maybe_product_config",
  ]
  deps = [
    "..:libdart",
  ]
}

# A source set for the implementation of 'dart:io' library.
template("dart_io") {
  extra_sources = []
  if (defined(invoker.extra_sources)) {
    extra_sources += invoker.extra_sources
  }
  source_set(target_name) {
    configs += [
      "..:dart_config",
      "..:dart_maybe_product_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)

    defines = []
    if (is_mac || is_ios) {
      libs = [
        "CoreFoundation.framework",
        "Security.framework",
      ]

      if (is_mac) {
        libs += [ "CoreServices.framework" ]
      }
    } else {
      deps = [
        "//third_party/boringssl",
      ]
    }

    sources = io_impl_sources_gypi + builtin_impl_sources_gypi
    sources += [
                 "builtin_natives.cc",
                 "io_natives.cc",
                 "io_natives.h",
                 "log_android.cc",
                 "log_linux.cc",
                 "log_macos.cc",
                 "log_win.cc",
                 "log.h",
               ] + extra_sources

    if (is_linux || is_win || (defined(is_fuchsia) && is_fuchsia)) {
      if (dart_use_fallback_root_certificates) {
        sources += [ "//third_party/root_certificates/root_certificates.cc" ]
      } else {
        defines += [ "DART_IO_ROOT_CERTS_DISABLED" ]
      }
    }

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

dart_io("embedded_dart_io") {
  extra_sources = [
    "builtin_nolib.cc",
    "embedded_dart_io.cc",
    "embedded_dart_io.h",
  ]
}

dart_io("standalone_dart_io") {
  extra_sources = []
}

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

template("dart_executable") {
  extra_configs = []
  if (defined(invoker.extra_configs)) {
    extra_configs += invoker.extra_configs
  }
  extra_deps = []
  if (defined(invoker.extra_deps)) {
    extra_deps += invoker.extra_deps
  }
  extra_defines = []
  if (defined(invoker.extra_defines)) {
    extra_defines = invoker.extra_defines
  }
  extra_sources = []
  if (defined(invoker.extra_sources)) {
    extra_sources += invoker.extra_sources
  }
  executable(target_name) {
    configs += [
                 "..:dart_config",
                 "..:dart_maybe_product_config",
               ] + extra_configs

    if (defined(is_fuchsia_host) && is_fuchsia_host) {
      # We already have these in the standalone build, but Fuchsia doesn't
      # have them. They are needed for running Fuchsia binaries built for the
      # host.
      if (is_linux) {
        configs += [ "../../build/config/gcc:executable_ldconfig" ]
      } else if (is_mac) {
        configs += [ "../../build/config/mac:mac_dynamic_flags" ]
      }
    }

    deps = [
             ":gen_resources_cc",
             ":standalone_dart_io",
             ":libdart_builtin",
             "$dart_zlib_path",
           ] + extra_deps

    if (dart_use_tcmalloc) {
      deps += [ "//third_party/tcmalloc" ]
    }

    defines = extra_defines

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

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

    if (is_win) {
      ldflags = [ "/EXPORT:Dart_True" ]
    } else {
      ldflags = [ "-rdynamic" ]
    }

    if (is_win) {
      libs = [
        "iphlpapi.lib",
        "psapi.lib",
        "ws2_32.lib",
        "Rpcrt4.lib",
        "winmm.lib",
      ]
    }
  }
}

dart_executable("dart") {
  extra_deps = [
    "..:libdart",
    ":dart_snapshot_cc",
    "../observatory:standalone_observatory_archive",
  ]
  extra_sources = [ "builtin_nolib.cc" ]
}

dart_executable("dart_noopt") {
  extra_configs = [ "..:dart_precompiler_config" ]
  extra_deps = [
    "..:libdart_noopt",
    ":dart_snapshot_cc",
    "../observatory:standalone_observatory_archive",
  ]
  extra_sources = [ "builtin_nolib.cc" ]
}

dart_executable("dart_precompiled_runtime") {
  extra_configs = [ "..:dart_precompiled_runtime_config" ]
  extra_deps = [
    "..:libdart_precompiled_runtime",
    "../observatory:standalone_observatory_archive",
  ]
  extra_sources = [
    "builtin_nolib.cc",
    "snapshot_empty.cc",
  ]
}

dart_executable("dart_bootstrap") {
  extra_configs = [
    "..:dart_precompiler_config",
    "..:dart_no_snapshot_config",
  ]
  extra_deps = [
    ":generate_builtin_cc_file",
    ":generate_io_cc_file",
    ":generate_io_patch_cc_file",
    ":generate_html_cc_file",
    ":generate_html_common_cc_file",
    ":generate_js_cc_file",
    ":generate_js_util_cc_file",
    ":generate_blink_cc_file",
    ":generate_indexed_db_cc_file",
    ":generate_cached_patches_cc_file",
    ":generate_web_gl_cc_file",
    ":generate_metadata_cc_file",
    ":generate_web_sql_cc_file",
    ":generate_svg_cc_file",
    ":generate_web_audio_cc_file",
    "..:libdart_nosnapshot_with_precompiler",
  ]
  extra_defines = [ "NO_OBSERVATORY" ]
  extra_sources = [
    "builtin.cc",
    "builtin.h",
    "observatory_assets_empty.cc",
    "snapshot_empty.cc",

    # 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/html_gen.cc",
    "$target_gen_dir/html_common_gen.cc",
    "$target_gen_dir/js_gen.cc",
    "$target_gen_dir/js_util_gen.cc",
    "$target_gen_dir/blink_gen.cc",
    "$target_gen_dir/indexed_db_gen.cc",
    "$target_gen_dir/cached_patches_gen.cc",
    "$target_gen_dir/web_gl_gen.cc",
    "$target_gen_dir/metadata_gen.cc",
    "$target_gen_dir/web_sql_gen.cc",
    "$target_gen_dir/svg_gen.cc",
    "$target_gen_dir/web_audio_gen.cc",
  ]
}

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("run_vm_tests_fuchsia") {
    testonly = true
    configs += [ "..:dart_config" ]
    sources = [
      "run_vm_tests_fuchsia.cc",
    ]
    libs = [
      "launchpad",
      "magenta",
    ]
  }
}

# This is only needed for the Fuchsia target build until the Observatory is
# supported.
dart_executable("dart_no_observatory") {
  extra_deps = [
    "..:libdart",
    ":dart_snapshot_cc",
  ]
  if (defined(is_fuchsia) && is_fuchsia) {
    extra_deps += [ ":hello_fuchsia" ]
  }
  extra_defines = [ "NO_OBSERVATORY" ]
  extra_sources = [
    "builtin_nolib.cc",
    "observatory_assets_empty.cc",
  ]
}

executable("process_test") {
  sources = [
    "process_test.cc",
  ]
}

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") {
  if (defined(is_fuchsia) && is_fuchsia) {
    testonly = true
  }

  configs += [
    "..:dart_config",
    "..:dart_maybe_product_config",
  ]

  deps = [
    ":dart_snapshot_cc",
    ":generate_snapshot_test_dat_file",
    ":libdart_builtin",
    ":standalone_dart_io",
    "$dart_zlib_path",
    "..:libdart",
  ]
  include_dirs = [
    "..",
    "$target_gen_dir",
  ]
  defines = [ "TESTING" ]

  if (dart_use_tcmalloc) {
    deps += [ "//third_party/tcmalloc" ]
  }

  # The VM sources are already included in libdart, so we just want to add in
  # the tests here.
  vm_tests = rebase_path(vm_tests_list, ".", "../vm")

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

  if (!is_win) {
    ldflags = [ "-rdynamic" ]
  }

  if (is_win) {
    libs = [
      "iphlpapi.lib",
      "psapi.lib",
      "ws2_32.lib",
      "Rpcrt4.lib",
      "winmm.lib",
    ]
  }
}

if (!defined(is_fuchsia) || !is_fuchsia) {
  shared_library("test_extension") {
    deps = [
      ":dart",
    ]
    sources = [
      "test_extension.c",
      "test_extension_dllmain_win.cc",
    ]
    include_dirs = [ ".." ]
    defines = [
      # The only effect of DART_SHARED_LIB is to export the Dart API.
      "DART_SHARED_LIB",
    ]
    if (is_win) {
      libs = [ "dart.lib" ]
      abs_root_out_dir = rebase_path(root_out_dir)
      ldflags = [ "/LIBPATH:$abs_root_out_dir" ]
    }
  }

  shared_library("sample_extension") {
    deps = [
      ":dart",
    ]
    sources = [
      "../../samples/sample_extension/sample_extension.cc",
      "../../samples/sample_extension/sample_extension_dllmain_win.cc",
    ]
    include_dirs = [ ".." ]
    defines = [
      # The only effect of DART_SHARED_LIB is to export the Dart API.
      "DART_SHARED_LIB",
    ]
    if (is_win) {
      libs = [ "dart.lib" ]
      abs_root_out_dir = rebase_path(root_out_dir)
      ldflags = [ "/LIBPATH:$abs_root_out_dir" ]
    }
  }
}
