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

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")
  if (is_starboard) {
    import("//starboard/build/test.gni")
  } else {
    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)
  }
  angle_shared_libvulkan = false

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

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

  # 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) && !is_starboard
  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 && !is_starboard

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

if (is_starboard) {
  angle_common_configs += [ angle_root + ":starboard_defines" ]
}

angle_remove_configs = []

if (angle_has_build && !is_starboard) {
  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 && !is_starboard) {
  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 = []
  main = ""
  suppressed_configs = angle_remove_configs

  # TODO(jmadill): Migrate to standalone harness. http://anglebug.com/3162
  if (build_with_chromium) {
    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" ]
    }

    if (is_starboard) {
      install_target = true
    }
  }
}

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") {
  _googletest_deps = [
    "//testing/gmock",
    "//testing/gtest",
    "//third_party/googletest:gmock",
    "//third_party/googletest:gtest",
  ]

  if (is_starboard) {
    _googletest_deps -= [
      "//third_party/googletest:gmock",
      "//third_party/googletest:gtest",
    ]
  }

  # TODO(jmadill): Migrate to standalone harness. http://anglebug.com/3162
  if (build_with_chromium) {
    _googletest_deps += [ "//base/test:test_support" ]
  }

  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
    configs -= [ angle_root + ":constructor_and_destructor_warnings" ]
    configs -= [ 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" ]
      if (build_with_chromium) {
        configs -= [ "//build/config/android:hide_all_but_jni" ]
      }
    }

    deps += _googletest_deps + [
              "$angle_root:angle_common",
              "$angle_root:includes",
            ]

    if (build_with_chromium) {
      sources += [ "//gpu/${invoker.main}.cc" ]
    } else {
      sources += [ "${invoker.main}.cpp" ]
    }
  }
}
