#!/usr/bin/env vpython3
# 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.

from __future__ import absolute_import
from __future__ import division
from __future__ import print_function

import argparse
import subprocess
import sys
import os
import platform

SRC_ROOT = os.path.dirname(
    os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
)


def get_out_dir(args):
  if args.target_os is not None:
    target_dir = [args.target_os]
  elif args.web:
    target_dir = ['wasm']
  else:
    target_dir = ['host']

  target_dir.append(args.runtime_mode)

  if args.simulator:
    target_dir.append('sim')

  if args.unoptimized:
    target_dir.append('unopt')

  if args.target_os != 'ios' and args.interpreter:
    target_dir.append('interpreter')

  if args.android_cpu != 'arm':
    target_dir.append(args.android_cpu)

  if args.ios_cpu != 'arm64':
    target_dir.append(args.ios_cpu)

  if args.mac_cpu != 'x64':
    target_dir.append(args.mac_cpu)

  if args.simulator_cpu != 'x64':
    target_dir.append(args.simulator_cpu)

  if args.linux_cpu is not None:
    target_dir.append(args.linux_cpu)

  if args.windows_cpu != 'x64':
    target_dir.append(args.windows_cpu)

  if args.target_os == 'fuchsia' and args.fuchsia_cpu is not None:
    target_dir.append(args.fuchsia_cpu)

  # This exists for backwards compatibility of tests that are being run
  # on LUCI. This can be removed in coordination with a LUCI change:
  # https://github.com/flutter/flutter/issues/76547
  if args.macos_enable_metal:
    target_dir.append('metal')

  if args.target_dir != '':
    target_dir = [args.target_dir]

  return os.path.join(args.out_dir, 'out', '_'.join(target_dir))


def to_command_line(gn_args):
  """Converts the arguments dictionary to a list of command-line arguments.

    Args:
      gn_args: GN arguments dictionary generated by to_gn_args().
    """

  def merge(key, value):
    if isinstance(value, bool):
      return '%s=%s' % (key, 'true' if value else 'false')
    return '%s="%s"' % (key, value)

  return [merge(x, y) for x, y in gn_args.items()]


def cpu_for_target_arch(arch):
  if arch in ['ia32', 'x86', 'arm', 'armv6', 'armv5te', 'mips', 'simarm',
              'simarmv6', 'simarmv5te', 'simmips', 'simdbc', 'armsimdbc']:
    return 'x86'
  if arch in ['x64', 'arm64', 'simarm64', 'simdbc64', 'armsimdbc64']:
    return 'x64'
  return None


def is_host_build(args):
  # If target_os == None, then this is a host build.
  if args.target_os is None:
    return True
  # For linux arm64 builds, we cross compile from x64 hosts, so the
  # target_os='linux' and linux-cpu='arm64'
  if args.target_os == 'linux' and args.linux_cpu == 'arm64':
    return True
  # The Mac and host targets are redundant. Again, necessary to disambiguate
  # during cross-compilation.
  if args.target_os == 'mac':
    return True
  return False


# Determines whether a prebuilt Dart SDK can be used instead of building one.
# We can use a prebuilt Dart SDK when:
# 1. It is a host build, a build targeting Fuchsia, or a build targeting desktop.
# 2. The prebuilt SDK exists under //flutter/prebuilts/$OS-$ARCH.
def can_use_prebuilt_dart(args):
  prebuilt = None
  # In a Fuchsia build, we can use a prebuilt Dart SDK for the host to build
  # platform agnostic artifacts (e.g. kernel snapshots), and a Dart SDK
  # targeting Fuchsia is not needed. So, it is safe to say that the prebuilt
  # Dart SDK in a Fuchsia build is the host prebuilt Dart SDK.
  if args.target_os is None or args.target_os == 'fuchsia':
    if sys.platform.startswith(('cygwin', 'win')):
      prebuilt = 'windows-x64'
    elif sys.platform == 'darwin':
      prebuilt = 'macos-x64'
    else:
      prebuilt = 'linux-x64'
  elif args.target_os == 'linux' and args.linux_cpu in ['x64', 'arm64']:
    prebuilt = 'linux-%s' % args.linux_cpu
  elif args.target_os == 'mac' and args.mac_cpu in ['x64', 'arm64']:
    prebuilt = 'macos-%s' % args.mac_cpu
  elif args.target_os == 'win' and args.windows_cpu in ['x64', 'arm64']:
    prebuilt = 'windows-%s' % args.windows_cpu

  prebuilts_dir = None
  if prebuilt is not None:
    prebuilts_dir = os.path.join(SRC_ROOT, 'flutter', 'prebuilts', prebuilt)
  return prebuilts_dir is not None and os.path.isdir(prebuilts_dir)


# Returns the host machine operating system.
def get_host_os():
  if sys.platform.startswith(('cygwin', 'win')):
    return 'win'
  if sys.platform == 'darwin':
    return 'mac'
  return 'linux'


