# 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("../../build/executable_suffix.gni")
import("../../build/prebuilt_dart_sdk.gni")
import("../../sdk/lib/async/async_sources.gni")
import("../../sdk/lib/collection/collection_sources.gni")
import("../../sdk/lib/convert/convert_sources.gni")
import("../../sdk/lib/core/core_sources.gni")
import("../../sdk/lib/developer/developer_sources.gni")
import("../../sdk/lib/internal/internal_sources.gni")
import("../../sdk/lib/isolate/isolate_sources.gni")
import("../../sdk/lib/math/math_sources.gni")
import("../../sdk/lib/mirrors/mirrors_sources.gni")
import("../../sdk/lib/profiler/profiler_sources.gni")
import("../../sdk/lib/typed_data/typed_data_sources.gni")
import("../../sdk/lib/vmservice/vmservice_sources.gni")
import("../../utils/compile_platform.gni")
import("../../utils/generate_patch_sdk.gni")
import("../bin/io_sources.gni")
import("../lib/async_sources.gni")
import("../lib/collection_sources.gni")
import("../lib/convert_sources.gni")
import("../lib/core_sources.gni")
import("../lib/developer_sources.gni")
import("../lib/internal_sources.gni")
import("../lib/isolate_sources.gni")
import("../lib/math_sources.gni")
import("../lib/mirrors_sources.gni")
import("../lib/profiler_sources.gni")
import("../lib/typed_data_sources.gni")
import("../lib/vmservice_sources.gni")
import("../runtime_args.gni")
import("compiler/compiler_sources.gni")
import("vm_sources.gni")

config("libdart_vm_config") {
  if (is_fuchsia) {
    libs = [
      "zircon",
      "trace-engine",
    ]
  } else if (is_win) {
    libs = [
      "advapi32.lib",
      "shell32.lib",
      "dbghelp.lib",
    ]
  } else {
    libs = [ "dl" ]
    if (!is_android) {
      libs += [ "pthread" ]
    }
    if (is_linux) {
      libs += [ "rt" ]
    }
  }
}

template("build_libdart_vm") {
  extra_configs = []
  if (defined(invoker.extra_configs)) {
    extra_configs += invoker.extra_configs
  }
  source_set(target_name) {
    configs += [
                 "..:dart_arch_config",
                 "..:dart_config",
                 "..:dart_os_config",
               ] + extra_configs
    if (is_fuchsia) {
      configs -= [ "//build/config:symbol_visibility_hidden" ]
      deps = [
        # TODO(zra): When the platform-specific timeline code is moved out to
        # the embedder, this can go away.
        "//zircon/system/ulib/fbl",
        # TODO(US-399): Remove time_service specific code when it is no longer
        # necessary.
        "//garnet/public/lib/time_service/fidl",
        "//garnet/public/lib/app/cpp",
      ]
    }
    public_configs = [ ":libdart_vm_config" ]
    set_sources_assignment_filter([
                                    "*_test.cc",
                                    "*_test.h",
                                  ])
    sources = vm_sources + rebase_path(compiler_sources, ".", "./compiler/")
    include_dirs = [ ".." ]
  }
}

build_libdart_vm("libdart_vm_jit") {
  extra_configs = [ "..:dart_maybe_product_config" ]
}

build_libdart_vm("libdart_vm_jit_product") {
  extra_configs = [ "..:dart_product_config" ]
}

build_libdart_vm("libdart_vm_precompiled_runtime") {
  extra_configs = [
    "..:dart_maybe_product_config",
    "..:dart_precompiled_runtime_config",
  ]
}

build_libdart_vm("libdart_vm_precompiled_runtime_product") {
  extra_configs = [
    "..:dart_product_config",
    "..:dart_precompiled_runtime_config",
  ]
}

build_libdart_vm("libdart_vm_nosnapshot") {
  extra_configs = [
    "..:dart_maybe_product_config",
    "..:dart_no_snapshot_config",
  ]
}

build_libdart_vm("libdart_vm_nosnapshot_with_precompiler") {
  extra_configs = [
    "..:dart_maybe_product_config",
    "..:dart_precompiler_config",
    "..:dart_no_snapshot_config",
  ]
}

