# Copyright 2019 The ANGLE Project Authors. 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_overrides/angle.gni")
if (angle_has_build) {
  import("//build/config/gclient_args.gni")
}

if (!defined(checkout_angle_cl_deps)) {
  checkout_angle_cl_deps = true
}

if (!defined(checkout_angle_dawn_deps)) {
  checkout_angle_dawn_deps = true
}

if (!defined(checkout_angle_partition_alloc)) {
  checkout_angle_partition_alloc = false
}

declare_args() {
  # Extract native libs in ANGLE apk. Useful for flamegraph generation.
  angle_extract_native_libs = false

  # Display mode for ANGLE vulkan display, could be 'simple' or 'headless',
  # default is 'simple'.
  angle_vulkan_display_mode = "simple"

  # Defaults to capture building to $root_out_dir/angle_libs/with_capture.
  # Switch on to build capture to $root_out_dir.
  angle_with_capture_by_default = false

  # Enables OpenCL support, off by default.
  angle_enable_cl = false
  if (!checkout_angle_cl_deps) {
    angle_enable_cl = false
  }

  angle_restricted_traces = []

  # Don't build dEQP by default.
  build_angle_deqp_tests = false

  # Build the ANGLE end2end tests as a shared library. This shared library can
  # (for example) be loaded by an Android APK to execute the end2end tests
  # outside of the normal GTest framework.
  build_angle_end2end_tests_library = false

  # List of traces for benchmark mode
  angle_standalone_benchmark_traces = []

  # Benchmark mode golden default directory
  angle_standalone_benchmark_goldens_dir = ""

  # Whether the ANGLE translator should be built with IR instead
  # THIS IS CURRENTLY EXPERIMENTAL.
  angle_ir = false
}

declare_args() {
  # Enable angle standalone benchmark mode if list of traces is provided
  angle_standalone_benchmark =
      is_android && angle_standalone_benchmark_traces != []

  # Only bundle traces in the APK if we're building a subset or if standalone
  # benchmark is selected
  restricted_traces_outside_of_apk =
      is_android && angle_restricted_traces == [] &&
      angle_standalone_benchmark_traces == []

  # Enables OpenCL testing support
  angle_enable_cl_testing = angle_enable_cl && (is_linux || is_android)
}

if (angle_has_build) {
  import("//build/config/dcheck_always_on.gni")
  import("//build/config/ozone.gni")  # import the ozone_platform_x11 variable
  import("//build/config/sanitizers/sanitizers.gni")
  import("//build_overrides/build.gni")
  import("//testing/test.gni")
  if (is_android) {
    import("//build/config/android/config.gni")
  }

  if (is_win) {
    import("//build/config/win/visual_studio_version.gni")
  }

  if (is_chromeos) {
    angle_vulkan_display_mode = "offscreen"
  } else if (is_castos || ozone_platform_headless) {
    angle_vulkan_display_mode = "headless"
  }

  declare_args() {
    angle_use_gbm = ozone_platform_drm
    angle_use_x11 = ozone_platform_x11 && (is_linux || is_chromeos)
    angle_use_wayland = ozone_platform_wayland && is_linux && !is_castos
    angle_use_vulkan_display = is_linux || is_chromeos
  }
} else {
  declare_args() {
    is_ubsan = false
    is_tsan = false
    is_asan = false
    is_lsan = false
    build_with_chromium = false
    dcheck_always_on = false
    angle_use_x11 = is_linux || is_chromeos
    angle_use_wayland = is_linux
    angle_use_gbm = false
    use_ozone = false
    ozone_platform_drm = false
    ozone_platform_wayland = false
    ozone_platform_headless = false
    use_fuzzing_engine = false
    is_apple = is_mac || is_ios
    is_desktop_android = false
  }

  declare_args() {
    angle_use_vulkan_display = is_linux || is_chromeos
  }
}

if (!defined(checkout_angle_internal)) {
  checkout_angle_internal = false
}

if (!defined(checkout_angle_restricted_traces)) {
  checkout_angle_restricted_traces = false
}

if (!defined(checkout_extra_traces)) {
  checkout_extra_traces = true
}

# Subdirectory to place data files (e.g. layer JSON files).
angle_data_dir = "angledata"

if (angle_use_wayland) {
  wayland_protocols_gn_dir = "//third_party/wayland-protocols"
  wayland_protocols_dir = "$wayland_protocols_gn_dir/src"
}

