# 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" ||
               dart_target_arch == "armsimdbc" ||
               dart_target_arch == "armsimdbc64") {
      defines += [ "TARGET_ARCH_DBC" ]
      defines += [ "USING_SIMULATOR" ]
    } else {
      print("Invalid $dart_target_arch")
      assert(false)
    }
  }

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

  if (!is_win) {
    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 = [ "-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 = [
      "$target_gen_dir/version.cc",
      "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",
    ]
    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_noopt") {
  extra_configs = [
    ":dart_maybe_precompiled_runtime_config",
    ":dart_precompiler_config",
  ]
  extra_deps = [
    "vm:libdart_lib",
    "vm:libdart_vm_noopt",
  ]
}

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_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 = [
    "third_party/double-conversion/src:libdouble_conversion",
    "vm:libdart_lib",
    "vm:libdart_lib_nosnapshot",
    "vm:libdart_vm",
    "vm:libdart_vm_nosnapshot",
  ]
  sources = [
    "vm/libdart_dependency_helper.cc",
  ]
}
