# Copyright 2013 The Flutter Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.

if (is_android) {
  import("//build/config/android/config.gni")
}

if (target_cpu == "arm" || target_cpu == "arm64") {
  import("//build/config/arm.gni")
}

declare_args() {
  # The runtime mode ("debug", "profile", "release", or "jit_release")
  flutter_runtime_mode = "debug"

  # Whether to link the Skia text shaper module into the engine
  flutter_enable_skshaper = false

  # Whether to use the Skia text shaper module for all text rendering
  flutter_always_use_skshaper = false

  # Whether to use a prebuilt Dart SDK instead of building one.
  flutter_prebuilt_dart_sdk = false

  # Whether to build the flutter web sdk outline/DDC artifacts.
  flutter_build_web_sdk = false
}

# feature_defines_list ---------------------------------------------------------

feature_defines_list = [
  "FLUTTER_RUNTIME_MODE_DEBUG=1",
  "FLUTTER_RUNTIME_MODE_PROFILE=2",
  "FLUTTER_RUNTIME_MODE_RELEASE=3",
  "FLUTTER_RUNTIME_MODE_JIT_RELEASE=4",
  "DART_LEGACY_API=[[deprecated]]",
]

if (flutter_runtime_mode == "debug") {
  feature_defines_list += [
    "FLUTTER_RUNTIME_MODE=1",
    "FLUTTER_JIT_RUNTIME=1",
  ]
} else if (flutter_runtime_mode == "profile") {
  feature_defines_list += [ "FLUTTER_RUNTIME_MODE=2" ]
} else if (flutter_runtime_mode == "release") {
  feature_defines_list += [
    "FLUTTER_RUNTIME_MODE=3",
    "FLUTTER_RELEASE=1",
  ]
} else if (flutter_runtime_mode == "jit_release") {
  feature_defines_list += [
    "FLUTTER_RUNTIME_MODE=4",
    "FLUTTER_RELEASE=1",
    "FLUTTER_JIT_RUNTIME=1",
  ]
} else {
  feature_defines_list += [ "FLUTTER_RUNTIME_MODE=0" ]
}

if (is_ios || is_mac) {
  flutter_cflags_objc = [
    "-Werror=overriding-method-mismatch",
    "-Werror=undeclared-selector",
  ]
  flutter_cflags_objcc = flutter_cflags_objc
  flutter_cflags_objc_arc = flutter_cflags_objc + [ "-fobjc-arc" ]
  flutter_cflags_objcc_arc = flutter_cflags_objc_arc
}

# A combo of host os name and cpu is used in several locations to
# generate the names of the archived artifacts.
platform_name = host_os
if (platform_name == "mac") {
  platform_name = "darwin"
} else if (platform_name == "win") {
  platform_name = "windows"
}

full_platform_name = "$platform_name-$host_cpu"

target_platform_name = target_os
if (target_platform_name == "mac") {
  platform_target_name = "darwin"
} else if (target_platform_name == "win") {
  target_platform_name = "windows"
}

full_target_platform_name = "$target_platform_name-$target_cpu"

# Prebuilt Dart SDK location

if (flutter_prebuilt_dart_sdk) {
  _target_os_name = target_os
  if (_target_os_name == "mac") {
    _target_os_name = "macos"
  } else if (_target_os_name == "win") {
    _target_os_name = "windows"
  }

  _host_os_name = host_os
  if (_host_os_name == "mac") {
    _host_os_name = "macos"
  } else if (_host_os_name == "win") {
    _host_os_name = "windows"
  }

  _target_prebuilt_dart_sdk_config = "$_target_os_name-$target_cpu"
  _host_prebuilt_dart_sdk_config = "$_host_os_name-$host_cpu"

  target_prebuilt_dart_sdk =
      "//flutter/prebuilts/$_target_prebuilt_dart_sdk_config/dart-sdk"
  host_prebuilt_dart_sdk =
      "//flutter/prebuilts/$_host_prebuilt_dart_sdk_config/dart-sdk"

  # There is no prebuilt Dart SDK targeting Fuchsia, but we also don't need
  # one, so even when the build is targeting Fuchsia, use the prebuilt
  # Dart SDK for the host.
  if (current_toolchain == host_toolchain || is_fuchsia || is_wasm) {
    prebuilt_dart_sdk = host_prebuilt_dart_sdk
    prebuilt_dart_sdk_config = _host_prebuilt_dart_sdk_config
  } else {
    prebuilt_dart_sdk = target_prebuilt_dart_sdk
    prebuilt_dart_sdk_config = _target_prebuilt_dart_sdk_config
  }
}

# Flutter SDK artifacts should only be built when either doing host builds, or
# for cross-compiled desktop targets.
# TODO: We can't build the engine artifacts for arm (32-bit) right now;
# see https://github.com/flutter/flutter/issues/74322
build_engine_artifacts =
    current_toolchain == host_toolchain ||
    (is_linux && !is_chromeos && current_cpu != "arm") || is_mac || is_win