declare_args() {
  angle_assert_always_on = dcheck_always_on

  if (current_cpu == "arm64" || current_cpu == "x64" ||
      current_cpu == "mips64el" || current_cpu == "s390x" ||
      current_cpu == "ppc64" || current_cpu == "loong64" ||
      current_cpu == "riscv64" || current_cpu == "arm64e") {
    angle_64bit_current_cpu = true
  } else if (current_cpu == "arm" || current_cpu == "x86" ||
             current_cpu == "mipsel" || current_cpu == "s390" ||
             current_cpu == "ppc" || current_cpu == "loong32") {
    angle_64bit_current_cpu = false
  } else {
    assert(false, "Unknown current CPU: $current_cpu")
  }

  # Indicate if the rapidJSON library is available to build with in
  # third_party/.
  angle_has_rapidjson = angle_has_build

  angle_is_winappsdk = false

  # Windows App SDK is a separate dependency from nuget.org that needs to
  # be pre-processed before being used.
  winappsdk_dir = ""
}

if (!defined(angle_shared_libvulkan_on_mac)) {
  angle_shared_libvulkan_on_mac = false
}

declare_args() {
  # By default we enable debug layers when asserts are turned on.
  angle_debug_layers_enabled = is_debug || angle_assert_always_on

  if (!is_android) {
    ndk_api_level_at_least_26 = false
  } else {
    ndk_api_level_at_least_26 = android_ndk_api_level >= 26
  }

  # Vulkan loader is statically linked on Mac unless the embedder specifies
  # otherwise. http://anglebug.com/40096682
  angle_shared_libvulkan = !is_mac || angle_shared_libvulkan_on_mac

  # There's no "is_winuwp" helper in BUILDCONFIG.gn, so we define one ourselves
  # Windows App SDK is almost UWP but for Win32, so we want all the same things
  angle_is_winuwp = (is_win && target_os == "winuwp") || angle_is_winappsdk

  angle_is_msvc = is_win && !is_clang

  # Default to using "_angle" suffix on Android
  if (!defined(angle_libs_suffix)) {
    if (is_android) {
      angle_libs_suffix = "_angle"
    } else {
      angle_libs_suffix = ""
    }
  }

  # Currently Windows on Arm doesn't support OpenGL or Vulkan.
  is_win_arm64 = is_win && target_cpu == "arm64"

  # Frame capture code is enabled by default if rapidjson is available.
  angle_has_frame_capture = angle_has_rapidjson
}

declare_args() {
  # True if ANGLE is linked statically in Chromium.
  if (!defined(angle_use_static_angle)) {
    angle_use_static_angle = false
  }

  # By default, ANGLE is using a thread pool for parallel compilation.
  # Activating the delegate worker results in posting the tasks using the
  # embedder API. In Chromium code base, it results in sending tasks to the
  # worker thread pool.
  angle_delegate_workers = build_with_chromium

  # True if we are building inside an ANGLE checkout.
  angle_standalone = !build_with_chromium

  angle_enable_d3d11 = is_win
  angle_enable_gl =
      (ozone_platform_drm || ozone_platform_wayland || !is_linux ||
       ((angle_use_x11 && !is_chromeos) || angle_use_wayland || is_castos)) &&
      !is_fuchsia && !angle_is_winuwp && !is_win_arm64 && !is_ios

  angle_enable_vulkan =
      angle_has_build &&
      ((is_win && !angle_is_winuwp) ||
       ((is_linux || is_chromeos) &&
        (angle_use_x11 || angle_use_wayland || angle_use_vulkan_display)) ||
       is_android || is_fuchsia || is_mac)

  # When set to true, ANGLE will not use VK_KHR_surface and VK_KHR_swapchain
  # extensions. Content can be rendered only off-screen.
  angle_use_vulkan_null_display = build_with_chromium && is_fuchsia

  # Disable null backend to save space for official build.
  angle_enable_null = !is_official_build
  angle_enable_gl_desktop_backend = !is_android && !is_ios

  angle_enable_metal = is_apple

  # Enables the OpenCL pass-through back end
  angle_enable_cl_passthrough = angle_enable_cl

  # Disable WGPU backend. Currently disabled on Android, Fuchsia, WinUWP, and
  # Win MSVC. X11 or Wayland required on Linux.
  # anglebug.com/42266968
  angle_enable_wgpu =
      !is_official_build && !(is_android || is_fuchsia || angle_is_winuwp) &&
      (!is_win || is_clang) &&
      (!is_linux || angle_use_x11 || angle_use_wayland) &&
      defined(angle_dawn_dir) && checkout_angle_dawn_deps
}

