# 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("../../utils/generate_patch_sdk.gni")
import("gypi_contents.gni")
import("../runtime_args.gni")

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

static_library("libdart_platform") {
  configs += [
    "..:dart_config",
    "..:dart_maybe_product_config",
  ]
  public_configs = [ ":libdart_vm_config" ]

  sources = rebase_path(processed_gypis.platform_sources, ".", "../platform")

  include_dirs = [ ".." ]
}

vm_sources_list = processed_gypis.vm_sources

static_library("libdart_vm_jit") {
  configs += [
    "..:dart_config",
    "..:dart_maybe_product_config",
  ]
  public_configs = [ ":libdart_vm_config" ]
  set_sources_assignment_filter([
                                  "*_test.cc",
                                  "*_test.h",
                                ])
  sources = vm_sources_list
  include_dirs = [ ".." ]
}

static_library("libdart_vm_precompiled_runtime") {
  configs += [
    "..:dart_config",
    "..:dart_maybe_product_config",
    "..:dart_precompiled_runtime_config",
  ]
  public_configs = [ ":libdart_vm_config" ]
  set_sources_assignment_filter([
                                  "*_test.cc",
                                  "*_test.h",
                                ])
  sources = vm_sources_list
  include_dirs = [ ".." ]
}

static_library("libdart_vm_nosnapshot") {
  configs += [
    "..:dart_config",
    "..:dart_maybe_product_config",
    "..:dart_no_snapshot_config",
  ]
  public_configs = [ ":libdart_vm_config" ]
  set_sources_assignment_filter([
                                  "*_test.cc",
                                  "*_test.h",
                                ])
  sources = vm_sources_list
  include_dirs = [ ".." ]
}

static_library("libdart_vm_nosnapshot_with_precompiler") {
  configs += [
    "..:dart_config",
    "..:dart_maybe_product_config",
    "..:dart_precompiler_config",
    "..:dart_no_snapshot_config",
  ]
  public_configs = [ ":libdart_vm_config" ]
  set_sources_assignment_filter([
                                  "*_test.cc",
                                  "*_test.h",
                                ])
  sources = vm_sources_list
  include_dirs = [ ".." ]
}

static_library("libdart_vm_with_precompiler") {
  configs += [
    "..:dart_config",
    "..:dart_maybe_product_config",
    "..:dart_precompiler_config",
  ]
  public_configs = [ ":libdart_vm_config" ]
  set_sources_assignment_filter([
                                  "*_test.cc",
                                  "*_test.h",
                                ])
  sources = vm_sources_list
  include_dirs = [ ".." ]
}

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

# 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")

  static_library("libdart_lib_nosnapshot_with_precompiler") {
    configs += [
      "..:dart_config",
      "..:dart_maybe_product_config",
      "..:dart_precompiler_config",
    ]
    deps = libdeps
    sources = all_libsources + [ "bootstrap.cc" ] + liboutputs
    include_dirs = [ ".." ]
  }

  static_library("libdart_lib_with_precompiler") {
    configs += [
      "..:dart_config",
      "..:dart_maybe_product_config",
      "..:dart_precompiler_config",
    ]
    deps = libdeps
    sources = all_libsources + [ "bootstrap_nocore.cc" ]
    include_dirs = [ ".." ]
  }

  static_library("libdart_lib_jit") {
    configs += [
      "..:dart_config",
      "..:dart_maybe_product_config",
    ]
    sources = all_libsources + [ "bootstrap_nocore.cc" ]
    include_dirs = [ ".." ]
  }

  static_library("libdart_lib_precompiled_runtime") {
    configs += [
      "..:dart_config",
      "..:dart_maybe_product_config",
      "..:dart_precompiled_runtime_config",
    ]
    sources = all_libsources + [ "bootstrap_nocore.cc" ]
    include_dirs = [ ".." ]
  }
}

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

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

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

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