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

# TODO(zra): These build arguments should likely be moved to a gni file that is
# included in BUILD.gn files that care about the values of the flags. For now,
# since the GN build only happens as part of a Mojo build there is no need for
# the indirection.
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

  # 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 = ""
}

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

config("dart_config") {
  defines = []

  if (dart_target_arch != "") {
    if (dart_target_arch == "arm") {
      defines += [ "TARGET_ARCH_ARM" ]
    } else if (dart_target_arch == "arm64") {
      defines += [ "TARGET_ARCH_ARM64" ]
    } else if (dart_target_arch == "mips") {
      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  {
      print("Invalid |dart_target_arch|")
      assert(false)
    }
  }

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

  if (is_ios || is_mac) {
    defines += ["DART_PRECOMPILER"]
  }

  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 (is_asan) {
    ldflags = [
      "-Wl,-u_sanitizer_options_link_helper",
      "-fsanitize=address",
    ]
  }
}

config("dart_config_no_precompiler") {
  defines = []

  if (dart_target_arch != "") {
    if (dart_target_arch == "arm") {
      defines += [ "TARGET_ARCH_ARM" ]
    } else if (dart_target_arch == "arm64") {
      defines += [ "TARGET_ARCH_ARM64" ]
    } else if (dart_target_arch == "mips") {
      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  {
      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 (is_asan) {
    ldflags = [
      "-Wl,-u_sanitizer_options_link_helper",
      "-fsanitize=address",
    ]
  }
}


static_library("libdart") {
  configs += [":dart_config"]
  deps = [
    "vm:libdart_lib",
    "vm:libdart_vm",
    "third_party/double-conversion/src:libdouble_conversion",
    ":generate_version_cc_file",
  ]
  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 = [
    # Using DART_SHARED_LIB to export the Dart API entries.
    "DART_SHARED_LIB",
  ]
}


static_library("libdart_precompiled_runtime") {
  configs += [":dart_config_no_precompiler"]
  deps = [
    "vm:libdart_lib_precompiled_runtime",
    "vm:libdart_vm_precompiled_runtime",
    "third_party/double-conversion/src:libdouble_conversion",
    ":generate_version_cc_file",
  ]
  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 = [
    # Using DART_SHARED_LIB to export the Dart API entries.
    "DART_SHARED_LIB",
    "DART_PRECOMPILED_RUNTIME",
  ]
}


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),
    "--ignore_svn_revision",
  ]
}


executable("libdart_dependency_helper") {
  configs += [":dart_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",
  ]
}
