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

declare_args() {
  # Instead of using is_debug, we introduce a different flag for specifying a
  # Debug build of Dart so that clients can still use a Release build of Dart
  # while themselves doing a Debug build.
  dart_debug = false

  # Set the runtime mode. This affects how the runtime is built and what
  # features it has. Valid values are:
  # 'develop' (the default) - VM is built to run as a JIT with all development
  # features enabled.
  # 'profile' - The VM is built to run with AOT compiled code with only the
  # CPU profiling features enabled.
  # 'release' - The VM is built to run with AOT compiled code with no developer
  # features enabled.
  #
  # These settings are only used for Flutter, at the moment. A standalone build
  # of the Dart VM should leave this set to "develop", and should set
  # 'is_debug', 'is_release', or 'is_product'.
  dart_runtime_mode = "develop"

  # Explicitly set the target architecture in case of precompilation. Leaving
  # this unspecified results in automatic target architecture detection.
  # Available options are: arm, arm64, mips, x64 and ia32
  dart_target_arch = ""

  dart_experimental_interpreter = false
}

config("dart_public_config") {
  include_dirs = [
    ".",
  ]
}

# Adds PRODUCT define if Flutter has specified "release" for dart_runtime_mode
config("dart_maybe_product_config") {
  defines = []

  if ((dart_runtime_mode != "develop") &&
      (dart_runtime_mode != "profile") &&
      (dart_runtime_mode != "release")) {
    print("Invalid |dart_runtime_mode|")
    assert(false)
  }

  if (dart_runtime_mode == "release") {
    if (dart_debug) {
      print("Debug and release mode are mutually exclusive.")
    }
    assert(!dart_debug)
    defines += ["PRODUCT"]
  }
}

# Adds the DART_PRECOMPILED_RUNTIME define if Flutter has specified "profile" or
# "release" for dart_runtime_mode.
config("dart_maybe_precompiled_runtime_config") {
  defines = []

  if ((dart_runtime_mode != "develop") &&
      (dart_runtime_mode != "profile") &&
      (dart_runtime_mode != "release")) {
    print("Invalid |dart_runtime_mode|")
    assert(false)
  }

  if (dart_runtime_mode == "release") {
    if (dart_debug) {
      print("Debug and release mode are mutually exclusive.")
    }
    assert(!dart_debug)

    if (!dart_experimental_interpreter) {
      defines += ["DART_PRECOMPILED_RUNTIME"]
    }
  } else if (dart_runtime_mode == "profile") {
    if (!dart_experimental_interpreter) {
      defines += ["DART_PRECOMPILED_RUNTIME"]
    }
  }
}

config("dart_precompiled_runtime_config") {
  defines = []
  defines += ["DART_PRECOMPILED_RUNTIME"]
}

# Controls DART_PRECOMPILER #define.
config("dart_precompiler_config") {
  defines = []
  defines += ["DART_PRECOMPILER"]
}

config("dart_no_snapshot_config") {
  defines = []
  defines += ["DART_NO_SNAPSHOT"]
}

config("dart_config") {
  defines = []

  if (dart_experimental_interpreter) {
    dart_target_arch = "dbc"
  }

  if (dart_target_arch != "") {
    if ((dart_target_arch == "arm") ||
        (dart_target_arch == "simarm")) {
      defines += [ "TARGET_ARCH_ARM" ]
      if (target_os == "mac" || target_os == "ios") {
        defines += [ "TARGET_ABI_IOS" ]
      } else {
        defines += [ "TARGET_ABI_EABI" ]
      }
    } else if ((dart_target_arch == "armv6") ||
               (dart_target_arch == "simarmv6")) {
      defines += [ "TARGET_ARCH_ARM" ]
      defines += [ "TARGET_ARCH_ARM_6" ]
      defines += [ "TARGET_ABI_EABI" ]
    } else if ((dart_target_arch == "armv5te") ||
               (dart_target_arch == "simarmv5te")) {
      defines += [ "TARGET_ARCH_ARM" ]
      defines += [ "TARGET_ARCH_ARM_5TE" ]
      defines += [ "TARGET_ABI_EABI" ]
    } else if ((dart_target_arch == "arm64") ||
               (dart_target_arch == "simarm64")) {
      defines += [ "TARGET_ARCH_ARM64" ]
    } else if ((dart_target_arch == "mips") ||
               (dart_target_arch == "simmips")) {
      defines += [ "TARGET_ARCH_MIPS" ]
    } else if (dart_target_arch == "x64") {
      defines += [ "TARGET_ARCH_X64" ]
    } else if (dart_target_arch == "ia32") {
      defines += [ "TARGET_ARCH_IA32" ]
    } else if ((dart_target_arch == "dbc") ||
               (dart_target_arch == "simdbc") ||
               (dart_target_arch == "simdbc64")) {
      defines += [ "TARGET_ARCH_DBC" ]
      defines += [ "USING_SIMULATOR" ]
    } else  {
      print("Invalid |dart_target_arch|")
      assert(false)
    }
  }

  if (dart_debug) {
    defines += ["DEBUG"]
  } else {
    defines += ["NDEBUG"]
  }

  cflags = [
    "-Werror",
    "-Wall",
    "-Wextra", # Also known as -W.
    "-Wno-unused-parameter",
    "-Wnon-virtual-dtor",
    "-Wvla",
    "-Wno-conversion-null",
    "-Woverloaded-virtual",
    "-g3",
    "-ggdb3",
    "-fno-rtti",
    "-fno-exceptions",
  ]

  if (dart_debug) {
    cflags += [
      "-O1",
    ]
  } else {
    cflags += [
      "-O3",
    ]
  }

  if (defined(is_asan) && is_asan) {
    ldflags = [
      "-Wl,-u_sanitizer_options_link_helper",
      "-fsanitize=address",
    ]
  }
}