build_libdart_vm("libdart_vm_nosnapshot_with_precompiler_product") {
  extra_configs = [
    "..:dart_product_config",
    "..:dart_precompiler_config",
    "..:dart_no_snapshot_config",
  ]
}

build_libdart_vm("libdart_vm_with_precompiler") {
  extra_configs = [
    "..:dart_maybe_product_config",
    "..:dart_precompiler_config",
  ]
}

build_libdart_vm("libdart_vm_with_precompiler_product") {
  extra_configs = [
    "..:dart_product_config",
    "..:dart_precompiler_config",
  ]
}

template("process_library_source") {
  assert(defined(invoker.libsources), "Need libsources in $target_name")
  assert(defined(invoker.output), "Need output in $target_name")
  action(target_name) {
    visibility = [ ":*" ]  # Only targets in this file can see this.
    libsources = invoker.libsources

    script = invoker.script
    inputs = invoker.inputs + libsources
    outputs = [
      invoker.output,
    ]
    args = invoker.args + rebase_path(libsources, root_build_dir)
  }
}

template("generate_library_source") {
  assert(defined(invoker.libname), "Need libname in $target_name")
  assert(defined(invoker.libsources), "Need libsources in $target_name")
  assert(defined(invoker.kind), "Need kind in $target_name")
  assert(defined(invoker.output), "Need output in $target_name")

  process_library_source(target_name) {
    libname = invoker.libname
    libsources = invoker.libsources
    kind = invoker.kind
    script = "../tools/gen_library_src_paths.py"
    inputs = [
      "../lib/libgen_in.cc",
    ]
    output = invoker.output
    args = [
      "--output",
      rebase_path(invoker.output, root_build_dir),
      "--input_cc",
      rebase_path("../lib/libgen_in.cc", root_build_dir),
      "--include",
      "vm/bootstrap.h",
      "--var_name",
      "dart::Bootstrap::${libname}_${kind}_paths_",
      "--library_name",
      "dart:${libname}",
    ]
  }
}

template("build_libdart_lib") {
  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_sources = []
  if (defined(invoker.extra_sources)) {
    extra_sources += invoker.extra_sources
  }
  source_set(target_name) {
    configs += [
                 "..:dart_arch_config",
                 "..:dart_config",
                 "..:dart_os_config",
               ] + extra_configs
    if (is_fuchsia) {
      configs -= [ "//build/config:symbol_visibility_hidden" ]
    }
    deps = extra_deps
    sources = extra_sources
    include_dirs = [ ".." ]
  }
}

