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

import("../build/dart/dart_host_sdk_toolchain.gni")
import("configs.gni")
import("runtime_args.gni")

if (is_fuchsia) {
  import("//build/fuchsia/sdk.gni")
}

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

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

# This is a config to use to build PRODUCT mode artifacts in a RELEASE build.
# If a DEBUG build has been specified it will be ignored.
config("dart_product_config") {
  defines = []
  if (!dart_debug) {
    defines += [ "PRODUCT" ]
  }
}

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

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

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

config("dart_os_config") {
  defines = []

  # If dart_host_toolchain is the current toolchain, and it is different from
  # host_toolchain, then we are building the SDK for the host, and should not
  # hardcode these defines.
  if (current_toolchain != dart_host_toolchain ||
      host_toolchain == dart_host_toolchain) {
    if (target_os == "android") {
      defines += [ "TARGET_OS_ANDROID" ]
    } else if (target_os == "fuchsia") {
      defines += [ "TARGET_OS_FUCHSIA" ]
    } else if (target_os == "ios") {
      defines += [ "TARGET_OS_MACOS" ]
      defines += [ "TARGET_OS_MACOS_IOS" ]
    } else if (target_os == "linux") {
      defines += [ "TARGET_OS_LINUX" ]
    } else if (target_os == "mac") {
      defines += [ "TARGET_OS_MACOS" ]
    } else if (target_os == "win") {
      defines += [ "TARGET_OS_WINDOWS" ]
    } else {
      print("Unknown target_os: $target_os")
      assert(false)
    }
  }
}

# We need to build gen_snapshot targeting Fuchsia during a build of the SDK
# targeting Mac and Linux. This configuration is used to unconditionally target
# Fuchsia. It should not be combined with dart_os_config.
config("dart_os_fuchsia_config") {
  defines = [ "TARGET_OS_FUCHSIA" ]
}

config("dart_arch_config") {
  defines = []

  # If dart_host_toolchain is the current toolchain, and it is different from
  # host_toolchain, then we are building the SDK for the host, and should not
  # hardcode these defines.
  if (current_toolchain != dart_host_toolchain ||
      host_toolchain == dart_host_toolchain) {
    if (dart_target_arch == "arm") {
      defines += [ "TARGET_ARCH_ARM" ]
    } else if (dart_target_arch == "armv6") {
      defines += [ "TARGET_ARCH_ARM" ]
      defines += [ "TARGET_ARCH_ARM_6" ]
    } else if (dart_target_arch == "armv5te") {
      defines += [ "TARGET_ARCH_ARM" ]
      defines += [ "TARGET_ARCH_ARM_5TE" ]
    } else if (dart_target_arch == "arm64") {
      defines += [ "TARGET_ARCH_ARM64" ]
    } else if (dart_target_arch == "x64") {
      defines += [ "TARGET_ARCH_X64" ]
    } else if (dart_target_arch == "ia32" || dart_target_arch == "x86") {
      defines += [ "TARGET_ARCH_IA32" ]
    } else if (dart_target_arch == "dbc") {
      defines += [ "TARGET_ARCH_DBC" ]
      defines += [ "USING_SIMULATOR" ]
    } else {
      print("Invalid dart_target_arch: $dart_target_arch")
      assert(false)
    }
  }
}

