# 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() {
  # 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
}

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

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

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

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_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.sources
}

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_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.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_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.sources + builtin_impl_sources_gypi.sources
    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_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 = [
              "builtin_nolib.cc",
              "run_vm_tests.cc",
            ] + builtin_impl_tests_list.sources + 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" ]
    }
  }
}