# Runs true if the currently executing python interpreter is running under
# Rosetta. I.e., python3 is an x64 executable and we're on an arm64 Mac.
def is_rosetta():
  if platform.system() == 'Darwin':
    proc = subprocess.Popen(['sysctl', '-in', 'sysctl.proc_translated'],
                            stdout=subprocess.PIPE,
                            stderr=subprocess.STDOUT)
    output, _ = proc.communicate()
    return output.decode('utf-8').strip() == '1'
  return False


# Returns the host machine CPU architecture.
def get_host_cpu():
  # If gn itself is running under Rosetta on an arm64 Mac, platform.machine()
  # will return x86_64; instead return the underlying host architecture.
  if is_rosetta():
    return 'arm64'
  machine = platform.machine()
  if machine in ['aarch64', 'arm64', 'ARM64']:
    return 'arm64'
  if machine in ['x86_64', 'AMD64', 'x64']:
    return 'x64'
  if machine in ['i686', 'i386', 'x86']:
    return 'x86'
  raise Exception('Unknown CPU architecture: %s' % machine)


# Returns the target CPU architecture.
#
# For macOS host builds where --mac-cpu is specified, returns that value.
# For windows host builds where --windows-cpu is specified, returns that value.
# For all other host builds, assumes 'x64'.
def get_target_cpu(args):
  if args.target_os == 'android':
    return args.android_cpu
  if args.target_os == 'ios':
    if args.simulator:
      return args.simulator_cpu
    return args.ios_cpu
  if args.target_os == 'mac':
    return args.mac_cpu
  if args.target_os == 'linux':
    return args.linux_cpu
  if args.target_os == 'fuchsia':
    return args.fuchsia_cpu
  if args.target_os == 'wasm':
    return 'wasm'
  if args.target_os == 'win':
    return args.windows_cpu

  # Host build. Default to x64 unless overridden.
  if get_host_os() == 'mac' and args.mac_cpu:
    return args.mac_cpu
  if get_host_os() == 'win' and args.windows_cpu:
    return args.windows_cpu

  return 'x64'