declare_args() {
  # Enable the ANGLE_explicit_context extension. This duplicates all GL entry
  # points which increases binary size.
  # Currently enabled only when the WebGPU backend is enabled because only the
  # WebGPU backend currently supports this extension.
  angle_enable_explicit_context = angle_enable_wgpu
}

declare_args() {
  # PartitionAlloc is Chrome's memory allocator.
  #
  # Enabling it allows ANGLE to use the same allocator as Chrome, which can
  # provide security benefits by turning most UAFs in Angle's internal
  # pointers into safe crashes. Additionally, it can help align tests/benchmark
  # results closer with in-browser behavior, providing more accurate
  # performance metrics that reflect real-world usage in Chrome.
  if (!defined(angle_use_partition_alloc)) {
    angle_use_partition_alloc =
        # Only for Angle CQ and local development. Not for arbitrary embedders.
        angle_standalone &&
        # Only enable PartitionAlloc in assert-enabled builds to avoid
        # performance penalties in pure release standalone builds.
        angle_assert_always_on &&
        # Angle CQ enables `checkout_angle_partition_alloc` by default so that
        # it can be used in tests/benchmarks. For local development, you can
        # enable it by adding ```
        #    "custom_vars": {
        #      "checkout_angle_partition_alloc": True,
        #    },
        # ```
        # to your .gclient config.
        checkout_angle_partition_alloc &&
        # While GCC is supported, it still lacks CI coverage to catch
        # regressions. Therefore, we disable it by default on GCC builds for
        # now.
        is_clang &&
        # TODO(b/503180635): Enable PartitionAlloc on Windows standalone builds.
        # Currently it is disabled because it leads to heap mismatch crashes in
        # trace tests (DLLs vs EXE).
        !is_win &&
        # TODO(b/503180635): Enable PartitionAlloc on Android standalone builds.
        # Currently it is disabled because it leads to systematic test failures
        # (likely startup crashes) on 'angle-cq-android-arm64-rel' bot across
        # almost all test suites (unittests, end2end_tests, deqp, etc.).
        !is_android
  }
}

declare_args() {
  # ASTC emulation is only built on standalone non-android builds
  angle_has_astc_encoder = angle_has_build && angle_standalone && !is_android
}

declare_args() {
  # Test the system EGL.
  # If "true", this disables testing any ANGLE libraries packaged with the
  # end2end tests. Meaning, only either System EGL or ANGLE EGL libraries can
  # be tested with the full suite, including all supported/enabled backends, but
  # not both drivers at the same time.
  angle_test_enable_system_egl = false
}

# OpenCL is not supported on Windows UWP, because the CL headers include DX9,
# which is not supported by UWP. A workaround might be possible if CL support on
# UWP is required.
assert(!angle_is_winuwp || !angle_enable_cl,
       "OpenCL is not supported on Windows UWP")

assert(!angle_is_winappsdk || winappsdk_dir != "",
       "No path to Windows App SDK was provided using 'winappsdk_dir'")

if (!angle_enable_cl) {
  angle_enable_cl_passthrough = false
}

if (!defined(checkout_angle_mesa)) {
  checkout_angle_mesa = false
}

