# 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")

declare_args() {
  is_ggp = false

  # Extract native libs in ANGLE apk. Useful for flamegraph generation.
  angle_extract_native_libs = false
}

if (angle_has_build) {
  import("//build/config/dcheck_always_on.gni")
  import("//build/config/sanitizers/sanitizers.gni")
  import("//build/config/ui.gni")  # import the use_x11 variable
  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")
  }

  angle_use_x11 = use_x11 && !is_ggp
} else {
  declare_args() {
    is_ubsan = false
    is_tsan = false
    is_asan = false
    build_with_chromium = false
    dcheck_always_on = false
    angle_use_x11 = is_linux && !is_ggp
    use_ozone = false
    use_fuzzing_engine = false
  }
}

if (build_with_chromium) {
  import("//ui/ozone/ozone.gni")
} else {
  declare_args() {
    ozone_platform_gbm = false
  }
}

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

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

declare_args() {
  if (!is_android) {
    ndk_api_level_at_least_26 = false
  } else {
    ndk_api_level_at_least_26 =
        (!angle_64bit_current_cpu && android32_ndk_api_level >= 26) ||
        (angle_64bit_current_cpu && android64_ndk_api_level >= 26)
  }

  # Vulkan loader is statically linked on Mac. http://anglebug.com/4477
  angle_shared_libvulkan = !is_mac

  # There's no "is_winuwp" helper in BUILDCONFIG.gn, so we define one ourselves
  angle_is_winuwp = is_win && current_os == "winuwp"

  # Default to using "_angle" suffix on Android
  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"
}

declare_args() {
  angle_enable_d3d9 = is_win && !angle_is_winuwp
  angle_enable_d3d11 = is_win
  angle_enable_gl =
      (ozone_platform_gbm || !is_linux || (angle_use_x11 && !is_chromeos)) &&
      !is_fuchsia && !angle_is_winuwp && !is_ggp && !is_win_arm64

  # ANGLE Vulkan backend on Android requires API level 26, i.e. Oreo, due to
  # Vulkan Validation Layers compatibility issues, see http://crrev/c/1405714.
  # Otherwise, API level 24 would have been enough.
  angle_enable_vulkan =
      angle_has_build && ((is_win && !angle_is_winuwp) ||
                          (is_linux && angle_use_x11 && !is_chromeos) ||
                          (is_android && ndk_api_level_at_least_26) ||
                          is_fuchsia || is_ggp || is_mac)
  angle_enable_null = true
  angle_enable_essl = true
  angle_enable_glsl = true

  # http://anglebug.com/2634
  angle_enable_metal = is_mac
}

declare_args() {
  # Currently SwiftShader's Vulkan front-end doesn't build on Android.
  # SwiftShader is not needed on Fuchsia because Vulkan is supported on all
  # devices that run Fuchsia.
  angle_enable_swiftshader =
      angle_enable_vulkan && !is_android && !is_fuchsia && !is_ggp

  angle_enable_gl_null = angle_enable_gl
  angle_enable_hlsl = angle_enable_d3d9 || angle_enable_d3d11
  angle_enable_trace = false

  # Disable the layers in ubsan builds because of really slow builds.
  # TODO(anglebug.com/4082) enable validation layers on mac for swiftshader
  angle_enable_vulkan_validation_layers =
      angle_enable_vulkan && !is_ubsan && !is_tsan && !is_asan &&
      (is_debug || dcheck_always_on) && !is_mac

  # Disable overlay by default
  angle_enable_overlay = false
}

angle_common_configs = [
  angle_root + ":angle_release_asserts_config",
  angle_root + ":better_linux_stack_traces",
  angle_root + ":constructor_and_destructor_warnings",
  angle_root + ":extra_warnings",
  angle_root + ":internal_config",
]

angle_remove_configs = []

if (angle_has_build) {
  angle_remove_configs += [ "//build/config/compiler:default_include_dirs" ]
}
angle_better_stack_traces =
    (is_debug || dcheck_always_on) && is_linux && !is_asan && !is_cfi

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

  # Disabled to enable better stack traces.
  if (angle_better_stack_traces) {
    # This line causes in-class-inline-functions in glslang to be weak symbols.  The KHR dEQP tests
    # link against glslang as well as libGLESv2.so, resulting in angle_deqp_khr_gles*_tests to link
    # those weak symbols.  Due to glslang's usage of a global variable in InitializeDll.cpp, a bug
    # is created where ANGLE sometimes calls into its own copy of glslang and sometimes the KHR
    # dEQP's version, with the two copies of the global variable being inconsistent.
    # Commented out until the underlying issue is resolved.  http://anglebug.com/4123
    # angle_remove_configs += [ "//build/config/gcc:symbol_visibility_hidden" ]
  }
}

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

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") {
  configs = angle_common_configs
  public_configs = []
  public_deps = []
  sources = []
  data = []
  defines = []
  main = ""
  suppressed_configs = angle_remove_configs

  # By default use the Chromium harness in Chromium. Can be overriden in a target.
  standalone_harness = !build_with_chromium

  if (!standalone_harness) {
    suppressed_configs -= [ "//build/config/compiler:default_include_dirs" ]
  }

  if (is_android) {
    if (build_with_chromium) {
      use_native_activity = true
    } else {
      use_raw_android_executable = true
    }
  }
}

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
  }
}

template("angle_shared_library") {
  shared_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

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

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
  }
}

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
  }
}

template("angle_test") {
  test(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 + [
                 "$angle_root:constructor_and_destructor_warnings",
                 "$angle_root:extra_warnings",
               ]

    if (is_linux && !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) {
      configs += [ "$angle_root:build_id_config" ]
    }

    deps += [
      "$angle_root:angle_common",
      "$angle_root:includes",
      "$angle_root/third_party/rapidjson:rapidjson",
      "$angle_root/util:angle_test_utils",
      "//testing/gmock",
      "//testing/gtest",
      "//third_party/googletest:gmock",
      "//third_party/googletest:gtest",
    ]

    sources += [
      "$angle_root/src/tests/test_utils/runner/TestSuite.cpp",
      "$angle_root/src/tests/test_utils/runner/TestSuite.h",
    ]

    # To use the Chromium test infrastructure we must currently use the //base test launcher.
    # Eventually we could switch to using standalone testing. See http://crbug.com/837741
    if (standalone_harness) {
      if (invoker.main != "") {
        sources += [ "${invoker.main}.cpp" ]
      }
    } else {
      if (invoker.main != "") {
        sources += [ "//gpu/${invoker.main}.cc" ]
      }
      deps += [ "//base/test:test_support" ]

      if (is_android) {
        configs -= [ "//build/config/android:hide_all_but_jni" ]
      }
    }
  }
}