def to_gn_args(args):
  if args.simulator:
    if args.target_os != 'ios':
      raise Exception('--simulator is only supported for iOS')

  runtime_mode = args.runtime_mode

  gn_args = {}

  gn_args['is_debug'] = args.unoptimized

  goma_dir = os.environ.get('GOMA_DIR')
  goma_home_dir = os.path.join(os.getenv('HOME', ''), 'goma')
  depot_tools_bin_dir = os.path.join(args.depot_tools, '.cipd_bin')

  # GOMA has a different default (home) path on gWindows.
  if not os.path.exists(goma_home_dir) and sys.platform.startswith(
      ('cygwin', 'win')):
    goma_home_dir = os.path.join('c:\\', 'src', 'goma', 'goma-win64')

  if args.target_os == 'wasm' or args.web:
    gn_args['use_goma'] = False
    gn_args['goma_dir'] = None
    print('Disabling GOMA for wasm builds, it is not supported yet.')
  elif args.goma and goma_dir:
    gn_args['use_goma'] = True
    gn_args['goma_dir'] = goma_dir
  elif args.goma and os.path.exists(goma_home_dir):
    gn_args['use_goma'] = True
    gn_args['goma_dir'] = goma_home_dir
  elif args.goma and os.path.exists(depot_tools_bin_dir):
    gn_args['use_goma'] = True
    gn_args['goma_dir'] = depot_tools_bin_dir
  else:
    if args.goma:
      print(
          "GOMA usage was specified but can't be found, falling back to local "
          'builds. Set the GOMA_DIR environment variable to fix GOMA.'
      )
    gn_args['use_goma'] = False
    gn_args['goma_dir'] = None

  if gn_args['use_goma']:
    if args.xcode_symlinks or os.getenv('FLUTTER_GOMA_CREATE_XCODE_SYMLINKS',
                                        '0') == '1':
      gn_args['create_xcode_symlinks'] = True

  # If building for WASM, set the GN args using 'to_gn_wasm_args' as most
  # of the Flutter SDK specific arguments are unused.
  if args.target_os == 'wasm' or args.web:
    to_gn_wasm_args(args, gn_args)
    return gn_args

  gn_args['flutter_build_web_sdk'] = args.build_web_sdk
  gn_args['full_dart_sdk'] = args.full_dart_sdk
  if args.build_web_sdk or args.full_dart_sdk:
    gn_args['build_canvaskit'] = args.build_canvaskit

  if args.enable_unittests:
    gn_args['enable_unittests'] = args.enable_unittests

  # Skia GN args.
  gn_args['skia_enable_flutter_defines'
         ] = True  # Enable Flutter API guards in Skia.
  gn_args['skia_use_dng_sdk'] = False  # RAW image handling.
  gn_args['skia_use_sfntly'] = False  # PDF handling dependency.
  gn_args['skia_enable_pdf'] = False  # PDF handling.
  gn_args['skia_use_x11'
         ] = False  # Never add the X11 dependency (only takes effect on Linux).
  gn_args['skia_use_wuffs'] = True
  gn_args['skia_use_expat'] = args.target_os == 'android'
  gn_args['skia_use_fontconfig'] = args.enable_fontconfig
  gn_args['skia_use_legacy_layer_bounds'
         ] = True  # Temporary: See skbug.com/12083, skbug.com/12303.

  if args.enable_skshaper:
    gn_args['skia_use_icu'] = True
    gn_args['flutter_always_use_skshaper'] = args.always_use_skshaper
  gn_args['is_official_build'] = True  # Disable Skia test utilities.
  gn_args['android_full_debug'
         ] = args.target_os == 'android' and args.unoptimized
  if args.clang is None:
    gn_args['is_clang'] = True
  else:
    gn_args['is_clang'] = args.clang

  if args.target_os == 'android' or args.target_os == 'ios':
    gn_args['skia_gl_standard'] = 'gles'
  else:
    # We explicitly don't want to pick GL because we run GLES tests using SwiftShader.
    gn_args['skia_gl_standard'] = ''

  if not sys.platform.startswith(('cygwin', 'win')):
    gn_args['use_clang_static_analyzer'] = args.clang_static_analyzer

  gn_args['enable_coverage'] = args.coverage

  if args.operator_new_alignment is not None:
    gn_args['operator_new_alignment'] = args.operator_new_alignment

  enable_lto = args.lto
  if args.unoptimized:
    # There is no point in enabling LTO in unoptimized builds.
    enable_lto = False

  if not sys.platform.startswith('win'):
    # The GN arg is not available in the windows toolchain.
    gn_args['enable_lto'] = enable_lto

  # Set OS, CPU arch for host or target build.
  if is_host_build(args):
    gn_args['host_os'] = get_host_os()
    gn_args['host_cpu'] = get_host_cpu()
    gn_args['target_os'] = gn_args['host_os']
    gn_args['target_cpu'] = get_target_cpu(args)
    gn_args['dart_target_arch'] = gn_args['target_cpu']
  else:
    gn_args['target_os'] = args.target_os
    gn_args['target_cpu'] = get_target_cpu(args)
    gn_args['dart_target_arch'] = gn_args['target_cpu']

  # We cannot cross-compile for 32 bit arm on a Windows host. We work around
  # this by leaving 'target_cpu' and 'dart_target_arch' set to 'arm' so that
  # Dart tools such as gen_snapshot that are built for the host will correctly
  # target arm, but we hardcode the 'current_cpu' to always be the host arch
  # so that the GN build doesn't go looking for a Windows arm toolchain, which
  # does not exist. Further, we set the 'host_cpu' so that it shares the
  # bitwidth of the 32-bit arm target.
  if sys.platform.startswith(
      ('cygwin', 'win')
  ) and args.target_os == 'android' and gn_args['target_cpu'] == 'arm':
    gn_args['host_cpu'] = 'x86'
    gn_args['current_cpu'] = 'x86'

  # When building binaries to run on a macOS host (like gen_snapshot), always
  # use the clang_x64 toolchain, which will run under Rosetta. This is done for
  # two reasons:
  #  1. goma currently only supports the clang_x64 toolchain.
  #  2. gen_snapshot cannot crossbuild from arm64 to x64. Its host architecture
  #     must be x64 to target x64.
  # TODO(cbracken): https://github.com/flutter/flutter/issues/103386
  if get_host_os() == 'mac' and not args.force_mac_arm64:
    gn_args['host_cpu'] = 'x64'

  if is_host_build(args) and gn_args['host_os'] == 'mac':
    # macOS unit tests include Vulkan headers which reference Metal types
    # introduced in macOS 10.14.
    gn_args['mac_sdk_min'] = '10.14'
    gn_args['mac_deployment_target'] = '10.14.0'

  if gn_args['target_os'] == 'ios':
    gn_args['use_ios_simulator'] = args.simulator
  elif get_host_os() == 'mac':
    gn_args['use_ios_simulator'] = False

  if args.dart_debug:
    gn_args['dart_debug'] = True

  if args.full_dart_debug:
    gn_args['dart_debug'] = True
    gn_args['dart_debug_optimization_level'] = '0'

  gn_args['flutter_use_fontconfig'] = args.enable_fontconfig
  gn_args['flutter_enable_skshaper'] = args.enable_skshaper
  gn_args['dart_component_kind'
         ] = 'static_library'  # Always link Dart in statically.
  gn_args['embedder_for_target'] = args.embedder_for_target
  gn_args['dart_lib_export_symbols'] = False
  gn_args['flutter_runtime_mode'] = runtime_mode
  gn_args['dart_version_git_info'] = not args.no_dart_version_git_info

  gn_args['dart_lib_export_symbols'] = False
  if runtime_mode == 'debug':
    gn_args['dart_runtime_mode'] = 'develop'
  elif runtime_mode == 'jit_release':
    gn_args['dart_runtime_mode'] = 'release'
  else:
    gn_args['dart_runtime_mode'] = runtime_mode

  # Desktop embeddings can have more dependencies than the engine library,
  # which can be problematic in some build environments (e.g., building on
  # Linux will bring in pkg-config dependencies at generation time). These
  # flags allow preventing those targets from being part of the build tree.
  gn_args['enable_desktop_embeddings'] = not args.disable_desktop_embeddings

  # Overrides whether Boring SSL is compiled with system as. Only meaningful
  # on Android.
  gn_args['bssl_use_clang_integrated_as'] = True

  if args.allow_deprecated_api_calls:
    gn_args['allow_deprecated_api_calls'] = args.allow_deprecated_api_calls

  # DBC is not supported anymore.
  if args.interpreter:
    raise Exception(
        '--interpreter is no longer needed on any supported platform.'
    )

  if args.target_os is None:
    if sys.platform.startswith(('cygwin', 'win')):
      gn_args['dart_use_fallback_root_certificates'] = True

  if args.target_sysroot:
    gn_args['target_sysroot'] = args.target_sysroot
    gn_args['custom_sysroot'] = args.target_sysroot

  if args.target_toolchain:
    gn_args['custom_toolchain'] = args.target_toolchain

  if args.target_triple:
    gn_args['custom_target_triple'] = args.target_triple

  # Enable Metal on iOS builds.
  if args.target_os == 'ios':
    gn_args['shell_enable_gl'] = False
    gn_args['skia_use_gl'] = False
    gn_args['shell_enable_metal'] = True
    gn_args['skia_use_metal'] = True
    # Bitcode enabled builds using the current version of the toolchain leak
    # C++ symbols decorated with the availability attribute. Disable these
    # attributes in release modes till the toolchain is updated.
    gn_args['skia_enable_api_available_macro'] = args.runtime_mode != 'release'
  else:
    gn_args['skia_use_gl'] = args.target_os != 'fuchsia'

  if sys.platform == 'darwin' and args.target_os not in ['android', 'fuchsia']:
    # OpenGL is deprecated on macOS > 10.11.
    # This is not necessarily needed but enabling this until we have a way to
    # build a macOS metal only shell and a gl only shell.
    gn_args['allow_deprecated_api_calls'] = True
    gn_args['skia_use_metal'] = True
    gn_args['shell_enable_metal'] = True

  # Enable Vulkan on all platforms except for iOS. This is just
  # to save on mobile binary size, as there's no reason the Vulkan embedder
  # features can't work on these platforms.
  if args.target_os not in ['ios']:
    gn_args['skia_use_vulkan'] = True
    gn_args['skia_use_vma'] = False
    gn_args['shell_enable_vulkan'] = True
    # Disable VMA's use of std::shared_mutex in environments where the
    # standard library doesn't support it.
    if args.target_os == 'ios' or sys.platform.startswith(('cygwin', 'win')):
      gn_args['disable_vma_stl_shared_mutex'] = True

  # We should not need a special case for x86, but this seems to introduce text relocations
  # even with -fPIC everywhere.
  # gn_args['enable_profiling'] = args.runtime_mode != 'release' and args.android_cpu != 'x86'

  # Make symbols visible in order to enable symbolization of unit test crash backtraces on Linux
  gn_args['disable_hidden_visibility'
         ] = args.target_os == 'linux' and args.unoptimized

  if args.arm_float_abi:
    gn_args['arm_float_abi'] = args.arm_float_abi

  # If we have a prebuilt for the Dart SDK for the target architecture, then
  # use it instead of building a new one.
  if args.prebuilt_dart_sdk:
    if can_use_prebuilt_dart(args):
      print(
          'Using prebuilt Dart SDK binary. If you are editing Dart sources '
          'and wish to compile the Dart SDK, set `--no-prebuilt-dart-sdk`.'
      )
      gn_args['flutter_prebuilt_dart_sdk'] = True
      gn_args['dart_sdk_output'] = 'built-dart-sdk'
    elif is_host_build(args):
      print(
          'Tried to download prebuilt Dart SDK but an appropriate version '
          'could not be found!'
      )
      print(
          'Either retry by running '
          'flutter/tools/download_dart_sdk.py manually or compile from '
          'source by setting `--no-prebuilt-dart-sdk` flag to tools/gn'
      )
  elif is_host_build(args):
    # dart_platform_sdk is only defined for host builds, linux arm host builds
    # specify target_os=linux.
    # dart_platform_sdk=True means exclude web-related files, e.g. dart2js,
    # dartdevc, web SDK kernel and source files.
    gn_args['dart_platform_sdk'] = not args.full_dart_sdk

  if args.build_glfw_shell is not None:
    gn_args['build_glfw_shell'] = args.build_glfw_shell

  if args.build_embedder_examples is not None:
    gn_args['build_embedder_examples'] = args.build_embedder_examples

  gn_args['stripped_symbols'] = args.stripped

  if args.msan:
    gn_args['is_msan'] = True

  if args.asan:
    gn_args['is_asan'] = True

  if args.tsan:
    gn_args['is_tsan'] = True

  if args.lsan:
    gn_args['is_lsan'] = True

  if args.ubsan:
    gn_args['is_ubsan'] = True

  if args.fstack_protector:
    gn_args['use_fstack_protector'] = True

  if args.enable_vulkan_validation_layers:
    if args.target_os != 'fuchsia':
      print(
          'Vulkan validation layers are currently only supported on Fuchsia targets.'
      )
      sys.exit(1)
    gn_args['enable_vulkan_validation_layers'] = True

  # Enable pointer compression on 64-bit mobile targets. iOS is excluded due to
  # its inability to allocate address space without allocating memory.
  if args.target_os in ['android'] and gn_args['target_cpu'] in ['x64', 'arm64'
                                                                ]:
    gn_args['dart_use_compressed_pointers'] = True

  if args.fuchsia_target_api_level is not None:
    gn_args['fuchsia_target_api_level'] = args.fuchsia_target_api_level
  elif args.target_os == 'fuchsia':
    # Read the default target api level from a file so we can update it with a roller
    with open(os.path.join(os.path.dirname(__file__),
                           'fuchsia/target_api_level')) as file:
      gn_args['fuchsia_target_api_level'] = int(file.read().strip())

  # Flags for Dart features:
  if args.use_mallinfo2:
    gn_args['dart_use_mallinfo2'] = args.use_mallinfo2

  # Impeller flags.
  if args.enable_impeller_playground:
    gn_args['impeller_enable_playground'] = args.enable_impeller_playground
  elif os.getenv('FLUTTER_IMPELLER_ENABLE_PLAYGROUND', '0') == '1':
    gn_args['impeller_enable_playground'] = True

  if args.enable_impeller_3d:
    gn_args['impeller_enable_3d'] = True

  if args.prebuilt_impellerc is not None:
    gn_args['impeller_use_prebuilt_impellerc'] = args.prebuilt_impellerc

  if args.malioc_path is not None:
    gn_args['impeller_malioc_path'] = args.malioc_path

  # ANGLE is exclusively used for:
  #  - Windows at runtime
  #  - Non-fuchsia host unit tests (is_host_build evaluates to false).
  # Setting these variables creates warnings otherwise.
  # If we add ANGLE usage on other platforms, include them here.
  # There is a special case for Android on Windows because there we _only_ build
  # gen_snapshot, but the build defines otherwise make it look like the build is
  # for a host Windows build and make GN think we will be building ANGLE.
  if is_host_build(args) or (args.target_os == 'android' and
                             get_host_os() == 'win'):
    # Do not build unnecessary parts of the ANGLE tree.
    gn_args['angle_build_all'] = False
    gn_args['angle_has_astc_encoder'] = False
    # Force ANGLE context checks on Windows to prevent crashes.
    # TODO(loic-sharma): Remove this once ANGLE crashes have been fixed.
    # https://github.com/flutter/flutter/issues/114107
    if get_host_os() == 'win':
      gn_args['angle_force_context_check_every_call'] = True

    # ANGLE and SwiftShader share build flags to enable X11 and Wayland,
    # but we only need these enabled for SwiftShader.
    gn_args['angle_use_x11'] = False
    gn_args['angle_use_wayland'] = False

    # Requires RTTI. We may want to build this in debug modes, punting on that
    # for now.
    gn_args['angle_enable_vulkan_validation_layers'] = False
    gn_args['angle_vulkan_headers_dir'
           ] = '//third_party/vulkan-deps/vulkan-headers/src'
    gn_args['angle_vulkan_loader_dir'
           ] = '//third_party/vulkan-deps/vulkan-loader/src'
    gn_args['angle_vulkan_tools_dir'
           ] = '//third_party/vulkan-deps/vulkan-tools/src'

  return gn_args


