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

template("build_libdart_platform") {
  extra_configs = []
  if (defined(invoker.extra_configs)) {
    extra_configs += invoker.extra_configs
  }
  static_library(target_name) {
    configs += [ "..:dart_config" ] + extra_configs
    if (is_fuchsia) {
      configs -= [ "//build/config:symbol_visibility_hidden" ]
      deps = [
        "//apps/tracing/lib/trace",
      ]
    }
    public_configs = [ ":libdart_vm_config" ]

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

    include_dirs = [ ".." ]
  }
}

build_libdart_platform("libdart_platform") {
  extra_configs = [ "..:dart_maybe_product_config" ]
}

build_libdart_platform("libdart_platform_product") {
  extra_configs = [ "..:dart_product_config" ]
}

vm_sources_list = processed_gypis.vm_sources

template("build_libdart_vm") {
  extra_configs = []
  if (defined(invoker.extra_configs)) {
    extra_configs += invoker.extra_configs
  }
  source_set(target_name) {
    configs += [ "..:dart_config" ] + extra_configs
    if (is_fuchsia) {
      configs -= [ "//build/config:symbol_visibility_hidden" ]
      deps = [
        "//apps/tracing/lib/trace",
      ]
    }
    public_configs = [ ":libdart_vm_config" ]
    set_sources_assignment_filter([
                                    "*_test.cc",
                                    "*_test.h",
                                  ])
    sources = vm_sources_list
    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_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",
      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",
    ],
  ]
}
