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

import("//tools/metrics/histograms/histograms_xml_files.gni")

# Runs the resources map generation script other the given header files to
# produce an output file and a source_set to build it.
#
# Parameters:
#   inputs:
#     List of file name to read. Each file should be a .xml file with
#     histogram descriptions and should be a path starting with
#     //tools/metrics/histograms/
#
#   namespace (optional):
#     Namespace in which the generated code should be scoped. If left empty,
#     the code will be in the global namespace.
#
#   header_filename:
#     Name of the generated header file.
#
#   major_branch_date_filepath:
#     A path to the file with the base date.
#
#   milestone_filepath:
#     A path to the file with the milestone information.
#
template("generate_expired_histograms_array") {
  action(target_name) {
    header_filename = "$target_gen_dir/" + invoker.header_filename

    script = "//tools/metrics/histograms/generate_expired_histograms_array.py"
    outputs = [ header_filename ]

    inputs = histograms_xml_files

    major_branch_date_filepath = invoker.major_branch_date_filepath
    milestone_filepath = invoker.milestone_filepath

    args = []

    if (defined(invoker.namespace) && invoker.namespace != "") {
      args += [ "-n" + invoker.namespace ]
    }

    args += [
              "-o" + rebase_path(root_gen_dir, root_build_dir),
              "-H" + rebase_path(header_filename, root_gen_dir),
              "-d" + rebase_path(major_branch_date_filepath, root_build_dir),
              "-m" + rebase_path(milestone_filepath, root_build_dir),
            ] + rebase_path(inputs, root_build_dir)
  }
}