# When building for WASM, almost all GN args used in the Flutter SDK
# build are unused. This method is used instead.
def to_gn_wasm_args(args, gn_args):
  gn_args['is_official_build'] = True
  gn_args['skia_enable_flutter_defines'] = True
  gn_args['is_component_build'] = False
  gn_args['use_clang_static_analyzer'] = False
  gn_args['is_clang'] = True
  gn_args['target_os'] = 'wasm'
  gn_args['target_cpu'] = 'wasm'
  gn_args['skia_use_angle'] = False
  gn_args['skia_use_dng_sdk'] = False
  gn_args['skia_use_expat'] = False
  gn_args['skia_use_vulkan'] = False
  gn_args['skia_use_webgpu'] = False
  gn_args['skia_use_libheif'] = False
  gn_args['skia_use_libjpeg_turbo_decode'] = True
  gn_args['skia_use_libjpeg_turbo_encode'] = False
  gn_args['skia_use_libpng_decode'] = True
  gn_args['skia_use_libpng_encode'] = True
  gn_args['skia_use_libwebp_decode'] = True
  gn_args['skia_use_libwebp_encode'] = False
  gn_args['skia_use_lua'] = False
  gn_args['skia_use_wuffs'] = True
  gn_args['skia_use_zlib'] = True
  gn_args['skia_gl_standard'] = 'webgl'
  gn_args['skia_enable_gpu'] = True
  gn_args['skia_enable_sksl_tracing'] = False
  gn_args['icu_use_data_file'] = False
  gn_args['skia_use_freetype'] = True
  gn_args['skia_use_harfbuzz'] = True
  gn_args['skia_use_fontconfig'] = False
  gn_args['skia_use_libheif'] = False
  gn_args['skia_enable_fontmgr_custom_directory'] = False
  gn_args['skia_enable_fontmgr_custom_embedded'] = True
  gn_args['skia_enable_fontmgr_custom_empty'] = True
  gn_args['skia_fontmgr_factory'
         ] = '//third_party/skia:fontmgr_custom_empty_factory'
  gn_args['skia_enable_skshaper'] = True
  gn_args['skia_enable_skparagraph'] = True
  gn_args['skia_canvaskit_force_tracing'] = False
  gn_args['skia_canvaskit_enable_skp_serialization'] = True
  gn_args['skia_canvaskit_enable_effects_deserialization'] = False
  gn_args['skia_canvaskit_enable_skottie'] = False
  gn_args['skia_canvaskit_include_viewer'] = False
  gn_args['skia_canvaskit_enable_particles'] = False
  gn_args['skia_canvaskit_enable_pathops'] = True
  gn_args['skia_canvaskit_enable_rt_shader'] = True
  gn_args['skia_canvaskit_enable_matrix_helper'] = False
  gn_args['skia_canvaskit_enable_canvas_bindings'] = False
  gn_args['skia_canvaskit_enable_font'] = True
  gn_args['skia_canvaskit_enable_embedded_font'] = False
  gn_args['skia_canvaskit_enable_alias_font'] = True
  gn_args['skia_canvaskit_legacy_draw_vertices_blend_mode'] = False
  gn_args['skia_canvaskit_enable_debugger'] = False
  gn_args['skia_canvaskit_enable_paragraph'] = True
  gn_args['skia_canvaskit_enable_webgl'] = True
  gn_args['skia_canvaskit_enable_webgpu'] = False
  is_profile_build = args.runtime_mode == 'profile' or args.runtime_mode == 'debug'
  gn_args['skia_canvaskit_profile_build'] = is_profile_build
  gn_args['flutter_prebuilt_dart_sdk'] = True

  # TODO(jacksongardner): Make this based off of the input argument rather
  # than forced to true, once the recipes are updated.
  # https://github.com/flutter/flutter/issues/113303
  gn_args['build_canvaskit'] = True
  gn_args['build_canvaskit_chromium'] = args.build_canvaskit_chromium
  gn_args['flutter_build_web_sdk'] = True


