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

# This file contains configs that need to be added or removed to all
# SwiftShader libraries

import("//build_overrides/build.gni")
import("//build_overrides/spirv_tools.gni")
import("//build_overrides/swiftshader.gni")

if (!swiftshader_standalone) {
  import("//build/config/sanitizers/sanitizers.gni")
} else {
  declare_args() {
    is_ubsan_vptr = false
  }
}

declare_args() {
  # By default, build SwiftShader with optimizations enabled in debug
  # for performance reasons. Set to false to build as unoptimized.
  swiftshader_optimized_debug_build = true

  # If enabled, debug builds on Windows will pop up a dialog when the
  # SwiftShader DLL gets loaded, to facilitate attaching a debugger.
  swiftshader_startup_dialog = false

  # Enable the ASTC codec sources from ARM
  swiftshader_enable_astc = true
}

configs_to_add = []
configs_to_delete = []

if (is_win) {
  configs_to_delete += [ "//build/config/win:unicode" ]
}

if (is_debug && swiftshader_optimized_debug_build) {
  configs_to_delete += [ "//build/config/compiler:default_optimization" ]
  configs_to_add += [ "//build/config/compiler:optimize" ]
}

configs_to_delete += [ "//build/config/compiler:chromium_code" ]
configs_to_add += [
  "//build/config/compiler:no_chromium_code",
  "$swiftshader_dir:swiftshader_config",
]

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

    configs -= configs_to_delete
    configs += configs_to_add
    forward_variables_from(invoker, "*", [ "configs" ])
    if (defined(invoker.configs)) {
      configs += invoker.configs
    }
  }
}

template("swiftshader_shared_library") {
  shared_library(target_name) {
    configs -= configs_to_delete
    configs += configs_to_add
    forward_variables_from(invoker, "*", [ "configs" ])
    if (defined(invoker.configs)) {
      configs += invoker.configs
    }
  }
}

template("swiftshader_static_library") {
  static_library(target_name) {
    configs -= configs_to_delete
    configs += configs_to_add
    forward_variables_from(invoker, "*", [ "configs" ])
    if (defined(invoker.configs)) {
      configs += invoker.configs
    }
  }
}