declare_args() {
  # Currently SwiftShader's Vulkan front-end doesn't build on Android.
  # Disabled by default on MSVC because of compiler warnings/errors.
  angle_enable_swiftshader = angle_enable_vulkan && !is_android && is_clang

  # Translator backend support:
  angle_enable_hlsl = angle_enable_d3d11
  angle_enable_essl = angle_enable_gl || use_ozone
  angle_enable_glsl = angle_enable_gl || use_ozone
  angle_enable_msl = angle_enable_metal
  angle_enable_trace = false
  angle_enable_trace_android_logcat = false
  angle_enable_trace_events = false
  angle_enable_perfetto = defined(angle_perfetto_cpp_dir) && angle_has_build &&
                          (build_with_chromium || is_clang)
  angle_dump_pipeline_cache_graph = false

  angle_always_log_info = false

  # Unwind backtrace support. This feature is currently only implemented
  # on Android for debugging purposes. Disabled by default.
  angle_enable_unwind_backtrace_support = false

  # Memory allocation logging support. This feature is for debugging only.
  # Disabled by default.
  angle_enable_memory_alloc_logging = false

  # Disable the layers in ubsan builds because of really slow builds.
  # Vulkan Validation Layers require Android NDK API level 26, i.e. Oreo, due to
  # Vulkan Validation Layers compatibility issues, see http://crrev/c/1405714.
  # This is disabled in the Chromium build because the current build toolchain
  # for APKs and bundles expect a single .so file in trichrome builds. See
  # https://bugs.chromium.org/p/angleproject/issues/detail?id=8398 for details.
  angle_enable_vulkan_validation_layers =
      angle_enable_vulkan && !is_ubsan && !is_tsan && !is_asan &&
      angle_debug_layers_enabled &&
      (!is_android || (ndk_api_level_at_least_26 && !build_with_chromium))
  angle_enable_vulkan_api_dump_layer =
      angle_enable_vulkan && angle_debug_layers_enabled && angle_standalone &&
      !is_apple && (is_linux || is_android)

  # ISpriteVisual windows cannot be validated and can lead to crashes if an
  # invalid window is provided to ANGLE. Disable them for non-standalone ANGLE
  # builds. crbug.com/1176118
  angle_enable_d3d11_compositor_native_window =
      angle_enable_d3d11 && angle_standalone

  # Disable performance counter output by default
  angle_enable_perf_counter_output = false

  angle_vulkan_headers_dir = "$angle_root/third_party/vulkan-headers/src"
  angle_vulkan_loader_dir = "$angle_root/third_party/vulkan-loader/src"
  angle_vulkan_tools_dir = "$angle_root/third_party/vulkan-tools/src"
  angle_vulkan_validation_layers_dir =
      "$angle_root/third_party/vulkan-validation-layers/src"
  angle_lunarg_vulkantools_dir =
      "$angle_root/third_party/lunarg-vulkantools/src"

  angle_build_vulkan_system_info = angle_has_build && !angle_is_winuwp

  angle_build_mesa = false

  # Android platform's addTraceEvent ignores the timestamp and time() is a
  # relatively heavy call.
  angle_trace_events_ignore_timestamp = is_android && angle_standalone
}

declare_args() {
  angle_enable_cgl = angle_enable_gl && is_mac

  angle_has_histograms = angle_has_build

  # True if we want to build the ANGLE test suites. On by default in most
  # configs.
  angle_build_tests = angle_has_build
}

declare_args() {
  angle_enable_renderdoc = angle_enable_vulkan_validation_layers
}

if (!defined(angle_zlib_compression_utils_dir)) {
  angle_zlib_compression_utils_dir = "//third_party/zlib/google"
}

angle_common_configs = [
  angle_root + ":angle_asserts_config",
  angle_root + ":constructor_and_destructor_warnings",
  angle_root + ":no_thread_safety_warnings",
  angle_root + ":extra_warnings",
  angle_root + ":internal_config",
  angle_root + ":angle_uwp_env",
]

angle_remove_configs = []

if (angle_has_build) {
  angle_remove_configs += [ "//build/config/compiler:default_include_dirs" ]

  if (is_clang) {
    angle_remove_configs += [ "//build/config/clang:find_bad_constructs" ]
  }

  if (!is_debug && !is_fuchsia) {
    # default->optimize_max (e.g. Android defaults to -Oz, optimize_max is -O2)
    angle_remove_configs += [ "//build/config/compiler:default_optimization" ]
    angle_common_configs += [ "//build/config/compiler:optimize_max" ]
  }

  # See https://crbug.com/386992829
  if (defined(angle_sanitize_array_bounds) && !angle_sanitize_array_bounds) {
    angle_remove_configs +=
        [ "//build/config/compiler:sanitize_c_array_bounds" ]
  }
}

# Enable max lto optimization
if (is_android && angle_enable_vulkan) {
  angle_common_configs += [ "//build/config/compiler:thinlto_optimize_max" ]
  angle_remove_configs += [ "//build/config/compiler:thinlto_optimize_default" ]
}

set_defaults("angle_executable") {
  configs = angle_common_configs
  public_configs = []
  suppressed_configs = angle_remove_configs
  data_deps = []
}