def parse_args(args):
  args = args[1:]
  parser = argparse.ArgumentParser(description='A script to run `gn gen`.')

  parser.add_argument('--unoptimized', default=False, action='store_true')

  parser.add_argument('--enable-unittests', action='store_true', default=False)

  parser.add_argument(
      '--runtime-mode',
      type=str,
      choices=['debug', 'profile', 'release', 'jit_release'],
      default='debug'
  )
  parser.add_argument('--interpreter', default=False, action='store_true')
  parser.add_argument(
      '--dart-debug',
      default=False,
      action='store_true',
      help='Enables assertions in the Dart VM. Does not affect optimization '
      'levels. If you need to disable optimizations in Dart, use '
      '--full-dart-debug'
  )
  parser.add_argument(
      '--no-dart-version-git-info',
      default=False,
      action='store_true',
      help='Set by default; if unset, turns off the dart SDK git hash check'
  )
  parser.add_argument(
      '--full-dart-debug',
      default=False,
      action='store_true',
      help='Implies --dart-debug and also disables optimizations in the Dart '
      'VM making it easier to step through VM code in the debugger.'
  )

  parser.add_argument(
      '--target-os',
      type=str,
      choices=['android', 'ios', 'mac', 'linux', 'fuchsia', 'wasm', 'win']
  )
  parser.add_argument(
      '--android', dest='target_os', action='store_const', const='android'
  )
  parser.add_argument(
      '--android-cpu',
      type=str,
      choices=['arm', 'x64', 'x86', 'arm64'],
      default='arm'
  )
  parser.add_argument(
      '--ios', dest='target_os', action='store_const', const='ios'
  )
  parser.add_argument(
      '--ios-cpu', type=str, choices=['arm', 'arm64'], default='arm64'
  )
  parser.add_argument(
      '--mac', dest='target_os', action='store_const', const='mac'
  )
  parser.add_argument(
      '--mac-cpu', type=str, choices=['x64', 'arm64'], default='x64'
  )
  parser.add_argument(
      '--force-mac-arm64',
      action='store_true',
      default=False,
      help='Force use of the clang_arm64 toolchain on an arm64 mac host when '
      'building host binaries.'
  )
  parser.add_argument('--simulator', action='store_true', default=False)
  parser.add_argument(
      '--linux', dest='target_os', action='store_const', const='linux'
  )
  parser.add_argument(
      '--fuchsia', dest='target_os', action='store_const', const='fuchsia'
  )
  parser.add_argument(
      '--wasm', dest='target_os', action='store_const', const='wasm'
  )
  parser.add_argument('--web', action='store_true', default=False)
  parser.add_argument(
      '--windows', dest='target_os', action='store_const', const='win'
  )

  parser.add_argument(
      '--linux-cpu', type=str, choices=['x64', 'x86', 'arm64', 'arm']
  )
  parser.add_argument(
      '--fuchsia-cpu', type=str, choices=['x64', 'arm64'], default='x64'
  )
  parser.add_argument(
      '--windows-cpu', type=str, choices=['x64', 'arm64', 'x86'], default='x64'
  )
  parser.add_argument(
      '--simulator-cpu', type=str, choices=['x64', 'arm64'], default='x64'
  )
  parser.add_argument(
      '--arm-float-abi', type=str, choices=['hard', 'soft', 'softfp']
  )

  parser.add_argument('--goma', default=True, action='store_true')
  parser.add_argument('--no-goma', dest='goma', action='store_false')
  parser.add_argument(
      '--xcode-symlinks',
      action='store_true',
      help='Set to true for builds targeting macOS or iOS when using goma. If '
      'set, symlinks to the Xcode provided sysroot and SDKs will be '
      'created in a generated folder, which will avoid potential backend '
      'errors in Fuchsia RBE. Instead of specifying the flag on each '
      'invocation the FLUTTER_GOMA_CREATE_XCODE_SYMLINKS environment '
      'variable may be set to 1 to achieve the same effect.'
  )
  parser.add_argument(
      '--no-xcode-symlinks',
      dest='xcode_symlinks',
      default=False,
      action='store_false'
  )
  parser.add_argument(
      '--depot-tools',
      default='~/depot_tools',
      type=str,
      help='Depot tools provides an alternative location for gomacc in ' +
      '/path/to/depot_tools/.cipd_bin'
  )

  parser.add_argument('--lto', default=True, action='store_true')
  parser.add_argument('--no-lto', dest='lto', action='store_false')

  parser.add_argument('--clang', action='store_const', const=True)
  parser.add_argument(
      '--no-clang', dest='clang', action='store_const', const=False
  )

  parser.add_argument(
      '--clang-static-analyzer', default=False, action='store_true'
  )
  parser.add_argument(
      '--no-clang-static-analyzer',
      dest='clang_static_analyzer',
      action='store_false'
  )

  parser.add_argument('--target-sysroot', type=str)
  parser.add_argument('--target-toolchain', type=str)
  parser.add_argument('--target-triple', type=str)
  parser.add_argument(
      '--operator-new-alignment',
      dest='operator_new_alignment',
      type=str,
      default=None
  )

  parser.add_argument(
      '--macos-enable-metal', action='store_true', default=False
  )
  parser.add_argument('--enable-vulkan', action='store_true', default=False)

  parser.add_argument('--enable-fontconfig', action='store_true', default=False)
  parser.add_argument(
      '--enable-vulkan-validation-layers', action='store_true', default=False
  )

  parser.add_argument('--enable-skshaper', action='store_true', default=True)
  parser.add_argument(
      '--no-enable-skshaper', dest='enable_skshaper', action='store_false'
  )
  parser.add_argument(
      '--always-use-skshaper', action='store_true', default=False
  )

  parser.add_argument(
      '--embedder-for-target',
      dest='embedder_for_target',
      action='store_true',
      default=False
  )

  parser.add_argument('--coverage', default=False, action='store_true')

  parser.add_argument(
      '--out-dir',
      default='',
      type=str,
      help='Root out directory. Target specific gn files will be generated in ${out-dir}/'
  )
  parser.add_argument(
      '--target-dir',
      default='',
      type=str,
      help='Use the specified name for target out directory. By default this tool determines one.'
  )

  parser.add_argument(
      '--full-dart-sdk',
      default=False,
      action='store_true',
      help='include trained dart2js and dartdevc snapshots. Enable only on steps that create an SDK'
  )
  parser.add_argument(
      '--no-full-dart-sdk', dest='full_dart_sdk', action='store_false'
  )

  parser.add_argument(
      '--build-web-sdk',
      default=False,
      action='store_true',
      help='build the flutter web sdk'
  )
  parser.add_argument(
      '--no-build-web-sdk', dest='build_web_sdk', action='store_false'
  )

  parser.add_argument(
      '--build-canvaskit',
      default=False,
      action='store_true',
      help='build canvaskit from source'
  )
  parser.add_argument(
      '--no-build-canvaskit', dest='build_canvaskit', action='store_false'
  )

  parser.add_argument(
      '--build-canvaskit-chromium',
      default=False,
      dest='build_canvaskit_chromium',
      action='store_true',
      help='build the Chromium variant of CanvasKit from sources'
  )

  parser.add_argument(
      '--ide',
      default='',
      type=str,
      help='The IDE files to generate using GN. Use `gn gen help` and look for the --ide flag to'
      +
      ' see supported IDEs. If this flag is not specified, a platform specific default is selected.'
  )

  parser.add_argument(
      '--allow-deprecated-api-calls',
      action='store_true',
      default=False,
      help='Turns off warnings about the usage of deprecated APIs.'
  )

  parser.add_argument(
      '--disable-desktop-embeddings',
      default=False,
      action='store_true',
      help='Do not include desktop embeddings in the build.'
  )
  parser.add_argument(
      '--build-glfw-shell',
      action='store_const',
      const=True,
      help='Build the GLFW shell on supported platforms where it is not built by default.'
  )
  parser.add_argument(
      '--no-build-glfw-shell',
      dest='build_glfw_shell',
      action='store_const',
      const=False,
      help='Do not build the GLFW shell on platforms where it is built by default.'
  )
  parser.add_argument(
      '--build-embedder-examples',
      action='store_const',
      const=True,
      help='Build the example embedders using the Embedder API.'
  )
  parser.add_argument(
      '--no-build-embedder-examples',
      dest='build_embedder_examples',
      action='store_const',
      const=False,
      help='Do not build the example embedders using the Embedder API.'
  )

  parser.add_argument(
      '--stripped',
      default=True,
      action='store_true',
      help='Strip debug symbols from the output. This defaults to true and has no effect on iOS.'
  )
  parser.add_argument('--no-stripped', dest='stripped', action='store_false')

  parser.add_argument(
      '--prebuilt-dart-sdk',
      default=True,
      action='store_true',
      help='Whether to use a prebuilt Dart SDK instead of building one. This defaults to '
      + 'true and is enabled on CI.'
  )
  parser.add_argument(
      '--no-prebuilt-dart-sdk', dest='prebuilt_dart_sdk', action='store_false'
  )

  parser.add_argument(
      '--fuchsia-target-api-level', dest='fuchsia_target_api_level'
  )

  # Flags for Dart features.
  parser.add_argument(
      '--use-mallinfo2',
      dest='use_mallinfo2',
      default=False,
      action='store_true',
      help='Use mallinfo2 to collect malloc stats.'
  )

  # Impeller flags.
  parser.add_argument(
      '--enable-impeller-playground',
      default=False,
      action='store_true',
      help='Whether impeller unit tests run in playground mode.'
  )

  parser.add_argument(
      '--prebuilt-impellerc',
      default=None,
      type=str,
      help='Absolute path to a prebuilt impellerc. ' +
      'Do not use this outside of CI or with impellerc from a different engine version.'
  )

  parser.add_argument(
      '--enable-impeller-3d',
      default=False,
      action='store_true',
      help='Enables experimental 3d support.'
  )

  parser.add_argument(
      '--malioc-path', type=str, help='The path to the malioc tool.'
  )

  # Sanitizers.
  parser.add_argument('--asan', default=False, action='store_true')
  parser.add_argument('--lsan', default=False, action='store_true')
  parser.add_argument('--msan', default=False, action='store_true')
  parser.add_argument('--tsan', default=False, action='store_true')
  parser.add_argument('--ubsan', default=False, action='store_true')

  parser.add_argument(
      '--fstack-protector',
      default=False,
      action='store_true',
      help='Whether the -fstack-protector flag should be passed unconditionally.'
  )

  parser.add_argument(
      '--trace-gn',
      default=False,
      action='store_true',
      help='Write a GN trace log (gn_trace.json) in the Chromium tracing '
      'format in the build directory.'
  )

  # Verbose output.
  parser.add_argument('--verbose', default=False, action='store_true')

  return parser.parse_args(args)


