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

# 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 if (defined(is_fuchsia) && is_fuchsia) {
      defines += [ "DART_IO_SECURE_SOCKET_DISABLED" ]
    } 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) {
      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

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

if (!defined(is_fuchsia) || !is_fuchsia) {
  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") {
  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" ]
    }
  }
}
