# 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.

config("libdart_vm_config") {
  libs = [
    "dl",
  ]

  if (!is_android) {
    libs += [
      "pthread",
      "rt",
    ]
  }
}


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

  platform_headers_gypi =
      exec_script("../../tools/gypi_to_gn.py",
                  [rebase_path("../platform/platform_headers.gypi")],
                  "scope",
                  ["../platform/platform_headers.gypi"])
  platform_headers =
      rebase_path(platform_headers_gypi.sources, ".", "../platform")

  platform_sources_gypi =
      exec_script("../../tools/gypi_to_gn.py",
                  [rebase_path("../platform/platform_sources.gypi")],
                  "scope",
                  ["../platform/platform_sources.gypi"])
  platform_sources =
      rebase_path(platform_sources_gypi.sources, ".", "../platform")

  sources = platform_headers + platform_sources
  include_dirs = [
    "..",
  ]
}


static_library("libdart_vm") {
  configs += ["..:dart_config"]
  public_configs = [":libdart_vm_config"]
  deps = [ ":generate_service_cc_file", ]

  vm_sources_list = exec_script("../../tools/gypi_to_gn.py",
                                [rebase_path("vm_sources.gypi")],
                                "scope",
                                ["vm_sources.gypi"])

  set_sources_assignment_filter(["*_test.cc", "*_test.h"])
  sources = vm_sources_list.sources
            + ["$target_gen_dir/service_gen.cc",]
            - ["vtune.cc", "vtune.h"]
  include_dirs = [
    "..",
  ]
}


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

    if (kind == "source") {
      path = "../../sdk/lib/${filename}"
    } else {
      path = "../lib"
    }

    lib_sources_gypi =
        exec_script("../../tools/gypi_to_gn.py",
                    [rebase_path("${path}/${filename}_sources.gypi")],
                    "scope",
                    ["${path}/${filename}_sources.gypi"])
    lib_sources =
        rebase_path(lib_sources_gypi.sources, ".", path)

    script = "../tools/gen_library_src_paths.py"
    inputs = [
      "../tools/gen_library_src_paths.py",
      "../lib/libgen_in.cc",
    ]
    outputs = [ 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}",] +
      rebase_path(lib_sources, root_build_dir)
  }
}


# This templates expects invoker.sources to be a list of pairs of strings.
# The pairs of strings mean the following.
# library name, file name
# e.g. for the "internal" library named "dart:_internal",
# with sources listed at sdk/lib/internal/internal_sources.gypi and
# lib/internal_sources.gypi, we have: ["_internal", "internal"]
#
# 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_withcore and libdart_lib.
template("generate_core_libraries") {
  assert(defined(invoker.sources), "Need sources in $target_name")
  liboutputs = []
  libsources = []
  libdeps = []
  foreach(lib, invoker.sources) {
    libname = lib[0]
    filename = lib[1]
    generate_library_source("generate_${filename}_cc_file") {
      libname = libname
      filename = filename
      kind = "source"
      output = "$target_gen_dir/${filename}_gen.cc"
    }
    generate_library_source("generate_${filename}_patch_cc_file") {
      libname = libname
      filename = filename
      kind = "patch"
      output = "$target_gen_dir/${filename}_patch_gen.cc"
    }
    lib_sources_gypi =
        exec_script("../../tools/gypi_to_gn.py",
                    [rebase_path("../lib/${filename}_sources.gypi")],
                    "scope",
                    ["../lib/${filename}_sources.gypi"])
    libsources += rebase_path(lib_sources_gypi.sources, ".", "../lib")
    liboutputs += ["$target_gen_dir/${filename}_gen.cc",
                   "$target_gen_dir/${filename}_patch_gen.cc"]
    libdeps += [":generate_${filename}_cc_file",
                ":generate_${filename}_patch_cc_file"]
  }

  static_library("libdart_lib_withcore") {
    configs += ["..:dart_config"]
    deps = libdeps
    sources = libsources + ["bootstrap.cc"] + liboutputs
    include_dirs = [
      "..",
    ]
  }
  static_library("libdart_lib") {
    configs += ["..:dart_config"]
    sources = libsources + [ "bootstrap_nocore.cc", ]
    include_dirs = [
      "..",
    ]
  }
}


generate_core_libraries("core_libraries") {
  sources = [
    ["async", "async"],
    ["core", "core"],
    ["collection", "collection"],
    ["convert", "convert"],
    ["_internal", "internal"],
    ["isolate", "isolate"],
    ["math", "math"],
    ["mirrors", "mirrors"],
    ["typed_data", "typed_data"],
    ["profiler", "profiler"],
  ]
}


action("generate_service_cc_file") {
  visibility = [ ":*" ]  # Only targets in this file can see this.
  script = "../tools/create_resources.py"
  sources = [
    "service/client.dart",
    "service/constants.dart",
    "service/message.dart",
    "service/message_router.dart",
    "service/running_isolate.dart",
    "service/running_isolates.dart",
    "service/vmservice.dart",
  ]

  output = "$target_gen_dir/service_gen.cc"
  outputs = [ output, ]

  args = [
    "--output", rebase_path(output, root_build_dir),
    "--outer_namespace", "dart",
    "--table_name", "service",
    "--root_prefix", rebase_path("service/", root_build_dir)] +
    rebase_path(sources, root_build_dir)
}