def main(argv):
  args = parse_args(argv)

  exe = '.exe' if sys.platform.startswith(('cygwin', 'win')) else ''

  command = [
      '%s/flutter/third_party/gn/gn%s' % (SRC_ROOT, exe),
      'gen',
      '--check',
      '--export-compile-commands',
  ]

  if not args.web:
    if args.ide != '':
      command.append('--ide=%s' % args.ide)
    elif sys.platform == 'darwin':
      # On the Mac, generate an Xcode project by default.
      command.append('--ide=xcode')
      command.append('--xcode-project=flutter_engine')
      command.append('--xcode-build-system=new')
    elif sys.platform.startswith('win'):
      # On Windows, generate a Visual Studio project.
      command.append('--ide=vs')
      command.append('--ninja-executable=ninja')

  command.append('--export-compile-commands=default')

  gn_args = to_command_line(to_gn_args(args))
  out_dir = get_out_dir(args)
  command.append(out_dir)
  command.append('--args=%s' % ' '.join(gn_args))

  if args.trace_gn:
    command.append('--tracelog=%s/gn_trace.json' % out_dir)

  if args.verbose:
    command.append('-v')

  print('Generating GN files in: %s' % out_dir)
  try:
    gn_call_result = subprocess.call(command, cwd=SRC_ROOT)
  except subprocess.CalledProcessError as exc:
    print('Failed to generate gn files: ', exc.returncode, exc.output)
    sys.exit(1)

  return gn_call_result


if __name__ == '__main__':
  sys.exit(main(sys.argv))
