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

  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
  include_dirs = [
    "..",
  ]
}


static_library("libdart_vm_precompiled_runtime") {
  configs += ["..:dart_config_no_precompiler"]
  public_configs = [":libdart_vm_config"]
  defines = ["DART_PRECOMPILED_RUNTIME"]
  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
  include_dirs = [
    "..",
  ]
}


static_library("libdart_vm_nosnapshot") {
  configs += ["..:dart_config"]
  public_configs = [":libdart_vm_config"]
  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
  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 = [
      "..",
    ]
  }
  static_library("libdart_lib_precompiled_runtime") {
    configs += ["..:dart_config_no_precompiler"]
    defines = ["DART_PRECOMPILED_RUNTIME"]
    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"],
    ["_vmservice", "vmservice"],
  ]
}
