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

    if (is_linux) {
      libs += [ "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 = [
    "..",
  ]
}


static_library("libdart_vm_nosnapshot") {
  configs += ["..:dart_config"]
  public_configs = [":libdart_vm_config"]
  deps = [ ":generate_service_cc_file", ]
  defines = [ "DART_NO_SNAPSHOT" ]
  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_nosnapshot 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_nosnapshot") {
    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"],
    ["developer", "developer"],
    ["_internal", "internal"],
    ["isolate", "isolate"],
    ["math", "math"],
    ["mirrors", "mirrors"],
    ["profiler", "profiler"],
    ["typed_data", "typed_data"],
  ]
}


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)
}