# This templates expects invoker.sources to be a list of lists.
# The lists contain the following information about each library:
#   library name (string)
#   library sources (list of strings)
#   library source base path (string)
#   filename (string)
#   do_patch (boolean)
#
# If do_patch is true, the lists additionally contains
#   patch sources (list of strings)
#   patch source base path (string)
#
# The template iterates over the list, and generates generate_library_source
# actions for each. After that, it generates targets to compile the generated
# sources to make libdart_lib_*.
template("generate_core_libraries") {
  assert(defined(invoker.sources), "Need sources in $target_name")
  assert(defined(invoker.allsources), "Need allsources in $target_name")
  liboutputs = []
  libdeps = []
  foreach(lib, invoker.sources) {
    libname = lib[0]
    filename = lib[3]
    do_patch = lib[4]
    generate_library_source("generate_${filename}_cc_file") {
      libname = libname
      libsources = rebase_path(lib[1], ".", lib[2])
      kind = "source"
      output = "$target_gen_dir/${filename}_gen.cc"
    }
    if (do_patch) {
      generate_library_source("generate_${filename}_patch_cc_file") {
        libname = libname
        libsources = rebase_path(lib[5], ".", lib[6])
        kind = "patch"
        output = "$target_gen_dir/${filename}_patch_gen.cc"
      }
    }

    liboutputs += [ "$target_gen_dir/${filename}_gen.cc" ]
    libdeps += [ ":generate_${filename}_cc_file" ]
    if (do_patch) {
      liboutputs += [ "$target_gen_dir/${filename}_patch_gen.cc" ]
      libdeps += [ ":generate_${filename}_patch_cc_file" ]
    }
  }

  all_libsources = rebase_path(invoker.allsources, ".", "../lib")

  build_libdart_lib("libdart_lib_nosnapshot_with_precompiler") {
    extra_configs = [
      "..:dart_maybe_product_config",
      "..:dart_precompiler_config",
    ]
    extra_deps = libdeps
    extra_sources = all_libsources + [ "bootstrap.cc" ] + liboutputs
  }

  build_libdart_lib("libdart_lib_nosnapshot_with_precompiler_product") {
    extra_configs = [
      "..:dart_product_config",
      "..:dart_precompiler_config",
    ]
    extra_deps = libdeps
    extra_sources = all_libsources + [ "bootstrap.cc" ] + liboutputs
  }

  build_libdart_lib("libdart_lib_with_precompiler") {
    extra_configs = [
      "..:dart_maybe_product_config",
      "..:dart_precompiler_config",
    ]
    extra_deps = libdeps
    extra_sources = all_libsources + [ "bootstrap_nocore.cc" ]
  }

  build_libdart_lib("libdart_lib_with_precompiler_product") {
    extra_configs = [
      "..:dart_product_config",
      "..:dart_precompiler_config",
    ]
    extra_deps = libdeps
    extra_sources = all_libsources + [ "bootstrap_nocore.cc" ]
  }

  build_libdart_lib("libdart_lib_jit") {
    extra_configs = [ "..:dart_maybe_product_config" ]
    extra_sources = all_libsources + [ "bootstrap_nocore.cc" ]
  }

  build_libdart_lib("libdart_lib_jit_product") {
    extra_configs = [ "..:dart_product_config" ]
    extra_sources = all_libsources + [ "bootstrap_nocore.cc" ]
  }

  build_libdart_lib("libdart_lib_precompiled_runtime") {
    extra_configs = [
      "..:dart_maybe_product_config",
      "..:dart_precompiled_runtime_config",
    ]
    extra_sources = all_libsources + [ "bootstrap_nocore.cc" ]
  }

  build_libdart_lib("libdart_lib_precompiled_runtime_product") {
    extra_configs = [
      "..:dart_product_config",
      "..:dart_precompiled_runtime_config",
    ]
    extra_sources = all_libsources + [ "bootstrap_nocore.cc" ]
  }
}

generate_core_libraries("core_libraries") {
  sources = [
    [
      "async",
      async_sdk_sources,
      "../../sdk/lib/async",
      "async",
      true,
      async_runtime_sources,
      "../lib",
    ],
    [
      "collection",
      collection_sdk_sources,
      "../../sdk/lib/collection",
      "collection",
      true,
      collection_runtime_sources,
      "../lib",
    ],
    [
      "convert",
      convert_sdk_sources,
      "../../sdk/lib/convert",
      "convert",
      true,
      convert_runtime_sources,
      "../lib",
    ],
    [
      "core",
      core_sdk_sources,
      "../../sdk/lib/core",
      "core",
      true,
      core_runtime_sources,
      "../lib",
    ],
    [
      "developer",
      developer_sdk_sources,
      "../../sdk/lib/developer",
      "developer",
      true,
      developer_runtime_sources,
      "../lib",
    ],
    [
      "_internal",
      internal_sdk_sources,
      "../../sdk/lib/internal",
      "internal",
      true,
      internal_runtime_sources,
      "../lib",
    ],
    [
      "isolate",
      isolate_sdk_sources,
      "../../sdk/lib/isolate",
      "isolate",
      true,
      isolate_runtime_sources,
      "../lib",
    ],
    [
      "math",
      math_sdk_sources,
      "../../sdk/lib/math",
      "math",
      true,
      math_runtime_sources,
      "../lib",
    ],
    [
      "mirrors",
      mirrors_sdk_sources,
      "../../sdk/lib/mirrors",
      "mirrors",
      true,
      mirrors_runtime_sources,
      "../lib",
    ],
    [
      "profiler",
      profiler_sdk_sources,
      "../../sdk/lib/profiler",
      "profiler",
      false,
    ],
    [
      "typed_data",
      typed_data_sdk_sources,
      "../../sdk/lib/typed_data",
      "typed_data",
      true,
      typed_data_runtime_sources,
      "../lib",
    ],
    [
      "_vmservice",
      vmservice_sdk_sources,
      "../../sdk/lib/vmservice",
      "vmservice",
      true,
      vmservice_runtime_sources,
      "../lib",
    ],
  ]
  allsources = async_runtime_sources + collection_runtime_sources +
               convert_runtime_sources + core_runtime_sources +
               developer_runtime_sources + internal_runtime_sources +
               isolate_runtime_sources + math_runtime_sources +
               mirrors_runtime_sources + profiler_runtime_sources +
               typed_data_runtime_sources + vmservice_runtime_sources
}