set_defaults("angle_shared_library") {
  configs = angle_common_configs
  public_configs = []
  suppressed_configs = angle_remove_configs
}

set_defaults("angle_source_set") {
  configs = angle_common_configs
  public_configs = []
  suppressed_configs = angle_remove_configs
}

set_defaults("angle_static_library") {
  configs = angle_common_configs
  public_configs = []
  suppressed_configs = angle_remove_configs
}

set_defaults("angle_test") {
  # Gtest itself can't pass all the strict warning filters.
  configs = angle_common_configs - [
              "$angle_root:constructor_and_destructor_warnings",
              "$angle_root:extra_warnings",
            ] + [ "$angle_root/src/tests:angle_maybe_has_histograms" ] +
            [ "$angle_root/src/tests:angle_enable_renderdoc" ]

  public_configs = []
  public_deps = []
  sources = []
  data = []
  defines = []
  deps = []
  data_deps = []
  suppressed_configs = angle_remove_configs
}

template("angle_executable") {
  executable(target_name) {
    forward_variables_from(invoker,
                           "*",
                           [
                             "configs",
                             "suppressed_configs",
                             "visibility",
                           ])

    # Needed because visibility is global.
    forward_variables_from(invoker, [ "visibility" ])

    configs += invoker.configs
    configs -= invoker.suppressed_configs

    if (angle_has_build && is_win) {
      data_deps += [ "//build/win:runtime_libs" ]
    }

    if (is_ios) {
      check_includes = false
    }
  }
}

template("angle_shared_library") {
  # On ios, define an ios_framework_bundle instead of a shared library.
  # ios_framework_bundle doesn't automatically link, so we have to create
  # a group that links and bundles the framework as well.
  target_type = "shared_library"
  internal_target_name = target_name
  if (is_ios) {
    target_type = "ios_framework_bundle"
    internal_target_name = target_name + "_framework"
  }

  target(target_type, internal_target_name) {
    forward_variables_from(invoker,
                           "*",
                           [
                             "configs",
                             "suppressed_configs",
                             "visibility",
                           ])

    # Needed because visibility is global.
    forward_variables_from(invoker, [ "visibility" ])

    configs += invoker.configs
    configs -= invoker.suppressed_configs

    if (is_apple) {
      # If a "build with ARC" config is present, remove it.
      if (filter_include(configs, [ "//build/config/compiler:enable_arc" ]) !=
          []) {
        configs -= [ "//build/config/compiler:enable_arc" ]
      }
    }

    public_configs += [ angle_root + ":shared_library_public_config" ]

    if (is_android) {
      configs += [ angle_root + ":build_id_config" ]
      configs -= [ "//build/config/android:hide_all_but_jni_onload" ]
    }
    if (is_ios) {
      info_plist = "$angle_root/util/ios/Info.plist"

      # shared libraries are hidden inside ios_framework_bundle, but we include
      # headers from them Specifically, libGLESv1_CM includes headers from
      # libGLESv2
      check_includes = false
    }
  }
  if (is_ios) {
    group(target_name) {
      forward_variables_from(invoker,
                             [
                               "testonly",
                               "visibility",
                             ])
      public_deps = [
        ":${internal_target_name}+bundle",
        ":${internal_target_name}+link",
      ]
    }
  }
}

template("angle_source_set") {
  source_set(target_name) {
    forward_variables_from(invoker,
                           "*",
                           [
                             "configs",
                             "suppressed_configs",
                             "visibility",
                           ])

    # Needed because visibility is global.
    forward_variables_from(invoker, [ "visibility" ])

    configs += invoker.configs
    configs -= invoker.suppressed_configs

    if (is_apple) {
      # If a "build with ARC" config is present, remove it.
      if (filter_include(configs, [ "//build/config/compiler:enable_arc" ]) !=
          []) {
        configs -= [ "//build/config/compiler:enable_arc" ]
      }
    }
  }
}

template("angle_static_library") {
  static_library(target_name) {
    forward_variables_from(invoker,
                           "*",
                           [
                             "configs",
                             "suppressed_configs",
                             "visibility",
                           ])

    # Needed because visibility is global.
    forward_variables_from(invoker, [ "visibility" ])

    configs += invoker.configs
    configs -= invoker.suppressed_configs

    if (is_apple) {
      # If a "build with ARC" config is present, remove it.
      if (filter_include(configs, [ "//build/config/compiler:enable_arc" ]) !=
          []) {
        configs -= [ "//build/config/compiler:enable_arc" ]
      }
    }
  }
}

