# Copyright (c) 2022, 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("../aot_snapshot.gni")
import("../compile_platform.gni")

sdk_root = "../../sdk"

template("wasm_module") {
  action(target_name) {
    script = rebase_path("//build/gn_run_binary.py")
    args = [
      "compiled_action",
      rebase_path("//third_party/emsdk/upstream/emscripten/emcc"),
      "--no-entry",
      rebase_path("//tests/web/wasm/${invoker.module_name}.c"),
      "-o",
      rebase_path("$root_out_dir/wasm/${invoker.module_name}.wasm"),
      "-O",
    ]
    outputs = [ "$root_out_dir/wasm/${invoker.module_name}.wasm" ]
  }
}

aot_snapshot("dart2wasm_snapshot") {
  main_dart = "../../pkg/dart2wasm/bin/dart2wasm.dart"
  name = "dart2wasm"
}

aot_snapshot("dart2wasm_asserts_snapshot") {
  main_dart = "../../pkg/dart2wasm/bin/dart2wasm.dart"
  name = "dart2wasm_asserts"
  gen_kernel_args = [ "--enable-asserts" ]
  gen_snapshot_args = [ "--enable-asserts" ]
}

aot_snapshot("dart2wasm_product_snapshot") {
  main_dart = "../../pkg/dart2wasm/bin/dart2wasm.dart"
  name = "dart2wasm_product"
  force_product_mode = true
}

compile_platform("compile_dart2wasm_platform") {
  single_root_scheme = "org-dartlang-sdk"
  single_root_base = rebase_path("$sdk_root/")
  libraries_specification_uri = "org-dartlang-sdk:///lib/libraries.json"

  outputs = [
    "$root_out_dir/dart2wasm_platform.dill",
    "$root_out_dir/dart2wasm_outline.dill",
  ]

  args = [
    "--target=dart2wasm",
    "--no-defines",
    "dart:core",
    "--nnbd-strong",
  ]
}

compile_platform("compile_dart2wasm_js_compatibility_platform") {
  single_root_scheme = "org-dartlang-sdk"
  single_root_base = rebase_path("$sdk_root/")
  libraries_specification_uri = "org-dartlang-sdk:///lib/libraries.json"

  outputs = [
    "$root_out_dir/dart2wasm_js_compatibility_platform.dill",
    "$root_out_dir/dart2wasm_js_compatibility_outline.dill",
  ]

  args = [
    "--target=dart2wasm_js_compatibility",
    "--no-defines",
    "dart:core",
    "--nnbd-strong",
  ]
}

wasm_module("ffi_native_test_wasm_module") {
  module_name = "ffi_native_test_module"
}

group("test_wasm_modules") {
  deps = [ ":ffi_native_test_wasm_module" ]
}