config("dart_config") {
  defines = []

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

  include_dirs = [ "include" ]
  if (dart_use_tcmalloc) {
    defines += [ "DART_USE_TCMALLOC" ]
    include_dirs += [ "../third_party/tcmalloc/gperftools/src" ]
  }

  if (is_fuchsia) {
    if (using_fuchsia_sdk) {
      # TODO(chinmaygarde): Currenty these targets need to be build in the
      # Fuchsia tree as well as outside it using the SDK. However, not all
      # Fuchsia features are available in the SDK. As these features are added,
      # the guards can be removed. Eventually, only SDK builds will be present.
      # Then, this flag can be removed completely.
      defines += [ "FUCHSIA_SDK" ]
    } else {
      include_dirs += [ "//zircon/system/ulib/zx/include" ]
    }
  }

  if (!is_win) {
    cflags = [
      "-Werror",
      "-Wall",
      "-Wextra",  # Also known as -W.
      "-Wno-unused-parameter",
      "-Wno-unused-private-field",
      "-Wnon-virtual-dtor",
      "-Wvla",
      "-Wno-conversion-null",
      "-Woverloaded-virtual",
      "-Wno-comments",  # Conflicts with clang-format.
      "-g3",
      "-ggdb3",
      "-fno-rtti",
      "-fno-exceptions",
      "-Wimplicit-fallthrough",
    ]

    ldflags = []
    if (is_clang && dart_vm_code_coverage) {
      cflags += [
        "-O0",
        "-fprofile-arcs",
        "-ftest-coverage",
      ]
      ldflags += [ "--coverage" ]
    } else if (dart_debug) {
      cflags += [ "-O${dart_debug_optimization_level}" ]
    } else {
      cflags += [ "-O3" ]
    }

    if (defined(is_asan) && is_asan) {
      ldflags += [ "-fsanitize=address" ]
    }
    if (defined(is_msan) && is_msan) {
      ldflags += [ "-fsanitize=memory" ]
    }
    if (defined(is_tsan) && is_tsan) {
      ldflags += [ "-fsanitize=thread" ]
    }

    if (is_fuchsia) {
      # safe-stack does not work with the interpreter.
      cflags += [ "-fno-sanitize=safe-stack" ]
    }
  }
}

config("dart_shared_lib") {
  if (dart_lib_export_symbols) {
    defines = [ "DART_SHARED_LIB" ]
  }
}

config("dart_libfuzzer_config") {
  defines = [ "FUZZING_BUILD_MODE_UNSAFE_FOR_PRODUCTION" ]
  cflags = [ "-fsanitize=address,fuzzer-no-link" ]
  ldflags = [ "-fsanitize=address,fuzzer" ]
}

source_set("dart_api") {
  public_configs = [ ":dart_public_config" ]
  sources = [
    "include/dart_api.h",
    "include/dart_native_api.h",
    "include/dart_tools_api.h",
  ]
}

library_for_all_configs("libdart") {
  target_type = dart_component_kind
  extra_deps = [
    "third_party/double-conversion/src:libdouble_conversion",
    ":generate_version_cc_file",
  ]
  if (is_fuchsia) {
    if (using_fuchsia_sdk) {
      extra_deps += [ "$fuchsia_sdk_root/pkg:fdio" ]
    } else {
      extra_deps += [
        "//zircon/public/lib/fbl",
        "//zircon/public/lib/trace-engine",
      ]
    }
  }
  configurable_deps = [
    "platform:libdart_platform",
    "vm:libdart_lib",
    "vm:libdart_vm",
  ]
  extra_configs = [ ":dart_shared_lib" ]
  include_dirs = [ "." ]
  public_configs = [ ":dart_public_config" ]
  sources = [
    "$target_gen_dir/version.cc",
    "include/dart_api.h",
    "include/dart_native_api.h",
    "include/dart_tools_api.h",
    "vm/dart_api_impl.cc",
    "vm/native_api_impl.cc",
    "vm/version.h",
  ]
}

action("generate_version_cc_file") {
  inputs = [
    "../tools/utils.py",
    "../tools/VERSION",
    "vm/version_in.cc",
  ]
  if (dart_version_git_info) {
    inputs += [ "../.git/logs/HEAD" ]
  }
  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),
  ]
  if (!dart_version_git_info) {
    args += [ "--no_git_hash" ]
  }
  if (dart_custom_version_for_pub != "") {
    args += [
      "--custom_for_pub",
      dart_custom_version_for_pub,
    ]
  }
}