if (angle_standalone || build_with_chromium ||
    build_angle_end2end_tests_library) {
  template("angle_test") {
    test(target_name) {
      forward_variables_from(invoker,
                             "*",
                             [
                               "configs",
                               "data",
                               "public_deps",
                             ])

      configs += invoker.configs
      configs -= invoker.suppressed_configs

      if (is_apple) {
        # If a "build with ARC" config is present, remove it.
        if (filter_include(configs, [ "//build/config/compiler:enable_arc" ]) !=
            []) {
          configs -= [ "//build/config/compiler:enable_arc" ]
        }
      }

      if (is_ios) {
        # shared libraries are hidden inside ios_framework_bundle, but we
        # include headers from them
        check_includes = false
      }

      public_deps = invoker.public_deps + [
                      "$angle_root:angle_common",
                      "$angle_root:includes",
                      "$angle_root/src/tests:angle_test_expectations",
                      "$angle_root/util:angle_test_utils",
                      "//testing/gmock",
                      "//testing/gtest",
                      "//third_party/googletest:gmock",
                      "//third_party/googletest:gtest",
                    ]
      if (angle_has_rapidjson) {
        public_deps += [ "$angle_root/third_party/rapidjson" ]
      }

      data = invoker.data + [
               "$angle_root/src/tests/py_utils/android_helper.py",
               "$angle_root/src/tests/py_utils/angle_path_util.py",
               "$angle_root/src/tests/py_utils/angle_test_util.py",
               "//testing/scripts/common.py",
               "//testing/xvfb.py",
             ]

      if (angle_has_rapidjson) {
        sources += [
          "$angle_root/src/tests/test_utils/runner/HistogramWriter.h",
          "$angle_root/src/tests/test_utils/runner/TestSuite.cpp",
          "$angle_root/src/tests/test_utils/runner/TestSuite.h",
        ]
      }

      if (angle_has_histograms) {
        sources +=
            [ "$angle_root/src/tests/test_utils/runner/HistogramWriter.cpp" ]
        deps += [
          "//third_party/catapult/tracing/tracing:histogram",
          "//third_party/catapult/tracing/tracing:reserved_infos",
        ]
      }

      if (is_mac) {
        if (angle_enable_metal) {
          # On macOS, compiling Metal shader sometimes takes very long time due
          # to internal caching mechanism. This hooking library is a way to
          # bypass this caching mechanism.
          data_deps += [ "$angle_root/src/libANGLE/renderer/metal/file_hooking:metal_shader_cache_file_hooking" ]
        }
        if (angle_enable_cgl) {
          configs += [ "$angle_root:supports_automatic_graphics_switching" ]
        }
      }

      if (is_linux && !is_chromeos) {
        use_xvfb = true
      }

      if ((is_linux || is_chromeos) && !is_component_build) {
        # Set rpath to find shared libs in a non-component build.
        configs += [ "//build/config/gcc:rpath_for_built_shared_libraries" ]
      }

      if (is_android) {
        public_configs += [ "$angle_root:build_id_config" ]
        configs -= [ "//build/config/android:hide_all_but_jni" ]
        use_default_launcher = false
        generate_final_jni = false
        if (angle_standalone_benchmark) {
          android_manifest_template = "$angle_root/src/tests/test_utils/runner/android/java/StandaloneBenchmarkAndroidManifest.xml.jinja2"
        } else {
          android_manifest_template = "$angle_root/src/tests/test_utils/runner/android/java/AndroidManifest.xml.jinja2"
        }

        deps += [
          "$angle_root/src/tests:native_test_java",
          "$angle_root/src/tests:native_test_support_android",
        ]
      }
      if (is_ios) {
        # We use a special main function on iOS to initialize UIKit before the
        # normal main runs.
        ldflags = [
          "-e",
          "_ios_main",
        ]
        sources += [ "$angle_root/util/ios/ios_main.mm" ]
      }

      if (angle_has_build && is_win) {
        data_deps += [ "//build/win:runtime_libs" ]
      }
    }
  }
}

if (angle_enable_cl) {
  # need the llvm build flags
  import("$angle_clspv_dir/gn/build/llvm_buildflags.gni")
}