template("libdart_library") {
  extra_configs = []
  if (defined(invoker.extra_configs)) {
    extra_configs += invoker.extra_configs
  }
  extra_deps = []
  if (defined(invoker.extra_deps)) {
    extra_deps += invoker.extra_deps
  }
  static_library(target_name) {
    configs += [
      ":dart_config",
      ":dart_maybe_product_config"
    ] + extra_configs
    deps = [
      "vm:libdart_platform",
      "third_party/double-conversion/src:libdouble_conversion",
      ":generate_version_cc_file",
    ] + extra_deps
    include_dirs = [
      ".",
    ]
    public_configs = [":dart_public_config"]
    sources = [
      "include/dart_api.h",
      "include/dart_mirrors_api.h",
      "include/dart_native_api.h",
      "include/dart_tools_api.h",
      "vm/dart_api_impl.cc",
      "vm/debugger_api_impl.cc",
      "vm/mirrors_api_impl.cc",
      "vm/native_api_impl.cc",
      "vm/version.h",
      "$target_gen_dir/version.cc",
    ]
    defines = [
      "DART_SHARED_LIB",
    ]
  }
}

libdart_library("libdart") {
  extra_configs = [
    ":dart_maybe_precompiled_runtime_config"
  ]
  extra_deps = [
    "vm:libdart_lib",
    "vm:libdart_vm",
  ]
}

libdart_library("libdart_precompiled_runtime") {
  extra_configs = [
    ":dart_precompiled_runtime_config"
  ]
  extra_deps = [
    "vm:libdart_lib_precompiled_runtime",
    "vm:libdart_vm_precompiled_runtime",
  ]
}

libdart_library("libdart_nosnapshot") {
  extra_configs = [
    ":dart_no_snapshot_config",
    ":dart_maybe_precompiled_runtime_config"
  ]
  extra_deps = [
    "vm:libdart_lib_nosnapshot",
    "vm:libdart_vm_nosnapshot",
  ]
}

libdart_library("libdart_nosnapshot_precompiled_runtime") {
  extra_configs = [
    ":dart_no_snapshot_config",
    ":dart_precompiled_runtime_config"
  ]
  extra_deps = [
    "vm:libdart_lib_nosnapshot_precompiled_runtime",
    "vm:libdart_vm_nosnapshot_precompiled_runtime",
  ]
}

libdart_library("libdart_nosnapshot_with_precompiler") {
  extra_configs = [
    ":dart_no_snapshot_config",
    ":dart_precompiler_config",
  ]
  extra_deps = [
    "vm:libdart_lib_nosnapshot_with_precompiler",
    "vm:libdart_vm_nosnapshot_with_precompiler",
  ]
}

action("generate_version_cc_file") {
  deps = [
    ":libdart_dependency_helper",
  ]
  inputs = [
    "../tools/utils.py",
    "../tools/print_version.py",
    "../tools/VERSION",
    "vm/version_in.cc",
  ]
  output = "$target_gen_dir/version.cc"
  outputs = [ output, ]

  script = "../tools/make_version.py"
  args = [
    "--quiet",
    "--output", rebase_path(output, root_build_dir),
    "--input", rebase_path("vm/version_in.cc", root_build_dir),
  ]
}


executable("libdart_dependency_helper") {
  configs += [":dart_config",
              ":dart_maybe_product_config"]
  deps = [
    "vm:libdart_lib_nosnapshot",
    "vm:libdart_lib",
    "vm:libdart_vm",
    "vm:libdart_platform",
    "third_party/double-conversion/src:libdouble_conversion",
  ]
  sources = [
    "vm/libdart_dependency_helper.cc",
  ]
}
