# Copyright 2023 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("../../gni/angle.gni")

template("angle_trace") {
  angle_shared_library(target_name) {
    testonly = true

    # Similar to capture replay sample, use the file index for sources
    sources = invoker.sources

    data = invoker.data
    defines = [ "ANGLE_REPLAY_IMPLEMENTATION" ]
    suppressed_configs += [ "$angle_root:constructor_and_destructor_warnings" ]

    deps = [
      "$angle_root/util:angle_trace_fixture",
      "$angle_root/util:angle_trace_loader",
    ]

    if (defined(invoker.deps)) {
      deps += invoker.deps
    }

    if (is_android) {
      libs = [ "log" ]
    }

    # Disable optimization in the trace perf tests to avoid optimizing huge files.
    if (!is_debug && !is_ubsan) {
      suppressed_configs += [
        "//build/config/compiler:afdo",
        "//build/config/compiler:afdo_optimize_size",
        "//build/config/compiler:default_optimization",
        "//build/config/compiler/pgo:default_pgo_flags",
      ]
      configs += [ "//build/config/compiler:no_optimize" ]
    }

    include_dirs = [ "." ]

    if (defined(invoker.output_name)) {
      output_name = invoker.output_name
    }
  }
}

set_defaults("angle_trace_libs") {
  # Uses a short name to work around file path limits on Windows.
  short_names = false
}

template("angle_trace_libs") {
  _trace_targets = []
  _trace_lib_files = []

  if (invoker.short_names) {
    _trace_counter = 1
  }

  if (is_android && is_component_build) {
    _cr_suffix = ".cr"
  } else {
    _cr_suffix = ""
  }

  foreach(_trace_and_version, invoker.trace_list) {
    _trace_and_version_arr = []
    _trace_and_version_arr = string_split(_trace_and_version)
    _trace = _trace_and_version_arr[0]
    if (defined(invoker.trace_dir)) {
      _trace_dir = invoker.trace_dir
    } else {
      _trace_dir = _trace
    }
    _trace_json_path = "$_trace_dir/$_trace.json"
    _trace_data = []
    _trace_data = read_file(_trace_json_path, "json")

    if (invoker.short_names) {
      _target = "cr_trace_${_trace_counter}"
      _trace_counter += 1
    } else {
      _target = "${target_name}_$_trace"
    }

    _gen_target = "gen${target_name}_$_trace"
    action(_gen_target) {
      script = "//scripts/tracegz.py"
      args = [
        _trace,
        rebase_path(_trace_dir, root_build_dir),
      ]
      outputs = [ "$root_gen_dir/tracegz_$_trace.gz" ]
    }

    angle_trace(_target) {
      sources = rebase_path(_trace_data.TraceFiles, ".", _trace_dir)

      data = [
        "$_trace_dir/$_trace.json",
        "$_trace_dir/$_trace.angledata.gz",
        "$root_gen_dir/tracegz_$_trace.gz",
      ]

      deps = [ ":$_gen_target" ]

      if (invoker.short_names) {
        output_name = _trace
      }
    }

    _trace_targets += [ ":$_target" ]
    _trace_lib_files += [ "${root_out_dir}/lib${_target}${_cr_suffix}.so" ]
  }

  angle_shared_library(target_name) {
    testonly = true
    data = [ invoker.json_path ]
    data_deps = _trace_targets
    deps = [ "$angle_root:angle_common" ]
    public_deps = [ "$angle_root/util:angle_trace_loader" ]
  }

  if (restricted_traces_outside_of_apk) {
    group("${target_name}__unpacked_libs") {
      testonly = true
      deps = [
        ":angle_restricted_traces",
        "$angle_root/util:angle_trace_interpreter",
      ]

      # Also need files listed as data to be picked up by isolate
      data = _trace_lib_files +
             [ "${root_out_dir}/libangle_trace_interpreter${_cr_suffix}.so" ]
    }
  }
}