template("concatenate_patch") {
  assert(defined(invoker.libsources), "Need a sources in $target_name")
  assert(defined(invoker.output), "Need an output in $target_name")

  process_library_source(target_name) {
    libsources = invoker.libsources
    inputs = []
    output = invoker.output
    script = "../tools/concatenate_patches.py"
    args = [
      "--output",
      rebase_path(output, root_build_dir),
    ]
  }
}

template("generate_vm_patched_sdk") {
  assert(defined(invoker.libraries), "Need libraries in $target_name")

  concatenation_target_names = []

  # Concatenate vm library patches.
  foreach(library, invoker.libraries) {
    name = library[0]

    target_output = "$target_gen_dir/patches/${name}_patch.dart"
    concatenate_patch("concatenate_${name}_patch") {
      libsources = rebase_path(library[1], ".", library[2])
      output = target_output
    }
    concatenation_target_names += [ ":concatenate_${name}_patch" ]
  }

  patched_sdk_dir = "patched_sdk"

  other_outputs = [
    # Instead of listing all outputs we list those consumed by
    # other BUILD rules.
    "$root_out_dir/$patched_sdk_dir/lib/libraries.json",
  ]

  # Build the patched sdk out of the concatenated patches and the special
  # libraries.
  generate_patched_sdk(target_name) {
    mode = "vm"
    deps = concatenation_target_names
    input_patches_dir = "$target_gen_dir/patches"
    patched_sdk_dir = patched_sdk_dir
    outputs = other_outputs
  }
}

generate_vm_patched_sdk("patched_sdk") {
  libraries = [
    [
      "async",
      async_runtime_sources,
      "../lib",
    ],
    [
      "collection",
      collection_runtime_sources,
      "../lib",
    ],
    [
      "convert",
      convert_runtime_sources,
      "../lib",
    ],
    [
      "core",
      core_runtime_sources,
      "../lib",
    ],
    [
      "developer",
      developer_runtime_sources,
      "../lib",
    ],
    [
      "internal",
      internal_runtime_sources,
      "../lib",
    ],
    [
      "isolate",
      isolate_runtime_sources,
      "../lib",
    ],
    [
      "math",
      math_runtime_sources,
      "../lib",
    ],
    [
      "mirrors",
      mirrors_runtime_sources,
      "../lib",
    ],
    [
      "profiler",
      profiler_runtime_sources,
      "../lib",
    ],
    [
      "typed_data",
      typed_data_runtime_sources,
      "../lib",
    ],
    [
      "vmservice",
      vmservice_runtime_sources,
      "../lib",
    ],
    [
      "io",
      io_runtime_sources,
      "../bin",
    ],
  ]
}

compile_platform("vm_legacy_platform") {
  sources = [
    "../../sdk/lib/libraries.json",
  ]

  outputs = [
    "$root_out_dir/vm_platform.dill",
    "$root_out_dir/vm_outline.dill",
  ]

  inputs = [
    "../../sdk/lib/libraries.yaml",
  ]

  args = [ "dart:core" ]
}

compile_platform("vm_platform") {
  sources = [
    "$root_out_dir/patched_sdk/lib/libraries.json",
  ]

  outputs = [
    "$root_out_dir/vm_platform_strong.dill",
    "$root_out_dir/vm_outline_strong.dill",
  ]

  deps = [
    ":patched_sdk",
  ]

  args = [
    "--strong-mode",
    "dart:core",
  ]
}

group("kernel_platform_files") {
  public_deps = [
    ":vm_legacy_platform",
    ":vm_platform",
  ]
}
